ZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuYW50LnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDg4NWY4M2UuLjI2OGJhZWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYW50LnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtNCwxMyArNCwxMyBAQAogQnVuZGxlLU5hbWU6ICVwbHVnaW5fbmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0CiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0Ci1CdW5kbGUtVmVyc2lvbjogNC4xMS40LnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDUuMC40LnF1YWxpZmllcgogQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS44CiBJbXBvcnQtUGFja2FnZTogb3JnLmFwYWNoZS50b29scy5hbnQsCi0gb3JnLmVjbGlwc2UuamdpdC5hbnQudGFza3M7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFudC50YXNrczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKICBvcmcuaGFtY3Jlc3QuY29yZTt2ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTIsNS4wLjApIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5hbnQudGVzdC9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQudGVzdC9wb20ueG1sCmluZGV4IDhhODliYzUuLjRiZmJjOWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYW50LnRlc3QvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0L3BvbS54bWwKQEAgLTUwLDcgKzUwLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuNC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5hbnQudGVzdDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuYW50L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggODA1M2YzYS4uNmRmMzA5MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5hbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsMTEgKzMsMTEgQEAKIEJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5hbnQKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuYW50Ci1CdW5kbGUtVmVyc2lvbjogNC4xMS40LnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDUuMC40LnF1YWxpZmllcgogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xLjgKIEltcG9ydC1QYWNrYWdlOiBvcmcuYXBhY2hlLnRvb2xzLmFudCwKLSAgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIgorICBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIgogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtVmVuZG9yOiAlUHJvdmlkZXItTmFtZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuYW50LnRhc2tzO3ZlcnNpb249IjQuMTEuNCI7CitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5hbnQudGFza3M7dmVyc2lvbj0iNS4wLjQiOwogIHVzZXM6PSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcyxvcmcuYXBhY2hlLnRvb2xzLmFudCIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuYW50L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LmFudC9wb20ueG1sCmluZGV4IGJjZDlmMGYuLmEyODgzNjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYW50L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQvcG9tLnhtbApAQCAtNDgsNyArNDgsNyBAQAogCTxwYXJlbnQ+CiAJCTxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAJCTxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotCQk8dmVyc2lvbj40LjExLjQtU05BUFNIT1Q8L3ZlcnNpb24+CisJCTx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogCTwvcGFyZW50PgogCiAJPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5hbnQ8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggODZlZjQ3NC4uMzI4NWVlNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMyw3ICszLDcgQEAKIEJ1bmRsZS1OYW1lOiAlcGx1Z2luX25hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUKLUJ1bmRsZS1WZXJzaW9uOiA0LjExLjQucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNS4wLjQucXVhbGlmaWVyCiBCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJfbmFtZQogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuOApAQCAtMTMsMTUgKzEzLDE1IEBACiAgb3JnLmFwYWNoZS5jb21tb25zLmNvbXByZXNzLmNvbXByZXNzb3JzLmJ6aXAyO3ZlcnNpb249IlsxLjQsMi4wKSIsCiAgb3JnLmFwYWNoZS5jb21tb25zLmNvbXByZXNzLmNvbXByZXNzb3JzLmd6aXA7dmVyc2lvbj0iWzEuNCwyLjApIiwKICBvcmcuYXBhY2hlLmNvbW1vbnMuY29tcHJlc3MuY29tcHJlc3NvcnMueHo7dmVyc2lvbj0iWzEuNCwyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAogIG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSJbMS4zLjAsMi4wLjApIgogQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKIEJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS5Gb3JtYXRBY3RpdmF0b3IKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmU7dmVyc2lvbj0iNC4xMS40IjsKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmU7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmFwaSwKICAgIG9yZy5hcGFjaGUuY29tbW9ucy5jb21wcmVzcy5hcmNoaXZlcnMsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgppbmRleCBjMTk3MjM3Li5mODU1NTFlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKQEAgLTMsNSArMyw1IEBACiBCdW5kbGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlIC0gU291cmNlcwogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlLnNvdXJjZQogQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcgLSBKR2l0Ci1CdW5kbGUtVmVyc2lvbjogNC4xMS40LnF1YWxpZmllcgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZTt2ZXJzaW9uPSI0LjExLjQucXVhbGlmaWVyIjtyb290cz0iLiIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKK0VjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmU7dmVyc2lvbj0iNS4wLjQucXVhbGlmaWVyIjtyb290cz0iLiIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3BvbS54bWwKaW5kZXggMDNhNDk0Mi4uNGJmYTE3NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3BvbS54bWwKQEAgLTUwLDcgKzUwLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuNC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlPC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FyY2hpdmUvVGFyRm9ybWF0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9UYXJGb3JtYXQuamF2YQppbmRleCA3NTU5YWRhLi45ZWQ2MGQ5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9UYXJGb3JtYXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9UYXJGb3JtYXQuamF2YQpAQCAtNDIsNiArNDIsOCBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUkFDVEVSX0VOQ09ESU5HOworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKQEAgLTgyLDIyICs4NCwxNCBAQAogCUBPdmVycmlkZQogCXB1YmxpYyBBcmNoaXZlT3V0cHV0U3RyZWFtIGNyZWF0ZUFyY2hpdmVPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIHMsCiAJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG8pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVRhckFyY2hpdmVPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IFRhckFyY2hpdmVPdXRwdXRTdHJlYW0ocywgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKKwkJVGFyQXJjaGl2ZU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgVGFyQXJjaGl2ZU91dHB1dFN0cmVhbShzLAorCQkJCUNIQVJBQ1RFUl9FTkNPRElORyk7CiAJCW91dC5zZXRMb25nRmlsZU1vZGUoVGFyQXJjaGl2ZU91dHB1dFN0cmVhbS5MT05HRklMRV9QT1NJWCk7CiAJCW91dC5zZXRCaWdOdW1iZXJNb2RlKFRhckFyY2hpdmVPdXRwdXRTdHJlYW0uQklHTlVNQkVSX1BPU0lYKTsKIAkJcmV0dXJuIGFwcGx5Rm9ybWF0T3B0aW9ucyhvdXQsIG8pOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCi0JQERlcHJlY2F0ZWQKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwdXRFbnRyeShBcmNoaXZlT3V0cHV0U3RyZWFtIG91dCwKLQkJCVN0cmluZyBwYXRoLCBGaWxlTW9kZSBtb2RlLCBPYmplY3RMb2FkZXIgbG9hZGVyKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcHV0RW50cnkob3V0LCBudWxsLCBwYXRoLCBtb2RlLGxvYWRlcik7Ci0JfQotCi0JLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBwdXRFbnRyeShBcmNoaXZlT3V0cHV0U3RyZWFtIG91dCwKIAkJCU9iamVjdElkIHRyZWUsIFN0cmluZyBwYXRoLCBGaWxlTW9kZSBtb2RlLCBPYmplY3RMb2FkZXIgbG9hZGVyKQpAQCAtMTA2LDcgKzEwMCw3IEBACiAJCQlmaW5hbCBUYXJBcmNoaXZlRW50cnkgZW50cnkgPSBuZXcgVGFyQXJjaGl2ZUVudHJ5KAogCQkJCQlwYXRoLCBUYXJDb25zdGFudHMuTEZfU1lNTElOSyk7CiAJCQllbnRyeS5zZXRMaW5rTmFtZShuZXcgU3RyaW5nKAotCQkJCQlsb2FkZXIuZ2V0Q2FjaGVkQnl0ZXMoMTAwKSwgIlVURi04IikpOyAvLyROT04tTkxTLTEkCisJCQkJCWxvYWRlci5nZXRDYWNoZWRCeXRlcygxMDApLCBDSEFSQUNURVJfRU5DT0RJTkcpKTsKIAkJCW91dC5wdXRBcmNoaXZlRW50cnkoZW50cnkpOwogCQkJb3V0LmNsb3NlQXJjaGl2ZUVudHJ5KCk7CiAJCQlyZXR1cm47CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9UYnoyRm9ybWF0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9UYnoyRm9ybWF0LmphdmEKaW5kZXggMmY5NWY2ZC4uZmE2YTdiMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FyY2hpdmUvVGJ6MkZvcm1hdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcmNoaXZlL1RiejJGb3JtYXQuamF2YQpAQCAtODMsMTUgKzgzLDYgQEAKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwotCUBEZXByZWNhdGVkCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHV0RW50cnkoQXJjaGl2ZU91dHB1dFN0cmVhbSBvdXQsCi0JCQlTdHJpbmcgcGF0aCwgRmlsZU1vZGUgbW9kZSwgT2JqZWN0TG9hZGVyIGxvYWRlcikKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXB1dEVudHJ5KG91dCwgbnVsbCwgcGF0aCwgbW9kZSxsb2FkZXIpOwotCX0KLQotCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgcHV0RW50cnkoQXJjaGl2ZU91dHB1dFN0cmVhbSBvdXQsCiAJCQlPYmplY3RJZCB0cmVlLCBTdHJpbmcgcGF0aCwgRmlsZU1vZGUgbW9kZSwgT2JqZWN0TG9hZGVyIGxvYWRlcikKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcmNoaXZlL1RnekZvcm1hdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FyY2hpdmUvVGd6Rm9ybWF0LmphdmEKaW5kZXggYjIyYTYyZC4uMzY4YjRmMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FyY2hpdmUvVGd6Rm9ybWF0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FyY2hpdmUvVGd6Rm9ybWF0LmphdmEKQEAgLTgzLDE1ICs4Myw2IEBACiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KLQlARGVwcmVjYXRlZAotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHB1dEVudHJ5KEFyY2hpdmVPdXRwdXRTdHJlYW0gb3V0LAotCQkJU3RyaW5nIHBhdGgsIEZpbGVNb2RlIG1vZGUsIE9iamVjdExvYWRlciBsb2FkZXIpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlwdXRFbnRyeShvdXQsIG51bGwsIHBhdGgsIG1vZGUsbG9hZGVyKTsKLQl9Ci0KLQkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHB1dEVudHJ5KEFyY2hpdmVPdXRwdXRTdHJlYW0gb3V0LAogCQkJT2JqZWN0SWQgdHJlZSwgU3RyaW5nIHBhdGgsIEZpbGVNb2RlIG1vZGUsIE9iamVjdExvYWRlciBsb2FkZXIpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9UeHpGb3JtYXQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcmNoaXZlL1R4ekZvcm1hdC5qYXZhCmluZGV4IGQyM2QyYjYuLjM2NjE2ZWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcmNoaXZlL1R4ekZvcm1hdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcmNoaXZlL1R4ekZvcm1hdC5qYXZhCkBAIC04MywxNSArODMsNiBAQAogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCi0JQERlcHJlY2F0ZWQKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwdXRFbnRyeShBcmNoaXZlT3V0cHV0U3RyZWFtIG91dCwKLQkJCVN0cmluZyBwYXRoLCBGaWxlTW9kZSBtb2RlLCBPYmplY3RMb2FkZXIgbG9hZGVyKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcHV0RW50cnkob3V0LCBudWxsLCBwYXRoLCBtb2RlLGxvYWRlcik7Ci0JfQotCi0JLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBwdXRFbnRyeShBcmNoaXZlT3V0cHV0U3RyZWFtIG91dCwKIAkJCU9iamVjdElkIHRyZWUsIFN0cmluZyBwYXRoLCBGaWxlTW9kZSBtb2RlLCBPYmplY3RMb2FkZXIgbG9hZGVyKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FyY2hpdmUvWmlwRm9ybWF0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9aaXBGb3JtYXQuamF2YQppbmRleCBkYzhmYjQ0Li44NDgzODAxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9aaXBGb3JtYXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9aaXBGb3JtYXQuamF2YQpAQCAtODQsMTUgKzg0LDYgQEAKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwotCUBEZXByZWNhdGVkCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHV0RW50cnkoQXJjaGl2ZU91dHB1dFN0cmVhbSBvdXQsCi0JCQlTdHJpbmcgcGF0aCwgRmlsZU1vZGUgbW9kZSwgT2JqZWN0TG9hZGVyIGxvYWRlcikKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXB1dEVudHJ5KG91dCwgbnVsbCwgcGF0aCwgbW9kZSxsb2FkZXIpOwotCX0KLQotCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgcHV0RW50cnkoQXJjaGl2ZU91dHB1dFN0cmVhbSBvdXQsCiAJCQlPYmplY3RJZCB0cmVlLCBTdHJpbmcgcGF0aCwgRmlsZU1vZGUgbW9kZSwgT2JqZWN0TG9hZGVyIGxvYWRlcikKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDExZjVkZmMuLjY5ZmI0N2MgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMyw3ICszLDcgQEAKIEJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZQogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZQotQnVuZGxlLVZlcnNpb246IDQuMTEuNC5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS44CiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1WZW5kb3I6ICVQcm92aWRlci1OYW1lCkBAIC0yMywxMCArMjMsMTAgQEAKICBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jbGllbnQ7dmVyc2lvbj0iWzQuMy4wLDUuMC4wKSIsCiAgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubjt2ZXJzaW9uPSJbNC4zLjAsNS4wLjApIiwKICBvcmcuYXBhY2hlLmh0dHAucGFyYW1zO3ZlcnNpb249Ils0LjMuMCw1LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cDt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5hcGFjaGU7dmVyc2lvbj0iNC4xMS40IjsKKyBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIgorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHAuYXBhY2hlO3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9Im9yZy5hcGFjaGUuaHR0cC5jbGllbnQsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLAogICAgb3JnLmFwYWNoZS5odHRwLmVudGl0eSwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvcG9tLnhtbAppbmRleCAzNTcxMWQxLi5iYzcxZmFhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS9wb20ueG1sCkBAIC00OCw3ICs0OCw3IEBACiAJPHBhcmVudD4KIAkJPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KIAkJPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0JCTx2ZXJzaW9uPjQuMTEuNC1TTkFQU0hPVDwvdmVyc2lvbj4KKwkJPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAJPC9wYXJlbnQ+CiAKIAk8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlPC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvaHR0cC9hcGFjaGUvSHR0cENsaWVudENvbm5lY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L2h0dHAvYXBhY2hlL0h0dHBDbGllbnRDb25uZWN0aW9uLmphdmEKaW5kZXggMjgxOTMwMC4uN2YxZmVjYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvaHR0cC9hcGFjaGUvSHR0cENsaWVudENvbm5lY3Rpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9odHRwL2FwYWNoZS9IdHRwQ2xpZW50Q29ubmVjdGlvbi5qYXZhCkBAIC00MjEsNyArNDIxLDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0SG9zdG5hbWVWZXJpZmllcihmaW5hbCBIb3N0bmFtZVZlcmlmaWVyIGhvc3RuYW1ldmVyaWZpZXIpIHsKKwlwdWJsaWMgdm9pZCBzZXRIb3N0bmFtZVZlcmlmaWVyKEhvc3RuYW1lVmVyaWZpZXIgaG9zdG5hbWV2ZXJpZmllcikgewogCQl0aGlzLmhvc3RuYW1ldmVyaWZpZXIgPSBob3N0bmFtZXZlcmlmaWVyOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggYjYyOGMyMC4uYzk3YjkyNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDEzICszLDEzIEBACiBCdW5kbGUtTmFtZTogJXBsdWdpbl9uYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIKLUJ1bmRsZS1WZXJzaW9uOiA0LjExLjQucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNS4wLjQucXVhbGlmaWVyCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlcl9uYW1lCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlcjt2ZXJzaW9uPSI0LjExLjQiLAotIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuZ2x1ZTt2ZXJzaW9uPSI0LjExLjQiOworRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXI7dmVyc2lvbj0iNS4wLjQiLAorIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuZ2x1ZTt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJqYXZheC5zZXJ2bGV0LGphdmF4LnNlcnZsZXQuaHR0cCIsCi0gb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5yZXNvbHZlcjt2ZXJzaW9uPSI0LjExLjQiOworIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIucmVzb2x2ZXI7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LApAQCAtMTgsMTIgKzE4LDEyIEBACiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuOAogSW1wb3J0LVBhY2thZ2U6IGphdmF4LnNlcnZsZXQ7dmVyc2lvbj0iWzIuNS4wLDMuMi4wKSIsCiAgamF2YXguc2VydmxldC5odHRwO3ZlcnNpb249IlsyLjUuMCwzLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIgorIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9wb20ueG1sCmluZGV4IGJlOTZlOWEuLjZmNzAwODEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3BvbS54bWwKQEAgLTUyLDcgKzUyLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuNC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlcjwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvQXNJc0ZpbGVGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvQXNJc0ZpbGVGaWx0ZXIuamF2YQppbmRleCA3ZjgyNmQ0Li45ZTlmMjVlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0FzSXNGaWxlRmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9Bc0lzRmlsZUZpbHRlci5qYXZhCkBAIC02Niw3ICs2Niw3IEBACiBjbGFzcyBBc0lzRmlsZUZpbHRlciBpbXBsZW1lbnRzIEZpbHRlciB7CiAJcHJpdmF0ZSBmaW5hbCBBc0lzRmlsZVNlcnZpY2UgYXNJczsKIAotCUFzSXNGaWxlRmlsdGVyKGZpbmFsIEFzSXNGaWxlU2VydmljZSBnZXRBbnlGaWxlKSB7CisJQXNJc0ZpbGVGaWx0ZXIoQXNJc0ZpbGVTZXJ2aWNlIGdldEFueUZpbGUpIHsKIAkJdGhpcy5hc0lzID0gZ2V0QW55RmlsZTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvRmlsZVNlbmRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9GaWxlU2VuZGVyLmphdmEKaW5kZXggMGQ5MzVmYy4uMDU1MTBhMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9GaWxlU2VuZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9GaWxlU2VuZGVyLmphdmEKQEAgLTg0LDcgKzg0LDcgQEAKIAogCXByaXZhdGUgbG9uZyBlbmQ7CiAKLQlGaWxlU2VuZGVyKGZpbmFsIEZpbGUgcGF0aCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisJRmlsZVNlbmRlcihGaWxlIHBhdGgpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewogCQl0aGlzLnBhdGggPSBwYXRoOwogCQl0aGlzLnNvdXJjZSA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKHBhdGgsICJyIik7CiAKQEAgLTIxNyw3ICsyMTcsNyBAQAogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBFbnVtZXJhdGlvbjxTdHJpbmc+IGdldFJhbmdlKGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKwlwcml2YXRlIHN0YXRpYyBFbnVtZXJhdGlvbjxTdHJpbmc+IGdldFJhbmdlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKIAkJcmV0dXJuIHJlcS5nZXRIZWFkZXJzKEhEUl9SQU5HRSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9HaXRTZXJ2bGV0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0dpdFNlcnZsZXQuamF2YQppbmRleCBlZTIzNjc3Li5kMGVhN2I2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0dpdFNlcnZsZXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0dpdFNlcnZsZXQuamF2YQpAQCAtMTgzLDcgKzE4Myw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXQoZmluYWwgU2VydmxldENvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBpbml0KFNlcnZsZXRDb25maWcgY29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CiAJCWdpdEZpbHRlci5pbml0KG5ldyBGaWx0ZXJDb25maWcoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBTdHJpbmcgZ2V0RmlsdGVyTmFtZSgpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvSW5mb1BhY2tzU2VydmxldC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9JbmZvUGFja3NTZXJ2bGV0LmphdmEKaW5kZXggODMwZTA2MS4uNTJhYWY1MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9JbmZvUGFja3NTZXJ2bGV0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9JbmZvUGFja3NTZXJ2bGV0LmphdmEKQEAgLTY3LDcgKzY3LDcgQEAKIAkJc2VuZFBsYWluVGV4dChwYWNrTGlzdChyZXEpLCByZXEsIHJzcCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHBhY2tMaXN0KGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGFja0xpc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgewogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIG91dCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAJCWZpbmFsIE9iamVjdERhdGFiYXNlIGRiID0gZ2V0UmVwb3NpdG9yeShyZXEpLmdldE9iamVjdERhdGFiYXNlKCk7CiAJCWlmIChkYiBpbnN0YW5jZW9mIE9iamVjdERpcmVjdG9yeSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9JbmZvUmVmc1NlcnZsZXQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvSW5mb1JlZnNTZXJ2bGV0LmphdmEKaW5kZXggNGY3MGNmNy4uMGY0NjMzYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9JbmZvUmVmc1NlcnZsZXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0luZm9SZWZzU2VydmxldC5qYXZhCkBAIC00NCwxOCArNDQsMTUgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlcjsKIAogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLlNlcnZsZXRVdGlscy5nZXRSZXBvc2l0b3J5OwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZEYXRhYmFzZS5BTEw7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CiBpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKIGltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5SZWZBZHZlcnRpc2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5IdHRwU3VwcG9ydDsKQEAgLTc5LDcgKzc2LDcgQEAKIAkJCQlDb25zdGFudHMuQ0hBUlNFVCkpIHsKIAkJCWZpbmFsIFJlZkFkdmVydGlzZXIgYWR2ID0gbmV3IFJlZkFkdmVydGlzZXIoKSB7CiAJCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgd3JpdGVPbmUoZmluYWwgQ2hhclNlcXVlbmNlIGxpbmUpCisJCQkJcHJvdGVjdGVkIHZvaWQgd3JpdGVPbmUoQ2hhclNlcXVlbmNlIGxpbmUpCiAJCQkJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCQkvLyBXaG9ldmVyIGRlY2lkZWQgdGhhdCBpbmZvL3JlZnMgc2hvdWxkIHVzZSBhIGRpZmZlcmVudAogCQkJCQkvLyBkZWxpbWl0ZXIgdGhhbiB0aGUgbmF0aXZlIGdpdDovLyBwcm90b2NvbCBzaG91bGRuJ3QKQEAgLTk0LDEwICs5MSw3IEBACiAJCQl9OwogCQkJYWR2LmluaXQoZGIpOwogCQkJYWR2LnNldERlcmVmVGFncyh0cnVlKTsKLQotCQkJTWFwPFN0cmluZywgUmVmPiByZWZzID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKEFMTCk7Ci0JCQlyZWZzLnJlbW92ZShDb25zdGFudHMuSEVBRCk7Ci0JCQlhZHYuc2VuZChyZWZzKTsKKwkJCWFkdi5zZW5kKGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmc0J5UHJlZml4KENvbnN0YW50cy5SX1JFRlMpKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvSXNMb2NhbEZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9Jc0xvY2FsRmlsdGVyLmphdmEKaW5kZXggYjBiODMxZi4uYjM3OTk4MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9Jc0xvY2FsRmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9Jc0xvY2FsRmlsdGVyLmphdmEKQEAgLTg4LDcgKzg4LDcgQEAKIAkJCSgoSHR0cFNlcnZsZXRSZXNwb25zZSkgcmVzcG9uc2UpLnNlbmRFcnJvcihTQ19GT1JCSURERU4pOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMb2NhbChmaW5hbCBSZXBvc2l0b3J5IGRiKSB7CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xvY2FsKFJlcG9zaXRvcnkgZGIpIHsKIAkJcmV0dXJuIGRiLmdldE9iamVjdERhdGFiYXNlKCkgaW5zdGFuY2VvZiBPYmplY3REaXJlY3Rvcnk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9PYmplY3RGaWxlU2VydmxldC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9PYmplY3RGaWxlU2VydmxldC5qYXZhCmluZGV4IDUwZGM2OGYuLjYyZjA3NWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvT2JqZWN0RmlsZVNlcnZsZXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL09iamVjdEZpbGVTZXJ2bGV0LmphdmEKQEAgLTc1LDcgKzc1LDcgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQlTdHJpbmcgZXRhZyhmaW5hbCBGaWxlU2VuZGVyIHNlbmRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGV0YWcoRmlsZVNlbmRlciBzZW5kZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlyZXR1cm4gTG9uZy50b0hleFN0cmluZyhzZW5kZXIuZ2V0TGFzdE1vZGlmaWVkKCkpOwogCQl9CiAJfQpAQCAtODgsNyArODgsNyBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCVN0cmluZyBldGFnKGZpbmFsIEZpbGVTZW5kZXIgc2VuZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlTdHJpbmcgZXRhZyhGaWxlU2VuZGVyIHNlbmRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXJldHVybiBzZW5kZXIuZ2V0VGFpbENoZWNrc3VtKCk7CiAJCX0KIAl9CkBAIC0xMTEsNyArMTExLDcgQEAKIAogCXByaXZhdGUgZmluYWwgU3RyaW5nIGNvbnRlbnRUeXBlOwogCi0JT2JqZWN0RmlsZVNlcnZsZXQoZmluYWwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7CisJT2JqZWN0RmlsZVNlcnZsZXQoU3RyaW5nIGNvbnRlbnRUeXBlKSB7CiAJCXRoaXMuY29udGVudFR5cGUgPSBjb250ZW50VHlwZTsKIAl9CiAKQEAgLTE3MCw3ICsxNzAsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZSBvYmplY3RzKGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKwlwcml2YXRlIHN0YXRpYyBGaWxlIG9iamVjdHMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgewogCQlmaW5hbCBSZXBvc2l0b3J5IGRiID0gZ2V0UmVwb3NpdG9yeShyZXEpOwogCQlyZXR1cm4gKChPYmplY3REaXJlY3RvcnkpIGRiLmdldE9iamVjdERhdGFiYXNlKCkpLmdldERpcmVjdG9yeSgpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvUmVwb3NpdG9yeUZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9SZXBvc2l0b3J5RmlsdGVyLmphdmEKaW5kZXggYzg5YTVkNy4uMDIwYmU0ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9SZXBvc2l0b3J5RmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9SZXBvc2l0b3J5RmlsdGVyLmphdmEKQEAgLTEwMCwxMyArMTAwLDEzIEBACiAJICogICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeX0gaW5zdGFuY2UgZm9yIHRoZQogCSAqICAgICAgICAgICAgY3VycmVudCB3ZWIgcmVxdWVzdC4KIAkgKi8KLQlwdWJsaWMgUmVwb3NpdG9yeUZpbHRlcihmaW5hbCBSZXBvc2l0b3J5UmVzb2x2ZXI8SHR0cFNlcnZsZXRSZXF1ZXN0PiByZXNvbHZlcikgeworCXB1YmxpYyBSZXBvc2l0b3J5RmlsdGVyKFJlcG9zaXRvcnlSZXNvbHZlcjxIdHRwU2VydmxldFJlcXVlc3Q+IHJlc29sdmVyKSB7CiAJCXRoaXMucmVzb2x2ZXIgPSByZXNvbHZlcjsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXQoZmluYWwgRmlsdGVyQ29uZmlnIGNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworCXB1YmxpYyB2b2lkIGluaXQoRmlsdGVyQ29uZmlnIGNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gewogCQljb250ZXh0ID0gY29uZmlnLmdldFNlcnZsZXRDb250ZXh0KCk7CiAJfQogCkBAIC0xNDAsOSArMTQwLDkgQEAKIAkJCXJldHVybjsKIAkJfQogCi0JCWZpbmFsIFJlcG9zaXRvcnkgZGI7Ci0JCXRyeSB7Ci0JCQlkYiA9IHJlc29sdmVyLm9wZW4ocmVxLCBuYW1lKTsKKwkJdHJ5IChSZXBvc2l0b3J5IGRiID0gcmVzb2x2ZXIub3BlbihyZXEsIG5hbWUpKSB7CisJCQlyZXF1ZXN0LnNldEF0dHJpYnV0ZShBVFRSSUJVVEVfUkVQT1NJVE9SWSwgZGIpOworCQkJY2hhaW4uZG9GaWx0ZXIocmVxdWVzdCwgcmVzcG9uc2UpOwogCQl9IGNhdGNoIChSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24gZSkgewogCQkJc2VuZEVycm9yKHJlcSwgcmVzLCBTQ19OT1RfRk9VTkQpOwogCQkJcmV0dXJuOwpAQCAtMTU1LDEzICsxNTUsOCBAQAogCQl9IGNhdGNoIChTZXJ2aWNlTWF5Tm90Q29udGludWVFeGNlcHRpb24gZSkgewogCQkJc2VuZEVycm9yKHJlcSwgcmVzLCBlLmdldFN0YXR1c0NvZGUoKSwgZS5nZXRNZXNzYWdlKCkpOwogCQkJcmV0dXJuOwotCQl9Ci0JCXRyeSB7Ci0JCQlyZXF1ZXN0LnNldEF0dHJpYnV0ZShBVFRSSUJVVEVfUkVQT1NJVE9SWSwgZGIpOwotCQkJY2hhaW4uZG9GaWx0ZXIocmVxdWVzdCwgcmVzcG9uc2UpOwogCQl9IGZpbmFsbHkgewogCQkJcmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUoQVRUUklCVVRFX1JFUE9TSVRPUlkpOwotCQkJZGIuY2xvc2UoKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvU2VydmxldFV0aWxzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1NlcnZsZXRVdGlscy5qYXZhCmluZGV4IGYxZmY1NDcuLjk2MDFjOGMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvU2VydmxldFV0aWxzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9TZXJ2bGV0VXRpbHMuamF2YQpAQCAtOTAsNyArOTAsNyBAQAogCSAqICAgICAgICAgICAgIHRoZSBmaWx0ZXIgcnVucyBiZWZvcmUgdGhlIHNlcnZsZXQuCiAJICogQHNlZSAjQVRUUklCVVRFX1JFUE9TSVRPUlkKIAkgKi8KLQlwdWJsaWMgc3RhdGljIFJlcG9zaXRvcnkgZ2V0UmVwb3NpdG9yeShmaW5hbCBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKwlwdWJsaWMgc3RhdGljIFJlcG9zaXRvcnkgZ2V0UmVwb3NpdG9yeShTZXJ2bGV0UmVxdWVzdCByZXEpIHsKIAkJUmVwb3NpdG9yeSBkYiA9IChSZXBvc2l0b3J5KSByZXEuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9SRVBPU0lUT1JZKTsKIAkJaWYgKGRiID09IG51bGwpCiAJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEh0dHBTZXJ2ZXJUZXh0LmdldCgpLmV4cGVjdGVkUmVwb3NpdG9yeUF0dHJpYnV0ZSk7CkBAIC0xMTAsNyArMTEwLDcgQEAKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgaWYgYW4gaW5wdXQgb3Igb3V0cHV0IGV4Y2VwdGlvbiBvY2N1cnJlZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpCisJcHVibGljIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShIdHRwU2VydmxldFJlcXVlc3QgcmVxKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJSW5wdXRTdHJlYW0gaW4gPSByZXEuZ2V0SW5wdXRTdHJlYW0oKTsKIAkJZmluYWwgU3RyaW5nIGVuYyA9IHJlcS5nZXRIZWFkZXIoSERSX0NPTlRFTlRfRU5DT0RJTkcpOwpAQCAtMjIwLDEyICsyMjAsOSBAQAogCXB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kKGJ5dGVbXSBjb250ZW50LCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLAogCQkJZmluYWwgSHR0cFNlcnZsZXRSZXNwb25zZSByc3ApIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWNvbnRlbnQgPSBzZW5kSW5pdChjb250ZW50LCByZXEsIHJzcCk7Ci0JCWZpbmFsIE91dHB1dFN0cmVhbSBvdXQgPSByc3AuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0JCXRyeSB7CisJCXRyeSAoT3V0cHV0U3RyZWFtIG91dCA9IHJzcC5nZXRPdXRwdXRTdHJlYW0oKSkgewogCQkJb3V0LndyaXRlKGNvbnRlbnQpOwogCQkJb3V0LmZsdXNoKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlvdXQuY2xvc2UoKTsKIAkJfQogCX0KIApAQCAtMjQxLDcgKzIzOCw3IEBACiAJCXJldHVybiBjb250ZW50OwogCX0KIAotCXN0YXRpYyBib29sZWFuIGFjY2VwdHNHemlwRW5jb2RpbmcoZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworCXN0YXRpYyBib29sZWFuIGFjY2VwdHNHemlwRW5jb2RpbmcoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgewogCQlyZXR1cm4gYWNjZXB0c0d6aXBFbmNvZGluZyhyZXEuZ2V0SGVhZGVyKEhEUl9BQ0NFUFRfRU5DT0RJTkcpKTsKIAl9CiAKQEAgLTI2MSw3ICsyNTgsNyBAQAogCQlyZXR1cm4gZmFsc2U7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGNvbXByZXNzKGZpbmFsIGJ5dGVbXSByYXcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGNvbXByZXNzKGJ5dGVbXSByYXcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGludCBtYXhMZW4gPSByYXcubGVuZ3RoICsgMzI7CiAJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKG1heExlbik7CiAJCWZpbmFsIEdaSVBPdXRwdXRTdHJlYW0gZ3ogPSBuZXcgR1pJUE91dHB1dFN0cmVhbShvdXQpOwpAQCAtMjcxLDcgKzI2OCw3IEBACiAJCXJldHVybiBvdXQudG9CeXRlQXJyYXkoKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXRhZyhmaW5hbCBieXRlW10gY29udGVudCkgeworCXByaXZhdGUgc3RhdGljIFN0cmluZyBldGFnKGJ5dGVbXSBjb250ZW50KSB7CiAJCWZpbmFsIE1lc3NhZ2VEaWdlc3QgbWQgPSBDb25zdGFudHMubmV3TWVzc2FnZURpZ2VzdCgpOwogCQltZC51cGRhdGUoY29udGVudCk7CiAJCXJldHVybiBPYmplY3RJZC5mcm9tUmF3KG1kLmRpZ2VzdCgpKS5nZXROYW1lKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1NtYXJ0T3V0cHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1NtYXJ0T3V0cHV0U3RyZWFtLmphdmEKaW5kZXggNGViOTRhMy4uYWQ1ZThkNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9TbWFydE91dHB1dFN0cmVhbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvU21hcnRPdXRwdXRTdHJlYW0uamF2YQpAQCAtMTEwLDExICsxMTAsOCBAQAogCQkJaWYgKDI1NiA8IG91dC5sZW5ndGgoKSAmJiBhY2NlcHRzR3ppcEVuY29kaW5nKHJlcSkpIHsKIAkJCQlUZW1wb3JhcnlCdWZmZXIgZ3pidWYgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkhlYXAoTElNSVQpOwogCQkJCXRyeSB7Ci0JCQkJCUdaSVBPdXRwdXRTdHJlYW0gZ3ppcCA9IG5ldyBHWklQT3V0cHV0U3RyZWFtKGd6YnVmKTsKLQkJCQkJdHJ5IHsKKwkJCQkJdHJ5IChHWklQT3V0cHV0U3RyZWFtIGd6aXAgPSBuZXcgR1pJUE91dHB1dFN0cmVhbShnemJ1ZikpIHsKIAkJCQkJCW91dC53cml0ZVRvKGd6aXAsIG51bGwpOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJZ3ppcC5jbG9zZSgpOwogCQkJCQl9CiAJCQkJCWlmIChnemJ1Zi5sZW5ndGgoKSA8IG91dC5sZW5ndGgoKSkgewogCQkJCQkJb3V0ID0gZ3pidWY7CkBAIC0xMzEsMTIgKzEyOCw5IEBACiAJCQkvLyBoYXJkY29kZWQgTElNSVQgY29uc3RhbnQgYWJvdmUgYXNzdXJlcyB1cyB3ZSB3b3VsZG4ndCBzdG9yZQogCQkJLy8gbW9yZSB0aGFuIDIgR2lCIG9mIGNvbnRlbnQgaW4gbWVtb3J5LgogCQkJcnNwLnNldENvbnRlbnRMZW5ndGgoKGludCkgb3V0Lmxlbmd0aCgpKTsKLQkJCWZpbmFsIE91dHB1dFN0cmVhbSBvcyA9IHJzcC5nZXRPdXRwdXRTdHJlYW0oKTsKLQkJCXRyeSB7CisJCQl0cnkgKE91dHB1dFN0cmVhbSBvcyA9IHJzcC5nZXRPdXRwdXRTdHJlYW0oKSkgewogCQkJCW91dC53cml0ZVRvKG9zLCBudWxsKTsKIAkJCQlvcy5mbHVzaCgpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlvcy5jbG9zZSgpOwogCQkJfQogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9TbWFydFNlcnZpY2VJbmZvUmVmcy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9TbWFydFNlcnZpY2VJbmZvUmVmcy5qYXZhCmluZGV4IDY0MTc4NzcuLjE5NWRmZjkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvU21hcnRTZXJ2aWNlSW5mb1JlZnMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1NtYXJ0U2VydmljZUluZm9SZWZzLmphdmEKQEAgLTc1LDcgKzc1LDcgQEAKIAogCXByaXZhdGUgZmluYWwgRmlsdGVyW10gZmlsdGVyczsKIAotCVNtYXJ0U2VydmljZUluZm9SZWZzKGZpbmFsIFN0cmluZyBzZXJ2aWNlLCBmaW5hbCBMaXN0PEZpbHRlcj4gZmlsdGVycykgeworCVNtYXJ0U2VydmljZUluZm9SZWZzKFN0cmluZyBzZXJ2aWNlLCBMaXN0PEZpbHRlcj4gZmlsdGVycykgewogCQl0aGlzLnN2YyA9IHNlcnZpY2U7CiAJCXRoaXMuZmlsdGVycyA9IGZpbHRlcnMudG9BcnJheShuZXcgRmlsdGVyW2ZpbHRlcnMuc2l6ZSgpXSk7CiAJfQpAQCAtMTMzLDkgKzEzMyw3IEBACiAJCQlyZXMuc2V0Q29udGVudFR5cGUoaW5mb1JlZnNSZXN1bHRUeXBlKHN2YykpOwogCiAJCQlmaW5hbCBQYWNrZXRMaW5lT3V0IG91dCA9IG5ldyBQYWNrZXRMaW5lT3V0KGJ1Zik7Ci0JCQlvdXQud3JpdGVTdHJpbmcoIiMgc2VydmljZT0iICsgc3ZjICsgIlxuIik7Ci0JCQlvdXQuZW5kKCk7Ci0JCQlhZHZlcnRpc2UocmVxLCBuZXcgUGFja2V0TGluZU91dFJlZkFkdmVydGlzZXIob3V0KSk7CisJCQlyZXNwb25kKHJlcSwgb3V0LCBzdmMpOwogCQkJYnVmLmNsb3NlKCk7CiAJCX0gY2F0Y2ggKFNlcnZpY2VOb3RBdXRob3JpemVkRXhjZXB0aW9uIGUpIHsKIAkJCXJlcy5zZW5kRXJyb3IoU0NfVU5BVVRIT1JJWkVELCBlLmdldE1lc3NhZ2UoKSk7CkBAIC0xNzgsNiArMTc2LDM3IEBACiAJCQlQYWNrZXRMaW5lT3V0UmVmQWR2ZXJ0aXNlciBwY2spIHRocm93cyBJT0V4Y2VwdGlvbiwKIAkJCVNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uLCBTZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbjsKIAorCS8qKgorCSAqIFdyaXRlcyB0aGUgYXBwcm9wcmlhdGUgcmVzcG9uc2UgdG8gYW4gaW5mby9yZWZzIHJlcXVlc3QgcmVjZWl2ZWQgYnkKKwkgKiBhIHNtYXJ0IHNlcnZpY2UuIEluIHByb3RvY29sIHYwLCB0aGlzIHN0YXJ0cyB3aXRoICIjCisJICogc2VydmljZT1zZXJ2aWNlTmFtZSIgZm9sbG93ZWQgYnkgYSBmbHVzaCBwYWNrZXQsIGJ1dCB0aGlzIGlzIG5vdAorCSAqIG5lY2Vzc2FyaWx5IHRoZSBjYXNlIGluIG90aGVyIHByb3RvY29sIHZlcnNpb25zLgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHdyaXRlcyAiIyBzZXJ2aWNlPXNlcnZpY2VOYW1lIiBhbmQgYQorCSAqIGZsdXNoIHBhY2tldCwgdGhlbiBjYWxscyB7QGxpbmsgI2FkdmVydGlzZX0uIFN1YmNsYXNzZXMgc2hvdWxkCisJICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhleSBzdXBwb3J0IHByb3RvY29sIHZlcnNpb25zIG90aGVyIHRoYW4KKwkgKiBwcm90b2NvbCB2MC4KKwkgKgorCSAqIEBwYXJhbSByZXEKKwkgKiAgICAgICAgICAgIHJlcXVlc3QKKwkgKiBAcGFyYW0gcGNrT3V0CisJICogICAgICAgICAgICBkZXN0aW5hdGlvbiBvZiByZXNwb25zZQorCSAqIEBwYXJhbSBzZXJ2aWNlTmFtZQorCSAqICAgICAgICAgICAgc2VydmljZSBuYW1lIHRvIGJlIHdyaXR0ZW4gb3V0IGluIHByb3RvY29sIHYwOyBtYXkgb3IgbWF5CisJICogICAgICAgICAgICBub3QgYmUgdXNlZCBpbiBvdGhlciB2ZXJzaW9ucworCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKiBAdGhyb3dzIFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uCisJICogQHRocm93cyBTZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbgorCSAqLworCXByb3RlY3RlZCB2b2lkIHJlc3BvbmQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKKwkJCVBhY2tldExpbmVPdXQgcGNrT3V0LCBTdHJpbmcgc2VydmljZU5hbWUpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uLAorCQkJU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb24geworCQlwY2tPdXQud3JpdGVTdHJpbmcoIiMgc2VydmljZT0iICsgc3ZjICsgJ1xuJyk7IC8vJE5PTi1OTFMtMSQKKwkJcGNrT3V0LmVuZCgpOworCQlhZHZlcnRpc2UocmVxLCBuZXcgUGFja2V0TGluZU91dFJlZkFkdmVydGlzZXIocGNrT3V0KSk7CisJfQorCiAJcHJpdmF0ZSBjbGFzcyBDaGFpbiBpbXBsZW1lbnRzIEZpbHRlckNoYWluIHsKIAkJcHJpdmF0ZSBpbnQgZmlsdGVySWR4OwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1RleHRGaWxlU2VydmxldC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9UZXh0RmlsZVNlcnZsZXQuamF2YQppbmRleCAwMDg1MWNmLi5iMjQ2NmQwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1RleHRGaWxlU2VydmxldC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvVGV4dEZpbGVTZXJ2bGV0LmphdmEKQEAgLTY0LDcgKzY0LDcgQEAKIAogCXByaXZhdGUgZmluYWwgU3RyaW5nIGZpbGVOYW1lOwogCi0JVGV4dEZpbGVTZXJ2bGV0KGZpbmFsIFN0cmluZyBuYW1lKSB7CisJVGV4dEZpbGVTZXJ2bGV0KFN0cmluZyBuYW1lKSB7CiAJCXRoaXMuZmlsZU5hbWUgPSBuYW1lOwogCX0KIApAQCAtODAsNyArODAsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBieXRlW10gcmVhZChmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgYnl0ZVtdIHJlYWQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgRmlsZSBnaXRkaXIgPSBnZXRSZXBvc2l0b3J5KHJlcSkuZ2V0RGlyZWN0b3J5KCk7CiAJCWlmIChnaXRkaXIgPT0gbnVsbCkKIAkJCXRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oZmlsZU5hbWUpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9VcGxvYWRQYWNrU2VydmxldC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9VcGxvYWRQYWNrU2VydmxldC5qYXZhCmluZGV4IDNlOWMxZmUuLmNhNmI3NDkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvVXBsb2FkUGFja1NlcnZsZXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1VwbG9hZFBhY2tTZXJ2bGV0LmphdmEKQEAgLTc2LDYgKzc2LDcgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuSW50ZXJuYWxIdHRwU2VydmVyR2x1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5QYWNrZXRMaW5lT3V0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlJlZkFkdmVydGlzZXIuUGFja2V0TGluZU91dFJlZkFkdmVydGlzZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuU2VydmljZU1heU5vdENvbnRpbnVlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlVwbG9hZFBhY2s7CkBAIC0xMTcsNiArMTE4LDI1IEBACiAJCQkJdXAuc2V0QmlEaXJlY3Rpb25hbFBpcGUoZmFsc2UpOwogCQkJCXVwLnNlbmRBZHZlcnRpc2VkUmVmcyhwY2spOwogCQkJfSBmaW5hbGx5IHsKKwkJCQkvLyBUT0RPKGpvbmF0aGFudGFubXkpOiBNb3ZlIHJlc3BvbnNpYmlsaXR5IGZvciBjbG9zaW5nIHRoZQorCQkJCS8vIFJldldhbGsgdG8gVXBsb2FkUGFjaywgZWl0aGVyIGJ5IG1ha2luZyBpdCBBdXRvQ2xvc2VhYmxlCisJCQkJLy8gb3IgYnkgbWFraW5nIHNlbmRBZHZlcnRpc2VkUmVmcyBjbGVhbiB1cCBhZnRlciBpdHNlbGYuCisJCQkJdXAuZ2V0UmV2V2FsaygpLmNsb3NlKCk7CisJCQl9CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgcmVzcG9uZChIdHRwU2VydmxldFJlcXVlc3QgcmVxLAorCQkJCVBhY2tldExpbmVPdXQgcGNrT3V0LCBTdHJpbmcgc2VydmljZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwKKwkJCQlTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbiwgU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb24geworCQkJVXBsb2FkUGFjayB1cCA9IChVcGxvYWRQYWNrKSByZXEuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9IQU5ETEVSKTsKKwkJCXRyeSB7CisJCQkJdXAuc2V0QmlEaXJlY3Rpb25hbFBpcGUoZmFsc2UpOworCQkJCXVwLnNlbmRBZHZlcnRpc2VkUmVmcyhuZXcgUGFja2V0TGluZU91dFJlZkFkdmVydGlzZXIocGNrT3V0KSwgc2VydmljZU5hbWUpOworCQkJfSBmaW5hbGx5IHsKKwkJCQkvLyBUT0RPKGpvbmF0aGFudGFubXkpOiBNb3ZlIHJlc3BvbnNpYmlsaXR5IGZvciBjbG9zaW5nIHRoZQorCQkJCS8vIFJldldhbGsgdG8gVXBsb2FkUGFjaywgZWl0aGVyIGJ5IG1ha2luZyBpdCBBdXRvQ2xvc2VhYmxlCisJCQkJLy8gb3IgYnkgbWFraW5nIHNlbmRBZHZlcnRpc2VkUmVmcyBjbGVhbiB1cCBhZnRlciBpdHNlbGYuCiAJCQkJdXAuZ2V0UmV2V2FsaygpLmNsb3NlKCk7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9FcnJvclNlcnZsZXQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9FcnJvclNlcnZsZXQuamF2YQppbmRleCA1N2ZkZGRhLi42ZjI3YjI4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL2dsdWUvRXJyb3JTZXJ2bGV0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9nbHVlL0Vycm9yU2VydmxldC5qYXZhCkBAIC02NCw3ICs2NCw3IEBACiAJICogQHBhcmFtIHN0YXR1cwogCSAqICAgICAgICAgICAgdGhlIEhUVFAgc3RhdHVzIGNvZGUgdG8gYWx3YXlzIHNlbmQuCiAJICovCi0JcHVibGljIEVycm9yU2VydmxldChmaW5hbCBpbnQgc3RhdHVzKSB7CisJcHVibGljIEVycm9yU2VydmxldChpbnQgc3RhdHVzKSB7CiAJCXRoaXMuc3RhdHVzID0gc3RhdHVzOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9nbHVlL1JlZ2V4R3JvdXBGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9SZWdleEdyb3VwRmlsdGVyLmphdmEKaW5kZXggYTNkYzZjMy4uZjI2ZWJjMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9nbHVlL1JlZ2V4R3JvdXBGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL2dsdWUvUmVnZXhHcm91cEZpbHRlci5qYXZhCkBAIC03NSw3ICs3NSw3IEBACiAJICogQHBhcmFtIGdyb3VwSWR4CiAJICogICAgICAgICAgICBjYXB0dXJlIGdyb3VwIG51bWJlciwgMSB0aHJvdWdoIHRoZSBudW1iZXIgb2YgZ3JvdXBzLgogCSAqLwotCXB1YmxpYyBSZWdleEdyb3VwRmlsdGVyKGZpbmFsIGludCBncm91cElkeCkgeworCXB1YmxpYyBSZWdleEdyb3VwRmlsdGVyKGludCBncm91cElkeCkgewogCQlpZiAoZ3JvdXBJZHggPCAxKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQkJSHR0cFNlcnZlclRleHQuZ2V0KCkuaW52YWxpZEluZGV4LCB2YWx1ZU9mKGdyb3VwSWR4KSkpOwpAQCAtMTA4LDcgKzEwOCw3IEBACiAJCQkJCXZhbHVlT2YoZ3JvdXBJZHggKyAxKSkpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIFdyYXBwZWRSZXF1ZXN0W10gZ3JvdXBzRm9yKGZpbmFsIFNlcnZsZXRSZXF1ZXN0IHIpIHsKKwlwcml2YXRlIHN0YXRpYyBXcmFwcGVkUmVxdWVzdFtdIGdyb3Vwc0ZvcihTZXJ2bGV0UmVxdWVzdCByKSB7CiAJCXJldHVybiAoV3JhcHBlZFJlcXVlc3RbXSkgci5nZXRBdHRyaWJ1dGUoTWV0YUZpbHRlci5SRUdFWF9HUk9VUFMpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9SZWdleFBpcGVsaW5lLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL2dsdWUvUmVnZXhQaXBlbGluZS5qYXZhCmluZGV4IGJmMmQ2ZGIuLjAxMDgxMDUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9SZWdleFBpcGVsaW5lLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9nbHVlL1JlZ2V4UGlwZWxpbmUuamF2YQpAQCAtODcsMTEgKzg3LDExIEBACiAJc3RhdGljIGNsYXNzIEJpbmRlciBleHRlbmRzIFNlcnZsZXRCaW5kZXJJbXBsIHsKIAkJcHJpdmF0ZSBmaW5hbCBQYXR0ZXJuIHBhdHRlcm47CiAKLQkJQmluZGVyKGZpbmFsIFN0cmluZyBwKSB7CisJCUJpbmRlcihTdHJpbmcgcCkgewogCQkJcGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZShwKTsKIAkJfQogCi0JCUJpbmRlcihmaW5hbCBQYXR0ZXJuIHApIHsKKwkJQmluZGVyKFBhdHRlcm4gcCkgewogCQkJcGF0dGVybiA9IHA7CiAJCX0KIApAQCAtMTEwLDcgKzExMCw3IEBACiAJfQogCiAJQE92ZXJyaWRlCi0JYm9vbGVhbiBtYXRjaChmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisJYm9vbGVhbiBtYXRjaChIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CiAJCWZpbmFsIFN0cmluZyBwYXRoSW5mbyA9IHJlcS5nZXRQYXRoSW5mbygpOwogCQlyZXR1cm4gcGF0aEluZm8gIT0gbnVsbCAmJiBwYXR0ZXJuLm1hdGNoZXIocGF0aEluZm8pLm1hdGNoZXMoKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL2dsdWUvU3VmZml4UGlwZWxpbmUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9TdWZmaXhQaXBlbGluZS5qYXZhCmluZGV4IDY3NDJjOWYuLjRmZDk5YzYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9TdWZmaXhQaXBlbGluZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9TdWZmaXhQaXBlbGluZS5qYXZhCkBAIC02Nyw3ICs2Nyw3IEBACiAJc3RhdGljIGNsYXNzIEJpbmRlciBleHRlbmRzIFNlcnZsZXRCaW5kZXJJbXBsIHsKIAkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc3VmZml4OwogCi0JCUJpbmRlcihmaW5hbCBTdHJpbmcgc3VmZml4KSB7CisJCUJpbmRlcihTdHJpbmcgc3VmZml4KSB7CiAJCQl0aGlzLnN1ZmZpeCA9IHN1ZmZpeDsKIAkJfQogCkBAIC04OSw3ICs4OSw3IEBACiAJfQogCiAJQE92ZXJyaWRlCi0JYm9vbGVhbiBtYXRjaChmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisJYm9vbGVhbiBtYXRjaChIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CiAJCWZpbmFsIFN0cmluZyBwYXRoSW5mbyA9IHJlcS5nZXRQYXRoSW5mbygpOwogCQlyZXR1cm4gcGF0aEluZm8gIT0gbnVsbCAmJiBwYXRoSW5mby5lbmRzV2l0aChzdWZmaXgpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9VcmxQaXBlbGluZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9nbHVlL1VybFBpcGVsaW5lLmphdmEKaW5kZXggNTZlNGUyMi4uYzAyMzk5YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9nbHVlL1VybFBpcGVsaW5lLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9nbHVlL1VybFBpcGVsaW5lLmphdmEKQEAgLTc5LDcgKzc5LDcgQEAKIAkvKiogSW5zdGFuY2UgdGhhdCBtdXN0IGdlbmVyYXRlIHRoZSByZXNwb25zZTsgbmV2ZXIgbnVsbC4gKi8KIAlwcml2YXRlIGZpbmFsIEh0dHBTZXJ2bGV0IHNlcnZsZXQ7CiAKLQlVcmxQaXBlbGluZShmaW5hbCBGaWx0ZXJbXSBmaWx0ZXJzLCBmaW5hbCBIdHRwU2VydmxldCBzZXJ2bGV0KSB7CisJVXJsUGlwZWxpbmUoRmlsdGVyW10gZmlsdGVycywgSHR0cFNlcnZsZXQgc2VydmxldCkgewogCQl0aGlzLmZpbHRlcnMgPSBmaWx0ZXJzOwogCQl0aGlzLnNlcnZsZXQgPSBzZXJ2bGV0OwogCX0KQEAgLTk5LDcgKzk5LDcgQEAKIAkgKiBAdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBhIGZpbHRlciBvciBzZXJ2bGV0IGlzIHVuYWJsZSB0byBpbml0aWFsaXplLgogCSAqLwotCXZvaWQgaW5pdChmaW5hbCBTZXJ2bGV0Q29udGV4dCBjb250ZXh0LCBmaW5hbCBTZXQ8T2JqZWN0PiBpbml0ZWQpCisJdm9pZCBpbml0KFNlcnZsZXRDb250ZXh0IGNvbnRleHQsIFNldDxPYmplY3Q+IGluaXRlZCkKIAkJCXRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKIAkJZm9yIChGaWx0ZXIgcmVmIDogZmlsdGVycykKIAkJCWluaXRGaWx0ZXIocmVmLCBjb250ZXh0LCBpbml0ZWQpOwpAQCAtMTY1LDcgKzE2NSw3IEBACiAJICogICAgICAgICAgICBkZXN0cm95ZWQgYSBzZWNvbmQgdGltZS4gRmlsdGVycyBhbmQgc2VydmxldHMgdGhhdCBhcmUgZmlyc3QKIAkgKiAgICAgICAgICAgIGRlc3Ryb3llZCBieSB0aGlzIHBpcGVsaW5lIHdpbGwgYmUgYWRkZWQgdG8gdGhpcyBzZXQuCiAJICovCi0Jdm9pZCBkZXN0cm95KGZpbmFsIFNldDxPYmplY3Q+IGRlc3Ryb3llZCkgeworCXZvaWQgZGVzdHJveShTZXQ8T2JqZWN0PiBkZXN0cm95ZWQpIHsKIAkJZm9yIChGaWx0ZXIgcmVmIDogZmlsdGVycykKIAkJCWRlc3Ryb3lGaWx0ZXIocmVmLCBkZXN0cm95ZWQpOwogCQlkZXN0cm95U2VydmxldChzZXJ2bGV0LCBkZXN0cm95ZWQpOwpAQCAtMjMwLDcgKzIzMCw3IEBACiAKIAkJcHJpdmF0ZSBpbnQgZmlsdGVySWR4OwogCi0JCUNoYWluKGZpbmFsIEZpbHRlcltdIGZpbHRlcnMsIGZpbmFsIEh0dHBTZXJ2bGV0IHNlcnZsZXQpIHsKKwkJQ2hhaW4oRmlsdGVyW10gZmlsdGVycywgSHR0cFNlcnZsZXQgc2VydmxldCkgewogCQkJdGhpcy5maWx0ZXJzID0gZmlsdGVyczsKIAkJCXRoaXMuc2VydmxldCA9IHNlcnZsZXQ7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvcmVzb2x2ZXIvQXNJc0ZpbGVTZXJ2aWNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL3Jlc29sdmVyL0FzSXNGaWxlU2VydmljZS5qYXZhCmluZGV4IDExYWQ1ZTAuLjlhOTI4YjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvcmVzb2x2ZXIvQXNJc0ZpbGVTZXJ2aWNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9yZXNvbHZlci9Bc0lzRmlsZVNlcnZpY2UuamF2YQpAQCAtNzMsNyArNzMsNyBAQAogCXByaXZhdGUgc3RhdGljIGNsYXNzIFNlcnZpY2VDb25maWcgewogCQlmaW5hbCBib29sZWFuIGVuYWJsZWQ7CiAKLQkJU2VydmljZUNvbmZpZyhmaW5hbCBDb25maWcgY2ZnKSB7CisJCVNlcnZpY2VDb25maWcoQ29uZmlnIGNmZykgewogCQkJZW5hYmxlZCA9IGNmZy5nZXRCb29sZWFuKCJodHRwIiwgImdldGFueWZpbGUiLCB0cnVlKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvcmVzb2x2ZXIvRGVmYXVsdFJlY2VpdmVQYWNrRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9yZXNvbHZlci9EZWZhdWx0UmVjZWl2ZVBhY2tGYWN0b3J5LmphdmEKaW5kZXggOTVlYjhkNS4uMDZhOGY1ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9yZXNvbHZlci9EZWZhdWx0UmVjZWl2ZVBhY2tGYWN0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9yZXNvbHZlci9EZWZhdWx0UmVjZWl2ZVBhY2tGYWN0b3J5LmphdmEKQEAgLTc0LDcgKzc0LDcgQEAKIAogCQlmaW5hbCBib29sZWFuIGVuYWJsZWQ7CiAKLQkJU2VydmljZUNvbmZpZyhmaW5hbCBDb25maWcgY2ZnKSB7CisJCVNlcnZpY2VDb25maWcoQ29uZmlnIGNmZykgewogCQkJc2V0ID0gY2ZnLmdldFN0cmluZygiaHR0cCIsIG51bGwsICJyZWNlaXZlcGFjayIpICE9IG51bGw7CiAJCQllbmFibGVkID0gY2ZnLmdldEJvb2xlYW4oImh0dHAiLCAicmVjZWl2ZXBhY2siLCBmYWxzZSk7CiAJCX0KQEAgLTgyLDcgKzgyLDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIFJlY2VpdmVQYWNrIGNyZWF0ZShmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBmaW5hbCBSZXBvc2l0b3J5IGRiKQorCXB1YmxpYyBSZWNlaXZlUGFjayBjcmVhdGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgUmVwb3NpdG9yeSBkYikKIAkJCXRocm93cyBTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbiwgU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb24gewogCQlmaW5hbCBTZXJ2aWNlQ29uZmlnIGNmZyA9IGRiLmdldENvbmZpZygpLmdldChTZXJ2aWNlQ29uZmlnOjpuZXcpOwogCQlTdHJpbmcgdXNlciA9IHJlcS5nZXRSZW1vdGVVc2VyKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL3Jlc29sdmVyL0RlZmF1bHRVcGxvYWRQYWNrRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9yZXNvbHZlci9EZWZhdWx0VXBsb2FkUGFja0ZhY3RvcnkuamF2YQppbmRleCBmNWFmYTFlLi5hNjlmYWIwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL3Jlc29sdmVyL0RlZmF1bHRVcGxvYWRQYWNrRmFjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvcmVzb2x2ZXIvRGVmYXVsdFVwbG9hZFBhY2tGYWN0b3J5LmphdmEKQEAgLTQzLDYgKzQzLDggQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLnJlc29sdmVyOwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKwogaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CkBAIC02NCwxOCArNjYsMjUgQEAKIAlwcml2YXRlIHN0YXRpYyBjbGFzcyBTZXJ2aWNlQ29uZmlnIHsKIAkJZmluYWwgYm9vbGVhbiBlbmFibGVkOwogCi0JCVNlcnZpY2VDb25maWcoZmluYWwgQ29uZmlnIGNmZykgeworCQlTZXJ2aWNlQ29uZmlnKENvbmZpZyBjZmcpIHsKIAkJCWVuYWJsZWQgPSBjZmcuZ2V0Qm9vbGVhbigiaHR0cCIsICJ1cGxvYWRwYWNrIiwgdHJ1ZSk7CiAJCX0KIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBVcGxvYWRQYWNrIGNyZWF0ZShmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBmaW5hbCBSZXBvc2l0b3J5IGRiKQorCXB1YmxpYyBVcGxvYWRQYWNrIGNyZWF0ZShIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBSZXBvc2l0b3J5IGRiKQogCQkJdGhyb3dzIFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uLCBTZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbiB7Ci0JCWlmIChkYi5nZXRDb25maWcoKS5nZXQoU2VydmljZUNvbmZpZzo6bmV3KS5lbmFibGVkKQotCQkJcmV0dXJuIG5ldyBVcGxvYWRQYWNrKGRiKTsKLQkJZWxzZQorCQlpZiAoZGIuZ2V0Q29uZmlnKCkuZ2V0KFNlcnZpY2VDb25maWc6Om5ldykuZW5hYmxlZCkgeworCQkJVXBsb2FkUGFjayB1cCA9IG5ldyBVcGxvYWRQYWNrKGRiKTsKKwkJCVN0cmluZyBoZWFkZXIgPSByZXEuZ2V0SGVhZGVyKCJHaXQtUHJvdG9jb2wiKTsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKGhlYWRlciAhPSBudWxsKSB7CisJCQkJU3RyaW5nW10gcGFyYW1zID0gaGVhZGVyLnNwbGl0KCI6Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQl1cC5zZXRFeHRyYVBhcmFtZXRlcnMoQXJyYXlzLmFzTGlzdChwYXJhbXMpKTsKKwkJCX0KKwkJCXJldHVybiB1cDsKKwkJfSBlbHNlIHsKIAkJCXRocm93IG5ldyBTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbigpOworCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCBiNGI3ZGU2Li44YmIyODJlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMywxNCArMywxNCBAQAogQnVuZGxlLU5hbWU6ICVwbHVnaW5fbmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdAogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QKLUJ1bmRsZS1WZXJzaW9uOiA0LjExLjQucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNS4wLjQucXVhbGlmaWVyCiBCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJfbmFtZQogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuOAogSW1wb3J0LVBhY2thZ2U6IGphdmF4LnNlcnZsZXQ7dmVyc2lvbj0iWzIuNS4wLDMuMi4wKSIsCiAgamF2YXguc2VydmxldC5odHRwO3ZlcnNpb249IlsyLjUuMCwzLjIuMCkiLAotIG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYzt2ZXJzaW9uPSJbMS42LjAsIDIuMC4wKSIsCi0gb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmJpbmFyeTt2ZXJzaW9uPSJbMS42LjAsIDIuMC4wKSIsCisgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjO3ZlcnNpb249IlsxLjYuMCwyLjAuMCkiLAorIG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5iaW5hcnk7dmVyc2lvbj0iWzEuNi4wLDIuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamV0dHkuY29udGludWF0aW9uO3ZlcnNpb249Ils5LjQuNSwxMC4wLjApIiwKICBvcmcuZWNsaXBzZS5qZXR0eS5odHRwO3ZlcnNpb249Ils5LjQuNSwxMC4wLjApIiwKICBvcmcuZWNsaXBzZS5qZXR0eS5pbzt2ZXJzaW9uPSJbOS40LjUsMTAuMC4wKSIsCkBAIC0yNSwyNSArMjUsMjYgQEAKICBvcmcuZWNsaXBzZS5qZXR0eS51dGlsLmxvZzt2ZXJzaW9uPSJbOS40LjUsMTAuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamV0dHkudXRpbC5zZWN1cml0eTt2ZXJzaW9uPSJbOS40LjUsMTAuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamV0dHkudXRpbC50aHJlYWQ7dmVyc2lvbj0iWzkuNC41LDEwLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlcjt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuZ2x1ZTt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIucmVzb2x2ZXI7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cDt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cDt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHAuYXBhY2hlO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuZ2x1ZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLnJlc29sdmVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWw7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHA7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5hcGFjaGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5oYW1jcmVzdDt2ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKICBvcmcuaGFtY3Jlc3QuY29yZTt2ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTIsNS4wLjApIiwKICBvcmcuanVuaXQucnVubmVyO3ZlcnNpb249Ils0LjEyLDUuMC4wKSIsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvcG9tLnhtbAppbmRleCBkZmU2Mzg4Li43YjgzMjQwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3BvbS54bWwKQEAgLTUxLDcgKzUxLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuNC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3Q8L2FydGlmYWN0SWQ+CkBAIC04NCw2ICs4NCwxMyBAQAogICAgIDwvZGVwZW5kZW5jeT4KIAogICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmhhbWNyZXN0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+aGFtY3Jlc3QtbGlicmFyeTwvYXJ0aWZhY3RJZD4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgIDx2ZXJzaW9uPlsxLjEuMCwyLjAuMCk8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwPC9hcnRpZmFjdElkPgogICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0FzSXNTZXJ2aWNlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0FzSXNTZXJ2aWNlVGVzdC5qYXZhCmluZGV4IGU5NGE3OTIuLjI5OGJmMjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9Bc0lzU2VydmljZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvQXNJc1NlcnZpY2VUZXN0LmphdmEKQEAgLTEzMyw3ICsxMzMsNyBAQAogCiAJCXByaXZhdGUgZmluYWwgU3RyaW5nIGhvc3Q7CiAKLQkJUihmaW5hbCBTdHJpbmcgdXNlciwgZmluYWwgU3RyaW5nIGhvc3QpIHsKKwkJUihTdHJpbmcgdXNlciwgU3RyaW5nIGhvc3QpIHsKIAkJCXN1cGVyKG5ldyBSZXF1ZXN0KG51bGwsIG51bGwpIC8qIGNhbid0IHBhc3MgbnVsbCwgc2lnaCAqLyk7CiAJCQl0aGlzLnVzZXIgPSB1c2VyOwogCQkJdGhpcy5ob3N0ID0gaG9zdDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9EZWZhdWx0UmVjZWl2ZVBhY2tGYWN0b3J5VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0RlZmF1bHRSZWNlaXZlUGFja0ZhY3RvcnlUZXN0LmphdmEKaW5kZXggYjI0ZTJkZi4uYWRlMWUxZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0RlZmF1bHRSZWNlaXZlUGFja0ZhY3RvcnlUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0RlZmF1bHRSZWNlaXZlUGFja0ZhY3RvcnlUZXN0LmphdmEKQEAgLTIwNSw3ICsyMDUsNyBAQAogCiAJCXByaXZhdGUgZmluYWwgU3RyaW5nIGhvc3Q7CiAKLQkJUihmaW5hbCBTdHJpbmcgdXNlciwgZmluYWwgU3RyaW5nIGhvc3QpIHsKKwkJUihTdHJpbmcgdXNlciwgU3RyaW5nIGhvc3QpIHsKIAkJCXN1cGVyKG5ldyBSZXF1ZXN0KG51bGwsIG51bGwpIC8qIGNhbid0IHBhc3MgbnVsbCwgc2lnaCAqLyk7CiAJCQl0aGlzLnVzZXIgPSB1c2VyOwogCQkJdGhpcy5ob3N0ID0gaG9zdDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9EZWZhdWx0VXBsb2FkUGFja0ZhY3RvcnlUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvRGVmYXVsdFVwbG9hZFBhY2tGYWN0b3J5VGVzdC5qYXZhCmluZGV4IGNlMjRkNjQuLjI2OGMyODEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9EZWZhdWx0VXBsb2FkUGFja0ZhY3RvcnlUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0RlZmF1bHRVcGxvYWRQYWNrRmFjdG9yeVRlc3QuamF2YQpAQCAtMTYxLDcgKzE2MSw3IEBACiAKIAkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaG9zdDsKIAotCQlSKGZpbmFsIFN0cmluZyB1c2VyLCBmaW5hbCBTdHJpbmcgaG9zdCkgeworCQlSKFN0cmluZyB1c2VyLCBTdHJpbmcgaG9zdCkgewogCQkJc3VwZXIobmV3IFJlcXVlc3QobnVsbCwgbnVsbCkgLyogY2FuJ3QgcGFzcyBudWxsLCBzaWdoICovKTsKIAkJCXRoaXMudXNlciA9IHVzZXI7CiAJCQl0aGlzLmhvc3QgPSBob3N0OwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0h0dHBDbGllbnRUZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0h0dHBDbGllbnRUZXN0cy5qYXZhCmluZGV4IDZkYmUwZTMuLmVmMDU5YmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9IdHRwQ2xpZW50VGVzdHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvSHR0cENsaWVudFRlc3RzLmphdmEKQEAgLTQzLDE1ICs0MywyMCBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0OwogCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLnRoZUluc3RhbmNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVSTDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CkBAIC03NSw5ICs4MCwxMyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlN0b3JlZENvbmZpZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkZldGNoQ29ubmVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5QYWNrZXRMaW5lSW47CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUGFja2V0TGluZU91dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5UcmFuc3BvcnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuVVJJaXNoOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlVzZXJuYW1lUGFzc3dvcmRDcmVkZW50aWFsc1Byb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHAuSHR0cENvbm5lY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5KREtIdHRwQ29ubmVjdGlvbkZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXIuUmVwb3NpdG9yeVJlc29sdmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyLlNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CkBAIC0xMTgsNyArMTI3LDcgQEAKIAkJc21hcnRBdXRoQmFzaWNVUkkgPSB0b1VSSWlzaChzQmFzaWMsIHNyY05hbWUpOwogCX0KIAotCXByaXZhdGUgU2VydmxldENvbnRleHRIYW5kbGVyIGR1bWIoZmluYWwgU3RyaW5nIHBhdGgpIHsKKwlwcml2YXRlIFNlcnZsZXRDb250ZXh0SGFuZGxlciBkdW1iKFN0cmluZyBwYXRoKSB7CiAJCWZpbmFsIEZpbGUgc3JjR2l0ID0gcmVtb3RlUmVwb3NpdG9yeS5nZXRSZXBvc2l0b3J5KCkuZ2V0RGlyZWN0b3J5KCk7CiAJCWZpbmFsIFVSSSBiYXNlID0gc3JjR2l0LmdldFBhcmVudEZpbGUoKS50b1VSSSgpOwogCkBAIC0xMzAsNyArMTM5LDcgQEAKIAkJcmV0dXJuIGN0eDsKIAl9CiAKLQlwcml2YXRlIFNlcnZsZXRDb250ZXh0SGFuZGxlciBzbWFydChmaW5hbCBTdHJpbmcgcGF0aCkgeworCXByaXZhdGUgU2VydmxldENvbnRleHRIYW5kbGVyIHNtYXJ0KFN0cmluZyBwYXRoKSB7CiAJCUdpdFNlcnZsZXQgZ3MgPSBuZXcgR2l0U2VydmxldCgpOwogCQlncy5zZXRSZXBvc2l0b3J5UmVzb2x2ZXIobmV3IFJlcG9zaXRvcnlSZXNvbHZlcjxIdHRwU2VydmxldFJlcXVlc3Q+KCkgewogCQkJQE92ZXJyaWRlCkBAIC0xNTEsNyArMTYwLDcgQEAKIAkJcmV0dXJuIGN0eDsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZU9mKGZpbmFsIFJlcG9zaXRvcnkgZGIpIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZU9mKFJlcG9zaXRvcnkgZGIpIHsKIAkJcmV0dXJuIGRiLmdldERpcmVjdG9yeSgpLmdldE5hbWUoKTsKIAl9CiAKQEAgLTM0NSw0ICszNTQsODIgQEAKIAkJCWFzc2VydE5vdE51bGwoaGVhZCk7CiAJCX0KIAl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RIdHRwQ2xpZW50V2FudHNWMkJ1dFNlcnZlck5vdENvbmZpZ3VyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSkRLSHR0cENvbm5lY3Rpb25GYWN0b3J5IGYgPSBuZXcgSkRLSHR0cENvbm5lY3Rpb25GYWN0b3J5KCk7CisJCVN0cmluZyB1cmwgPSBzbWFydEF1dGhOb25lVVJJLnRvU3RyaW5nKCkgKyAiL2luZm8vcmVmcz9zZXJ2aWNlPWdpdC11cGxvYWQtcGFjayI7CisJCUh0dHBDb25uZWN0aW9uIGMgPSBmLmNyZWF0ZShuZXcgVVJMKHVybCkpOworCQljLnNldFJlcXVlc3RNZXRob2QoIkdFVCIpOworCQljLnNldFJlcXVlc3RQcm9wZXJ0eSgiR2l0LVByb3RvY29sIiwgInZlcnNpb249MiIpOworCQljLmNvbm5lY3QoKTsKKwkJYXNzZXJ0VGhhdChjLmdldFJlc3BvbnNlQ29kZSgpLCBpcygyMDApKTsKKworCQlQYWNrZXRMaW5lSW4gcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKGMuZ2V0SW5wdXRTdHJlYW0oKSk7CisKKwkJLy8gQ2hlY2sgdGhhdCB3ZSBnZXQgYSB2MCByZXNwb25zZS4KKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCIjIHNlcnZpY2U9Z2l0LXVwbG9hZC1wYWNrIikpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgdGhlSW5zdGFuY2UoUGFja2V0TGluZUluLkVORCkpOworCQlhc3NlcnRUcnVlKHBja0luLnJlYWRTdHJpbmcoKS5tYXRjaGVzKCJbMC05YS1mXXs0MH0gSEVBRC4qIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYySHR0cEZpcnN0UmVzcG9uc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmVtb3RlUmVwb3NpdG9yeS5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCkuc2V0SW50KAorCQkJCSJwcm90b2NvbCIsIG51bGwsICJ2ZXJzaW9uIiwgMik7CisKKwkJSkRLSHR0cENvbm5lY3Rpb25GYWN0b3J5IGYgPSBuZXcgSkRLSHR0cENvbm5lY3Rpb25GYWN0b3J5KCk7CisJCVN0cmluZyB1cmwgPSBzbWFydEF1dGhOb25lVVJJLnRvU3RyaW5nKCkgKyAiL2luZm8vcmVmcz9zZXJ2aWNlPWdpdC11cGxvYWQtcGFjayI7CisJCUh0dHBDb25uZWN0aW9uIGMgPSBmLmNyZWF0ZShuZXcgVVJMKHVybCkpOworCQljLnNldFJlcXVlc3RNZXRob2QoIkdFVCIpOworCQljLnNldFJlcXVlc3RQcm9wZXJ0eSgiR2l0LVByb3RvY29sIiwgInZlcnNpb249MiIpOworCQljLmNvbm5lY3QoKTsKKwkJYXNzZXJ0VGhhdChjLmdldFJlc3BvbnNlQ29kZSgpLCBpcygyMDApKTsKKworCQlQYWNrZXRMaW5lSW4gcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKGMuZ2V0SW5wdXRTdHJlYW0oKSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygidmVyc2lvbiAyIikpOworCisJCS8vIFdoYXQgcmVtYWlucyBhcmUgY2FwYWJpbGl0aWVzIC0gZW5zdXJlIHRoYXQgYWxsIG9mIHRoZW0gYXJlCisJCS8vIG5vbi1lbXB0eSBzdHJpbmdzLCBhbmQgdGhhdCB3ZSBzZWUgRU5EIGF0IHRoZSBlbmQuCisJCVN0cmluZyBzOworCQl3aGlsZSAoKHMgPSBwY2tJbi5yZWFkU3RyaW5nKCkpICE9IFBhY2tldExpbmVJbi5FTkQpIHsKKwkJCWFzc2VydFRydWUoIXMuaXNFbXB0eSgpKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYySHR0cFN1YnNlcXVlbnRSZXNwb25zZSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZW1vdGVSZXBvc2l0b3J5LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKS5zZXRJbnQoCisJCQkJInByb3RvY29sIiwgbnVsbCwgInZlcnNpb24iLCAyKTsKKworCQlKREtIdHRwQ29ubmVjdGlvbkZhY3RvcnkgZiA9IG5ldyBKREtIdHRwQ29ubmVjdGlvbkZhY3RvcnkoKTsKKwkJU3RyaW5nIHVybCA9IHNtYXJ0QXV0aE5vbmVVUkkudG9TdHJpbmcoKSArICIvZ2l0LXVwbG9hZC1wYWNrIjsKKwkJSHR0cENvbm5lY3Rpb24gYyA9IGYuY3JlYXRlKG5ldyBVUkwodXJsKSk7CisJCWMuc2V0UmVxdWVzdE1ldGhvZCgiUE9TVCIpOworCQljLnNldFJlcXVlc3RQcm9wZXJ0eSgiQ29udGVudC1UeXBlIiwgImFwcGxpY2F0aW9uL3gtZ2l0LXVwbG9hZC1wYWNrLXJlcXVlc3QiKTsKKwkJYy5zZXRSZXF1ZXN0UHJvcGVydHkoIkdpdC1Qcm90b2NvbCIsICJ2ZXJzaW9uPTIiKTsKKwkJYy5zZXREb091dHB1dCh0cnVlKTsKKwkJYy5jb25uZWN0KCk7CisKKwkJLy8gVGVzdCBscy1yZWZzIHRvIHZlcmlmeSB0aGF0IGV2ZXJ5dGhpbmcgaXMgY29ubmVjdGVkCisJCS8vIHByb3Blcmx5LiBUZXN0cyBmb3Igb3RoZXIgY29tbWFuZHMgZ28gaW4KKwkJLy8gVXBsb2FkUGFja1Rlc3QuamF2YS4KKworCQlPdXRwdXRTdHJlYW0gb3MgPSBjLmdldE91dHB1dFN0cmVhbSgpOworCQlQYWNrZXRMaW5lT3V0IHBja091dCA9IG5ldyBQYWNrZXRMaW5lT3V0KG9zKTsKKwkJcGNrT3V0LndyaXRlU3RyaW5nKCJjb21tYW5kPWxzLXJlZnMiKTsKKwkJcGNrT3V0LndyaXRlRGVsaW0oKTsKKwkJcGNrT3V0LmVuZCgpOworCQlvcy5jbG9zZSgpOworCisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4oYy5nZXRJbnB1dFN0cmVhbSgpKTsKKworCQkvLyBKdXN0IGNoZWNrIHRoYXQgd2UgZ2V0IHdoYXQgbG9va3MgbGlrZSBhIHJlZiBhZHZlcnRpc2VtZW50LgorCQlTdHJpbmcgczsKKwkJd2hpbGUgKChzID0gcGNrSW4ucmVhZFN0cmluZygpKSAhPSBQYWNrZXRMaW5lSW4uRU5EKSB7CisJCQlhc3NlcnRUcnVlKHMubWF0Y2hlcygiWzAtOWEtZl17NDB9IFtBLVphLXovXSoiKSk7CisJCX0KKworCQlhc3NlcnRUaGF0KGMuZ2V0UmVzcG9uc2VDb2RlKCksIGlzKDIwMCkpOworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9Qcm90b2NvbEVycm9yVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L1Byb3RvY29sRXJyb3JUZXN0LmphdmEKaW5kZXggODdkMGJhZC4uYTFiYWFlMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L1Byb3RvY29sRXJyb3JUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L1Byb3RvY29sRXJyb3JUZXN0LmphdmEKQEAgLTE0OSwxOSArMTQ5LDE1IEBACiAJCQljLnNldFJlcXVlc3RQcm9wZXJ0eSgiQ29udGVudC1UeXBlIiwKIAkJCQkJR2l0U21hcnRIdHRwVG9vbHMuUkVDRUlWRV9QQUNLX1JFUVVFU1RfVFlQRSk7CiAJCQljLnNldEZpeGVkTGVuZ3RoU3RyZWFtaW5nTW9kZShyZXFiaW4ubGVuZ3RoKTsKLQkJCU91dHB1dFN0cmVhbSBvdXQgPSBjLmdldE91dHB1dFN0cmVhbSgpOwotCQkJdHJ5IHsKKwkJCXRyeSAoT3V0cHV0U3RyZWFtIG91dCA9IGMuZ2V0T3V0cHV0U3RyZWFtKCkpIHsKIAkJCQlvdXQud3JpdGUocmVxYmluKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJb3V0LmNsb3NlKCk7CiAJCQl9CiAKIAkJCWFzc2VydEVxdWFscygyMDAsIGMuZ2V0UmVzcG9uc2VDb2RlKCkpOwogCQkJYXNzZXJ0RXF1YWxzKEdpdFNtYXJ0SHR0cFRvb2xzLlJFQ0VJVkVfUEFDS19SRVNVTFRfVFlQRSwKIAkJCQkJYy5nZXRDb250ZW50VHlwZSgpKTsKIAotCQkJSW5wdXRTdHJlYW0gcmF3aW4gPSBjLmdldElucHV0U3RyZWFtKCk7Ci0JCQl0cnkgeworCQkJdHJ5IChJbnB1dFN0cmVhbSByYXdpbiA9IGMuZ2V0SW5wdXRTdHJlYW0oKSkgewogCQkJCVBhY2tldExpbmVJbiBwY2tpbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmF3aW4pOwogCQkJCWFzc2VydEVxdWFscygidW5wYWNrIGVycm9yICIKIAkJCQkJCSsgSkdpdFRleHQuZ2V0KCkucGFja2ZpbGVJc1RydW5jYXRlZE5vUGFyYW0sCkBAIC0xNjksOCArMTY1LDYgQEAKIAkJCQlhc3NlcnRFcXVhbHMoIm5nIHJlZnMvb2JqZWN0cy9BIG4vYSAodW5wYWNrZXIgZXJyb3IpIiwKIAkJCQkJCXBja2luLnJlYWRTdHJpbmcoKSk7CiAJCQkJYXNzZXJ0U2FtZShQYWNrZXRMaW5lSW4uRU5ELCBwY2tpbi5yZWFkU3RyaW5nKCkpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlyYXdpbi5jbG9zZSgpOwogCQkJfQogCQl9IGZpbmFsbHkgewogCQkJYy5kaXNjb25uZWN0KCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvU2V0QWRkaXRpb25hbEhlYWRlcnNUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvU2V0QWRkaXRpb25hbEhlYWRlcnNUZXN0LmphdmEKaW5kZXggZWY4ZGFlYy4uZmJjNTRmMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L1NldEFkZGl0aW9uYWxIZWFkZXJzVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9TZXRBZGRpdGlvbmFsSGVhZGVyc1Rlc3QuamF2YQpAQCAtMTA3LDggKzEwNyw3IEBACiAKIAkJYXNzZXJ0RXF1YWxzKCJodHRwIiwgcmVtb3RlVVJJLmdldFNjaGVtZSgpKTsKIAotCQlUcmFuc3BvcnQgdCA9IFRyYW5zcG9ydC5vcGVuKGRzdCwgcmVtb3RlVVJJKTsKLQkJdHJ5IHsKKwkJdHJ5IChUcmFuc3BvcnQgdCA9IFRyYW5zcG9ydC5vcGVuKGRzdCwgcmVtb3RlVVJJKSkgewogCQkJYXNzZXJ0VHJ1ZSgiaXNhIFRyYW5zcG9ydEh0dHAiLCB0IGluc3RhbmNlb2YgVHJhbnNwb3J0SHR0cCk7CiAJCQlhc3NlcnRUcnVlKCJpc2EgSHR0cFRyYW5zcG9ydCIsIHQgaW5zdGFuY2VvZiBIdHRwVHJhbnNwb3J0KTsKIApAQCAtMTE3LDggKzExNiw2IEBACiAJCQloZWFkZXJzLnB1dCgiQW5vdGhlcktleSIsICJzb21lVmFsdWUiKTsKIAkJCSgoVHJhbnNwb3J0SHR0cCkgdCkuc2V0QWRkaXRpb25hbEhlYWRlcnMoaGVhZGVycyk7CiAJCQl0Lm9wZW5GZXRjaCgpOwotCQl9IGZpbmFsbHkgewotCQkJdC5jbG9zZSgpOwogCQl9CiAKIAkJTGlzdDxBY2Nlc3NFdmVudD4gcmVxdWVzdHMgPSBnZXRSZXF1ZXN0cygpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L1NtYXJ0Q2xpZW50U21hcnRTZXJ2ZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvU21hcnRDbGllbnRTbWFydFNlcnZlclRlc3QuamF2YQppbmRleCA1ZjQwYmU0Li40MmRiMGZlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvU21hcnRDbGllbnRTbWFydFNlcnZlclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvU21hcnRDbGllbnRTbWFydFNlcnZlclRlc3QuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0OwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5IdHRwU3VwcG9ydC5IRFJfQ09OVEVOVF9FTkNPRElORzsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC51dGlsLkh0dHBTdXBwb3J0LkhEUl9DT05URU5UX0xFTkdUSDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC51dGlsLkh0dHBTdXBwb3J0LkhEUl9DT05URU5UX1RZUEU7CkBAIC0yNjYsMTAgKzI2NiwxMCBAQAogCQkJCQl0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewogCQkJCWZpbmFsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgciA9IChIdHRwU2VydmxldFJlc3BvbnNlKSByZXNwb25zZTsKIAkJCQlyLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7Ci0JCQkJci5zZXRDaGFyYWN0ZXJFbmNvZGluZygiVVRGLTgiKTsKLQkJCQlQcmludFdyaXRlciB3ID0gci5nZXRXcml0ZXIoKTsKLQkJCQl3LnByaW50KCJPSyIpOwotCQkJCXcuY2xvc2UoKTsKKwkJCQlyLnNldENoYXJhY3RlckVuY29kaW5nKENvbnN0YW50cy5DSEFSQUNURVJfRU5DT0RJTkcpOworCQkJCXRyeSAoUHJpbnRXcml0ZXIgdyA9IHIuZ2V0V3JpdGVyKCkpIHsKKwkJCQkJdy5wcmludCgiT0siKTsKKwkJCQl9CiAJCQl9CiAKIAkJCUBPdmVycmlkZQpAQCAtMzk3LDExICszOTcsOCBAQAogCQkJYXNzZXJ0VHJ1ZSgiaXNhIFRyYW5zcG9ydEh0dHAiLCB0IGluc3RhbmNlb2YgVHJhbnNwb3J0SHR0cCk7CiAJCQlhc3NlcnRUcnVlKCJpc2EgSHR0cFRyYW5zcG9ydCIsIHQgaW5zdGFuY2VvZiBIdHRwVHJhbnNwb3J0KTsKIAotCQkJRmV0Y2hDb25uZWN0aW9uIGMgPSB0Lm9wZW5GZXRjaCgpOwotCQkJdHJ5IHsKKwkJCXRyeSAoRmV0Y2hDb25uZWN0aW9uIGMgPSB0Lm9wZW5GZXRjaCgpKSB7CiAJCQkJbWFwID0gYy5nZXRSZWZzTWFwKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWMuY2xvc2UoKTsKIAkJCX0KIAkJfQogCkBAIC0xMDg0LDcgKzEwODEsNyBAQAogCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkV2FudCgpIHRocm93cyBFeGNlcHRpb24gewogCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQogCQlPYmplY3RJZCBpZCA9IG5ldyBPYmplY3RJbnNlcnRlci5Gb3JtYXR0ZXIoKS5pZEZvcihDb25zdGFudHMuT0JKX0JMT0IsCi0JCQkJInRlc3RJbnZhbGlkV2FudCIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCQkidGVzdEludmFsaWRXYW50Ii5nZXRCeXRlcyhDSEFSU0VUKSk7CiAKIAkJUmVwb3NpdG9yeSBkc3QgPSBjcmVhdGVCYXJlUmVwb3NpdG9yeSgpOwogCQl0cnkgKFRyYW5zcG9ydCB0ID0gVHJhbnNwb3J0Lm9wZW4oZHN0LCByZW1vdGVVUkkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDA0MzZlZTQuLmE2OGQxNTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsNyArMyw3IEBACiBCdW5kbGUtTmFtZTogJXBsdWdpbl9uYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cAogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwCi1CdW5kbGUtVmVyc2lvbjogNC4xMS40LnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDUuMC40LnF1YWxpZmllcgogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJfbmFtZQogQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKQEAgLTIyLDE2ICsyMiwxNiBAQAogIG9yZy5lY2xpcHNlLmpldHR5LnV0aWwubG9nO3ZlcnNpb249Ils5LjQuNSwxMC4wLjApIiwKICBvcmcuZWNsaXBzZS5qZXR0eS51dGlsLnNlY3VyaXR5O3ZlcnNpb249Ils5LjQuNSwxMC4wLjApIiwKICBvcmcuZWNsaXBzZS5qZXR0eS51dGlsLnNzbDt2ZXJzaW9uPSJbOS40LjUsMTAuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlcjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlcjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTIsNS4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cDt2ZXJzaW9uPSI0LjExLjQiOworRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cDt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydCwKICAgIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQsCiAgICBqYXZheC5zZXJ2bGV0Lmh0dHAsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9wb20ueG1sCmluZGV4IDA0NjY4N2QuLmViN2QwMmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9wb20ueG1sCkBAIC01MCw3ICs1MCw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjQtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9odHRwL0FjY2Vzc0V2ZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvaHR0cC9BY2Nlc3NFdmVudC5qYXZhCmluZGV4IDAxYzQzNjAuLjgyNDc2ZGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9odHRwL0FjY2Vzc0V2ZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L2h0dHAvQWNjZXNzRXZlbnQuamF2YQpAQCAtNjcsNyArNjcsNyBAQAogCiAJcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHJlc3BvbnNlSGVhZGVyczsKIAotCUFjY2Vzc0V2ZW50KGZpbmFsIFJlcXVlc3QgcmVxLCBmaW5hbCBSZXNwb25zZSByc3ApIHsKKwlBY2Nlc3NFdmVudChSZXF1ZXN0IHJlcSwgUmVzcG9uc2UgcnNwKSB7CiAJCW1ldGhvZCA9IHJlcS5nZXRNZXRob2QoKTsKIAkJdXJpID0gcmVxLmdldFJlcXVlc3RVUkkoKTsKIAkJcmVxdWVzdEhlYWRlcnMgPSBjbG9uZUhlYWRlcnMocmVxKTsKQEAgLTc3LDcgKzc3LDcgQEAKIAkJcmVzcG9uc2VIZWFkZXJzID0gY2xvbmVIZWFkZXJzKHJzcCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBjbG9uZUhlYWRlcnMoZmluYWwgUmVxdWVzdCByZXEpIHsKKwlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGNsb25lSGVhZGVycyhSZXF1ZXN0IHJlcSkgewogCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHIgPSBuZXcgVHJlZU1hcDw+KCk7CiAJCUVudW1lcmF0aW9uIGhuID0gcmVxLmdldEhlYWRlck5hbWVzKCk7CiAJCXdoaWxlIChobi5oYXNNb3JlRWxlbWVudHMoKSkgewpAQCAtODksNyArODksNyBAQAogCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHIpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gY2xvbmVIZWFkZXJzKGZpbmFsIFJlc3BvbnNlIHJzcCkgeworCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gY2xvbmVIZWFkZXJzKFJlc3BvbnNlIHJzcCkgewogCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHIgPSBuZXcgVHJlZU1hcDw+KCk7CiAJCUVudW1lcmF0aW9uPFN0cmluZz4gaG4gPSByc3AuZ2V0SHR0cEZpZWxkcygpLmdldEZpZWxkTmFtZXMoKTsKIAkJd2hpbGUgKGhuLmhhc01vcmVFbGVtZW50cygpKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvaHR0cC9SZWNvcmRpbmdMb2dnZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9odHRwL1JlY29yZGluZ0xvZ2dlci5qYXZhCmluZGV4IGZlZDA2M2EuLmE3MTRlYjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9odHRwL1JlY29yZGluZ0xvZ2dlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9odHRwL1JlY29yZGluZ0xvZ2dlci5qYXZhCkBAIC0xMDcsNyArMTA3LDcgQEAKIAkgKgogCSAqIEBwYXJhbSBuYW1lCiAJICovCi0JcHVibGljIFJlY29yZGluZ0xvZ2dlcihmaW5hbCBTdHJpbmcgbmFtZSkgeworCXB1YmxpYyBSZWNvcmRpbmdMb2dnZXIoU3RyaW5nIG5hbWUpIHsKIAkJdGhpcy5uYW1lID0gbmFtZTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9odHRwL1NpbXBsZUh0dHBTZXJ2ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9odHRwL1NpbXBsZUh0dHBTZXJ2ZXIuamF2YQppbmRleCBjNTU3NmY5Li4yNDViNTEwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvaHR0cC9TaW1wbGVIdHRwU2VydmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L2h0dHAvU2ltcGxlSHR0cFNlcnZlci5qYXZhCkBAIC0xMzQsNyArMTM0LDcgQEAKIAkJcmV0dXJuIHNlY3VyZVVyaTsKIAl9CiAKLQlwcml2YXRlIFNlcnZsZXRDb250ZXh0SGFuZGxlciBzbWFydChmaW5hbCBTdHJpbmcgcGF0aCkgeworCXByaXZhdGUgU2VydmxldENvbnRleHRIYW5kbGVyIHNtYXJ0KFN0cmluZyBwYXRoKSB7CiAJCUdpdFNlcnZsZXQgZ3MgPSBuZXcgR2l0U2VydmxldCgpOwogCQlncy5zZXRSZXBvc2l0b3J5UmVzb2x2ZXIobmV3IFJlcG9zaXRvcnlSZXNvbHZlcjxIdHRwU2VydmxldFJlcXVlc3Q+KCkgewogCQkJQE92ZXJyaWRlCkBAIC0xNTQsNyArMTU0LDcgQEAKIAkJcmV0dXJuIGN0eDsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZU9mKGZpbmFsIFJlcG9zaXRvcnkgZGIpIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZU9mKFJlcG9zaXRvcnkgZGIpIHsKIAkJcmV0dXJuIGRiLmdldERpcmVjdG9yeSgpLmdldE5hbWUoKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvLnNldHRpbmdzLy5hcGlfZmlsdGVycyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvLnNldHRpbmdzLy5hcGlfZmlsdGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWRlNzg3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC8uc2V0dGluZ3MvLmFwaV9maWx0ZXJzCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPGNvbXBvbmVudCBpZD0ib3JnLmVjbGlwc2UuamdpdC5qdW5pdCIgdmVyc2lvbj0iMiI+CisgICAgPHJlc291cmNlIHBhdGg9InNyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L0xvY2FsRGlza1JlcG9zaXRvcnlUZXN0Q2FzZS5qYXZhIiB0eXBlPSJvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LkxvY2FsRGlza1JlcG9zaXRvcnlUZXN0Q2FzZSI+CisgICAgICAgIDxmaWx0ZXIgY29tbWVudD0iRG9uJ3QgY2FyZSBhYm91dCBub24tQVBJIGluIHRlc3RzLiIgaWQ9IjY0Mzg0MjA2NCI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IkZpbGVSZXBvc2l0b3J5Ii8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IkxvY2FsRGlza1JlcG9zaXRvcnlUZXN0Q2FzZSIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJjcmVhdGVCYXJlUmVwb3NpdG9yeSgpIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICAgICAgPGZpbHRlciBjb21tZW50PSJEb24ndCBjYXJlIGFib3V0IG5vbi1BUEkgaW4gdGVzdHMuIiBpZD0iNjQzODQyMDY0Ij4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iRmlsZVJlcG9zaXRvcnkiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iTG9jYWxEaXNrUmVwb3NpdG9yeVRlc3RDYXNlIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9ImNyZWF0ZVJlcG9zaXRvcnkoYm9vbGVhbiwgYm9vbGVhbikiLz4KKyAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgIDwvZmlsdGVyPgorICAgICAgICA8ZmlsdGVyIGNvbW1lbnQ9IkRvbid0IGNhcmUgYWJvdXQgbm9uLUFQSSBpbiB0ZXN0cy4iIGlkPSI2NDM4NDIwNjQiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJGaWxlUmVwb3NpdG9yeSIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJMb2NhbERpc2tSZXBvc2l0b3J5VGVzdENhc2UiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iY3JlYXRlV29ya1JlcG9zaXRvcnkoKSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgPC9yZXNvdXJjZT4KKyAgICA8cmVzb3VyY2UgcGF0aD0ic3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvUmVwb3NpdG9yeVRlc3RDYXNlLmphdmEiIHR5cGU9Im9yZy5lY2xpcHNlLmpnaXQuanVuaXQuUmVwb3NpdG9yeVRlc3RDYXNlIj4KKyAgICAgICAgPGZpbHRlciBjb21tZW50PSJEb24ndCBjYXJlIGFib3V0IG5vbi1BUEkgaW4gdGVzdHMuIiBpZD0iNjI3MDYwNzUxIj4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iRmlsZVJlcG9zaXRvcnkiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iUmVwb3NpdG9yeVRlc3RDYXNlIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9ImRiIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICA8L3Jlc291cmNlPgorPC9jb21wb25lbnQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCBkM2I2MGM0Li43NDlmOGZlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsMzEgKzMsMzEgQEAKIEJ1bmRsZS1OYW1lOiAlcGx1Z2luX25hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdAogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdAotQnVuZGxlLVZlcnNpb246IDQuMTEuNC5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyX25hbWUKIEJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuOAotSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucGFjazt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5tZXJnZTt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsLnRpbWU7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKK0ltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucGFjazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW87dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsLnRpbWU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCiAgb3JnLmp1bml0O3ZlcnNpb249Ils0LjEyLDUuMC4wKSIsCiAgb3JnLmp1bml0LnJ1bGVzO3ZlcnNpb249Ils0LjEyLDUuMC4wKSIsCiAgb3JnLmp1bml0LnJ1bm5lcjt2ZXJzaW9uPSJbNC4xMiw1LjAuMCkiLAogIG9yZy5qdW5pdC5ydW5uZXJzLm1vZGVsO3ZlcnNpb249Ils0LjEyLDUuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249IjQuMTEuNCI7CitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLAogICAgb3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssCkBAIC0zNiw0ICszNiw0IEBACiAgICBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZSwKICAgIG9yZy5lY2xpcHNlLmpnaXQuYXBpIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnRpbWU7dmVyc2lvbj0iNC4xMS40IgorIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQudGltZTt2ZXJzaW9uPSI1LjAuNCIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvcG9tLnhtbAppbmRleCAzY2Q1OGU1Li4zMGNlMGIzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9wb20ueG1sCkBAIC01Miw3ICs1Miw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjQtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuanVuaXQ8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L0pHaXRUZXN0VXRpbC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9KR2l0VGVzdFV0aWwuamF2YQppbmRleCBjZWY4MWEwLi5hMTAyZGExIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L0pHaXRUZXN0VXRpbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvSkdpdFRlc3RVdGlsLmphdmEKQEAgLTQ1LDcgKzQ1LDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0OwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CkBAIC0xNDIsNyArMTQyLDcgQEAKIAkgKiBAcGFyYW0gZmlsZU5hbWUKIAkgKiBAcmV0dXJuIHRoZSB0ZXN0IHJlc291cmNlIGZpbGUKIAkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgZ2V0VGVzdFJlc291cmNlRmlsZShmaW5hbCBTdHJpbmcgZmlsZU5hbWUpIHsKKwlwdWJsaWMgc3RhdGljIEZpbGUgZ2V0VGVzdFJlc291cmNlRmlsZShTdHJpbmcgZmlsZU5hbWUpIHsKIAkJaWYgKGZpbGVOYW1lID09IG51bGwgfHwgZmlsZU5hbWUubGVuZ3RoKCkgPD0gMCkgewogCQkJcmV0dXJuIG51bGw7CiAJCX0KQEAgLTI0MiwxMSArMjQyLDExIEBACiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBmaWxlIGNvdWxkIG5vdCBiZSB3cml0dGVuLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZShmaW5hbCBGaWxlIGYsIGZpbmFsIFN0cmluZyBib2R5KQorCXB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZShGaWxlIGYsIFN0cmluZyBib2R5KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJRmlsZVV0aWxzLm1rZGlycyhmLmdldFBhcmVudEZpbGUoKSwgdHJ1ZSk7CiAJCXRyeSAoV3JpdGVyIHcgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYpLAotCQkJCVVURl84KSkgeworCQkJCUNIQVJTRVQpKSB7CiAJCQl3LndyaXRlKGJvZHkpOwogCQl9CiAJfQpAQCAtMjYxLDkgKzI2MSw5IEBACiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCBvciBjb3VsZCBub3QgYmUgcmVhZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkKGZpbmFsIEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgYnl0ZVtdIGJvZHkgPSBJTy5yZWFkRnVsbHkoZmlsZSk7Ci0JCXJldHVybiBuZXcgU3RyaW5nKGJvZHksIDAsIGJvZHkubGVuZ3RoLCBVVEZfOCk7CisJCXJldHVybiBuZXcgU3RyaW5nKGJvZHksIDAsIGJvZHkubGVuZ3RoLCBDSEFSU0VUKTsKIAl9CiAKIAkvKioKQEAgLTI3NCw3ICsyNzQsNyBAQAogCSAqIEByZXR1cm4gdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZChmaW5hbCBSZXBvc2l0b3J5IGRiLCBmaW5hbCBTdHJpbmcgbmFtZSkKKwlwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkKFJlcG9zaXRvcnkgZGIsIFN0cmluZyBuYW1lKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgbmFtZSk7CiAJCXJldHVybiByZWFkKGZpbGUpOwpAQCAtMjg4LDcgKzI4OCw3IEBACiAJICogICAgICAgICAgICBuYW1lIG9mIHRoZSBmaWxlCiAJICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGZpbGUgZXhpc3RzCiAJICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrKGZpbmFsIFJlcG9zaXRvcnkgZGIsIGZpbmFsIFN0cmluZyBuYW1lKSB7CisJcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrKFJlcG9zaXRvcnkgZGIsIFN0cmluZyBuYW1lKSB7CiAJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksIG5hbWUpOwogCQlyZXR1cm4gZmlsZS5leGlzdHMoKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L0xvY2FsRGlza1JlcG9zaXRvcnlUZXN0Q2FzZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9Mb2NhbERpc2tSZXBvc2l0b3J5VGVzdENhc2UuamF2YQppbmRleCA1NjhiYzNiLi42Y2RkMGViIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L0xvY2FsRGlza1JlcG9zaXRvcnlUZXN0Q2FzZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvTG9jYWxEaXNrUmVwb3NpdG9yeVRlc3RDYXNlLmphdmEKQEAgLTQ1LDcgKzQ1LDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0OwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIApAQCAtMjI1LDcgKzIyNSw3IEBACiAJICogQHBhcmFtIGRpcgogCSAqICAgICAgICAgICAgdGhlIHJlY3Vyc2l2ZWx5IGRpcmVjdG9yeSB0byBkZWxldGUsIGlmIHByZXNlbnQuCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgcmVjdXJzaXZlRGVsZXRlKGZpbmFsIEZpbGUgZGlyKSB7CisJcHJvdGVjdGVkIHZvaWQgcmVjdXJzaXZlRGVsZXRlKEZpbGUgZGlyKSB7CiAJCXJlY3Vyc2l2ZURlbGV0ZShkaXIsIGZhbHNlLCB0cnVlKTsKIAl9CiAKQEAgLTM1Miw3ICszNTIsNyBAQAogCQkJaWYgKDAgIT0gKGluY2x1ZGVkT3B0aW9ucyAmIENPTlRFTlQpKSB7CiAJCQkJc2IuYXBwZW5kKCIsIGNvbnRlbnQ6IgogCQkJCQkJKyBuZXcgU3RyaW5nKHJlcG8ub3BlbihlbnRyeS5nZXRPYmplY3RJZCgpLAotCQkJCQkJQ29uc3RhbnRzLk9CSl9CTE9CKS5nZXRDYWNoZWRCeXRlcygpLCBVVEZfOCkpOworCQkJCQkJQ29uc3RhbnRzLk9CSl9CTE9CKS5nZXRDYWNoZWRCeXRlcygpLCBDSEFSU0VUKSk7CiAJCQl9CiAJCQlpZiAoMCAhPSAoaW5jbHVkZWRPcHRpb25zICYgQVNTVU1FX1VOQ0hBTkdFRCkpCiAJCQkJc2IuYXBwZW5kKCIsIGFzc3VtZS11bmNoYW5nZWQ6IgpAQCAtNTQwLDcgKzU0MCw3IEBACiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBmaWxlIGNvdWxkIG5vdCBiZSB3cml0dGVuLgogCSAqLwotCXByb3RlY3RlZCBGaWxlIHdyaXRlKGZpbmFsIFN0cmluZyBib2R5KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCBGaWxlIHdyaXRlKFN0cmluZyBib2R5KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBGaWxlIGYgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ0ZW1wIiwgInR4dCIsIHRtcCk7CiAJCXRyeSB7CiAJCQl3cml0ZShmLCBib2R5KTsKQEAgLTU3MSw3ICs1NzEsNyBAQAogCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgZmlsZSBjb3VsZCBub3QgYmUgd3JpdHRlbi4KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZShmaW5hbCBGaWxlIGYsIGZpbmFsIFN0cmluZyBib2R5KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCB2b2lkIHdyaXRlKEZpbGUgZiwgU3RyaW5nIGJvZHkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCUpHaXRUZXN0VXRpbC53cml0ZShmLCBib2R5KTsKIAl9CiAKQEAgLTU4MywxMSArNTgzLDExIEBACiAJICogQHJldHVybiB0aGUgY29udGVudCBvZiB0aGUgZmlsZQogCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KIAkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlYWQoZmluYWwgRmlsZSBmKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCBTdHJpbmcgcmVhZChGaWxlIGYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBKR2l0VGVzdFV0aWwucmVhZChmKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0b0VudkFycmF5KGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gZW52KSB7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdG9FbnZBcnJheShNYXA8U3RyaW5nLCBTdHJpbmc+IGVudikgewogCQlmaW5hbCBTdHJpbmdbXSBlbnZwID0gbmV3IFN0cmluZ1tlbnYuc2l6ZSgpXTsKIAkJaW50IGkgPSAwOwogCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZSA6IGVudi5lbnRyeVNldCgpKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9Nb2NrU3lzdGVtUmVhZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L01vY2tTeXN0ZW1SZWFkZXIuamF2YQppbmRleCAwNWQxNTIyLi5kM2Q3ZDY4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L01vY2tTeXN0ZW1SZWFkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L01vY2tTeXN0ZW1SZWFkZXIuamF2YQpAQCAtMTA5LDcgKzEwOSw3IEBACiAJCXNldEN1cnJlbnRQbGF0Zm9ybSgpOwogCX0KIAotCXByaXZhdGUgdm9pZCBpbml0KGZpbmFsIFN0cmluZyBuKSB7CisJcHJpdmF0ZSB2b2lkIGluaXQoU3RyaW5nIG4pIHsKIAkJc2V0UHJvcGVydHkobiwgbik7CiAJfQogCkBAIC0xOTcsNyArMTk3LDcgQEAKIAkgKiAgICAgICAgICAgIG51bWJlciBvZiBzZWNvbmRzIHRvIGFkZCB0byB0aGUgY3VycmVudCB0aW1lLgogCSAqIEBzaW5jZSA0LjIKIAkgKi8KLQlwdWJsaWMgdm9pZCB0aWNrKGZpbmFsIGludCBzZWNEZWx0YSkgeworCXB1YmxpYyB2b2lkIHRpY2soaW50IHNlY0RlbHRhKSB7CiAJCW5vdyArPSBzZWNEZWx0YSAqIDEwMDBMOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9SZXBvc2l0b3J5VGVzdENhc2UuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvUmVwb3NpdG9yeVRlc3RDYXNlLmphdmEKaW5kZXggYWZjMmM0NC4uZTk4M2U1ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9SZXBvc2l0b3J5VGVzdENhc2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L1JlcG9zaXRvcnlUZXN0Q2FzZS5qYXZhCkBAIC00Niw3ICs0Niw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5qdW5pdDsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTkyLDIyICs5MiwxNSBAQAogCSAqIEBwYXJhbSBkc3QKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGNvcHlGaWxlKGZpbmFsIEZpbGUgc3JjLCBmaW5hbCBGaWxlIGRzdCkKKwlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgY29weUZpbGUoRmlsZSBzcmMsIEZpbGUgZHN0KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZmluYWwgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc3JjKTsKLQkJdHJ5IHsKLQkJCWZpbmFsIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZHN0KTsKLQkJCXRyeSB7Ci0JCQkJZmluYWwgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzQwOTZdOwotCQkJCWludCByOwotCQkJCXdoaWxlICgociA9IGZpcy5yZWFkKGJ1ZikpID4gMCkgewotCQkJCQlmb3Mud3JpdGUoYnVmLCAwLCByKTsKLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCWZvcy5jbG9zZSgpOworCQl0cnkgKEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNyYyk7CisJCQkJRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkc3QpKSB7CisJCQlmaW5hbCBieXRlW10gYnVmID0gbmV3IGJ5dGVbNDA5Nl07CisJCQlpbnQgcjsKKwkJCXdoaWxlICgociA9IGZpcy5yZWFkKGJ1ZikpID4gMCkgeworCQkJCWZvcy53cml0ZShidWYsIDAsIHIpOwogCQkJfQotCQl9IGZpbmFsbHkgewotCQkJZmlzLmNsb3NlKCk7CiAJCX0KIAl9CiAKQEAgLTExOSw3ICsxMTIsNyBAQAogCSAqIEByZXR1cm4gdGhlIHRyYXNoIGZpbGUKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICovCi0JcHJvdGVjdGVkIEZpbGUgd3JpdGVUcmFzaEZpbGUoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBkYXRhKQorCXByb3RlY3RlZCBGaWxlIHdyaXRlVHJhc2hGaWxlKFN0cmluZyBuYW1lLCBTdHJpbmcgZGF0YSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBKR2l0VGVzdFV0aWwud3JpdGVUcmFzaEZpbGUoZGIsIG5hbWUsIGRhdGEpOwogCX0KQEAgLTEzNSw3ICsxMjgsNyBAQAogCSAqIEB0aHJvd3MgRXhjZXB0aW9uCiAJICogQHNpbmNlIDQuMgogCSAqLwotCXByb3RlY3RlZCBQYXRoIHdyaXRlTGluayhmaW5hbCBTdHJpbmcgbGluaywgZmluYWwgU3RyaW5nIHRhcmdldCkKKwlwcm90ZWN0ZWQgUGF0aCB3cml0ZUxpbmsoU3RyaW5nIGxpbmssIFN0cmluZyB0YXJnZXQpCiAJCQl0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcmV0dXJuIEpHaXRUZXN0VXRpbC53cml0ZUxpbmsoZGIsIGxpbmssIHRhcmdldCk7CiAJfQpAQCAtMTYyLDcgKzE1NSw3IEBACiAJICogQHJldHVybiB0aGUgZmlsZSdzIGNvbnRlbnQKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICovCi0JcHJvdGVjdGVkIFN0cmluZyByZWFkKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCBTdHJpbmcgcmVhZChTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIEpHaXRUZXN0VXRpbC5yZWFkKGRiLCBuYW1lKTsKIAl9CiAKQEAgLTE3Myw3ICsxNjYsNyBAQAogCSAqICAgICAgICAgICAgZmlsZSBuYW1lCiAJICogQHJldHVybiBpZiB0aGUgZmlsZSBleGlzdHMKIAkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGVjayhmaW5hbCBTdHJpbmcgbmFtZSkgeworCXByb3RlY3RlZCBib29sZWFuIGNoZWNrKFN0cmluZyBuYW1lKSB7CiAJCXJldHVybiBKR2l0VGVzdFV0aWwuY2hlY2soZGIsIG5hbWUpOwogCX0KIApAQCAtMTg0LDcgKzE3Nyw3IEBACiAJICogICAgICAgICAgICBmaWxlIG5hbWUKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlVHJhc2hGaWxlKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCB2b2lkIGRlbGV0ZVRyYXNoRmlsZShTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJSkdpdFRlc3RVdGlsLmRlbGV0ZVRyYXNoRmlsZShkYiwgbmFtZSk7CiAJfQogCkBAIC0xOTYsMTAgKzE4OSwxMCBAQAogCSAqICAgICAgICAgICAgZXhwZWN0ZWQgY29udGVudAogCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KIAkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgY2hlY2tGaWxlKEZpbGUgZiwgZmluYWwgU3RyaW5nIGNoZWNrRGF0YSkKKwlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgY2hlY2tGaWxlKEZpbGUgZiwgU3RyaW5nIGNoZWNrRGF0YSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRyeSAoUmVhZGVyIHIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShmKSwKLQkJCQlVVEZfOCkpIHsKKwkJCQlDSEFSU0VUKSkgewogCQkJaWYgKGNoZWNrRGF0YS5sZW5ndGgoKSA+IDApIHsKIAkJCQljaGFyW10gZGF0YSA9IG5ldyBjaGFyW2NoZWNrRGF0YS5sZW5ndGgoKV07CiAJCQkJYXNzZXJ0RXF1YWxzKGRhdGEubGVuZ3RoLCByLnJlYWQoZGF0YSkpOwpAQCAtMjkzLDEwICsyODYsMTEgQEAKIAkJCQlkY2Uuc2V0RmlsZU1vZGUodHJlZUl0ci5nZXRFbnRyeUZpbGVNb2RlKCkpOwogCQkJCWRjZS5zZXRMYXN0TW9kaWZpZWQodHJlZUl0ci5nZXRFbnRyeUxhc3RNb2RpZmllZCgpKTsKIAkJCQlkY2Uuc2V0TGVuZ3RoKChpbnQpIGxlbik7Ci0JCQkJRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbSgKLQkJCQkJCXRyZWVJdHIuZ2V0RW50cnlGaWxlKCkpOwotCQkJCWRjZS5zZXRPYmplY3RJZChpbnNlcnRlci5pbnNlcnQoQ29uc3RhbnRzLk9CSl9CTE9CLCBsZW4sIGluKSk7Ci0JCQkJaW4uY2xvc2UoKTsKKwkJCQl0cnkgKEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oCisJCQkJCQl0cmVlSXRyLmdldEVudHJ5RmlsZSgpKSkgeworCQkJCQlkY2Uuc2V0T2JqZWN0SWQoCisJCQkJCQkJaW5zZXJ0ZXIuaW5zZXJ0KENvbnN0YW50cy5PQkpfQkxPQiwgbGVuLCBpbikpOworCQkJCX0KIAkJCQlidWlsZGVyLmFkZChkY2UpOwogCQkJCXRyZWVJdHIubmV4dCgxKTsKIAkJCX0KQEAgLTM4MCw4ICszNzQsOSBAQAogCQkJd2hpbGUgKGFjdFRpbWUgPD0gc3RhcnRUaW1lKSB7CiAJCQkJVGhyZWFkLnNsZWVwKHNsZWVwVGltZSk7CiAJCQkJc2xlZXBUaW1lICo9IDI7Ci0JCQkJRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0bXApOwotCQkJCWZvcy5jbG9zZSgpOworCQkJCXRyeSAoRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0bXApKSB7CisJCQkJCS8vIERvIG5vdGhpbmcKKwkJCQl9CiAJCQkJYWN0VGltZSA9IGZzLmxhc3RNb2RpZmllZCh0bXApOwogCQkJfQogCQkJcmV0dXJuIGFjdFRpbWU7CkBAIC01MDUsNyArNTAwLDcgQEAKIAkgKiBAcGFyYW0gbW9kZQogCSAqIEByZXR1cm4gdGhlIERpckNhY2hlRW50cnkKIAkgKi8KLQlwcm90ZWN0ZWQgRGlyQ2FjaGVFbnRyeSBjcmVhdGVFbnRyeShmaW5hbCBTdHJpbmcgcGF0aCwgZmluYWwgRmlsZU1vZGUgbW9kZSkgeworCXByb3RlY3RlZCBEaXJDYWNoZUVudHJ5IGNyZWF0ZUVudHJ5KFN0cmluZyBwYXRoLCBGaWxlTW9kZSBtb2RlKSB7CiAJCXJldHVybiBjcmVhdGVFbnRyeShwYXRoLCBtb2RlLCBEaXJDYWNoZUVudHJ5LlNUQUdFXzAsIHBhdGgpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9UZXN0UmVwb3NpdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9UZXN0UmVwb3NpdG9yeS5qYXZhCmluZGV4IDQxNjM0ZTcuLmQyM2MwZDMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvVGVzdFJlcG9zaXRvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L1Rlc3RSZXBvc2l0b3J5LmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0OwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKQEAgLTI0NCw3ICsyNDQsNyBAQAogCSAqIEBwYXJhbSBzZWNEZWx0YQogCSAqICAgICAgICAgICAgbnVtYmVyIG9mIHNlY29uZHMgdG8gYWRkIHRvIHRoZSBjdXJyZW50IHRpbWUuCiAJICovCi0JcHVibGljIHZvaWQgdGljayhmaW5hbCBpbnQgc2VjRGVsdGEpIHsKKwlwdWJsaWMgdm9pZCB0aWNrKGludCBzZWNEZWx0YSkgewogCQltb2NrU3lzdGVtUmVhZGVyLnRpY2soc2VjRGVsdGEpOwogCX0KIApAQCAtMjY3LDggKzI2Nyw4IEBACiAJICogQHJldHVybiByZWZlcmVuY2UgdG8gdGhlIGJsb2IuCiAJICogQHRocm93cyBFeGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgUmV2QmxvYiBibG9iKGZpbmFsIFN0cmluZyBjb250ZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGJsb2IoY29udGVudC5nZXRCeXRlcyhVVEZfOCkpOworCXB1YmxpYyBSZXZCbG9iIGJsb2IoU3RyaW5nIGNvbnRlbnQpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gYmxvYihjb250ZW50LmdldEJ5dGVzKENIQVJTRVQpKTsKIAl9CiAKIAkvKioKQEAgLTI3OSw3ICsyNzksNyBAQAogCSAqIEByZXR1cm4gcmVmZXJlbmNlIHRvIHRoZSBibG9iLgogCSAqIEB0aHJvd3MgRXhjZXB0aW9uCiAJICovCi0JcHVibGljIFJldkJsb2IgYmxvYihmaW5hbCBieXRlW10gY29udGVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHVibGljIFJldkJsb2IgYmxvYihieXRlW10gY29udGVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCU9iamVjdElkIGlkOwogCQl0cnkgKE9iamVjdEluc2VydGVyIGlucyA9IGluc2VydGVyKSB7CiAJCQlpZCA9IGlucy5pbnNlcnQoQ29uc3RhbnRzLk9CSl9CTE9CLCBjb250ZW50KTsKQEAgLTI5OCw3ICsyOTgsNyBAQAogCSAqIEByZXR1cm4gdGhlIGVudHJ5LgogCSAqIEB0aHJvd3MgRXhjZXB0aW9uCiAJICovCi0JcHVibGljIERpckNhY2hlRW50cnkgZmlsZShmaW5hbCBTdHJpbmcgcGF0aCwgZmluYWwgUmV2QmxvYiBibG9iKQorCXB1YmxpYyBEaXJDYWNoZUVudHJ5IGZpbGUoU3RyaW5nIHBhdGgsIFJldkJsb2IgYmxvYikKIAkJCXRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBEaXJDYWNoZUVudHJ5IGUgPSBuZXcgRGlyQ2FjaGVFbnRyeShwYXRoKTsKIAkJZS5zZXRGaWxlTW9kZShGaWxlTW9kZS5SRUdVTEFSX0ZJTEUpOwpAQCAtMzE1LDEwICszMTUsMTAgQEAKIAkgKiBAcmV0dXJuIHJlZmVyZW5jZSB0byB0aGUgdHJlZSBzcGVjaWZpZWQgYnkgdGhlIGVudHJ5IGxpc3QuCiAJICogQHRocm93cyBFeGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgUmV2VHJlZSB0cmVlKGZpbmFsIERpckNhY2hlRW50cnkuLi4gZW50cmllcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHVibGljIFJldlRyZWUgdHJlZShEaXJDYWNoZUVudHJ5Li4uIGVudHJpZXMpIHRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBEaXJDYWNoZSBkYyA9IERpckNhY2hlLm5ld0luQ29yZSgpOwogCQlmaW5hbCBEaXJDYWNoZUJ1aWxkZXIgYiA9IGRjLmJ1aWxkZXIoKTsKLQkJZm9yIChmaW5hbCBEaXJDYWNoZUVudHJ5IGUgOiBlbnRyaWVzKQorCQlmb3IgKERpckNhY2hlRW50cnkgZSA6IGVudHJpZXMpCiAJCQliLmFkZChlKTsKIAkJYi5maW5pc2goKTsKIAkJT2JqZWN0SWQgcm9vdDsKQEAgLTMzOSw3ICszMzksNyBAQAogCSAqIEByZXR1cm4gdGhlIHBhcnNlZCBvYmplY3QgZW50cnkgYXQgdGhpcyBwYXRoLCBuZXZlciBudWxsLgogCSAqIEB0aHJvd3MgRXhjZXB0aW9uCiAJICovCi0JcHVibGljIFJldk9iamVjdCBnZXQoZmluYWwgUmV2VHJlZSB0cmVlLCBmaW5hbCBTdHJpbmcgcGF0aCkKKwlwdWJsaWMgUmV2T2JqZWN0IGdldChSZXZUcmVlIHRyZWUsIFN0cmluZyBwYXRoKQogCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsocG9vbC5nZXRPYmplY3RSZWFkZXIoKSkpIHsKIAkJCXR3LnNldEZpbHRlcihQYXRoRmlsdGVyR3JvdXAuY3JlYXRlRnJvbVN0cmluZ3MoQ29sbGVjdGlvbnMKQEAgLTM3MCw3ICszNzAsNyBAQAogCSAqIEByZXR1cm4gdGhlIG5ldyBjb21taXQuCiAJICogQHRocm93cyBFeGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgUmV2Q29tbWl0IGNvbW1pdChmaW5hbCBSZXZDb21taXQuLi4gcGFyZW50cykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHVibGljIFJldkNvbW1pdCBjb21taXQoUmV2Q29tbWl0Li4uIHBhcmVudHMpIHRocm93cyBFeGNlcHRpb24gewogCQlyZXR1cm4gY29tbWl0KDEsIHRyZWUoKSwgcGFyZW50cyk7CiAJfQogCkBAIC0zODYsNyArMzg2LDcgQEAKIAkgKiBAcmV0dXJuIHRoZSBuZXcgY29tbWl0LgogCSAqIEB0aHJvd3MgRXhjZXB0aW9uCiAJICovCi0JcHVibGljIFJldkNvbW1pdCBjb21taXQoZmluYWwgUmV2VHJlZSB0cmVlLCBmaW5hbCBSZXZDb21taXQuLi4gcGFyZW50cykKKwlwdWJsaWMgUmV2Q29tbWl0IGNvbW1pdChSZXZUcmVlIHRyZWUsIFJldkNvbW1pdC4uLiBwYXJlbnRzKQogCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXJldHVybiBjb21taXQoMSwgdHJlZSwgcGFyZW50cyk7CiAJfQpAQCAtNDA0LDcgKzQwNCw3IEBACiAJICogQHJldHVybiB0aGUgbmV3IGNvbW1pdC4KIAkgKiBAdGhyb3dzIEV4Y2VwdGlvbgogCSAqLwotCXB1YmxpYyBSZXZDb21taXQgY29tbWl0KGZpbmFsIGludCBzZWNEZWx0YSwgZmluYWwgUmV2Q29tbWl0Li4uIHBhcmVudHMpCisJcHVibGljIFJldkNvbW1pdCBjb21taXQoaW50IHNlY0RlbHRhLCBSZXZDb21taXQuLi4gcGFyZW50cykKIAkJCXRocm93cyBFeGNlcHRpb24gewogCQlyZXR1cm4gY29tbWl0KHNlY0RlbHRhLCB0cmVlKCksIHBhcmVudHMpOwogCX0KQEAgLTQ3MCw3ICs0NzAsNyBAQAogCSAqIEByZXR1cm4gdGhlIGFubm90YXRlZCB0YWcgb2JqZWN0LgogCSAqIEB0aHJvd3MgRXhjZXB0aW9uCiAJICovCi0JcHVibGljIFJldlRhZyB0YWcoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFJldk9iamVjdCBkc3QpIHRocm93cyBFeGNlcHRpb24geworCXB1YmxpYyBSZXZUYWcgdGFnKFN0cmluZyBuYW1lLCBSZXZPYmplY3QgZHN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgVGFnQnVpbGRlciB0ID0gbmV3IFRhZ0J1aWxkZXIoKTsKIAkJdC5zZXRPYmplY3RJZChkc3QpOwogCQl0LnNldFRhZyhuYW1lKTsKQEAgLTc1OSw3ICs3NTksNyBAQAogCQkJZmluYWwgRmlsZVJlcG9zaXRvcnkgZnIgPSAoRmlsZVJlcG9zaXRvcnkpIGRiOwogCQkJUmVmV3JpdGVyIHJ3ID0gbmV3IFJlZldyaXRlcihmci5nZXRBbGxSZWZzKCkudmFsdWVzKCkpIHsKIAkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCB3cml0ZUZpbGUoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIGJ5dGVbXSBiaW4pCisJCQkJcHJvdGVjdGVkIHZvaWQgd3JpdGVGaWxlKFN0cmluZyBuYW1lLCBieXRlW10gYmluKQogCQkJCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCQkJRmlsZSBwYXRoID0gbmV3IEZpbGUoZnIuZ2V0RGlyZWN0b3J5KCksIG5hbWUpOwogCQkJCQlUZXN0UmVwb3NpdG9yeS50aGlzLndyaXRlRmlsZShwYXRoLCBiaW4pOwpAQCAtNzkxLDcgKzc5MSw3IEBACiAJICogQHJldHVybiB7QGNvZGUgb2JqZWN0fQogCSAqIEB0aHJvd3MgRXhjZXB0aW9uCiAJICovCi0JcHVibGljIDxUIGV4dGVuZHMgUmV2T2JqZWN0PiBUIHBhcnNlQm9keShmaW5hbCBUIG9iamVjdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHVibGljIDxUIGV4dGVuZHMgUmV2T2JqZWN0PiBUIHBhcnNlQm9keShUIG9iamVjdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXBvb2wucGFyc2VCb2R5KG9iamVjdCk7CiAJCXJldHVybiBvYmplY3Q7CiAJfQpAQCAtOTQ0LDcgKzk0NCw3IEBACiAJCXJldHVybiBuZXcgRmlsZShwYWNrZGlyLCAicGFjay0iICsgbmFtZS5uYW1lKCkgKyB0KTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgd3JpdGVGaWxlKGZpbmFsIEZpbGUgcCwgZmluYWwgYnl0ZVtdIGJpbikgdGhyb3dzIElPRXhjZXB0aW9uLAorCXByaXZhdGUgdm9pZCB3cml0ZUZpbGUoRmlsZSBwLCBieXRlW10gYmluKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAJCQlPYmplY3RXcml0aW5nRXhjZXB0aW9uIHsKIAkJZmluYWwgTG9ja0ZpbGUgbGNrID0gbmV3IExvY2tGaWxlKHApOwogCQlpZiAoIWxjay5sb2NrKCkpCkBAIC05NjIsNyArOTYyLDcgQEAKIAlwdWJsaWMgY2xhc3MgQnJhbmNoQnVpbGRlciB7CiAJCXByaXZhdGUgZmluYWwgU3RyaW5nIHJlZjsKIAotCQlCcmFuY2hCdWlsZGVyKGZpbmFsIFN0cmluZyByZWYpIHsKKwkJQnJhbmNoQnVpbGRlcihTdHJpbmcgcmVmKSB7CiAJCQl0aGlzLnJlZiA9IHJlZjsKIAkJfQogCkBAIC0xMDkzLDcgKzEwOTMsNyBAQAogCQkJcmV0dXJuIGFkZChwYXRoLCBibG9iKGNvbnRlbnQpKTsKIAkJfQogCi0JCXB1YmxpYyBDb21taXRCdWlsZGVyIGFkZChTdHJpbmcgcGF0aCwgZmluYWwgUmV2QmxvYiBpZCkKKwkJcHVibGljIENvbW1pdEJ1aWxkZXIgYWRkKFN0cmluZyBwYXRoLCBSZXZCbG9iIGlkKQogCQkJCXRocm93cyBFeGNlcHRpb24gewogCQkJcmV0dXJuIGVkaXQobmV3IFBhdGhFZGl0KHBhdGgpIHsKIAkJCQlAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvVGVzdFJuZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9UZXN0Um5nLmphdmEKaW5kZXggNTRjODFmMi4uZjdhZjM2YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9UZXN0Um5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9UZXN0Um5nLmphdmEKQEAgLTU1LDcgKzU1LDcgQEAKIAkgKiBAcGFyYW0gc2VlZAogCSAqICAgICAgICAgICAgc2VlZCB0byBib290c3RyYXAsIHVzdWFsbHkgdGhpcyBpcyB0aGUgdGVzdCBtZXRob2QgbmFtZS4KIAkgKi8KLQlwdWJsaWMgVGVzdFJuZyhmaW5hbCBTdHJpbmcgc2VlZCkgeworCXB1YmxpYyBUZXN0Um5nKFN0cmluZyBzZWVkKSB7CiAJCW5leHQgPSAwOwogCQlmb3IgKGludCBpID0gMDsgaSA8IHNlZWQubGVuZ3RoKCk7IGkrKykKIAkJCW5leHQgPSBuZXh0ICogMTEgKyBzZWVkLmNoYXJBdChpKTsKQEAgLTY4LDcgKzY4LDcgQEAKIAkgKiAgICAgICAgICAgIG51bWJlciBvZiByYW5kb20gYnl0ZXMgdG8gcHJvZHVjZS4KIAkgKiBAcmV0dXJuIGFycmF5IG9mIHtAY29kZSBjbnR9IHJhbmRvbWx5IGdlbmVyYXRlZCBieXRlcy4KIAkgKi8KLQlwdWJsaWMgYnl0ZVtdIG5leHRCeXRlcyhmaW5hbCBpbnQgY250KSB7CisJcHVibGljIGJ5dGVbXSBuZXh0Qnl0ZXMoaW50IGNudCkgewogCQlmaW5hbCBieXRlW10gciA9IG5ldyBieXRlW2NudF07CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgY250OyBpKyspCiAJCQlyW2ldID0gKGJ5dGUpIG5leHRJbnQoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggYmRlZjY0NS4uYzgwNWY3NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsNyArMyw3IEBACiBCdW5kbGUtTmFtZTogJXBsdWdpbl9uYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0CiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdAotQnVuZGxlLVZlcnNpb246IDQuMTEuNC5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKIEJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlcl9uYW1lCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS44CkBAIC0yOCwyNCArMjgsMjQgQEAKICBvcmcuZWNsaXBzZS5qZXR0eS51dGlsLmxvZzt2ZXJzaW9uPSJbOS40LjUsMTAuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamV0dHkudXRpbC5zZWN1cml0eTt2ZXJzaW9uPSJbOS40LjUsMTAuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamV0dHkudXRpbC50aHJlYWQ7dmVyc2lvbj0iWzkuNC41LDEwLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnM7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnM7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWI7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXI7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuZnM7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0O3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9yczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5mczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKICBvcmcuaGFtY3Jlc3QuY29yZTt2ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTIsNS4wLjApIiwKICBvcmcuanVuaXQucnVsZXM7dmVyc2lvbj0iWzQuMTIsNS4wLjApIiwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdC9wb20ueG1sCmluZGV4IDUwYmM0ODIuLmRlZTMxOTkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvcG9tLnhtbApAQCAtNTAsNyArNTAsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS40LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9zZXJ2ZXIvZnMvTGZzU2VydmVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9mcy9MZnNTZXJ2ZXJUZXN0LmphdmEKaW5kZXggOTBmZTExNi4uNTBhMDZmOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9mcy9MZnNTZXJ2ZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9mcy9MZnNTZXJ2ZXJUZXN0LmphdmEKQEAgLTQyLDcgKzQyLDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuZnM7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CkBAIC0xMzEsMTIgKzEzMSw2IEBACiAKIAkJCUBPdmVycmlkZQogCQkJcHJvdGVjdGVkIExhcmdlRmlsZVJlcG9zaXRvcnkgZ2V0TGFyZ2VGaWxlUmVwb3NpdG9yeSgKLQkJCQkJTGZzUmVxdWVzdCByZXF1ZXN0LCBTdHJpbmcgcGF0aCkgewotCQkJCXJldHVybiByZXBvc2l0b3J5OwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMYXJnZUZpbGVSZXBvc2l0b3J5IGdldExhcmdlRmlsZVJlcG9zaXRvcnkoCiAJCQkJCUxmc1JlcXVlc3QgcmVxdWVzdCwgU3RyaW5nIHBhdGgsIFN0cmluZyBhdXRoKQogCQkJCQl0aHJvd3MgTGZzRXhjZXB0aW9uIHsKIAkJCQlyZXR1cm4gcmVwb3NpdG9yeTsKQEAgLTIxNywxMSArMjExLDExIEBACiAJCQkJaWYgKGJ1Zi5oYXNBcnJheSgpKSB7CiAJCQkJCWVycm9yID0gbmV3IFN0cmluZyhidWYuYXJyYXkoKSwKIAkJCQkJCQlidWYuYXJyYXlPZmZzZXQoKSArIGJ1Zi5wb3NpdGlvbigpLCBidWYucmVtYWluaW5nKCksCi0JCQkJCQkJVVRGXzgpOworCQkJCQkJCUNIQVJTRVQpOwogCQkJCX0gZWxzZSB7CiAJCQkJCWZpbmFsIGJ5dGVbXSBiID0gbmV3IGJ5dGVbYnVmLnJlbWFpbmluZygpXTsKIAkJCQkJYnVmLmR1cGxpY2F0ZSgpLmdldChiKTsKLQkJCQkJZXJyb3IgPSBuZXcgU3RyaW5nKGIsIFVURl84KTsKKwkJCQkJZXJyb3IgPSBuZXcgU3RyaW5nKGIsIENIQVJTRVQpOwogCQkJCX0KIAkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKIAkJCQllcnJvciA9IHN0YXR1c0xpbmUuZ2V0UmVhc29uUGhyYXNlKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL2ZzL1VwbG9hZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9zZXJ2ZXIvZnMvVXBsb2FkVGVzdC5qYXZhCmluZGV4IDhhOGY0OWMuLjA5ZjhkMGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9zZXJ2ZXIvZnMvVXBsb2FkVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9zZXJ2ZXIvZnMvVXBsb2FkVGVzdC5qYXZhCkBAIC0xMjIsNyArMTIyLDcgQEAKIAogCQlFeGVjdXRvclNlcnZpY2UgZSA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woY291bnQpOwogCQl0cnkgewotCQkJZm9yIChmaW5hbCBQYXRoIHAgOiBwYXRocykgeworCQkJZm9yIChQYXRoIHAgOiBwYXRocykgewogCQkJCWUuc3VibWl0KG5ldyBDYWxsYWJsZTxWb2lkPigpIHsKIAkJCQkJQE92ZXJyaWRlCiAJCQkJCXB1YmxpYyBWb2lkIGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCBhYTlhNzAyLi4xNGQzYWI4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDE5ICszLDE5IEBACiBCdW5kbGUtTmFtZTogJXBsdWdpbl9uYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlcgogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyCi1CdW5kbGUtVmVyc2lvbjogNC4xMS40LnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDUuMC40LnF1YWxpZmllcgogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJfbmFtZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlcjt2ZXJzaW9uPSI0LjExLjQiOworRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlcjt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJqYXZheC5zZXJ2bGV0Lmh0dHAsCiAgICBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWIiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5mczt2ZXJzaW9uPSI0LjExLjQiOworIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5mczt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJqYXZheC5zZXJ2bGV0LAogICAgamF2YXguc2VydmxldC5odHRwLAogICAgb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLAogICAgb3JnLmVjbGlwc2UuamdpdC5sZnMubGliIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuaW50ZXJuYWw7dmVyc2lvbj0iNC4xMS40Ijt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5zMzt2ZXJzaW9uPSI0LjExLjQiOworIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5pbnRlcm5hbDt2ZXJzaW9uPSI1LjAuNCI7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuczM7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLAogICAgb3JnLmVjbGlwc2UuamdpdC5sZnMubGliIgogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xLjgKQEAgLTI1LDE0ICsyNSwxNSBAQAogIGphdmF4LnNlcnZsZXQuaHR0cDt2ZXJzaW9uPSJbMy4xLjAsNC4wLjApIiwKICBvcmcuYXBhY2hlLmh0dHA7dmVyc2lvbj0iWzQuMy4wLDUuMC4wKSIsCiAgb3JnLmFwYWNoZS5odHRwLmNsaWVudDt2ZXJzaW9uPSJbNC4zLjAsNS4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbDt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMuZXJyb3JzO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMuaW50ZXJuYWw7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWI7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLmFwYWNoZTt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMuaW50ZXJuYWw7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMubGliO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5hcGFjaGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAogIG9yZy5zbGY0ajt2ZXJzaW9uPSJbMS43LjAsMi4wLjApIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvcG9tLnhtbAppbmRleCA0MzRjYjVjLi43YzgxYzFhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvcG9tLnhtbApAQCAtNTAsNyArNTAsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS40LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXI8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9MZnNQcm90b2NvbFNlcnZsZXQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL0xmc1Byb3RvY29sU2VydmxldC5qYXZhCmluZGV4IDY5NjhkNzUuLmQyMmQ0NTkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL0xmc1Byb3RvY29sU2VydmxldC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL0xmc1Byb3RvY29sU2VydmxldC5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuaHR0cC5IdHRwU3RhdHVzLlNDX0ZPUkJJRERFTjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5odHRwLkh0dHBTdGF0dXMuU0NfSU5TVUZGSUNJRU5UX1NUT1JBR0U7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuaHR0cC5IdHRwU3RhdHVzLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKQEAgLTExMiw0OCArMTEyLDYgQEAKIAkgKiAgICAgICAgICAgIHRoZSByZXF1ZXN0CiAJICogQHBhcmFtIHBhdGgKIAkgKiAgICAgICAgICAgIHRoZSBwYXRoCi0JICogQHJldHVybiB0aGUgbGFyZ2UgZmlsZSByZXBvc2l0b3J5IHN0b3JpbmcgbGFyZ2UgZmlsZXMuCi0JICogQHRocm93cyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnMuTGZzRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zIHNob3VsZCB0aHJvdyBtb3JlIHNwZWNpZmljIGV4Y2VwdGlvbnMgdG8KLQkgKiAgICAgICAgICAgICBzaWduYWwgd2hpY2ggdHlwZSBvZiBlcnJvciBvY2N1cnJlZDoKLQkgKiAgICAgICAgICAgICA8ZGw+Ci0JICogICAgICAgICAgICAgPGR0PntAbGluayBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnMuTGZzVmFsaWRhdGlvbkVycm9yfTwvZHQ+Ci0JICogICAgICAgICAgICAgPGRkPndoZW4gdGhlcmUgaXMgYSB2YWxpZGF0aW9uIGVycm9yIHdpdGggb25lIG9yIG1vcmUgb2YgdGhlCi0JICogICAgICAgICAgICAgb2JqZWN0cyBpbiB0aGUgcmVxdWVzdDwvZGQ+Ci0JICogICAgICAgICAgICAgPGR0PntAbGluayBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnMuTGZzUmVwb3NpdG9yeU5vdEZvdW5kfTwvZHQ+Ci0JICogICAgICAgICAgICAgPGRkPndoZW4gdGhlIHJlcG9zaXRvcnkgZG9lcyBub3QgZXhpc3QgZm9yIHRoZSB1c2VyPC9kZD4KLQkgKiAgICAgICAgICAgICA8ZHQ+e0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9ycy5MZnNSZXBvc2l0b3J5UmVhZE9ubHl9PC9kdD4KLQkgKiAgICAgICAgICAgICA8ZGQ+d2hlbiB0aGUgdXNlciBoYXMgcmVhZCwgYnV0IG5vdCB3cml0ZSBhY2Nlc3MuIE9ubHkKLQkgKiAgICAgICAgICAgICBhcHBsaWNhYmxlIHdoZW4gdGhlIG9wZXJhdGlvbiBpbiB0aGUgcmVxdWVzdCBpcyAidXBsb2FkIjwvZGQ+Ci0JICogICAgICAgICAgICAgPGR0PntAbGluayBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnMuTGZzUmF0ZUxpbWl0RXhjZWVkZWR9PC9kdD4KLQkgKiAgICAgICAgICAgICA8ZGQ+d2hlbiB0aGUgdXNlciBoYXMgaGl0IGEgcmF0ZSBsaW1pdCB3aXRoIHRoZSBzZXJ2ZXI8L2RkPgotCSAqICAgICAgICAgICAgIDxkdD57QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5sZnMuZXJyb3JzLkxmc0JhbmR3aWR0aExpbWl0RXhjZWVkZWR9PC9kdD4KLQkgKiAgICAgICAgICAgICA8ZGQ+d2hlbiB0aGUgYmFuZHdpZHRoIGxpbWl0IGZvciB0aGUgdXNlciBvciByZXBvc2l0b3J5IGhhcwotCSAqICAgICAgICAgICAgIGJlZW4gZXhjZWVkZWQ8L2RkPgotCSAqICAgICAgICAgICAgIDxkdD57QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5sZnMuZXJyb3JzLkxmc0luc3VmZmljaWVudFN0b3JhZ2V9PC9kdD4KLQkgKiAgICAgICAgICAgICA8ZGQ+d2hlbiB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgc3RvcmFnZSBvbiB0aGUgc2VydmVyPC9kZD4KLQkgKiAgICAgICAgICAgICA8ZHQ+e0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9ycy5MZnNVbmF2YWlsYWJsZX08L2R0PgotCSAqICAgICAgICAgICAgIDxkZD53aGVuIExGUyBpcyBub3QgYXZhaWxhYmxlPC9kZD4KLQkgKiAgICAgICAgICAgICA8ZHQ+e0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9ycy5MZnNFeGNlcHRpb259PC9kdD4KLQkgKiAgICAgICAgICAgICA8ZGQ+d2hlbiBhbiB1bmV4cGVjdGVkIGludGVybmFsIHNlcnZlciBlcnJvciBvY2N1cnJlZDwvZGQ+Ci0JICogICAgICAgICAgICAgPC9kbD4KLQkgKiBAc2luY2UgNC41Ci0JICogQGRlcHJlY2F0ZWQgdXNlCi0JICogICAgICAgICAgICAge0BsaW5rICNnZXRMYXJnZUZpbGVSZXBvc2l0b3J5KExmc1JlcXVlc3QsIFN0cmluZywgU3RyaW5nKX0KLQkgKi8KLQlARGVwcmVjYXRlZAotCXByb3RlY3RlZCBMYXJnZUZpbGVSZXBvc2l0b3J5IGdldExhcmdlRmlsZVJlcG9zaXRvcnkoTGZzUmVxdWVzdCByZXF1ZXN0LAotCQkJU3RyaW5nIHBhdGgpIHRocm93cyBMZnNFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0TGFyZ2VGaWxlUmVwb3NpdG9yeShyZXF1ZXN0LCBwYXRoLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGxhcmdlIGZpbGUgcmVwb3NpdG9yeSBmb3IgdGhlIGdpdmVuIHJlcXVlc3QgYW5kIHBhdGguCi0JICoKLQkgKiBAcGFyYW0gcmVxdWVzdAotCSAqICAgICAgICAgICAgdGhlIHJlcXVlc3QKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgdGhlIHBhdGgKIAkgKiBAcGFyYW0gYXV0aAogCSAqICAgICAgICAgICAgdGhlIEF1dGhvcml6YXRpb24gSFRUUCBoZWFkZXIKIAkgKiBAcmV0dXJuIHRoZSBsYXJnZSBmaWxlIHJlcG9zaXRvcnkgc3RvcmluZyBsYXJnZSBmaWxlcy4KQEAgLTI0NCwxMCArMjAyLDEwIEBACiAJcHJvdGVjdGVkIHZvaWQgZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQogCQkJdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJV3JpdGVyIHcgPSBuZXcgQnVmZmVyZWRXcml0ZXIoCi0JCQkJbmV3IE91dHB1dFN0cmVhbVdyaXRlcihyZXMuZ2V0T3V0cHV0U3RyZWFtKCksIFVURl84KSk7CisJCQkJbmV3IE91dHB1dFN0cmVhbVdyaXRlcihyZXMuZ2V0T3V0cHV0U3RyZWFtKCksIENIQVJTRVQpKTsKIAogCQlSZWFkZXIgciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKLQkJCQluZXcgSW5wdXRTdHJlYW1SZWFkZXIocmVxLmdldElucHV0U3RyZWFtKCksIFVURl84KSk7CisJCQkJbmV3IElucHV0U3RyZWFtUmVhZGVyKHJlcS5nZXRJbnB1dFN0cmVhbSgpLCBDSEFSU0VUKSk7CiAJCUxmc1JlcXVlc3QgcmVxdWVzdCA9IExmc0dzb24uZnJvbUpzb24ociwgTGZzUmVxdWVzdC5jbGFzcyk7CiAJCVN0cmluZyBwYXRoID0gcmVxLmdldFBhdGhJbmZvKCk7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL2ZzL0ZpbGVMZnNSZXBvc2l0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9mcy9GaWxlTGZzUmVwb3NpdG9yeS5qYXZhCmluZGV4IDY4OGFlZjIuLjU1ZDkwOTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL2ZzL0ZpbGVMZnNSZXBvc2l0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9zZXJ2ZXIvZnMvRmlsZUxmc1JlcG9zaXRvcnkuamF2YQpAQCAtMTcwLDcgKzE3MCw3IEBACiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIGhleGNoYXIgPSB7ICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywKIAkJCSc3JywgJzgnLCAnOScsICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicgfTsKIAotCXByaXZhdGUgc3RhdGljIHZvaWQgZm9ybWF0SGV4Q2hhcihmaW5hbCBjaGFyW10gZHN0LCBmaW5hbCBpbnQgcCwgaW50IGIpIHsKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGZvcm1hdEhleENoYXIoY2hhcltdIGRzdCwgaW50IHAsIGludCBiKSB7CiAJCWludCBvID0gcCArIDE7CiAJCXdoaWxlIChvID49IHAgJiYgYiAhPSAwKSB7CiAJCQlkc3Rbby0tXSA9IGhleGNoYXJbYiAmIDB4Zl07CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9zMy9TaWduZXJWNC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9zZXJ2ZXIvczMvU2lnbmVyVjQuamF2YQppbmRleCBiMjFjOTRlLi4zNzRhNTYwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9zMy9TaWduZXJWNC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL3MzL1NpZ25lclY0LmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuczM7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC51dGlsLkh0dHBTdXBwb3J0LkhEUl9BVVRIT1JJWkFUSU9OOwogCiBpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwpAQCAtMzU5LDEzICszNTksMTMgQEAKIAogCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBoYXNoKFN0cmluZyBzKSB7CiAJCU1lc3NhZ2VEaWdlc3QgbWQgPSBDb25zdGFudHMubmV3TWVzc2FnZURpZ2VzdCgpOwotCQltZC51cGRhdGUocy5nZXRCeXRlcyhVVEZfOCkpOworCQltZC51cGRhdGUocy5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCXJldHVybiBtZC5kaWdlc3QoKTsKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBieXRlW10gc2lnbihTdHJpbmcgc3RyaW5nRGF0YSwgYnl0ZVtdIGtleSkgewogCQl0cnkgewotCQkJYnl0ZVtdIGRhdGEgPSBzdHJpbmdEYXRhLmdldEJ5dGVzKFVURl84KTsKKwkJCWJ5dGVbXSBkYXRhID0gc3RyaW5nRGF0YS5nZXRCeXRlcyhDSEFSU0VUKTsKIAkJCU1hYyBtYWMgPSBNYWMuZ2V0SW5zdGFuY2UoSE1BQ1NIQTI1Nik7CiAJCQltYWMuaW5pdChuZXcgU2VjcmV0S2V5U3BlYyhrZXksIEhNQUNTSEEyNTYpKTsKIAkJCXJldHVybiBtYWMuZG9GaW5hbChkYXRhKTsKQEAgLTM5NSw3ICszOTUsNyBAQAogCXByaXZhdGUgc3RhdGljIFN0cmluZyB1cmxFbmNvZGUoU3RyaW5nIHVybCwgYm9vbGVhbiBrZWVwUGF0aFNsYXNoKSB7CiAJCVN0cmluZyBlbmNvZGVkOwogCQl0cnkgewotCQkJZW5jb2RlZCA9IFVSTEVuY29kZXIuZW5jb2RlKHVybCwgVVRGXzgubmFtZSgpKTsKKwkJCWVuY29kZWQgPSBVUkxFbmNvZGVyLmVuY29kZSh1cmwsIENIQVJTRVQubmFtZSgpKTsKIAkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CiAJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihMZnNTZXJ2ZXJUZXh0LmdldCgpLnVuc3VwcG9ydGVkVXRmOCwgZSk7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDk1ZjkyNWMuLmQ4Mzc2Y2UgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMywyMyArMywyMyBAQAogQnVuZGxlLU5hbWU6ICVwbHVnaW5fbmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0CiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0Ci1CdW5kbGUtVmVyc2lvbjogNC4xMS40LnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDUuMC40LnF1YWxpZmllcgogQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyX25hbWUKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xLjgKLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZGZzO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMuZXJyb3JzO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMubGliO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXI7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKK0ltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZGZzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMuZXJyb3JzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLmxpYjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCiAgb3JnLmhhbWNyZXN0LmNvcmU7dmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIsCiAgb3JnLmp1bml0O3ZlcnNpb249Ils0LjEyLDUuMC4wKSIsCiAgb3JnLmp1bml0LnJ1bm5lcjt2ZXJzaW9uPSJbNC4xMiw1LjAuMCkiLAogIG9yZy5qdW5pdC5ydW5uZXJzO3ZlcnNpb249Ils0LjEyLDUuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0O3ZlcnNpb249IjQuMTEuNCI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QiCitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdDt2ZXJzaW9uPSI1LjAuNCI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QiCiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvcG9tLnhtbAppbmRleCBhMjM0YjBhLi5hNTVjZWNkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC9wb20ueG1sCkBAIC01MCw3ICs1MCw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjQtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3Q8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy90ZXN0L0xvbmdPYmplY3RJZFRlc3RVdGlscy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvdGVzdC9Mb25nT2JqZWN0SWRUZXN0VXRpbHMuamF2YQppbmRleCBjM2MzODU5Li5lM2M2ZWY4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy90ZXN0L0xvbmdPYmplY3RJZFRlc3RVdGlscy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL3Rlc3QvTG9uZ09iamVjdElkVGVzdFV0aWxzLmphdmEKQEAgLTQyLDcgKzQyLDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0OwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CkBAIC02Niw3ICs2Niw3IEBACiAJICovCiAJcHVibGljIHN0YXRpYyBMb25nT2JqZWN0SWQgaGFzaChTdHJpbmcgcykgewogCQlNZXNzYWdlRGlnZXN0IG1kID0gQ29uc3RhbnRzLm5ld01lc3NhZ2VEaWdlc3QoKTsKLQkJbWQudXBkYXRlKHMuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJbWQudXBkYXRlKHMuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlyZXR1cm4gTG9uZ09iamVjdElkLmZyb21SYXcobWQuZGlnZXN0KCkpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9sZnMvbGliL0xGU1BvaW50ZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvTEZTUG9pbnRlclRlc3QuamF2YQppbmRleCAxNDZhMjVlLi5hMTI4M2RkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvTEZTUG9pbnRlclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvTEZTUG9pbnRlclRlc3QuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubGZzLmxpYjsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSQUNURVJfRU5DT0RJTkc7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CkBAIC02Niw3ICs2Niw3IEBACiAJCQlhc3NlcnRFcXVhbHMoCiAJCQkJCSJ2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjFcbm9pZCBzaGEyNTY6IgogCQkJCQkJCSsgcyArICJcbnNpemUgNFxuIiwKLQkJCQkJYmFvcy50b1N0cmluZyhVVEZfOC5uYW1lKCkpKTsKKwkJCQkJYmFvcy50b1N0cmluZyhDSEFSQUNURVJfRU5DT0RJTkcpKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggZTA5ZDJhMy4uM2UxZTIyMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsMzMgKzMsMzQgQEAKIEJ1bmRsZS1OYW1lOiAlcGx1Z2luX25hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5sZnMKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQubGZzCi1CdW5kbGUtVmVyc2lvbjogNC4xMS40LnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDUuMC40LnF1YWxpZmllcgogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJfbmFtZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQubGZzO3ZlcnNpb249IjQuMTEuNCIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMuZXJyb3JzO3ZlcnNpb249IjQuMTEuNCIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMuaW50ZXJuYWw7dmVyc2lvbj0iNC4xMS40Ijt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0LG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5mcyxvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLmxpYjt2ZXJzaW9uPSI0LjExLjQiCitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5sZnM7dmVyc2lvbj0iNS4wLjQiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9yczt2ZXJzaW9uPSI1LjAuNCIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMuaW50ZXJuYWw7dmVyc2lvbj0iNS4wLjQiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3Qsb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLmZzLG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlciIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMubGliO3ZlcnNpb249IjUuMC40IgogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xLjgKIEltcG9ydC1QYWNrYWdlOiBjb20uZ29vZ2xlLmdzb247dmVyc2lvbj0iWzIuOC4yLDMuMC4wKSIsCiAgY29tLmdvb2dsZS5nc29uLnN0cmVhbTt2ZXJzaW9uPSJbMi44LjIsMy4wLjApIiwKICBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jbGllbnQ7dmVyc2lvbj0iWzQuMi42LDUuMC4wKSIsCiAgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubjt2ZXJzaW9uPSJbNC4yLjYsNS4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5kaWZmO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmhvb2tzO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UucGFjazt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cDt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiCisgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9uczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZGlmZjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmhvb2tzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UucGFjazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuc2xmNGo7dmVyc2lvbj0iWzEuNy4wLDIuMC4wKSIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9wb20ueG1sCmluZGV4IGM1Yzc4NTAuLmMyMzE2OTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvcG9tLnhtbApAQCAtNTAsNyArNTAsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS40LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LmxmczwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9MZnMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9MZnMuamF2YQppbmRleCA0MGQ4MzQyLi40YzQ2YmJkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL0xmcy5qYXZhCkBAIC02NSwxOSArNjUsNiBAQAogCS8qKgogCSAqIENvbnN0cnVjdG9yIGZvciBMZnMuCiAJICoKLQkgKiBAcGFyYW0gcm9vdAotCSAqICAgICAgICAgICAgdGhlIHBhdGggdG8gdGhlIExGUyBtZWRpYSBkaXJlY3RvcnkuIFdpbGwgYmUKLQkgKiAgICAgICAgICAgIHtAY29kZSAiPHJlcG8+Ly5naXQvbGZzIn0KLQkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNMZnMoUmVwb3NpdG9yeSl9IGluc3RlYWQuCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgTGZzKFBhdGggcm9vdCkgewotCQl0aGlzLnJvb3QgPSByb290OwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBMZnMuCi0JICoKIAkgKiBAcGFyYW0gZGIKIAkgKiAgICAgICAgICAgIHRoZSBhc3NvY2lhdGVkIHJlcG8KIAkgKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL0xmc1BvaW50ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9MZnNQb2ludGVyLmphdmEKaW5kZXggMGUzODMwYy4uNGY5NTk0MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL0xmc1BvaW50ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzUG9pbnRlci5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5sZnM7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTEzNCw3ICsxMzQsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIGVuY29kZShPdXRwdXRTdHJlYW0gb3V0KSB7CiAJCXRyeSAoUHJpbnRTdHJlYW0gcHMgPSBuZXcgUHJpbnRTdHJlYW0ob3V0LCBmYWxzZSwKLQkJCQlVVEZfOC5uYW1lKCkpKSB7CisJCQkJQ0hBUlNFVC5uYW1lKCkpKSB7CiAJCQlwcy5wcmludCgidmVyc2lvbiAiKTsgLy8kTk9OLU5MUy0xJAogCQkJcHMucHJpbnQoVkVSU0lPTiArICJcbiIpOyAvLyROT04tTkxTLTEkCiAJCQlwcy5wcmludCgib2lkICIgKyBIQVNIX0ZVTkNUSU9OX05BTUUgKyAiOiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKQEAgLTE0Myw3ICsxNDMsNyBAQAogCQkJcHMucHJpbnQoc2l6ZSArICJcbiIpOyAvLyROT04tTkxTLTEkCiAJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewogCQkJLy8gc2hvdWxkIG5vdCBoYXBwZW4sIHdlIGFyZSB1c2luZyBhIHN0YW5kYXJkIGNoYXJzZXQKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24oVVRGXzgubmFtZSgpKTsKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24oQ0hBUlNFVC5uYW1lKCkpOwogCQl9CiAJfQogCkBAIC0xNjUsNyArMTY1LDcgQEAKIAkJbG9uZyBzeiA9IC0xOwogCiAJCXRyeSAoQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCi0JCQkJbmV3IElucHV0U3RyZWFtUmVhZGVyKGluLCBVVEZfOCkpKSB7CisJCQkJbmV3IElucHV0U3RyZWFtUmVhZGVyKGluLCBDSEFSU0VUKSkpIHsKIAkJCWZvciAoU3RyaW5nIHMgPSBici5yZWFkTGluZSgpOyBzICE9IG51bGw7IHMgPSBici5yZWFkTGluZSgpKSB7CiAJCQkJaWYgKHMuc3RhcnRzV2l0aCgiIyIpIHx8IHMubGVuZ3RoKCkgPT0gMCkgeyAvLyROT04tTkxTLTEkCiAJCQkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL0xmc1ByZVB1c2hIb29rLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzUHJlUHVzaEhvb2suamF2YQppbmRleCA2MTE1ZTM5Li5kZTQ0NDlmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzUHJlUHVzaEhvb2suamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzUHJlUHVzaEhvb2suamF2YQpAQCAtNDIsNyArNDIsNyBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubGZzOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGZzLlByb3RvY29sLk9QRVJBVElPTl9VUExPQUQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGZzLmludGVybmFsLkxmc0Nvbm5lY3Rpb25GYWN0b3J5LnRvUmVxdWVzdDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5IdHRwQ29ubmVjdGlvbi5IVFRQX09LOwpAQCAtMTc0LDggKzE3NCw4IEBACiAKIAlwcml2YXRlIHZvaWQgZXhjbHVkZVJlbW90ZVJlZnMoT2JqZWN0V2FsayB3YWxrKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlSZWZEYXRhYmFzZSByZWZEYXRhYmFzZSA9IGdldFJlcG9zaXRvcnkoKS5nZXRSZWZEYXRhYmFzZSgpOwotCQlNYXA8U3RyaW5nLCBSZWY+IHJlbW90ZVJlZnMgPSByZWZEYXRhYmFzZS5nZXRSZWZzKHJlbW90ZSgpKTsKLQkJZm9yIChSZWYgciA6IHJlbW90ZVJlZnMudmFsdWVzKCkpIHsKKwkJTGlzdDxSZWY+IHJlbW90ZVJlZnMgPSByZWZEYXRhYmFzZS5nZXRSZWZzQnlQcmVmaXgocmVtb3RlKCkpOworCQlmb3IgKFJlZiByIDogcmVtb3RlUmVmcykgewogCQkJT2JqZWN0SWQgb2lkID0gci5nZXRQZWVsZWRPYmplY3RJZCgpOwogCQkJaWYgKG9pZCA9PSBudWxsKSB7CiAJCQkJb2lkID0gci5nZXRPYmplY3RJZCgpOwpAQCAtMjA4LDcgKzIwOCw3IEBACiAJCX0KIAkJR3NvbiBnc29uID0gUHJvdG9jb2wuZ3NvbigpOwogCQlhcGkuZ2V0T3V0cHV0U3RyZWFtKCkud3JpdGUoCi0JCQkJZ3Nvbi50b0pzb24odG9SZXF1ZXN0KE9QRVJBVElPTl9VUExPQUQsIHJlcykpLmdldEJ5dGVzKFVURl84KSk7CisJCQkJZ3Nvbi50b0pzb24odG9SZXF1ZXN0KE9QRVJBVElPTl9VUExPQUQsIHJlcykpLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJaW50IHJlc3BvbnNlQ29kZSA9IGFwaS5nZXRSZXNwb25zZUNvZGUoKTsKIAkJaWYgKHJlc3BvbnNlQ29kZSAhPSBIVFRQX09LKSB7CiAJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvU211ZGdlRmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvU211ZGdlRmlsdGVyLmphdmEKaW5kZXggZTJhYjMwOS4uNmJmZjEyZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL1NtdWRnZUZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9TbXVkZ2VGaWx0ZXIuamF2YQpAQCAtNDIsMTEgKzQyLDEyIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5sZnM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIGltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CkBAIC0xNjksNyArMTcwLDcgQEAKIAkJCQkud3JpdGUoZ3NvbgogCQkJCQkJLnRvSnNvbihMZnNDb25uZWN0aW9uRmFjdG9yeQogCQkJCQkJCQkudG9SZXF1ZXN0KFByb3RvY29sLk9QRVJBVElPTl9ET1dOTE9BRCwgcmVzKSkKLQkJCQkJCS5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KSk7CisJCQkJCQkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlpbnQgcmVzcG9uc2VDb2RlID0gbGZzU2VydmVyQ29ubi5nZXRSZXNwb25zZUNvZGUoKTsKIAkJaWYgKHJlc3BvbnNlQ29kZSAhPSBIdHRwQ29ubmVjdGlvbi5IVFRQX09LKSB7CiAJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvZXJyb3JzL0xmc0NvbmZpZ0ludmFsaWRFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9lcnJvcnMvTGZzQ29uZmlnSW52YWxpZEV4Y2VwdGlvbi5qYXZhCmluZGV4IDUzMjBhZjAuLmY5MGEwMDMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9lcnJvcnMvTGZzQ29uZmlnSW52YWxpZEV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9lcnJvcnMvTGZzQ29uZmlnSW52YWxpZEV4Y2VwdGlvbi5qYXZhCkBAIC02Myw0ICs2MywxNyBAQAogCQlzdXBlcihtc2cpOwogCX0KIAorCS8qKgorCSAqIENvbnN0cnVjdG9yIGZvciBMZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uLgorCSAqCisJICogQHBhcmFtIG1zZworCSAqICAgICAgICAgICAgdGhlIGVycm9yIGRlc2NyaXB0aW9uCisJICogQHBhcmFtIGUKKwkgKiAgICAgICAgICAgIGNhdXNlIG9mIHRoaXMgZXhjZXB0aW9uCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyBMZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uKFN0cmluZyBtc2csIEV4Y2VwdGlvbiBlKSB7CisJCXN1cGVyKG1zZywgZSk7CisJfQorCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvaW50ZXJuYWwvTGZzQ29ubmVjdGlvbkZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9pbnRlcm5hbC9MZnNDb25uZWN0aW9uRmFjdG9yeS5qYXZhCmluZGV4IDVkODI2OGIuLjk1NWVjYTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9pbnRlcm5hbC9MZnNDb25uZWN0aW9uRmFjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9pbnRlcm5hbC9MZnNDb25uZWN0aW9uRmFjdG9yeS5qYXZhCkBAIC00NywxMCArNDcsOSBAQAogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuSHR0cFN1cHBvcnQuSERSX0FDQ0VQVF9FTkNPRElORzsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC51dGlsLkh0dHBTdXBwb3J0LkhEUl9DT05URU5UX1RZUEU7CiAKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKIGltcG9ydCBqYXZhLm5ldC5Qcm94eVNlbGVjdG9yOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5VUkw7CiBpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CkBAIC01OCw2ICs1Nyw3IEBACiBpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zLk5vbk51bGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQ29tbWFuZEZhaWxlZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5MZnNQb2ludGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGZzLlByb3RvY29sOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9ycy5MZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uOwpAQCAtNjYsMjAgKzY2LDE3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuU3RvcmVkQ29uZmlnOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lkh0dHBDb25maWc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuSHR0cFRyYW5zcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5SZW1vdGVTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlNzaFNlc3Npb25GYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlVSSWlzaDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLkh0dHBDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GUzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuSHR0cFN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvLk1lc3NhZ2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvLlN0cmVhbUNvcHlUaHJlYWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlNzaFN1cHBvcnQ7CiAKIC8qKgogICogUHJvdmlkZXMgbWVhbnMgdG8gZ2V0IGEgdmFsaWQgTEZTIGNvbm5lY3Rpb24gZm9yIGEgZ2l2ZW4gcmVwb3NpdG9yeS4KICAqLwogcHVibGljIGNsYXNzIExmc0Nvbm5lY3Rpb25GYWN0b3J5IHsKIAorCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTU0hfQVVUSF9USU1FT1VUX1NFQ09ORFMgPSAzMDsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1FX0hUVFBTID0gImh0dHBzIjsgLy8kTk9OLU5MUy0xJAogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUVfU1NIID0gInNzaCI7IC8vJE5PTi1OTFMtMSQKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBBdXRoQ2FjaGU+IHNzaEF1dGhDYWNoZSA9IG5ldyBUcmVlTWFwPD4oKTsKQEAgLTEzMyw2ICsxMzAsNyBAQAogCQlTdHJpbmcgbGZzVXJsID0gY29uZmlnLmdldFN0cmluZyhDb25maWdDb25zdGFudHMuQ09ORklHX1NFQ1RJT05fTEZTLAogCQkJCW51bGwsCiAJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfVVJMKTsKKwkJRXhjZXB0aW9uIGV4ID0gbnVsbDsKIAkJaWYgKGxmc1VybCA9PSBudWxsKSB7CiAJCQlTdHJpbmcgcmVtb3RlVXJsID0gbnVsbDsKIAkJCWZvciAoU3RyaW5nIHJlbW90ZSA6IGRiLmdldFJlbW90ZU5hbWVzKCkpIHsKQEAgLTE1MSwzOCArMTQ5LDQ0IEBACiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlpZiAobGZzVXJsID09IG51bGwgJiYgcmVtb3RlVXJsICE9IG51bGwpIHsKLQkJCQlsZnNVcmwgPSBkaXNjb3Zlckxmc1VybChkYiwgcHVycG9zZSwgYWRkaXRpb25hbEhlYWRlcnMsCi0JCQkJCQlyZW1vdGVVcmwpOworCQkJCXRyeSB7CisJCQkJCWxmc1VybCA9IGRpc2NvdmVyTGZzVXJsKGRiLCBwdXJwb3NlLCBhZGRpdGlvbmFsSGVhZGVycywKKwkJCQkJCQlyZW1vdGVVcmwpOworCQkJCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiB8IElPRXhjZXB0aW9uCisJCQkJCQl8IENvbW1hbmRGYWlsZWRFeGNlcHRpb24gZSkgeworCQkJCQlleCA9IGU7CisJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQlsZnNVcmwgPSBsZnNVcmwgKyBQcm90b2NvbC5JTkZPX0xGU19FTkRQT0lOVDsKIAkJCX0KIAkJfQogCQlpZiAobGZzVXJsID09IG51bGwpIHsKKwkJCWlmIChleCAhPSBudWxsKSB7CisJCQkJdGhyb3cgbmV3IExmc0NvbmZpZ0ludmFsaWRFeGNlcHRpb24oCisJCQkJCQlMZnNUZXh0LmdldCgpLmxmc05vRG93bmxvYWRVcmwsIGV4KTsKKwkJCX0KIAkJCXRocm93IG5ldyBMZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uKExmc1RleHQuZ2V0KCkubGZzTm9Eb3dubG9hZFVybCk7CiAJCX0KIAkJcmV0dXJuIGxmc1VybDsKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGlzY292ZXJMZnNVcmwoUmVwb3NpdG9yeSBkYiwgU3RyaW5nIHB1cnBvc2UsCi0JCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGFkZGl0aW9uYWxIZWFkZXJzLCBTdHJpbmcgcmVtb3RlVXJsKSB7Ci0JCXRyeSB7Ci0JCQlVUklpc2ggdSA9IG5ldyBVUklpc2gocmVtb3RlVXJsKTsKLQkJCWlmIChTQ0hFTUVfU1NILmVxdWFscyh1LmdldFNjaGVtZSgpKSkgewotCQkJCVByb3RvY29sLkV4cGlyaW5nQWN0aW9uIGFjdGlvbiA9IGdldFNzaEF1dGhlbnRpY2F0aW9uKAotCQkJCQkJZGIsIHB1cnBvc2UsIHJlbW90ZVVybCwgdSk7Ci0JCQkJYWRkaXRpb25hbEhlYWRlcnMucHV0QWxsKGFjdGlvbi5oZWFkZXIpOwotCQkJCXJldHVybiBhY3Rpb24uaHJlZjsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHJlbW90ZVVybCArIFByb3RvY29sLklORk9fTEZTX0VORFBPSU5UOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7IC8vIGNvdWxkIG5vdCBkaXNjb3ZlcgorCQkJTWFwPFN0cmluZywgU3RyaW5nPiBhZGRpdGlvbmFsSGVhZGVycywgU3RyaW5nIHJlbW90ZVVybCkKKwkJCXRocm93cyBVUklTeW50YXhFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb21tYW5kRmFpbGVkRXhjZXB0aW9uIHsKKwkJVVJJaXNoIHUgPSBuZXcgVVJJaXNoKHJlbW90ZVVybCk7CisJCWlmICh1LmdldFNjaGVtZSgpID09IG51bGwgfHwgU0NIRU1FX1NTSC5lcXVhbHModS5nZXRTY2hlbWUoKSkpIHsKKwkJCVByb3RvY29sLkV4cGlyaW5nQWN0aW9uIGFjdGlvbiA9IGdldFNzaEF1dGhlbnRpY2F0aW9uKGRiLCBwdXJwb3NlLAorCQkJCQlyZW1vdGVVcmwsIHUpOworCQkJYWRkaXRpb25hbEhlYWRlcnMucHV0QWxsKGFjdGlvbi5oZWFkZXIpOworCQkJcmV0dXJuIGFjdGlvbi5ocmVmOworCQl9IGVsc2UgeworCQkJcmV0dXJuIHJlbW90ZVVybCArIFByb3RvY29sLklORk9fTEZTX0VORFBPSU5UOwogCQl9CiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgUHJvdG9jb2wuRXhwaXJpbmdBY3Rpb24gZ2V0U3NoQXV0aGVudGljYXRpb24oCiAJCQlSZXBvc2l0b3J5IGRiLCBTdHJpbmcgcHVycG9zZSwgU3RyaW5nIHJlbW90ZVVybCwgVVJJaXNoIHUpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBDb21tYW5kRmFpbGVkRXhjZXB0aW9uIHsKIAkJQXV0aENhY2hlIGNhY2hlZCA9IHNzaEF1dGhDYWNoZS5nZXQocmVtb3RlVXJsKTsKIAkJUHJvdG9jb2wuRXhwaXJpbmdBY3Rpb24gYWN0aW9uID0gbnVsbDsKIAkJaWYgKGNhY2hlZCAhPSBudWxsICYmIGNhY2hlZC52YWxpZFVudGlsID4gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpIHsKQEAgLTE5MywxMCArMTk3LDExIEBACiAJCQkvLyBkaXNjb3ZlciBhbmQgYXV0aGVudGljYXRlOyBnaXQtbGZzIGRvZXMgInNzaAogCQkJLy8gLXAgPHBvcnQ+IC0tIDxob3N0PiBnaXQtbGZzLWF1dGhlbnRpY2F0ZQogCQkJLy8gPHByb2plY3Q+IDx1cGxvYWQvZG93bmxvYWQ+IgotCQkJU3RyaW5nIGpzb24gPSBydW5Tc2hDb21tYW5kKHUuc2V0UGF0aCgiIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZGIuZ2V0RlMoKSwKKwkJCVN0cmluZyBqc29uID0gU3NoU3VwcG9ydC5ydW5Tc2hDb21tYW5kKHUuc2V0UGF0aCgiIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkJbnVsbCwgZGIuZ2V0RlMoKSwKIAkJCQkJImdpdC1sZnMtYXV0aGVudGljYXRlICIgKyBleHRyYWN0UHJvamVjdE5hbWUodSkgKyAiICIgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkrIHB1cnBvc2UpOworCQkJCQkJCSsgcHVycG9zZSwKKwkJCQkJU1NIX0FVVEhfVElNRU9VVF9TRUNPTkRTKTsKIAogCQkJYWN0aW9uID0gUHJvdG9jb2wuZ3NvbigpLmZyb21Kc29uKGpzb24sCiAJCQkJCVByb3RvY29sLkV4cGlyaW5nQWN0aW9uLmNsYXNzKTsKQEAgLTIzMCw4ICsyMzUsMTAgQEAKIAkJCQkuY3JlYXRlKGNvbnRlbnRVcmwsIEh0dHBTdXBwb3J0CiAJCQkJCQkucHJveHlGb3IoUHJveHlTZWxlY3Rvci5nZXREZWZhdWx0KCksIGNvbnRlbnRVcmwpKTsKIAkJY29udGVudFNlcnZlckNvbm4uc2V0UmVxdWVzdE1ldGhvZChtZXRob2QpOwotCQlhY3Rpb24uaGVhZGVyCi0JCQkJLmZvckVhY2goKGssIHYpIC0+IGNvbnRlbnRTZXJ2ZXJDb25uLnNldFJlcXVlc3RQcm9wZXJ0eShrLCB2KSk7CisJCWlmIChhY3Rpb24uaGVhZGVyICE9IG51bGwpIHsKKwkJCWFjdGlvbi5oZWFkZXIuZm9yRWFjaCgKKwkJCQkJKGssIHYpIC0+IGNvbnRlbnRTZXJ2ZXJDb25uLnNldFJlcXVlc3RQcm9wZXJ0eShrLCB2KSk7CisJCX0KIAkJaWYgKGNvbnRlbnRVcmwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoU0NIRU1FX0hUVFBTKQogCQkJCSYmICFyZXBvLmdldENvbmZpZygpLmdldEJvb2xlYW4oSHR0cENvbmZpZy5IVFRQLAogCQkJCQkJSHR0cENvbmZpZy5TU0xfVkVSSUZZX0tFWSwgdHJ1ZSkpIHsKQEAgLTI0NSw3ICsyNTIsMTMgQEAKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXh0cmFjdFByb2plY3ROYW1lKFVSSWlzaCB1KSB7Ci0JCVN0cmluZyBwYXRoID0gdS5nZXRQYXRoKCkuc3Vic3RyaW5nKDEpOworCQlTdHJpbmcgcGF0aCA9IHUuZ2V0UGF0aCgpOworCisJCS8vIGJlZ2lucyB3aXRoIGEgc2xhc2ggaWYgdGhlIHVybCBjb250YWlucyBhIHBvcnQgKGdlcnJpdCB2cy4gZ2l0aHViKS4KKwkJaWYgKHBhdGguc3RhcnRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCXBhdGggPSBwYXRoLnN1YnN0cmluZygxKTsKKwkJfQorCiAJCWlmIChwYXRoLmVuZHNXaXRoKG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5ET1RfR0lUKSkgewogCQkJcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoKCkgLSA0KTsKIAkJfSBlbHNlIHsKQEAgLTI1Myw0MiArMjY2LDYgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBydW5Tc2hDb21tYW5kKFVSSWlzaCBzc2hVcmksIEZTIGZzLCBTdHJpbmcgY29tbWFuZCkKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVJlbW90ZVNlc3Npb24gc2Vzc2lvbiA9IG51bGw7Ci0JCVByb2Nlc3MgcHJvY2VzcyA9IG51bGw7Ci0JCVN0cmVhbUNvcHlUaHJlYWQgZXJyb3JUaHJlYWQgPSBudWxsOwotCQl0cnkgKE1lc3NhZ2VXcml0ZXIgc3RkZXJyID0gbmV3IE1lc3NhZ2VXcml0ZXIoKSkgewotCQkJc2Vzc2lvbiA9IFNzaFNlc3Npb25GYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U2Vzc2lvbihzc2hVcmksIG51bGwsCi0JCQkJCWZzLCA1XzAwMCk7Ci0JCQlwcm9jZXNzID0gc2Vzc2lvbi5leGVjKGNvbW1hbmQsIDApOwotCQkJZXJyb3JUaHJlYWQgPSBuZXcgU3RyZWFtQ29weVRocmVhZChwcm9jZXNzLmdldEVycm9yU3RyZWFtKCksCi0JCQkJCXN0ZGVyci5nZXRSYXdTdHJlYW0oKSk7Ci0JCQllcnJvclRocmVhZC5zdGFydCgpOwotCQkJdHJ5IChCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCi0JCQkJCW5ldyBJbnB1dFN0cmVhbVJlYWRlcihwcm9jZXNzLmdldElucHV0U3RyZWFtKCksCi0JCQkJCQkJb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQpKSkgewotCQkJCXJldHVybiByZWFkZXIucmVhZExpbmUoKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChwcm9jZXNzICE9IG51bGwpIHsKLQkJCQlwcm9jZXNzLmRlc3Ryb3koKTsKLQkJCX0KLQkJCWlmIChlcnJvclRocmVhZCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZXJyb3JUaHJlYWQuaGFsdCgpOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gU3RvcCB3YWl0aW5nIGFuZCByZXR1cm4gYW55d2F5LgotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWVycm9yVGhyZWFkID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoc2Vzc2lvbiAhPSBudWxsKSB7Ci0JCQkJU3NoU2Vzc2lvbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5yZWxlYXNlU2Vzc2lvbihzZXNzaW9uKTsKLQkJCX0KLQkJfQotCX0KLQogCS8qKgogCSAqIEBwYXJhbSBvcGVyYXRpb24KIAkgKiAgICAgICAgICAgIHRoZSBvcGVyYXRpb24gdG8gcGVyZm9ybSwgZS5nLiBQcm90b2NvbC5PUEVSQVRJT05fRE9XTkxPQUQKQEAgLTMxMyw3ICsyOTAsNyBAQAogCX0KIAogCXByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEF1dGhDYWNoZSB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgQVVUSF9DQUNIRV9FQUdFUl9USU1FT1VUID0gMTAwOworCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEFVVEhfQ0FDSEVfRUFHRVJfVElNRU9VVCA9IDUwMDsKIAogCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTaW1wbGVEYXRlRm9ybWF0IElTT19GT1JNQVQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgKIAkJCQkieXl5eS1NTS1kZCdUJ0hIOm1tOnNzLlNTU1giKTsgLy8kTk9OLU5MUy0xJApAQCAtMzMwLDggKzMwNyw5IEBACiAJCQl0aGlzLmNhY2hlZEFjdGlvbiA9IGFjdGlvbjsKIAkJCXRyeSB7CiAJCQkJaWYgKGFjdGlvbi5leHBpcmVzSW4gIT0gbnVsbCAmJiAhYWN0aW9uLmV4cGlyZXNJbi5pc0VtcHR5KCkpIHsKLQkJCQkJdGhpcy52YWxpZFVudGlsID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkKLQkJCQkJCQkrIExvbmcucGFyc2VMb25nKGFjdGlvbi5leHBpcmVzSW4pOworCQkJCQl0aGlzLnZhbGlkVW50aWwgPSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkKKwkJCQkJCQkrIExvbmcucGFyc2VMb25nKGFjdGlvbi5leHBpcmVzSW4pKQorCQkJCQkJCS0gQVVUSF9DQUNIRV9FQUdFUl9USU1FT1VUOwogCQkJCX0gZWxzZSBpZiAoYWN0aW9uLmV4cGlyZXNBdCAhPSBudWxsCiAJCQkJCQkmJiAhYWN0aW9uLmV4cGlyZXNBdC5pc0VtcHR5KCkpIHsKIAkJCQkJdGhpcy52YWxpZFVudGlsID0gSVNPX0ZPUk1BVC5wYXJzZShhY3Rpb24uZXhwaXJlc0F0KQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9BYmJyZXZpYXRlZExvbmdPYmplY3RJZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9BYmJyZXZpYXRlZExvbmdPYmplY3RJZC5qYXZhCmluZGV4IDQ1MjlhMjUuLmJkZDFiMzkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvQWJicmV2aWF0ZWRMb25nT2JqZWN0SWQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvbGliL0FiYnJldmlhdGVkTG9uZ09iamVjdElkLmphdmEKQEAgLTc4LDcgKzc4LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gdGVzdC4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN0cmluZyBjYW4gY29udmVydGVkIGludG8gYW4gQWJicmV2aWF0ZWRPYmplY3RJZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNJZChmaW5hbCBTdHJpbmcgaWQpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNJZChTdHJpbmcgaWQpIHsKIAkJaWYgKGlkLmxlbmd0aCgpIDwgMgogCQkJCXx8IENvbnN0YW50cy5MT05HX09CSkVDVF9JRF9TVFJJTkdfTEVOR1RIIDwgaWQubGVuZ3RoKCkpCiAJCQlyZXR1cm4gZmFsc2U7CkBAIC0xMzgsNyArMTM4LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gcmVhZCBmcm9tLiBNdXN0IGJlICZsdDs9IDY0IGNoYXJhY3RlcnMuCiAJICogQHJldHVybiB0aGUgY29udmVydGVkIG9iamVjdCBpZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEFiYnJldmlhdGVkTG9uZ09iamVjdElkIGZyb21TdHJpbmcoZmluYWwgU3RyaW5nIHN0cikgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgQWJicmV2aWF0ZWRMb25nT2JqZWN0SWQgZnJvbVN0cmluZyhTdHJpbmcgc3RyKSB7CiAJCWlmIChzdHIubGVuZ3RoKCkgPiBDb25zdGFudHMuTE9OR19PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSCkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCiAJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KExmc1RleHQuZ2V0KCkuaW52YWxpZExvbmdJZCwgc3RyKSk7CkBAIC0xNzMsNyArMTczLDcgQEAKIAkJcmV0dXJuIHIgPDwgKDE2IC0gbikgKiA0OwogCX0KIAotCXN0YXRpYyBsb25nIG1hc2soZmluYWwgaW50IG5pYmJsZXMsIGZpbmFsIGxvbmcgd29yZCwgZmluYWwgbG9uZyB2KSB7CisJc3RhdGljIGxvbmcgbWFzayhpbnQgbmliYmxlcywgbG9uZyB3b3JkLCBsb25nIHYpIHsKIAkJZmluYWwgbG9uZyBiID0gKHdvcmQgLSAxKSAqIDE2OwogCQlpZiAoYiArIDE2IDw9IG5pYmJsZXMpIHsKIAkJCS8vIFdlIGhhdmUgYWxsIG9mIHRoZSBiaXRzIHJlcXVpcmVkIGZvciB0aGlzIHdvcmQuCkBAIC0yNDksNyArMjQ5LDcgQEAKIAkgKiAgICAgICAgICZndDswIGlmIHRoaXMgYWJicmV2aWF0aW9uIG5hbWVzIGFuIG9iamVjdCB0aGF0IGlzIGFmdGVyCiAJICogICAgICAgICA8Y29kZT5vdGhlcjwvY29kZT4uCiAJICovCi0JcHVibGljIGZpbmFsIGludCBwcmVmaXhDb21wYXJlKGZpbmFsIEFueUxvbmdPYmplY3RJZCBvdGhlcikgeworCXB1YmxpYyBmaW5hbCBpbnQgcHJlZml4Q29tcGFyZShBbnlMb25nT2JqZWN0SWQgb3RoZXIpIHsKIAkJaW50IGNtcDsKIAogCQljbXAgPSBOQi5jb21wYXJlVUludDY0KHcxLCBtYXNrKDEsIG90aGVyLncxKSk7CkBAIC0yODEsNyArMjgxLDcgQEAKIAkgKiAgICAgICAgICZndDswIGlmIHRoaXMgYWJicmV2aWF0aW9uIG5hbWVzIGFuIG9iamVjdCB0aGF0IGlzIGFmdGVyCiAJICogICAgICAgICA8Y29kZT5vdGhlcjwvY29kZT4uCiAJICovCi0JcHVibGljIGZpbmFsIGludCBwcmVmaXhDb21wYXJlKGZpbmFsIGJ5dGVbXSBicywgZmluYWwgaW50IHApIHsKKwlwdWJsaWMgZmluYWwgaW50IHByZWZpeENvbXBhcmUoYnl0ZVtdIGJzLCBpbnQgcCkgewogCQlpbnQgY21wOwogCiAJCWNtcCA9IE5CLmNvbXBhcmVVSW50NjQodzEsIG1hc2soMSwgTkIuZGVjb2RlSW50NjQoYnMsIHApKSk7CkBAIC0zMTMsNyArMzEzLDcgQEAKIAkgKiAgICAgICAgICZndDswIGlmIHRoaXMgYWJicmV2aWF0aW9uIG5hbWVzIGFuIG9iamVjdCB0aGF0IGlzIGFmdGVyCiAJICogICAgICAgICA8Y29kZT5vdGhlcjwvY29kZT4uCiAJICovCi0JcHVibGljIGZpbmFsIGludCBwcmVmaXhDb21wYXJlKGZpbmFsIGxvbmdbXSBicywgZmluYWwgaW50IHApIHsKKwlwdWJsaWMgZmluYWwgaW50IHByZWZpeENvbXBhcmUobG9uZ1tdIGJzLCBpbnQgcCkgewogCQlpbnQgY21wOwogCiAJCWNtcCA9IE5CLmNvbXBhcmVVSW50NjQodzEsIG1hc2soMSwgYnNbcF0pKTsKQEAgLTM0MCw3ICszNDAsNyBAQAogCQlyZXR1cm4gKGludCkgKHcxID4+PiA1Nik7CiAJfQogCi0JcHJpdmF0ZSBsb25nIG1hc2soZmluYWwgbG9uZyB3b3JkLCBmaW5hbCBsb25nIHYpIHsKKwlwcml2YXRlIGxvbmcgbWFzayhsb25nIHdvcmQsIGxvbmcgdikgewogCQlyZXR1cm4gbWFzayhuaWJibGVzLCB3b3JkLCB2KTsKIAl9CiAKQEAgLTM1Miw3ICszNTIsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG8pIHsKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKIAkJaWYgKG8gaW5zdGFuY2VvZiBBYmJyZXZpYXRlZExvbmdPYmplY3RJZCkgewogCQkJZmluYWwgQWJicmV2aWF0ZWRMb25nT2JqZWN0SWQgYiA9IChBYmJyZXZpYXRlZExvbmdPYmplY3RJZCkgbzsKIAkJCXJldHVybiBuaWJibGVzID09IGIubmliYmxlcyAmJiB3MSA9PSBiLncxICYmIHcyID09IGIudzIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvQW55TG9uZ09iamVjdElkLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvbGliL0FueUxvbmdPYmplY3RJZC5qYXZhCmluZGV4IDk2ZDY5MzguLjA3ODg5MjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvQW55TG9uZ09iamVjdElkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9BbnlMb25nT2JqZWN0SWQuamF2YQpAQCAtMTcwLDcgKzE3MCw3IEBACiAJICogQ29tcGFyZSB0aGlzIExvbmdPYmplY3RJZCB0byBhbm90aGVyIGFuZCBvYnRhaW4gYSBzb3J0IG9yZGVyaW5nLgogCSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZVRvKGZpbmFsIEFueUxvbmdPYmplY3RJZCBvdGhlcikgeworCXB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZVRvKEFueUxvbmdPYmplY3RJZCBvdGhlcikgewogCQlpZiAodGhpcyA9PSBvdGhlcikKIAkJCXJldHVybiAwOwogCkBAIC0yMDIsNyArMjAyLDcgQEAKIAkgKiBAcmV0dXJuIGEgbmVnYXRpdmUgaW50ZWdlciwgemVybywgb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIGFzIHRoaXMgb2JqZWN0IGlzCiAJICogICAgICAgICBsZXNzIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCBvYmplY3QuCiAJICovCi0JcHVibGljIGZpbmFsIGludCBjb21wYXJlVG8oZmluYWwgYnl0ZVtdIGJzLCBmaW5hbCBpbnQgcCkgeworCXB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZVRvKGJ5dGVbXSBicywgaW50IHApIHsKIAkJaW50IGNtcDsKIAogCQljbXAgPSBOQi5jb21wYXJlVUludDY0KHcxLCBOQi5kZWNvZGVJbnQ2NChicywgcCkpOwpAQCAtMjMxLDcgKzIzMSw3IEBACiAJICogQHJldHVybiBhIG5lZ2F0aXZlIGludGVnZXIsIHplcm8sIG9yIGEgcG9zaXRpdmUgaW50ZWdlciBhcyB0aGlzIG9iamVjdCBpcwogCSAqICAgICAgICAgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgogCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZVRvKGZpbmFsIGxvbmdbXSBicywgZmluYWwgaW50IHApIHsKKwlwdWJsaWMgZmluYWwgaW50IGNvbXBhcmVUbyhsb25nW10gYnMsIGludCBwKSB7CiAJCWludCBjbXA7CiAKIAkJY21wID0gTkIuY29tcGFyZVVJbnQ2NCh3MSwgYnNbcF0pOwpAQCAtMjU3LDcgKzI1Nyw3IEBACiAJICogQHJldHVybiB0cnVlIGlmIHRoaXMgTG9uZ09iamVjdElkIGJlZ2lucyB3aXRoIHRoZSBhYmJyZXZpYXRpb247IGVsc2UKIAkgKiAgICAgICAgIGZhbHNlLgogCSAqLwotCXB1YmxpYyBib29sZWFuIHN0YXJ0c1dpdGgoZmluYWwgQWJicmV2aWF0ZWRMb25nT2JqZWN0SWQgYWJicikgeworCXB1YmxpYyBib29sZWFuIHN0YXJ0c1dpdGgoQWJicmV2aWF0ZWRMb25nT2JqZWN0SWQgYWJicikgewogCQlyZXR1cm4gYWJici5wcmVmaXhDb21wYXJlKHRoaXMpID09IDA7CiAJfQogCkBAIC0yNzQsMTMgKzI3NCwxMyBAQAogCSAqICAgICAgICAgICAgdGhlIG90aGVyIGlkIHRvIGNvbXBhcmUgdG8uIE1heSBiZSBudWxsLgogCSAqIEByZXR1cm4gdHJ1ZSBvbmx5IGlmIGJvdGggTG9uZ09iamVjdElkcyBoYXZlIGlkZW50aWNhbCBiaXRzLgogCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhmaW5hbCBBbnlMb25nT2JqZWN0SWQgb3RoZXIpIHsKKwlwdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoQW55TG9uZ09iamVjdElkIG90aGVyKSB7CiAJCXJldHVybiBvdGhlciAhPSBudWxsID8gZXF1YWxzKHRoaXMsIG90aGVyKSA6IGZhbHNlOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvKSB7CisJcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CiAJCWlmIChvIGluc3RhbmNlb2YgQW55TG9uZ09iamVjdElkKQogCQkJcmV0dXJuIGVxdWFscygoQW55TG9uZ09iamVjdElkKSBvKTsKIAkJZWxzZQpAQCAtMjkzLDcgKzI5Myw3IEBACiAJICogQHBhcmFtIHcKIAkgKiAgICAgICAgICAgIHRoZSBidWZmZXIgdG8gY29weSB0by4gTXVzdCBiZSBpbiBiaWcgZW5kaWFuIG9yZGVyLgogCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlSYXdUbyhmaW5hbCBCeXRlQnVmZmVyIHcpIHsKKwlwdWJsaWMgdm9pZCBjb3B5UmF3VG8oQnl0ZUJ1ZmZlciB3KSB7CiAJCXcucHV0TG9uZyh3MSk7CiAJCXcucHV0TG9uZyh3Mik7CiAJCXcucHV0TG9uZyh3Myk7CkBAIC0zMDgsNyArMzA4LDcgQEAKIAkgKiBAcGFyYW0gbwogCSAqICAgICAgICAgICAgdGhlIG9mZnNldCB3aXRoaW4gYiB0byB3cml0ZSBhdC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5UmF3VG8oZmluYWwgYnl0ZVtdIGIsIGZpbmFsIGludCBvKSB7CisJcHVibGljIHZvaWQgY29weVJhd1RvKGJ5dGVbXSBiLCBpbnQgbykgewogCQlOQi5lbmNvZGVJbnQ2NChiLCBvLCB3MSk7CiAJCU5CLmVuY29kZUludDY0KGIsIG8gKyA4LCB3Mik7CiAJCU5CLmVuY29kZUludDY0KGIsIG8gKyAxNiwgdzMpOwpAQCAtMzIzLDcgKzMyMyw3IEBACiAJICogQHBhcmFtIG8KIAkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgd2l0aGluIGIgdG8gd3JpdGUgYXQuCiAJICovCi0JcHVibGljIHZvaWQgY29weVJhd1RvKGZpbmFsIGxvbmdbXSBiLCBmaW5hbCBpbnQgbykgeworCXB1YmxpYyB2b2lkIGNvcHlSYXdUbyhsb25nW10gYiwgaW50IG8pIHsKIAkJYltvXSA9IHcxOwogCQliW28gKyAxXSA9IHcyOwogCQliW28gKyAyXSA9IHczOwpAQCAtMzM4LDE0ICszMzgsMTQgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgc3RyZWFtIHdyaXRpbmcgZmFpbGVkLgogCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlSYXdUbyhmaW5hbCBPdXRwdXRTdHJlYW0gdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBjb3B5UmF3VG8oT3V0cHV0U3RyZWFtIHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXdyaXRlUmF3TG9uZyh3LCB3MSk7CiAJCXdyaXRlUmF3TG9uZyh3LCB3Mik7CiAJCXdyaXRlUmF3TG9uZyh3LCB3Myk7CiAJCXdyaXRlUmF3TG9uZyh3LCB3NCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVJhd0xvbmcoZmluYWwgT3V0cHV0U3RyZWFtIHcsIGxvbmcgdikKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlUmF3TG9uZyhPdXRwdXRTdHJlYW0gdywgbG9uZyB2KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdy53cml0ZSgoaW50KSAodiA+Pj4gNTYpKTsKIAkJdy53cml0ZSgoaW50KSAodiA+Pj4gNDgpKTsKQEAgLTM2NSw3ICszNjUsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBzdHJlYW0gd3JpdGluZyBmYWlsZWQuCiAJICovCi0JcHVibGljIHZvaWQgY29weVRvKGZpbmFsIE91dHB1dFN0cmVhbSB3KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyB2b2lkIGNvcHlUbyhPdXRwdXRTdHJlYW0gdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdy53cml0ZSh0b0hleEJ5dGVBcnJheSgpKTsKIAl9CiAKQEAgLTQwNiw3ICs0MDYsNyBAQAogCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBoZXhieXRlID0geyAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsCiAJCQknNycsICc4JywgJzknLCAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnIH07CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZvcm1hdEhleEJ5dGUoZmluYWwgYnl0ZVtdIGRzdCwgZmluYWwgaW50IHAsIGxvbmcgdykgeworCXByaXZhdGUgc3RhdGljIHZvaWQgZm9ybWF0SGV4Qnl0ZShieXRlW10gZHN0LCBpbnQgcCwgbG9uZyB3KSB7CiAJCWludCBvID0gcCArIDE1OwogCQl3aGlsZSAobyA+PSBwICYmIHcgIT0gMCkgewogCQkJZHN0W28tLV0gPSBoZXhieXRlWyhpbnQpICh3ICYgMHhmKV07CkBAIC00MjQsNyArNDI0LDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgc3RyZWFtIHdyaXRpbmcgZmFpbGVkLgogCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlUbyhmaW5hbCBXcml0ZXIgdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBjb3B5VG8oV3JpdGVyIHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXcud3JpdGUodG9IZXhDaGFyQXJyYXkoKSk7CiAJfQogCkBAIC00NDAsNyArNDQwLDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgc3RyZWFtIHdyaXRpbmcgZmFpbGVkLgogCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlUbyhmaW5hbCBjaGFyW10gdG1wLCBmaW5hbCBXcml0ZXIgdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBjb3B5VG8oY2hhcltdIHRtcCwgV3JpdGVyIHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRvSGV4Q2hhckFycmF5KHRtcCk7CiAJCXcud3JpdGUodG1wLCAwLCBDb25zdGFudHMuTE9OR19PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSCk7CiAJfQpAQCAtNDU1LDcgKzQ1NSw3IEBACiAJICogQHBhcmFtIHcKIAkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gYXBwZW5kIG9udG8uCiAJICovCi0JcHVibGljIHZvaWQgY29weVRvKGZpbmFsIGNoYXJbXSB0bXAsIGZpbmFsIFN0cmluZ0J1aWxkZXIgdykgeworCXB1YmxpYyB2b2lkIGNvcHlUbyhjaGFyW10gdG1wLCBTdHJpbmdCdWlsZGVyIHcpIHsKIAkJdG9IZXhDaGFyQXJyYXkodG1wKTsKIAkJdy5hcHBlbmQodG1wLCAwLCBDb25zdGFudHMuTE9OR19PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSCk7CiAJfQpAQCAtNDY2LDcgKzQ2Niw3IEBACiAJCXJldHVybiBkc3Q7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHRvSGV4Q2hhckFycmF5KGZpbmFsIGNoYXJbXSBkc3QpIHsKKwlwcml2YXRlIHZvaWQgdG9IZXhDaGFyQXJyYXkoY2hhcltdIGRzdCkgewogCQlmb3JtYXRIZXhDaGFyKGRzdCwgMCwgdzEpOwogCQlmb3JtYXRIZXhDaGFyKGRzdCwgMTYsIHcyKTsKIAkJZm9ybWF0SGV4Q2hhcihkc3QsIDMyLCB3Myk7CkBAIC00NzYsNyArNDc2LDcgQEAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gaGV4Y2hhciA9IHsgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLAogCQkJJzcnLCAnOCcsICc5JywgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJyB9OwogCi0Jc3RhdGljIHZvaWQgZm9ybWF0SGV4Q2hhcihmaW5hbCBjaGFyW10gZHN0LCBmaW5hbCBpbnQgcCwgbG9uZyB3KSB7CisJc3RhdGljIHZvaWQgZm9ybWF0SGV4Q2hhcihjaGFyW10gZHN0LCBpbnQgcCwgbG9uZyB3KSB7CiAJCWludCBvID0gcCArIDE1OwogCQl3aGlsZSAobyA+PSBwICYmIHcgIT0gMCkgewogCQkJZHN0W28tLV0gPSBoZXhjaGFyWyhpbnQpICh3ICYgMHhmKV07CkBAIC01MjQsNyArNTI0LDcgQEAKIAkgKiAgICAgICAgICAgIGxlbmd0aCBvZiB0aGUgYWJicmV2aWF0ZWQgc3RyaW5nLgogCSAqIEByZXR1cm4gU0hBLTI1NiBhYmJyZXZpYXRpb24uCiAJICovCi0JcHVibGljIEFiYnJldmlhdGVkTG9uZ09iamVjdElkIGFiYnJldmlhdGUoZmluYWwgaW50IGxlbikgeworCXB1YmxpYyBBYmJyZXZpYXRlZExvbmdPYmplY3RJZCBhYmJyZXZpYXRlKGludCBsZW4pIHsKIAkJZmluYWwgbG9uZyBhID0gQWJicmV2aWF0ZWRMb25nT2JqZWN0SWQubWFzayhsZW4sIDEsIHcxKTsKIAkJZmluYWwgbG9uZyBiID0gQWJicmV2aWF0ZWRMb25nT2JqZWN0SWQubWFzayhsZW4sIDIsIHcyKTsKIAkJZmluYWwgbG9uZyBjID0gQWJicmV2aWF0ZWRMb25nT2JqZWN0SWQubWFzayhsZW4sIDMsIHczKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvTG9uZ09iamVjdElkLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvbGliL0xvbmdPYmplY3RJZC5qYXZhCmluZGV4IGVjMWUxNzkuLjgxNTk1NzYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvTG9uZ09iamVjdElkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9Mb25nT2JqZWN0SWQuamF2YQpAQCAtOTAsNyArOTAsNyBAQAogCSAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byB0ZXN0LgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyaW5nIGNhbiBjb252ZXJ0ZWQgaW50byBhbiBMb25nT2JqZWN0SWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzSWQoZmluYWwgU3RyaW5nIGlkKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzSWQoU3RyaW5nIGlkKSB7CiAJCWlmIChpZC5sZW5ndGgoKSAhPSBDb25zdGFudHMuTE9OR19PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSCkKIAkJCXJldHVybiBmYWxzZTsKIAkJdHJ5IHsKQEAgLTExMCw3ICsxMTAsNyBAQAogCSAqICAgICAgICAgICAgdGhlIGlkIHRvIGNvbnZlcnQuIE1heSBiZSBudWxsLgogCSAqIEByZXR1cm4gdGhlIGhleCBzdHJpbmcgY29udmVyc2lvbiBvZiB0aGlzIGlkJ3MgY29udGVudC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyB0b1N0cmluZyhmaW5hbCBMb25nT2JqZWN0SWQgaSkgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nKExvbmdPYmplY3RJZCBpKSB7CiAJCXJldHVybiBpICE9IG51bGwgPyBpLm5hbWUoKSA6IFpFUk9JRF9TVFI7CiAJfQogCkBAIC0xNzMsNyArMTczLDcgQEAKIAkgKiAgICAgICAgICAgIGF2YWlsYWJsZSB3aXRoaW4gdGhpcyBieXRlIGFycmF5LgogCSAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBvYmplY3QgaWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMb25nT2JqZWN0SWQgZnJvbVJhdyhmaW5hbCBieXRlW10gYnMpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIExvbmdPYmplY3RJZCBmcm9tUmF3KGJ5dGVbXSBicykgewogCQlyZXR1cm4gZnJvbVJhdyhicywgMCk7CiAJfQogCkBAIC0xODcsNyArMTg3LDcgQEAKIAkgKiAgICAgICAgICAgIHBvc2l0aW9uIHRvIHJlYWQgdGhlIGZpcnN0IGJ5dGUgb2YgZGF0YSBmcm9tLgogCSAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBvYmplY3QgaWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMb25nT2JqZWN0SWQgZnJvbVJhdyhmaW5hbCBieXRlW10gYnMsIGZpbmFsIGludCBwKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBMb25nT2JqZWN0SWQgZnJvbVJhdyhieXRlW10gYnMsIGludCBwKSB7CiAJCWZpbmFsIGxvbmcgYSA9IE5CLmRlY29kZUludDY0KGJzLCBwKTsKIAkJZmluYWwgbG9uZyBiID0gTkIuZGVjb2RlSW50NjQoYnMsIHAgKyA4KTsKIAkJZmluYWwgbG9uZyBjID0gTkIuZGVjb2RlSW50NjQoYnMsIHAgKyAxNik7CkBAIC0yMDMsNyArMjAzLDcgQEAKIAkgKiAgICAgICAgICAgIGF2YWlsYWJsZSB3aXRoaW4gdGhpcyBsb25nIGFycmF5LgogCSAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBvYmplY3QgaWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMb25nT2JqZWN0SWQgZnJvbVJhdyhmaW5hbCBsb25nW10gaXMpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIExvbmdPYmplY3RJZCBmcm9tUmF3KGxvbmdbXSBpcykgewogCQlyZXR1cm4gZnJvbVJhdyhpcywgMCk7CiAJfQogCkBAIC0yMTcsNyArMjE3LDcgQEAKIAkgKiAgICAgICAgICAgIHBvc2l0aW9uIHRvIHJlYWQgdGhlIGZpcnN0IGxvbmcgb2YgZGF0YSBmcm9tLgogCSAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBvYmplY3QgaWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMb25nT2JqZWN0SWQgZnJvbVJhdyhmaW5hbCBsb25nW10gaXMsIGZpbmFsIGludCBwKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBMb25nT2JqZWN0SWQgZnJvbVJhdyhsb25nW10gaXMsIGludCBwKSB7CiAJCXJldHVybiBuZXcgTG9uZ09iamVjdElkKGlzW3BdLCBpc1twICsgMV0sIGlzW3AgKyAyXSwgaXNbcCArIDNdKTsKIAl9CiAKQEAgLTIzMSw3ICsyMzEsNyBAQAogCSAqICAgICAgICAgICAgcG9zaXRpb24gdG8gcmVhZCB0aGUgZmlyc3QgY2hhcmFjdGVyIGZyb20uCiAJICogQHJldHVybiB0aGUgY29udmVydGVkIG9iamVjdCBpZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvbmdPYmplY3RJZCBmcm9tU3RyaW5nKGZpbmFsIGJ5dGVbXSBidWYsIGZpbmFsIGludCBvZmZzZXQpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIExvbmdPYmplY3RJZCBmcm9tU3RyaW5nKGJ5dGVbXSBidWYsIGludCBvZmZzZXQpIHsKIAkJcmV0dXJuIGZyb21IZXhTdHJpbmcoYnVmLCBvZmZzZXQpOwogCX0KIApAQCAtMjQyLDE0ICsyNDIsMTQgQEAKIAkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gcmVhZCBmcm9tLiBNdXN0IGJlIDY0IGNoYXJhY3RlcnMgbG9uZy4KIAkgKiBAcmV0dXJuIHRoZSBjb252ZXJ0ZWQgb2JqZWN0IGlkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgTG9uZ09iamVjdElkIGZyb21TdHJpbmcoZmluYWwgU3RyaW5nIHN0cikgeworCXB1YmxpYyBzdGF0aWMgTG9uZ09iamVjdElkIGZyb21TdHJpbmcoU3RyaW5nIHN0cikgewogCQlpZiAoc3RyLmxlbmd0aCgpICE9IENvbnN0YW50cy5MT05HX09CSkVDVF9JRF9TVFJJTkdfTEVOR1RIKQogCQkJdGhyb3cgbmV3IEludmFsaWRMb25nT2JqZWN0SWRFeGNlcHRpb24oc3RyKTsKIAkJcmV0dXJuIGZyb21IZXhTdHJpbmcob3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLmVuY29kZUFTQ0lJKHN0ciksCiAJCQkJMCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9uZ09iamVjdElkIGZyb21IZXhTdHJpbmcoZmluYWwgYnl0ZVtdIGJzLCBpbnQgcCkgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIExvbmdPYmplY3RJZCBmcm9tSGV4U3RyaW5nKGJ5dGVbXSBicywgaW50IHApIHsKIAkJdHJ5IHsKIAkJCWZpbmFsIGxvbmcgYSA9IFJhd1BhcnNlVXRpbHMucGFyc2VIZXhJbnQ2NChicywgcCk7CiAJCQlmaW5hbCBsb25nIGIgPSBSYXdQYXJzZVV0aWxzLnBhcnNlSGV4SW50NjQoYnMsIHAgKyAxNik7CkBAIC0yODAsNyArMjgwLDcgQEAKIAkgKiBAcGFyYW0gc3JjCiAJICogICAgICAgICAgICBhbm90aGVyIGFscmVhZHkgcGFyc2VkIExvbmdPYmplY3RJZCB0byBjb3B5IHRoZSB2YWx1ZSBvdXQgb2YuCiAJICovCi0JcHJvdGVjdGVkIExvbmdPYmplY3RJZChmaW5hbCBBbnlMb25nT2JqZWN0SWQgc3JjKSB7CisJcHJvdGVjdGVkIExvbmdPYmplY3RJZChBbnlMb25nT2JqZWN0SWQgc3JjKSB7CiAJCXcxID0gc3JjLncxOwogCQl3MiA9IHNyYy53MjsKIAkJdzMgPSBzcmMudzM7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvbGliL011dGFibGVMb25nT2JqZWN0SWQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvTXV0YWJsZUxvbmdPYmplY3RJZC5qYXZhCmluZGV4IDdiMGM0OTQuLjNkNjI0OTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvTXV0YWJsZUxvbmdPYmplY3RJZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvTXV0YWJsZUxvbmdPYmplY3RJZC5qYXZhCkBAIC0xNjcsNyArMTY3LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSByYXcgYnl0ZSBidWZmZXIgdG8gcmVhZCBmcm9tLiBBdCBsZWFzdCAzMiBieXRlcyBtdXN0IGJlCiAJICogICAgICAgICAgICBhdmFpbGFibGUgd2l0aGluIHRoaXMgYnl0ZSBhcnJheS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBmcm9tUmF3KGZpbmFsIGJ5dGVbXSBicykgeworCXB1YmxpYyB2b2lkIGZyb21SYXcoYnl0ZVtdIGJzKSB7CiAJCWZyb21SYXcoYnMsIDApOwogCX0KIApAQCAtMTgwLDcgKzE4MCw3IEBACiAJICogQHBhcmFtIHAKIAkgKiAgICAgICAgICAgIHBvc2l0aW9uIHRvIHJlYWQgdGhlIGZpcnN0IGJ5dGUgb2YgZGF0YSBmcm9tLgogCSAqLwotCXB1YmxpYyB2b2lkIGZyb21SYXcoZmluYWwgYnl0ZVtdIGJzLCBmaW5hbCBpbnQgcCkgeworCXB1YmxpYyB2b2lkIGZyb21SYXcoYnl0ZVtdIGJzLCBpbnQgcCkgewogCQl3MSA9IE5CLmRlY29kZUludDY0KGJzLCBwKTsKIAkJdzIgPSBOQi5kZWNvZGVJbnQ2NChicywgcCArIDgpOwogCQl3MyA9IE5CLmRlY29kZUludDY0KGJzLCBwICsgMTYpOwpAQCAtMTk0LDcgKzE5NCw3IEBACiAJICogICAgICAgICAgICB0aGUgcmF3IGxvbmcgYnVmZmVyIHRvIHJlYWQgZnJvbS4gQXQgbGVhc3QgNCBsb25ncyBtdXN0IGJlCiAJICogICAgICAgICAgICBhdmFpbGFibGUgd2l0aGluIHRoaXMgbG9uZ3MgYXJyYXkuCiAJICovCi0JcHVibGljIHZvaWQgZnJvbVJhdyhmaW5hbCBsb25nW10gbG9uZ3MpIHsKKwlwdWJsaWMgdm9pZCBmcm9tUmF3KGxvbmdbXSBsb25ncykgewogCQlmcm9tUmF3KGxvbmdzLCAwKTsKIAl9CiAKQEAgLTIwNyw3ICsyMDcsNyBAQAogCSAqIEBwYXJhbSBwCiAJICogICAgICAgICAgICBwb3NpdGlvbiB0byByZWFkIHRoZSBmaXJzdCBpbnRlZ2VyIG9mIGRhdGEgZnJvbS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBmcm9tUmF3KGZpbmFsIGxvbmdbXSBsb25ncywgZmluYWwgaW50IHApIHsKKwlwdWJsaWMgdm9pZCBmcm9tUmF3KGxvbmdbXSBsb25ncywgaW50IHApIHsKIAkJdzEgPSBsb25nc1twXTsKIAkJdzIgPSBsb25nc1twICsgMV07CiAJCXczID0gbG9uZ3NbcCArIDJdOwpAQCAtMjIzLDcgKzIyMyw3IEBACiAJICogQHBhcmFtIG9mZnNldAogCSAqICAgICAgICAgICAgcG9zaXRpb24gdG8gcmVhZCB0aGUgZmlyc3QgY2hhcmFjdGVyIGZyb20uCiAJICovCi0JcHVibGljIHZvaWQgZnJvbVN0cmluZyhmaW5hbCBieXRlW10gYnVmLCBmaW5hbCBpbnQgb2Zmc2V0KSB7CisJcHVibGljIHZvaWQgZnJvbVN0cmluZyhieXRlW10gYnVmLCBpbnQgb2Zmc2V0KSB7CiAJCWZyb21IZXhTdHJpbmcoYnVmLCBvZmZzZXQpOwogCX0KIApAQCAtMjMzLDE0ICsyMzMsMTQgQEAKIAkgKiBAcGFyYW0gc3RyCiAJICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIHJlYWQgZnJvbS4gTXVzdCBiZSA2NCBjaGFyYWN0ZXJzIGxvbmcuCiAJICovCi0JcHVibGljIHZvaWQgZnJvbVN0cmluZyhmaW5hbCBTdHJpbmcgc3RyKSB7CisJcHVibGljIHZvaWQgZnJvbVN0cmluZyhTdHJpbmcgc3RyKSB7CiAJCWlmIChzdHIubGVuZ3RoKCkgIT0gQ29uc3RhbnRzLkxPTkdfT0JKRUNUX0lEX1NUUklOR19MRU5HVEgpCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAogCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChMZnNUZXh0LmdldCgpLmludmFsaWRMb25nSWQsIHN0cikpOwogCQlmcm9tSGV4U3RyaW5nKG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5lbmNvZGVBU0NJSShzdHIpLCAwKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgZnJvbUhleFN0cmluZyhmaW5hbCBieXRlW10gYnMsIGludCBwKSB7CisJcHJpdmF0ZSB2b2lkIGZyb21IZXhTdHJpbmcoYnl0ZVtdIGJzLCBpbnQgcCkgewogCQl0cnkgewogCQkJdzEgPSBSYXdQYXJzZVV0aWxzLnBhcnNlSGV4SW50NjQoYnMsIHApOwogCQkJdzIgPSBSYXdQYXJzZVV0aWxzLnBhcnNlSGV4SW50NjQoYnMsIHAgKyAxNik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwppbmRleCAzNjllMzA3Li4xNjllZjdlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKQEAgLTM1LDEyNSArMzUsMTQzIEBACiAjIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKIGxpY2Vuc2U9XAogRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50XG5cCi1BcHJpbCA5LCAyMDE0XG5cCitcblwKK05vdmVtYmVyIDIyLCAyMDE3XG5cCiBcblwKIFVzYWdlIE9mIENvbnRlbnRcblwKIFxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCitUSEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT05cblwKK0FORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GXG5cCitUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRVxuXAorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKK0JFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORURcblwKK0JZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRVxuXAorQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTllcblwKK0FQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VXG5cCitNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKIFxuXAogQXBwbGljYWJsZSBMaWNlbnNlc1xuXAogXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCi1FY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAotdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAorVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKK2lzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2VcblwKK1ZlcnNpb24gMi4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvXG5cCithdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCxcblwKKyJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCiBcblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKK0NvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uXG5cCithbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnlcblwKKygiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzXG5cCitkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKIFxuXAotICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCi0gICAgICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAgICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCistICAgQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGVcblwKKyAgICBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXlcblwKKyAgICBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kXG5cCisgICAgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAorLSAgIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUlxuXAorICAgIChKYXZh4oSiIEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKKy0gICBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmRcblwKKyAgICBhc3NvY2lhdGVkIG1hdGVyaWFsLiBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhXG5cCisgICAgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5XG5cCisgICAgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vclxuXAorICAgIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAorLSAgIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYVxuXAorICAgIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmRcblwKKyAgICB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCiBcblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAorVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW5cblwKK2ZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzXG5cCithbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIlxuXAorKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnlcblwKK2RpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nXG5cCitsb2NhdGlvbnM6XG5cCiBcblwKLSAgICAgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgICAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgICAgICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgICAgICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgICAgICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKKy0gICBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKKy0gICBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAorLSAgIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKKy0gICBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCistICAgRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAogXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1Qcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCi1VcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAorTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nXG5cCit0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2VcblwKKygiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlXG5cCitjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAord2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91XG5cCit3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIlxuXAorcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4gU3VjaFxuXAorQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mXG5cCit0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAogXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKK1RIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTFxuXAorT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFXG5cCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAogXG5cCi0gICAgICAgLSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sKVxuXAotICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCistICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwpXG5cCistICAgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sKVxuXAorLSAgIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCistICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKKy0gICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKKy0gICBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCiBcblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKK0lUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE9cblwKK1VTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpc1xuXAorcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKIFxuXAotXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCitVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKIFxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKK1RoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2hcblwKK2luY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlclxuXAorKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsXG5cCitzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5XG5cCisiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZ1xuXAorc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvblxuXAorYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAogaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCAoIlNwZWNpZmljYXRpb24iKS5cblwKIFxuXAotWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlXG5cCi1JbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZFxuXAotbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKLWFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzpcblwKK1lvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbFxuXAorSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGVcblwKK2xpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmRcblwKK2FjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGVcblwKK1NwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdFxuXAorYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAorYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGVcblwKK2ZvbGxvd2luZzpcblwKIFxuXAotICAgICAgIDEuIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGVcblwKLSAgICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZyxcblwKLSAgICAgICAgICBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAotICAgICAgIDIuIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHlcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKLSAgICAgICAzLiBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdFxuXAotICAgICAgICAgIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoXG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2VcblwKLSAgICAgICAgICB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGVcblwKLSAgICAgICAgICB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5XG5cCi0gICAgICAgICAgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoXG5cCi0gICAgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvblxuXAotICAgICAgICAgIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKKzEuICBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heVxuXAorICAgIGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGVcblwKKyAgICBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuXG5cCisgICAgRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAorMi4gIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmRcblwKKyAgICBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvXG5cCisgICAgdGhlIFRhcmdldCBNYWNoaW5lLlxuXAorMy4gIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmRcblwKKyAgICBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGVcblwKKyAgICBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmVcblwKKyAgICBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2hcblwKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZFxuXAorICAgIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZVxuXAorICAgIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZVxuXAorICAgIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGVcblwKKyAgICBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGVcblwKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKIFxuXAogQ3J5cHRvZ3JhcGh5XG5cCiBcblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZFxuXAotcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKK0NvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHlcblwKK21heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvXG5cCithbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSxcblwKK3BsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsXG5cCitwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXNcblwKK3Blcm1pdHRlZC5cblwKIFxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlXG5cCitVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KKyMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL2ZlYXR1cmUueG1sCmluZGV4IGU3Y2Y4MTcuLmQwOTg1MmIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmUvZmVhdHVyZS54bWwKQEAgLTIsNyArMiw3IEBACiA8ZmVhdHVyZQogICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpnaXQiCiAgICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iNC4xMS40LnF1YWxpZmllciIKKyAgICAgIHZlcnNpb249IjUuMC40LnF1YWxpZmllciIKICAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgogCiAgICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2pnaXQvIj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmUvbGljZW5zZS5odG1sCmluZGV4IDk1YWQ5NWUuLjAwOGI4MDEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL2xpY2Vuc2UuaHRtbApAQCAtMSwxMDYgKzEsMTg5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgogPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLQorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgogPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgOSwgMjAxNDwvcD4KKwk8aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KKwk8cD5Ob3ZlbWJlciAyMiwgMjAxNzwvcD4KIAotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KIAotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICJDT05URU5UIikuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisJPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sCisJCUlORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCisJCShDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWQorCQlUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKKwkJQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAorCQlCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTCisJCUdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZCisJCUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQKKwkJQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMKKwkJQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRQorCQlBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QKKwkJVVNFIFRIRSBDT05URU5ULjwvcD4KIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgorCTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCJFUEwiKS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCTxwPgorCQlVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UKKwkJRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorCQlFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wICgmcXVvdDtFUEwmcXVvdDspLiBBIGNvcHkgb2YgdGhlCisJCUVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wPC9hPi4KKwkJRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LgorCTwvcD4KIAotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZQotICAgcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L3A+CisJPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0CisJCWNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UKKwkJRm91bmRhdGlvbiBzb3VyY2UgY29kZSByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZQorCQltb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlCisJCWFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YZkgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLjwvbGk+Ci0gICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8KKwkJCWZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsCisJCQltb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4KKwkJCWZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzCisJCQkoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+CisJCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeQorCQkJb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZAorCQkJJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgorCQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vcgorCQkJRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEKKwkJCXN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuIFdpdGhpbiBhCisJCQlGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YKKwkJCXRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzCisJCQlhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+CisJCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZAorCQkJRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZAorCQkJJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbgorCQkJbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgorCTwvdWw+CiAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisJPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZAorCQliZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OworCQkoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKKwkJSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZAorCQkmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiBBYm91dHMgYW5kCisJCUZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yCisJCU1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLSAgICAgICA8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotICAgICAgIDxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLSAgICAgICA8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgorCQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorCQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+CisJCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YKKwkJCWNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorCQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+CisJPC91bD4KIAotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KKwk8cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcworCQlpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91CisJCW11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcKKwkJdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywKKwkJdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcworCQlhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91CisJCWNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZQorCQkmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkCisJCSZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLiBTdWNoIEFib3V0cywKKwkJRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZAorCQljb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuCisJCXlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuPC9wPgogCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CisJPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWQorCQlSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQKKwkJQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVAorCQlBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5FY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbDwvYT4pCisJCTwvbGk+CisJCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KQorCQk8L2xpPgorCQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPikKKwkJPC9saT4KKwkJPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KQorCQk8L2xpPgorCTwvdWw+CiAKLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KKwk8cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORAorCQlDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwKKwkJb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UKKwkJRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdAorCQlwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgogCiAKLTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgorCTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgogCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZQotICAgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KLSAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgiU3BlY2lmaWNhdGlvbiIpLjwvcD4KKwk8cD4KKwkJVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcworCQlvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlCisJCU1hbmFnZXIgKCZxdW90O1Byb3Zpc2lvbmluZyBUZWNobm9sb2d5JnF1b3Q7KSBmb3IgdGhlIHB1cnBvc2Ugb2YKKwkJYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCisJCW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcworCQljYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCisJCWluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0CisJCXBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+CisJCSgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS4KKwk8L3A+CiAKLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KKwk8cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvCisJCWluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcKKwkJdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZQorCQl0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcKKwkJVGVjaG5vbG9neSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZworCQlUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoCisJCXRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZQorCQlhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+CiAKLTxvbD4KLSAgICAgICA8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAotICAgICAgIHByb2R1Y3QuPC9saT4KLSAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQotICAgICAgIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAotICAgICAgIE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4KLSAgICAgICB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaAotICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLjwvbGk+Ci08L29sPgorCTxvbD4KKwkJPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgmcXVvdDtQcm92aXNpb25pbmcKKwkJCVByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nCisJCQlUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoJnF1b3Q7VGFyZ2V0IE1hY2hpbmUmcXVvdDspIHdpdGggdGhlIGludGVudAorCQkJb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuCisJCQlFY2xpcHNlLWJhc2VkIHByb2R1Y3QuPC9saT4KKwkJPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQorCQkJbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCisJCQlhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgorCQk8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIKKwkJCXRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUgKCZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCZxdW90OykgYW5kIHN1Y2gKKwkJCUluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKKwkJCU1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisJCQl0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5CisJCQl0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUKKwkJCUFncmVlbWVudC4gVXBvbiBzdWNoIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUKKwkJCXByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUuPC9saT4KKwk8L29sPgogCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KKwk8aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KIAotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KKwk8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoCisJCXlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQKKwkJdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4KKwkJQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLAorCQlyZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsCisJCWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KIAotPHA+PHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+Ci0KLQotPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisJPHA+CisJCTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mCisJCQlPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPgorCTwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZS9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL3BvbS54bWwKaW5kZXggNWRiNDI5NC4uYTlhNThhZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL3BvbS54bWwKQEAgLTUwLDcgKzUwLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmpnaXQudHljaG8ucGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuNC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlPC9ncm91cElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKaW5kZXggYjliNWNjZS4uNDgwZTljMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCkBAIC0zNSwxMjUgKzM1LDE0MyBAQAogIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCiBsaWNlbnNlPVwKIEVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAotQXByaWwgOSwgMjAxNFxuXAorXG5cCitOb3ZlbWJlciAyMiwgMjAxN1xuXAogXG5cCiBVc2FnZSBPZiBDb250ZW50XG5cCiBcblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAorVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OXG5cCitBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRlxuXAorVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEVcblwKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCitCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEXG5cCitCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0VcblwKK0FHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZXG5cCitBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVVxuXAorTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCiBcblwKIEFwcGxpY2FibGUgTGljZW5zZXNcblwKIFxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZVxuXAotRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcblwKLXRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzXG5cCi1wcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKK1VubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCitpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlXG5cCitWZXJzaW9uIDIuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzb1xuXAorYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4gRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsXG5cCisiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAogXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCitDb250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvblxuXAorYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZSByZXBvc2l0b3J5XG5cCisoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhc1xuXAorZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCiBcblwKLSAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAotICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAorLSAgIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlXG5cCisgICAgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5XG5cCisgICAgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZFxuXAorICAgIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKKy0gICBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVJcblwKKyAgICAoSmF2YeKEoiBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCistICAgQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kXG5cCisgICAgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYVxuXAorICAgIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heVxuXAorICAgIGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3JcblwKKyAgICBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKKy0gICBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGFcblwKKyAgICBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kXG5cCisgICAgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAogXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKK1RoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluXG5cCitmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlc1xuXAorYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCJcblwKKygiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55XG5cCitkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZ1xuXAorbG9jYXRpb25zOlxuXAogXG5cCi0gICAgICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgICAgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAgICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAgICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCistICAgVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCistICAgUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKKy0gICBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCistICAgU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAorLSAgIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKIFxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFxuXAotVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuXG5cCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlXG5cCi10ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0XG5cCi1nb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKK05vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZ1xuXAordGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlXG5cCisoIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZVxuXAorY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKK3dpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdVxuXAord2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSJcblwKK3Byb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuIFN1Y2hcblwKK0Fib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAorY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZlxuXAordGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKIFxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCitUSEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUExcblwKK09SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRVxuXAorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKIFxuXAotICAgICAgIC0gRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbClcblwKLSAgICAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAorLSAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sKVxuXAorLSAgIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbClcblwKKy0gICBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAorLSAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCistICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCistICAgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAogXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCitJVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPXG5cCitVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXNcblwKK3Byb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZFxuXAorY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCiBcblwKLVxuXFVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAorVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCiBcblwKLVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSxcblwKLWJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yXG5cCi10aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3JcblwKLW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aFxuXAotdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuXG5cCi1JbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCitUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoXG5cCitpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXJcblwKKygiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbFxuXAorc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseVxuXAorIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmdcblwKK3N1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb25cblwKK2Fib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKIGh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cCiBcblwKLVlvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXAotSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLWluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKLW1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCi1hZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cCitZb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGxcblwKK0luc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlXG5cCitsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kXG5cCithY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlXG5cCitTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXRcblwKK2F2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKK2FncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlXG5cCitmb2xsb3dpbmc6XG5cCiBcblwKLSAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCi0gICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCi0gICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKLSAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCi0gICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKLSAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCi0gICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCi0gICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAotICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAotICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKLSAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCisxLiAgQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXlcblwKKyAgICBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlXG5cCisgICAgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhblxuXAorICAgIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKKzIuICBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkXG5cCisgICAgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0b1xuXAorICAgIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKKzMuICBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kXG5cCisgICAgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlXG5cCisgICAgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlXG5cCisgICAgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoXG5cCisgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmRcblwKKyAgICBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2VcblwKKyAgICBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGVcblwKKyAgICBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaCBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlXG5cCisgICAgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlXG5cCisgICAgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCiBcblwKIENyeXB0b2dyYXBoeVxuXAogXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKLXJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCitDb250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5XG5cCittYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0b1xuXAorYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsXG5cCitwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LFxuXAorcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzXG5cCitwZXJtaXR0ZWQuXG5cCiBcblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK0phdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZVxuXAorVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCisjIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9mZWF0dXJlLnhtbAppbmRleCBmOTUxZmM2Li40ODVmZDZiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS5mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC0yLDcgKzIsNyBAQAogPGZlYXR1cmUKICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlIgogICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjQuMTEuNC5xdWFsaWZpZXIiCisgICAgICB2ZXJzaW9uPSI1LjAuNC5xdWFsaWZpZXIiCiAgICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KIAogICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9qZ2l0LyI+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAppbmRleCA5NWFkOTVlLi4wMDhiODAxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9saWNlbnNlLmh0bWwKQEAgLTEsMTA2ICsxLDE4OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPz4KIDwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci0KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIgLz4KIDx0aXRsZT5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkFwcmlsIDksIDIwMTQ8L3A+CisJPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+CisJPHA+Tm92ZW1iZXIgMjIsIDIwMTc8L3A+CiAKLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKwk8aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CiAKLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgorCTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLAorCQlJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUworCQkoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkKKwkJVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisJCUNPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQKKwkJQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUworCQlHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWQorCQlBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECisJCUJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTCisJCUFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UKKwkJQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UCisJCVVTRSBUSEUgQ09OVEVOVC48L3A+CiAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KKwk8aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+CiAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgiRVBMIikuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKwk8cD4KKwkJVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKKwkJRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gQSBjb3B5IG9mIHRoZQorCQlFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMDwvYT4uCisJCUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC4KKwk8L3A+CiAKLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUKLSAgIHJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9wPgorCTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdAorCQljb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gc291cmNlIGNvZGUgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gc29mdHdhcmUKKwkJbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZQorCQlhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS48L2xpPgotICAgICAgIDxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmGZIEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotICAgICAgIDxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvCisJCQlmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbAorCQkJbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluCisJCQlmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcworCQkJKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgorCQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkKKwkJCW9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQKKwkJCSZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KKwkJPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IKKwkJCUZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhCisJCQlzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiBXaXRoaW4gYQorCQkJRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mCisJCQl0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cworCQkJYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgorCQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQKKwkJCUZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQKKwkJCSZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24KKwkJCW51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KKwk8L3VsPgogCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQKKwkJYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsKKwkJKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCisJCUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQKKwkJJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gQWJvdXRzIGFuZAorCQlGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvcgorCQlNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgogCi08dWw+Ci0gICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0gICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLSAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0gICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotICAgICAgIDxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKwkJPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KKwkJPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgorCQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mCisJCQljZXJ0YWluIFBsdWctaW5zPC9saT4KKwkJPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgorCTwvdWw+CiAKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+CisJPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMKKwkJaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdQorCQltdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nCisJCXRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsCisJCXRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMKKwkJYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdQorCQljYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUKKwkJJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZAorCQkmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4gU3VjaCBBYm91dHMsCisJCUZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQKKwkJY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybgorCQl5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LjwvcD4KIAotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgorCTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkKKwkJUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5ECisJCUNPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQKKwkJQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+RWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4pCisJCTwvbGk+CisJCTxsaT5FY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pCisJCTwvbGk+CisJCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPikKKwkJPC9saT4KKwkJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pCisJCTwvbGk+CisJCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPikKKwkJPC9saT4KKwk8L3VsPgogCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+CisJPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQKKwkJQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsCisJCW9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQKKwkJcGFydGljdWxhciBDb250ZW50LjwvcD4KIAogCi08aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KKwk8aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KIAotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKLSAgIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCi0gICBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+Ci0gICAoIlNwZWNpZmljYXRpb24iKS48L3A+CisJPHA+CisJCVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMKKwkJb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZQorCQlNYW5hZ2VyICgmcXVvdDtQcm92aXNpb25pbmcgVGVjaG5vbG9neSZxdW90OykgZm9yIHRoZSBwdXJwb3NlIG9mCisJCWFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgorCQlvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSZxdW90OykuIFRoaXMKKwkJY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bworCQlpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dAorCQlwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgorCQkoJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90OykuCisJPC9wPgogCi08cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlCi0gICBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCi0gICBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+CisJPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0bworCQlpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nCisJCXRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUKKwkJdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nCisJCVRlY2hub2xvZ3kgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcKKwkJVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aAorCQl0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUKKwkJYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgogCi08b2w+Ci0gICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICAgICAgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKLSAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuCi0gICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2gKLSAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgotPC9vbD4KKwk8b2w+CisJCTxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nCisJCQlQcm9jZXNzJnF1b3Q7KSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZworCQkJVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQKKwkJCW9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbgorCQkJRWNsaXBzZS1iYXNlZCBwcm9kdWN0LjwvbGk+CisJCTxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKKwkJCW1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQorCQkJYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KKwkJPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyCisJCQl0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoCisJCQlJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0CisJCQlNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworCQkJdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieQorCQkJdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlCisJCQlBZ3JlZW1lbnQuIFVwb24gc3VjaCBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlCisJCQlwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlLjwvbGk+CisJPC9vbD4KIAotPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisJPGgzPkNyeXB0b2dyYXBoeTwvaDM+CiAKLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CisJPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaAorCQl5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kCisJCXVzZSwgYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuCisJCUJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywKKwkJcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLAorCQlhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CiAKLTxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgotCi0KLTwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCTxwPgorCQk8c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZgorCQkJT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4KKwk8L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlLmZlYXR1cmUvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9wb20ueG1sCmluZGV4IDI5Mzk1NWUuLmQxNDhhYzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9wb20ueG1sCkBAIC01MCw3ICs1MCw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5qZ2l0LnR5Y2hvLnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjQtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZTwvZ3JvdXBJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmluZGV4IDQ0NTBiYmIuLjI5MWIyOWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpAQCAtMzYsMTI1ICszNiwxNDMgQEAKICMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgogbGljZW5zZT1cCiBFY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnRcblwKLUFwcmlsIDksIDIwMTRcblwKK1xuXAorTm92ZW1iZXIgMjIsIDIwMTdcblwKIFxuXAogVXNhZ2UgT2YgQ29udGVudFxuXAogXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKK1RIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTlxuXAorQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0ZcblwKK1RIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFXG5cCitURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAorQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRFxuXAorQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFXG5cCitBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCitURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWVxuXAorQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1VcblwKK01BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAogXG5cCiBBcHBsaWNhYmxlIExpY2Vuc2VzXG5cCiBcblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGVcblwKLUVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG5cCi10aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpc1xuXAotcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCitVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAoraXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZVxuXAorVmVyc2lvbiAyLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc29cblwKK2F2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLFxuXAorIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKIFxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGVcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAorQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb25cblwKK2FuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUgcmVwb3NpdG9yeVxuXAorKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXNcblwKK2Rvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAogXG5cCi0gICAgICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgICAgICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YShUTSkgQVJjaGl2ZSlcblwKLSAgICAgICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgICAgICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgICAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKKy0gICBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZVxuXAorICAgIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heVxuXAorICAgIGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmRcblwKKyAgICBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCistICAgRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSXG5cCisgICAgKEphdmHihKIgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAorLSAgIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZFxuXAorICAgIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGFcblwKKyAgICBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXlcblwKKyAgICBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yXG5cCisgICAgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCistICAgRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhXG5cCisgICAgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZFxuXAorICAgIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKIFxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCitUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpblxuXAorZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXNcblwKK2FuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiXG5cCisoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueVxuXAorZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmdcblwKK2xvY2F0aW9uczpcblwKIFxuXAotICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAorLSAgIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAorLSAgIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCistICAgSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAorLSAgIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKKy0gICBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCiBcblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLVByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBcblwKLVVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLlxuXAotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZVxuXAotdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdFxuXAotZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCitOb3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmdcblwKK3RoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZVxuXAorKCJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmVcblwKK2NvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCit3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3VcblwKK3doZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiXG5cCitwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLiBTdWNoXG5cCitBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKK2NvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2ZcblwKK3RoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCiBcblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAorVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMXG5cCitPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0VcblwKK09USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCiBcblwKLSAgICAgICAtIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWwpXG5cCi0gICAgICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKKy0gICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbClcblwKKy0gICBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWwpXG5cCistICAgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKKy0gICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAorLSAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAorLSAgIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKIFxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAorSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUT1xuXAorVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzXG5cCitwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmRcblwKK2NvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAogXG5cCi1cblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKK1VzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAogXG5cCi1UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsXG5cCi1idXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvclxuXAotdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yXG5cCi1vdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGhcblwKLXRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLlxuXAotSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAorVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaFxuXAoraW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyXG5cCisoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGxcblwKK3NvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHlcblwKKyJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nXG5cCitzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uXG5cCithYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCiBodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLlxuXAogXG5cCi1Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1Zb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGVcblwKLUluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1pbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kXG5cCi1tYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAotYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOlxuXAorWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsXG5cCitJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZVxuXAorbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZFxuXAorYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZVxuXAorU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0XG5cCithdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCithZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZVxuXAorZm9sbG93aW5nOlxuXAogXG5cCi0gICAgICAgMS4gQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZVxuXAotICAgICAgICAgIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLFxuXAotICAgICAgICAgIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCi0gICAgICAgMi4gRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eVxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLlxuXAotICAgICAgIDMuIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0XG5cCi0gICAgICAgICAgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2hcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZVxuXAotICAgICAgICAgIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZVxuXAotICAgICAgICAgIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnlcblwKLSAgICAgICAgICB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2hcblwKLSAgICAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uXG5cCi0gICAgICAgICAgb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAorMS4gIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5XG5cCisgICAgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZVxuXAorICAgIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW5cblwKKyAgICBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCisyLiAgRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZFxuXAorICAgIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG9cblwKKyAgICB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCiszLiAgUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZFxuXAorICAgIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZVxuXAorICAgIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZVxuXAorICAgIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaFxuXAorICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kXG5cCisgICAgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlXG5cCisgICAgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlXG5cCisgICAgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2ggaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZVxuXAorICAgIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZVxuXAorICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAogXG5cCiBDcnlwdG9ncmFwaHlcblwKIFxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kXG5cCi1yZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAorQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseVxuXAorbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG9cblwKK2Fub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLFxuXAorcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCxcblwKK3Bvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpc1xuXAorcGVybWl0dGVkLlxuXAogXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitKYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGVcblwKK1VuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgorIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LmZlYXR1cmUvZmVhdHVyZS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LmZlYXR1cmUvZmVhdHVyZS54bWwKaW5kZXggYWRmNTYxMy4uNjU1MTMzMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMiw3ICsyLDcgQEAKIDxmZWF0dXJlCiAgICAgICBpZD0ib3JnLmVjbGlwc2UuamdpdC5qdW5pdCIKICAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSI0LjExLjQucXVhbGlmaWVyIgorICAgICAgdmVyc2lvbj0iNS4wLjQucXVhbGlmaWVyIgogICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+CiAKICAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvamdpdC8iPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9saWNlbnNlLmh0bWwKaW5kZXggOTVhZDk1ZS4uMDA4YjgwMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LmZlYXR1cmUvbGljZW5zZS5odG1sCkBAIC0xLDEwNiArMSwxODkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+CiA8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotCis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+CiA8dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5BcHJpbCA5LCAyMDE0PC9wPgorCTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorCTxwPk5vdmVtYmVyIDIyLCAyMDE3PC9wPgogCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CisJPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgogCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKwk8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwKKwkJSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKwkJKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZCisJCVRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAorCQlDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECisJCUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMKKwkJR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkKKwkJQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAorCQlCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUworCQlBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFCisJCUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVAorCQlVU0UgVEhFIENPTlRFTlQuPC9wPgogCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+CisJPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgogCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoIkVQTCIpLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisJPHA+CisJCVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCisJCUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjAgKCZxdW90O0VQTCZxdW90OykuIEEgY29weSBvZiB0aGUKKwkJRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjA8L2E+LgorCQlGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuCisJPC9wPgogCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvcD4KKwk8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QKKwkJY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlCisJCW1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUKKwkJYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgogCi08dWw+Ci0gICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuPC9saT4KLSAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhmSBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuPC9saT4KLSAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0bworCQkJZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwKKwkJCW1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbgorCQkJZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMKKwkJCSgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KKwkJPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5CisJCQlvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkCisJCQkmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+CisJCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yCisJCQlGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYQorCQkJc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gV2l0aGluIGEKKwkJCUZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZgorCQkJdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMKKwkJCWFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KKwkJPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkCisJCQlGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkCisJCQkmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uCisJCQludW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+CisJPC91bD4KIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KKwk8cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkCisJCWJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7CisJCSgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAorCQlJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkCisJCSZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuIEFib3V0cyBhbmQKKwkJRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IKKwkJTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisJCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+CisJCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKwkJPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZgorCQkJY2VydGFpbiBQbHVnLWluczwvbGk+CisJCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKwk8L3VsPgogCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgorCTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzCisJCWluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UKKwkJbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZworCQl0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLAorCQl0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zCisJCWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UKKwkJY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlCisJCSZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQKKwkJJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuIFN1Y2ggQWJvdXRzLAorCQlGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kCisJCWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4KKwkJeW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS48L3A+CiAKLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKwk8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZCisJCVJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORAorCQlDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUCisJCUFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgogCi08dWw+Ci0gICAgICAgPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+RWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pCisJCTwvbGk+CisJCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KQorCQk8L2xpPgorCQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pCisJCTwvbGk+CisJPC91bD4KIAotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5ECisJCUNPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLAorCQlvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0CisJCXBhcnRpY3VsYXIgQ29udGVudC48L3A+CiAKIAotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CisJPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CiAKLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgotICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bwotICAgaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgotICAgKCJTcGVjaWZpY2F0aW9uIikuPC9wPgorCTxwPgorCQlUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzCisJCW9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUKKwkJTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZgorCQlhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKKwkJb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUmcXVvdDspLiBUaGlzCisJCWNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KKwkJaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQKKwkJcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KKwkJKCZxdW90O1NwZWNpZmljYXRpb24mcXVvdDspLgorCTwvcD4KIAotPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQotICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQotICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgorCTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8KKwkJaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZworCQl0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlCisJCXRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZworCQlUZWNobm9sb2d5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nCisJCVRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGgKKwkJdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlCisJCWFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KIAotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkCi0gICAgICAgcHJvZHVjdC48L2xpPgotICAgICAgIDxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCi0gICAgICAgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KLSAgICAgICA8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCi0gICAgICAgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+CisJPG9sPgorCQk8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCZxdW90O1Byb3Zpc2lvbmluZworCQkJUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcKKwkJCVRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgmcXVvdDtUYXJnZXQgTWFjaGluZSZxdW90Oykgd2l0aCB0aGUgaW50ZW50CisJCQlvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4KKwkJCUVjbGlwc2UtYmFzZWQgcHJvZHVjdC48L2xpPgorCQk8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5CisJCQltYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKKwkJCWFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+CisJCTxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlcgorCQkJdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaAorCQkJSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAorCQkJTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKwkJCXRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkKKwkJCXRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZQorCQkJQWdyZWVtZW50LiBVcG9uIHN1Y2ggaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZQorCQkJcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZS48L2xpPgorCTwvb2w+CiAKLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCTxoMz5DcnlwdG9ncmFwaHk8L2gzPgogCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorCTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2gKKwkJeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZAorCQl1c2UsIGFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLgorCQlCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsCisJCXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwKKwkJYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgogCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLQotCi08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKwk8cD4KKwkJPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YKKwkJCU9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+CisJPC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5mZWF0dXJlL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LmZlYXR1cmUvcG9tLnhtbAppbmRleCAwMzFlYjdhLi5mNjUzMjZlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LmZlYXR1cmUvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LmZlYXR1cmUvcG9tLnhtbApAQCAtNTAsNyArNTAsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+amdpdC50eWNoby5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS40LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmU8L2dyb3VwSWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQubGZzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmluZGV4IGM1YmZmYTguLjgzODc1ODUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQubGZzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQubGZzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCkBAIC0zNSwxMjUgKzM1LDE0MyBAQAogIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCiBsaWNlbnNlPVwKIEVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAotQXByaWwgOSwgMjAxNFxuXAorXG5cCitOb3ZlbWJlciAyMiwgMjAxN1xuXAogXG5cCiBVc2FnZSBPZiBDb250ZW50XG5cCiBcblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAorVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OXG5cCitBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRlxuXAorVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEVcblwKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCitCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEXG5cCitCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0VcblwKK0FHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZXG5cCitBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVVxuXAorTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCiBcblwKIEFwcGxpY2FibGUgTGljZW5zZXNcblwKIFxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZVxuXAotRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcblwKLXRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzXG5cCi1wcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKK1VubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCitpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlXG5cCitWZXJzaW9uIDIuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzb1xuXAorYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4gRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsXG5cCisiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAogXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCitDb250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvblxuXAorYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZSByZXBvc2l0b3J5XG5cCisoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhc1xuXAorZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCiBcblwKLSAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAotICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAorLSAgIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlXG5cCisgICAgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5XG5cCisgICAgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZFxuXAorICAgIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKKy0gICBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVJcblwKKyAgICAoSmF2YeKEoiBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCistICAgQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kXG5cCisgICAgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYVxuXAorICAgIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heVxuXAorICAgIGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3JcblwKKyAgICBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKKy0gICBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGFcblwKKyAgICBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kXG5cCisgICAgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAogXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKK1RoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluXG5cCitmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlc1xuXAorYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCJcblwKKygiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55XG5cCitkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZ1xuXAorbG9jYXRpb25zOlxuXAogXG5cCi0gICAgICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgICAgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAgICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAgICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCistICAgVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCistICAgUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKKy0gICBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCistICAgU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAorLSAgIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKIFxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFxuXAotVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuXG5cCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlXG5cCi10ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0XG5cCi1nb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKK05vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZ1xuXAordGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlXG5cCisoIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZVxuXAorY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKK3dpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdVxuXAord2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSJcblwKK3Byb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuIFN1Y2hcblwKK0Fib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAorY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZlxuXAordGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKIFxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCitUSEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUExcblwKK09SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRVxuXAorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKIFxuXAotICAgICAgIC0gRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbClcblwKLSAgICAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAorLSAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sKVxuXAorLSAgIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbClcblwKKy0gICBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAorLSAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCistICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCistICAgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAogXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCitJVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPXG5cCitVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXNcblwKK3Byb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZFxuXAorY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCiBcblwKLVxuXFVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAorVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCiBcblwKLVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSxcblwKLWJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yXG5cCi10aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3JcblwKLW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aFxuXAotdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuXG5cCi1JbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCitUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoXG5cCitpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXJcblwKKygiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbFxuXAorc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseVxuXAorIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmdcblwKK3N1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb25cblwKK2Fib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKIGh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cCiBcblwKLVlvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXAotSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLWluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKLW1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCi1hZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cCitZb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGxcblwKK0luc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlXG5cCitsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kXG5cCithY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlXG5cCitTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXRcblwKK2F2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKK2FncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlXG5cCitmb2xsb3dpbmc6XG5cCiBcblwKLSAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCi0gICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCi0gICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKLSAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCi0gICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKLSAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCi0gICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCi0gICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAotICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAotICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKLSAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCisxLiAgQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXlcblwKKyAgICBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlXG5cCisgICAgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhblxuXAorICAgIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKKzIuICBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkXG5cCisgICAgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0b1xuXAorICAgIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKKzMuICBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kXG5cCisgICAgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlXG5cCisgICAgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlXG5cCisgICAgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoXG5cCisgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmRcblwKKyAgICBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2VcblwKKyAgICBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGVcblwKKyAgICBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaCBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlXG5cCisgICAgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlXG5cCisgICAgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCiBcblwKIENyeXB0b2dyYXBoeVxuXAogXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKLXJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCitDb250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5XG5cCittYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0b1xuXAorYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsXG5cCitwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LFxuXAorcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzXG5cCitwZXJtaXR0ZWQuXG5cCiBcblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KK0phdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZVxuXAorVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCiAjIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQubGZzLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5mZWF0dXJlL2ZlYXR1cmUueG1sCmluZGV4IGFkOWU1NGQuLjcyZTE1ZGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQubGZzLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5sZnMuZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMiw3ICsyLDcgQEAKIDxmZWF0dXJlCiAgICAgICBpZD0ib3JnLmVjbGlwc2UuamdpdC5sZnMiCiAgICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iNC4xMS40LnF1YWxpZmllciIKKyAgICAgIHZlcnNpb249IjUuMC40LnF1YWxpZmllciIKICAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgogCiAgICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2pnaXQvIj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQubGZzLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5sZnMuZmVhdHVyZS9saWNlbnNlLmh0bWwKaW5kZXggOTVhZDk1ZS4uMDA4YjgwMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5sZnMuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5sZnMuZmVhdHVyZS9saWNlbnNlLmh0bWwKQEAgLTEsMTA2ICsxLDE4OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPz4KIDwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci0KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIgLz4KIDx0aXRsZT5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkFwcmlsIDksIDIwMTQ8L3A+CisJPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+CisJPHA+Tm92ZW1iZXIgMjIsIDIwMTc8L3A+CiAKLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKwk8aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CiAKLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgorCTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLAorCQlJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUworCQkoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkKKwkJVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisJCUNPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQKKwkJQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUworCQlHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWQorCQlBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECisJCUJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTCisJCUFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UKKwkJQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UCisJCVVTRSBUSEUgQ09OVEVOVC48L3A+CiAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KKwk8aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+CiAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgiRVBMIikuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKwk8cD4KKwkJVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKKwkJRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gQSBjb3B5IG9mIHRoZQorCQlFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMDwvYT4uCisJCUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC4KKwk8L3A+CiAKLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUKLSAgIHJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9wPgorCTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdAorCQljb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gc291cmNlIGNvZGUgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gc29mdHdhcmUKKwkJbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZQorCQlhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS48L2xpPgotICAgICAgIDxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmGZIEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotICAgICAgIDxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvCisJCQlmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbAorCQkJbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluCisJCQlmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcworCQkJKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgorCQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkKKwkJCW9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQKKwkJCSZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KKwkJPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IKKwkJCUZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhCisJCQlzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiBXaXRoaW4gYQorCQkJRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mCisJCQl0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cworCQkJYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgorCQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQKKwkJCUZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQKKwkJCSZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24KKwkJCW51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KKwk8L3VsPgogCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQKKwkJYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsKKwkJKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCisJCUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQKKwkJJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gQWJvdXRzIGFuZAorCQlGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvcgorCQlNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgogCi08dWw+Ci0gICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0gICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLSAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0gICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotICAgICAgIDxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKwkJPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KKwkJPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgorCQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mCisJCQljZXJ0YWluIFBsdWctaW5zPC9saT4KKwkJPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgorCTwvdWw+CiAKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+CisJPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMKKwkJaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdQorCQltdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nCisJCXRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsCisJCXRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMKKwkJYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdQorCQljYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUKKwkJJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZAorCQkmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4gU3VjaCBBYm91dHMsCisJCUZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQKKwkJY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybgorCQl5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LjwvcD4KIAotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgorCTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkKKwkJUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5ECisJCUNPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQKKwkJQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+RWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4pCisJCTwvbGk+CisJCTxsaT5FY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pCisJCTwvbGk+CisJCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPikKKwkJPC9saT4KKwkJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pCisJCTwvbGk+CisJCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPikKKwkJPC9saT4KKwk8L3VsPgogCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+CisJPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQKKwkJQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsCisJCW9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQKKwkJcGFydGljdWxhciBDb250ZW50LjwvcD4KIAogCi08aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KKwk8aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KIAotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKLSAgIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCi0gICBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+Ci0gICAoIlNwZWNpZmljYXRpb24iKS48L3A+CisJPHA+CisJCVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMKKwkJb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZQorCQlNYW5hZ2VyICgmcXVvdDtQcm92aXNpb25pbmcgVGVjaG5vbG9neSZxdW90OykgZm9yIHRoZSBwdXJwb3NlIG9mCisJCWFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgorCQlvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSZxdW90OykuIFRoaXMKKwkJY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bworCQlpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dAorCQlwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgorCQkoJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90OykuCisJPC9wPgogCi08cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlCi0gICBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCi0gICBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+CisJPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0bworCQlpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nCisJCXRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUKKwkJdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nCisJCVRlY2hub2xvZ3kgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcKKwkJVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aAorCQl0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUKKwkJYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgogCi08b2w+Ci0gICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICAgICAgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKLSAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuCi0gICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2gKLSAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgotPC9vbD4KKwk8b2w+CisJCTxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nCisJCQlQcm9jZXNzJnF1b3Q7KSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZworCQkJVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQKKwkJCW9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbgorCQkJRWNsaXBzZS1iYXNlZCBwcm9kdWN0LjwvbGk+CisJCTxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKKwkJCW1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQorCQkJYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KKwkJPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyCisJCQl0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoCisJCQlJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0CisJCQlNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworCQkJdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieQorCQkJdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlCisJCQlBZ3JlZW1lbnQuIFVwb24gc3VjaCBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlCisJCQlwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlLjwvbGk+CisJPC9vbD4KIAotPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisJPGgzPkNyeXB0b2dyYXBoeTwvaDM+CiAKLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CisJPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaAorCQl5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kCisJCXVzZSwgYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuCisJCUJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywKKwkJcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLAorCQlhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CiAKLTxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgotCi0KLTwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCTxwPgorCQk8c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZgorCQkJT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4KKwk8L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5mZWF0dXJlL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5mZWF0dXJlL3BvbS54bWwKaW5kZXggMGY5ZjA2Zi4uMzVhNGZkYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5sZnMuZmVhdHVyZS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQubGZzLmZlYXR1cmUvcG9tLnhtbApAQCAtNTAsNyArNTAsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+amdpdC50eWNoby5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS40LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmU8L2dyb3VwSWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmluZGV4IDg5OTJhZDMuLmVmOTAzMWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCkBAIC0zNSwxMjUgKzM1LDE0MyBAQAogIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCiBsaWNlbnNlPVwKIEVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAotQXByaWwgOSwgMjAxNFxuXAorXG5cCitOb3ZlbWJlciAyMiwgMjAxN1xuXAogXG5cCiBVc2FnZSBPZiBDb250ZW50XG5cCiBcblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAorVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OXG5cCitBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRlxuXAorVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEVcblwKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCitCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEXG5cCitCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0VcblwKK0FHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZXG5cCitBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVVxuXAorTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCiBcblwKIEFwcGxpY2FibGUgTGljZW5zZXNcblwKIFxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZVxuXAotRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcblwKLXRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzXG5cCi1wcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKK1VubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCitpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlXG5cCitWZXJzaW9uIDIuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzb1xuXAorYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4gRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsXG5cCisiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAogXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCitDb250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvblxuXAorYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZSByZXBvc2l0b3J5XG5cCisoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhc1xuXAorZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCiBcblwKLSAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAotICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAorLSAgIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlXG5cCisgICAgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5XG5cCisgICAgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZFxuXAorICAgIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKKy0gICBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVJcblwKKyAgICAoSmF2YeKEoiBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCistICAgQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kXG5cCisgICAgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYVxuXAorICAgIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heVxuXAorICAgIGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3JcblwKKyAgICBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKKy0gICBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGFcblwKKyAgICBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kXG5cCisgICAgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAogXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKK1RoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluXG5cCitmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlc1xuXAorYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCJcblwKKygiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55XG5cCitkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZ1xuXAorbG9jYXRpb25zOlxuXAogXG5cCi0gICAgICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgICAgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAgICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAgICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCistICAgVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCistICAgUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKKy0gICBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCistICAgU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAorLSAgIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKIFxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFxuXAotVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuXG5cCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlXG5cCi10ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0XG5cCi1nb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKK05vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZ1xuXAordGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlXG5cCisoIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZVxuXAorY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKK3dpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdVxuXAord2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSJcblwKK3Byb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuIFN1Y2hcblwKK0Fib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAorY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZlxuXAordGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKIFxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCitUSEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUExcblwKK09SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRVxuXAorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKIFxuXAotICAgICAgIC0gRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbClcblwKLSAgICAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAorLSAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sKVxuXAorLSAgIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbClcblwKKy0gICBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAorLSAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCistICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCistICAgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAogXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCitJVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPXG5cCitVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXNcblwKK3Byb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZFxuXAorY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCiBcblwKLVxuXFVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAorVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCiBcblwKLVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSxcblwKLWJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yXG5cCi10aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3JcblwKLW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aFxuXAotdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuXG5cCi1JbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCitUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoXG5cCitpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXJcblwKKygiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbFxuXAorc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseVxuXAorIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmdcblwKK3N1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb25cblwKK2Fib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKIGh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cCiBcblwKLVlvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXAotSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLWluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKLW1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCi1hZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cCitZb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGxcblwKK0luc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlXG5cCitsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kXG5cCithY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlXG5cCitTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXRcblwKK2F2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKK2FncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlXG5cCitmb2xsb3dpbmc6XG5cCiBcblwKLSAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCi0gICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCi0gICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKLSAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCi0gICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKLSAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCi0gICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCi0gICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAotICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAotICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKLSAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCisxLiAgQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXlcblwKKyAgICBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlXG5cCisgICAgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhblxuXAorICAgIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKKzIuICBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkXG5cCisgICAgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0b1xuXAorICAgIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKKzMuICBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kXG5cCisgICAgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlXG5cCisgICAgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlXG5cCisgICAgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoXG5cCisgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmRcblwKKyAgICBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2VcblwKKyAgICBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGVcblwKKyAgICBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaCBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlXG5cCisgICAgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlXG5cCisgICAgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCiBcblwKIENyeXB0b2dyYXBoeVxuXAogXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKLXJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCitDb250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5XG5cCittYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0b1xuXAorYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsXG5cCitwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LFxuXAorcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzXG5cCitwZXJtaXR0ZWQuXG5cCiBcblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK0phdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZVxuXAorVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCisjIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5mZWF0dXJlL2ZlYXR1cmUueG1sCmluZGV4IDE0NGY4ZmIuLjE4YTdkMWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMiw3ICsyLDcgQEAKIDxmZWF0dXJlCiAgICAgICBpZD0ib3JnLmVjbGlwc2UuamdpdC5wZ20iCiAgICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iNC4xMS40LnF1YWxpZmllciIKKyAgICAgIHZlcnNpb249IjUuMC40LnF1YWxpZmllciIKICAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgogCiAgICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2pnaXQvIj4KQEAgLTMxLDggKzMxLDggQEAKICAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+CiAKICAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuamdpdCIgdmVyc2lvbj0iNC4xMS40IiBtYXRjaD0iZXF1aXZhbGVudCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qZ2l0LmxmcyIgdmVyc2lvbj0iNC4xMS40IiBtYXRjaD0iZXF1aXZhbGVudCIvPgorICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qZ2l0IiB2ZXJzaW9uPSI1LjAuNCIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KKyAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuamdpdC5sZnMiIHZlcnNpb249IjUuMC40IiBtYXRjaD0iZXF1aXZhbGVudCIvPgogICAgPC9yZXF1aXJlcz4KIAogICAgPHBsdWdpbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAppbmRleCA5NWFkOTVlLi4wMDhiODAxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5mZWF0dXJlL2xpY2Vuc2UuaHRtbApAQCAtMSwxMDYgKzEsMTg5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgogPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLQorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgogPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgOSwgMjAxNDwvcD4KKwk8aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KKwk8cD5Ob3ZlbWJlciAyMiwgMjAxNzwvcD4KIAotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KIAotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICJDT05URU5UIikuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisJPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sCisJCUlORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCisJCShDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWQorCQlUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKKwkJQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAorCQlCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTCisJCUdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZCisJCUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQKKwkJQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMKKwkJQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRQorCQlBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QKKwkJVVNFIFRIRSBDT05URU5ULjwvcD4KIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgorCTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCJFUEwiKS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCTxwPgorCQlVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UKKwkJRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorCQlFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wICgmcXVvdDtFUEwmcXVvdDspLiBBIGNvcHkgb2YgdGhlCisJCUVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wPC9hPi4KKwkJRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LgorCTwvcD4KIAotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZQotICAgcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L3A+CisJPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0CisJCWNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UKKwkJRm91bmRhdGlvbiBzb3VyY2UgY29kZSByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZQorCQltb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlCisJCWFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YZkgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLjwvbGk+Ci0gICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8KKwkJCWZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsCisJCQltb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4KKwkJCWZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzCisJCQkoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+CisJCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeQorCQkJb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZAorCQkJJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgorCQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vcgorCQkJRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEKKwkJCXN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuIFdpdGhpbiBhCisJCQlGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YKKwkJCXRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzCisJCQlhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+CisJCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZAorCQkJRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZAorCQkJJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbgorCQkJbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgorCTwvdWw+CiAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisJPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZAorCQliZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OworCQkoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKKwkJSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZAorCQkmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiBBYm91dHMgYW5kCisJCUZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yCisJCU1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLSAgICAgICA8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotICAgICAgIDxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLSAgICAgICA8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgorCQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorCQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+CisJCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YKKwkJCWNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorCQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+CisJPC91bD4KIAotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KKwk8cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcworCQlpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91CisJCW11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcKKwkJdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywKKwkJdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcworCQlhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91CisJCWNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZQorCQkmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkCisJCSZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLiBTdWNoIEFib3V0cywKKwkJRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZAorCQljb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuCisJCXlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuPC9wPgogCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CisJPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWQorCQlSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQKKwkJQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVAorCQlBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5FY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbDwvYT4pCisJCTwvbGk+CisJCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KQorCQk8L2xpPgorCQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPikKKwkJPC9saT4KKwkJPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KQorCQk8L2xpPgorCTwvdWw+CiAKLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KKwk8cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORAorCQlDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwKKwkJb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UKKwkJRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdAorCQlwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgogCiAKLTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgorCTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgogCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZQotICAgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KLSAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgiU3BlY2lmaWNhdGlvbiIpLjwvcD4KKwk8cD4KKwkJVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcworCQlvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlCisJCU1hbmFnZXIgKCZxdW90O1Byb3Zpc2lvbmluZyBUZWNobm9sb2d5JnF1b3Q7KSBmb3IgdGhlIHB1cnBvc2Ugb2YKKwkJYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCisJCW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcworCQljYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCisJCWluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0CisJCXBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+CisJCSgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS4KKwk8L3A+CiAKLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KKwk8cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvCisJCWluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcKKwkJdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZQorCQl0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcKKwkJVGVjaG5vbG9neSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZworCQlUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoCisJCXRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZQorCQlhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+CiAKLTxvbD4KLSAgICAgICA8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAotICAgICAgIHByb2R1Y3QuPC9saT4KLSAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQotICAgICAgIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAotICAgICAgIE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4KLSAgICAgICB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaAotICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLjwvbGk+Ci08L29sPgorCTxvbD4KKwkJPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgmcXVvdDtQcm92aXNpb25pbmcKKwkJCVByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nCisJCQlUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoJnF1b3Q7VGFyZ2V0IE1hY2hpbmUmcXVvdDspIHdpdGggdGhlIGludGVudAorCQkJb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuCisJCQlFY2xpcHNlLWJhc2VkIHByb2R1Y3QuPC9saT4KKwkJPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQorCQkJbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCisJCQlhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgorCQk8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIKKwkJCXRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUgKCZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCZxdW90OykgYW5kIHN1Y2gKKwkJCUluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKKwkJCU1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisJCQl0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5CisJCQl0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUKKwkJCUFncmVlbWVudC4gVXBvbiBzdWNoIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUKKwkJCXByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUuPC9saT4KKwk8L29sPgogCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KKwk8aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KIAotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KKwk8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoCisJCXlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQKKwkJdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4KKwkJQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLAorCQlyZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsCisJCWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KIAotPHA+PHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+Ci0KLQotPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisJPHA+CisJCTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mCisJCQlPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPgorCTwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvcG9tLnhtbAppbmRleCA0OGJlZDQzLi43M2E3ZDNmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5mZWF0dXJlL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uZmVhdHVyZS9wb20ueG1sCkBAIC01MCw3ICs1MCw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5qZ2l0LnR5Y2hvLnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjQtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZTwvZ3JvdXBJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLnNvdXJjZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLnNvdXJjZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwppbmRleCAwMTJjMjE3Li43MzcwMWIyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5zb3VyY2UuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uc291cmNlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCkBAIC0xNiw3ICsxNiw3IEBACiAjIGRlc2NyaXB0aW9uIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgRGVzY3JpcHRpb24iCiBkZXNjcmlwdGlvbj1cCiBEbyBub3QgaW5zdGFsbCBpbiB5b3VyIElERTogdGhpcyBmZWF0dXJlIGlzIG1lYW50IHRvIHByb3Zpc2lvbiBUYXJnZXQgUGxhdGZvcm1zLlxuXAotU291cmNlIGNvZGUgZm9yIHRoZSBzdXBwb3J0IGZvciBQREUncyBKVW5pdCBydW5uZXIgZm9yIGEgVGFyZ2V0IFBsYXRmb3JtXG5cCitTb3VyY2UgY29kZSBmb3IgdGhlIHN1cHBvcnQgZm9yIFBERSdzIEpVbml0IHJ1bm5lciBmb3IgYSBUYXJnZXQgUGxhdGZvcm1cbgogIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgZGVzY3JpcHRpb24gcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCiAjICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKQEAgLTM2LDEyNSArMzYsMTQzIEBACiAjIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKIGxpY2Vuc2U9XAogRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50XG5cCi1BcHJpbCA5LCAyMDE0XG5cCitcblwKK05vdmVtYmVyIDIyLCAyMDE3XG5cCiBcblwKIFVzYWdlIE9mIENvbnRlbnRcblwKIFxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCitUSEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT05cblwKK0FORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GXG5cCitUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRVxuXAorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKK0JFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORURcblwKK0JZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRVxuXAorQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTllcblwKK0FQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VXG5cCitNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKIFxuXAogQXBwbGljYWJsZSBMaWNlbnNlc1xuXAogXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCi1FY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAotdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAorVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKK2lzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2VcblwKK1ZlcnNpb24gMi4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvXG5cCithdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCxcblwKKyJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCiBcblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKK0NvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uXG5cCithbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnlcblwKKygiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzXG5cCitkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKIFxuXAotICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCi0gICAgICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAgICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCistICAgQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGVcblwKKyAgICBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXlcblwKKyAgICBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kXG5cCisgICAgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAorLSAgIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUlxuXAorICAgIChKYXZh4oSiIEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKKy0gICBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmRcblwKKyAgICBhc3NvY2lhdGVkIG1hdGVyaWFsLiBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhXG5cCisgICAgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5XG5cCisgICAgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vclxuXAorICAgIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAorLSAgIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYVxuXAorICAgIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmRcblwKKyAgICB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCiBcblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAorVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW5cblwKK2ZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzXG5cCithbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIlxuXAorKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnlcblwKK2RpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nXG5cCitsb2NhdGlvbnM6XG5cCiBcblwKLSAgICAgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgICAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgICAgICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgICAgICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgICAgICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKKy0gICBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKKy0gICBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAorLSAgIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKKy0gICBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCistICAgRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAogXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1Qcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCi1VcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAorTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nXG5cCit0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2VcblwKKygiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlXG5cCitjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAord2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91XG5cCit3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIlxuXAorcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4gU3VjaFxuXAorQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mXG5cCit0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAogXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKK1RIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTFxuXAorT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFXG5cCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAogXG5cCi0gICAgICAgLSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sKVxuXAotICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCistICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwpXG5cCistICAgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sKVxuXAorLSAgIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCistICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKKy0gICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKKy0gICBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCiBcblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKK0lUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE9cblwKK1VTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpc1xuXAorcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKIFxuXAotXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCitVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKIFxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKK1RoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2hcblwKK2luY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlclxuXAorKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsXG5cCitzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5XG5cCisiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZ1xuXAorc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvblxuXAorYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAogaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCAoIlNwZWNpZmljYXRpb24iKS5cblwKIFxuXAotWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlXG5cCi1JbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZFxuXAotbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKLWFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzpcblwKK1lvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbFxuXAorSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGVcblwKK2xpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmRcblwKK2FjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGVcblwKK1NwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdFxuXAorYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAorYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGVcblwKK2ZvbGxvd2luZzpcblwKIFxuXAotICAgICAgIDEuIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGVcblwKLSAgICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZyxcblwKLSAgICAgICAgICBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAotICAgICAgIDIuIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHlcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKLSAgICAgICAzLiBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdFxuXAotICAgICAgICAgIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoXG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2VcblwKLSAgICAgICAgICB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGVcblwKLSAgICAgICAgICB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5XG5cCi0gICAgICAgICAgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoXG5cCi0gICAgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvblxuXAotICAgICAgICAgIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKKzEuICBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heVxuXAorICAgIGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGVcblwKKyAgICBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuXG5cCisgICAgRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAorMi4gIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmRcblwKKyAgICBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvXG5cCisgICAgdGhlIFRhcmdldCBNYWNoaW5lLlxuXAorMy4gIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmRcblwKKyAgICBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGVcblwKKyAgICBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmVcblwKKyAgICBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2hcblwKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZFxuXAorICAgIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZVxuXAorICAgIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZVxuXAorICAgIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGVcblwKKyAgICBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGVcblwKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKIFxuXAogQ3J5cHRvZ3JhcGh5XG5cCiBcblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZFxuXAotcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKK0NvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHlcblwKK21heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvXG5cCithbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSxcblwKK3BsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsXG5cCitwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXNcblwKK3Blcm1pdHRlZC5cblwKIFxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlXG5cCitVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KKyMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uc291cmNlLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5zb3VyY2UuZmVhdHVyZS9mZWF0dXJlLnhtbAppbmRleCAyYjliZjZiLi44MTBkMDE4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5zb3VyY2UuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5zb3VyY2UuZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMiw3ICsyLDcgQEAKIDxmZWF0dXJlCiAgICAgICBpZD0ib3JnLmVjbGlwc2UuamdpdC5wZ20uc291cmNlIgogICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjQuMTEuNC5xdWFsaWZpZXIiCisgICAgICB2ZXJzaW9uPSI1LjAuNC5xdWFsaWZpZXIiCiAgICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KIAogICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9qZ2l0LyI+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5zb3VyY2UuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5zb3VyY2UuZmVhdHVyZS9saWNlbnNlLmh0bWwKaW5kZXggOTVhZDk1ZS4uMDA4YjgwMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uc291cmNlLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLnNvdXJjZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbApAQCAtMSwxMDYgKzEsMTg5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgogPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLQorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgogPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgOSwgMjAxNDwvcD4KKwk8aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KKwk8cD5Ob3ZlbWJlciAyMiwgMjAxNzwvcD4KIAotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KIAotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICJDT05URU5UIikuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisJPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sCisJCUlORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCisJCShDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWQorCQlUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKKwkJQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAorCQlCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTCisJCUdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZCisJCUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQKKwkJQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMKKwkJQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRQorCQlBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QKKwkJVVNFIFRIRSBDT05URU5ULjwvcD4KIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgorCTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCJFUEwiKS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCTxwPgorCQlVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UKKwkJRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorCQlFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wICgmcXVvdDtFUEwmcXVvdDspLiBBIGNvcHkgb2YgdGhlCisJCUVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wPC9hPi4KKwkJRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LgorCTwvcD4KIAotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZQotICAgcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L3A+CisJPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0CisJCWNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UKKwkJRm91bmRhdGlvbiBzb3VyY2UgY29kZSByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZQorCQltb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlCisJCWFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YZkgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLjwvbGk+Ci0gICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8KKwkJCWZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsCisJCQltb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4KKwkJCWZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzCisJCQkoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+CisJCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeQorCQkJb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZAorCQkJJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgorCQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vcgorCQkJRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEKKwkJCXN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuIFdpdGhpbiBhCisJCQlGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YKKwkJCXRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzCisJCQlhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+CisJCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZAorCQkJRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZAorCQkJJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbgorCQkJbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgorCTwvdWw+CiAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisJPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZAorCQliZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OworCQkoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKKwkJSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZAorCQkmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiBBYm91dHMgYW5kCisJCUZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yCisJCU1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLSAgICAgICA8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotICAgICAgIDxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLSAgICAgICA8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgorCQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorCQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+CisJCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YKKwkJCWNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorCQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+CisJPC91bD4KIAotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KKwk8cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcworCQlpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91CisJCW11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcKKwkJdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywKKwkJdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcworCQlhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91CisJCWNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZQorCQkmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkCisJCSZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLiBTdWNoIEFib3V0cywKKwkJRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZAorCQljb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuCisJCXlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuPC9wPgogCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CisJPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWQorCQlSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQKKwkJQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVAorCQlBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5FY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbDwvYT4pCisJCTwvbGk+CisJCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KQorCQk8L2xpPgorCQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPikKKwkJPC9saT4KKwkJPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KQorCQk8L2xpPgorCTwvdWw+CiAKLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KKwk8cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORAorCQlDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwKKwkJb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UKKwkJRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdAorCQlwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgogCiAKLTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgorCTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgogCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZQotICAgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KLSAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgiU3BlY2lmaWNhdGlvbiIpLjwvcD4KKwk8cD4KKwkJVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcworCQlvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlCisJCU1hbmFnZXIgKCZxdW90O1Byb3Zpc2lvbmluZyBUZWNobm9sb2d5JnF1b3Q7KSBmb3IgdGhlIHB1cnBvc2Ugb2YKKwkJYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCisJCW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcworCQljYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCisJCWluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0CisJCXBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+CisJCSgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS4KKwk8L3A+CiAKLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KKwk8cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvCisJCWluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcKKwkJdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZQorCQl0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcKKwkJVGVjaG5vbG9neSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZworCQlUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoCisJCXRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZQorCQlhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+CiAKLTxvbD4KLSAgICAgICA8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAotICAgICAgIHByb2R1Y3QuPC9saT4KLSAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQotICAgICAgIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAotICAgICAgIE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4KLSAgICAgICB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaAotICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLjwvbGk+Ci08L29sPgorCTxvbD4KKwkJPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgmcXVvdDtQcm92aXNpb25pbmcKKwkJCVByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nCisJCQlUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoJnF1b3Q7VGFyZ2V0IE1hY2hpbmUmcXVvdDspIHdpdGggdGhlIGludGVudAorCQkJb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuCisJCQlFY2xpcHNlLWJhc2VkIHByb2R1Y3QuPC9saT4KKwkJPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQorCQkJbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCisJCQlhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgorCQk8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIKKwkJCXRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUgKCZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCZxdW90OykgYW5kIHN1Y2gKKwkJCUluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKKwkJCU1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisJCQl0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5CisJCQl0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUKKwkJCUFncmVlbWVudC4gVXBvbiBzdWNoIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUKKwkJCXByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUuPC9saT4KKwk8L29sPgogCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KKwk8aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KIAotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KKwk8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoCisJCXlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQKKwkJdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4KKwkJQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLAorCQlyZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsCisJCWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KIAotPHA+PHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+Ci0KLQotPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisJPHA+CisJCTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mCisJCQlPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPgorCTwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLnNvdXJjZS5mZWF0dXJlL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5zb3VyY2UuZmVhdHVyZS9wb20ueG1sCmluZGV4IDQ3N2E1ODEuLjg4YjhjZTkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLnNvdXJjZS5mZWF0dXJlL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uc291cmNlLmZlYXR1cmUvcG9tLnhtbApAQCAtNTAsNyArNTAsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+amdpdC50eWNoby5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS40LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmU8L2dyb3VwSWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnJlcG9zaXRvcnkvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucmVwb3NpdG9yeS9wb20ueG1sCmluZGV4IGI5MWRhZDAuLmM4YzNiNTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucmVwb3NpdG9yeS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucmVwb3NpdG9yeS9wb20ueG1sCkBAIC01MCw3ICs1MCw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5qZ2l0LnR5Y2hvLnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjQtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQucmVwb3NpdG9yeTwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc291cmNlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKaW5kZXggOTg0M2UyMy4uYzA0ZGM2MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKQEAgLTM2LDEyNSArMzYsMTQzIEBACiAjIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKIGxpY2Vuc2U9XAogRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50XG5cCi1BcHJpbCA5LCAyMDE0XG5cCitcblwKK05vdmVtYmVyIDIyLCAyMDE3XG5cCiBcblwKIFVzYWdlIE9mIENvbnRlbnRcblwKIFxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCitUSEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT05cblwKK0FORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GXG5cCitUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRVxuXAorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKK0JFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORURcblwKK0JZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRVxuXAorQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTllcblwKK0FQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VXG5cCitNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKIFxuXAogQXBwbGljYWJsZSBMaWNlbnNlc1xuXAogXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCi1FY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAotdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAorVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKK2lzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2VcblwKK1ZlcnNpb24gMi4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvXG5cCithdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCxcblwKKyJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCiBcblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKK0NvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uXG5cCithbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnlcblwKKygiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzXG5cCitkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKIFxuXAotICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCi0gICAgICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAgICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCistICAgQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGVcblwKKyAgICBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXlcblwKKyAgICBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kXG5cCisgICAgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAorLSAgIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUlxuXAorICAgIChKYXZh4oSiIEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKKy0gICBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmRcblwKKyAgICBhc3NvY2lhdGVkIG1hdGVyaWFsLiBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhXG5cCisgICAgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5XG5cCisgICAgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vclxuXAorICAgIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAorLSAgIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYVxuXAorICAgIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmRcblwKKyAgICB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCiBcblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAorVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW5cblwKK2ZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzXG5cCithbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIlxuXAorKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnlcblwKK2RpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nXG5cCitsb2NhdGlvbnM6XG5cCiBcblwKLSAgICAgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgICAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgICAgICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgICAgICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgICAgICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKKy0gICBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKKy0gICBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAorLSAgIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKKy0gICBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCistICAgRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAogXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1Qcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCi1VcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAorTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nXG5cCit0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2VcblwKKygiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlXG5cCitjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAord2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91XG5cCit3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIlxuXAorcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4gU3VjaFxuXAorQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mXG5cCit0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAogXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKK1RIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTFxuXAorT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFXG5cCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAogXG5cCi0gICAgICAgLSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sKVxuXAotICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCistICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwpXG5cCistICAgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sKVxuXAorLSAgIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCistICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKKy0gICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKKy0gICBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCiBcblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKK0lUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE9cblwKK1VTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpc1xuXAorcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKIFxuXAotXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCitVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKIFxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKK1RoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2hcblwKK2luY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlclxuXAorKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsXG5cCitzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5XG5cCisiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZ1xuXAorc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvblxuXAorYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAogaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCAoIlNwZWNpZmljYXRpb24iKS5cblwKIFxuXAotWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlXG5cCi1JbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZFxuXAotbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKLWFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzpcblwKK1lvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbFxuXAorSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGVcblwKK2xpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmRcblwKK2FjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGVcblwKK1NwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdFxuXAorYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAorYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGVcblwKK2ZvbGxvd2luZzpcblwKIFxuXAotICAgICAgIDEuIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGVcblwKLSAgICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZyxcblwKLSAgICAgICAgICBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAotICAgICAgIDIuIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHlcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKLSAgICAgICAzLiBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdFxuXAotICAgICAgICAgIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoXG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2VcblwKLSAgICAgICAgICB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGVcblwKLSAgICAgICAgICB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5XG5cCi0gICAgICAgICAgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoXG5cCi0gICAgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvblxuXAotICAgICAgICAgIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKKzEuICBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heVxuXAorICAgIGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGVcblwKKyAgICBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuXG5cCisgICAgRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAorMi4gIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmRcblwKKyAgICBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvXG5cCisgICAgdGhlIFRhcmdldCBNYWNoaW5lLlxuXAorMy4gIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmRcblwKKyAgICBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGVcblwKKyAgICBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmVcblwKKyAgICBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2hcblwKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZFxuXAorICAgIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZVxuXAorICAgIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZVxuXAorICAgIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGVcblwKKyAgICBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGVcblwKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKIFxuXAogQ3J5cHRvZ3JhcGh5XG5cCiBcblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZFxuXAotcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKK0NvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHlcblwKK21heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvXG5cCithbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSxcblwKK3BsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsXG5cCitwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXNcblwKK3Blcm1pdHRlZC5cblwKIFxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlXG5cCitVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KKyMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc291cmNlLmZlYXR1cmUvZmVhdHVyZS54bWwKaW5kZXggOGY3MGVjMC4uMTJkNmZlMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC0yLDcgKzIsNyBAQAogPGZlYXR1cmUKICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZSIKICAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSI0LjExLjQucXVhbGlmaWVyIgorICAgICAgdmVyc2lvbj0iNS4wLjQucXVhbGlmaWVyIgogICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+CiAKICAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvamdpdC8iPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAppbmRleCA5NWFkOTVlLi4wMDhiODAxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbApAQCAtMSwxMDYgKzEsMTg5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgogPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLQorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgogPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgOSwgMjAxNDwvcD4KKwk8aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KKwk8cD5Ob3ZlbWJlciAyMiwgMjAxNzwvcD4KIAotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KIAotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICJDT05URU5UIikuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisJPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sCisJCUlORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCisJCShDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWQorCQlUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKKwkJQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAorCQlCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTCisJCUdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZCisJCUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQKKwkJQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMKKwkJQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRQorCQlBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QKKwkJVVNFIFRIRSBDT05URU5ULjwvcD4KIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgorCTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCJFUEwiKS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCTxwPgorCQlVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UKKwkJRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorCQlFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wICgmcXVvdDtFUEwmcXVvdDspLiBBIGNvcHkgb2YgdGhlCisJCUVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wPC9hPi4KKwkJRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LgorCTwvcD4KIAotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZQotICAgcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L3A+CisJPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0CisJCWNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UKKwkJRm91bmRhdGlvbiBzb3VyY2UgY29kZSByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZQorCQltb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlCisJCWFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YZkgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLjwvbGk+Ci0gICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8KKwkJCWZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsCisJCQltb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4KKwkJCWZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzCisJCQkoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+CisJCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeQorCQkJb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZAorCQkJJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgorCQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vcgorCQkJRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEKKwkJCXN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuIFdpdGhpbiBhCisJCQlGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YKKwkJCXRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzCisJCQlhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+CisJCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZAorCQkJRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZAorCQkJJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbgorCQkJbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgorCTwvdWw+CiAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisJPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZAorCQliZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OworCQkoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKKwkJSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZAorCQkmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiBBYm91dHMgYW5kCisJCUZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yCisJCU1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLSAgICAgICA8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotICAgICAgIDxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLSAgICAgICA8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgorCQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorCQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+CisJCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YKKwkJCWNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorCQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+CisJPC91bD4KIAotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KKwk8cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcworCQlpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91CisJCW11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcKKwkJdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywKKwkJdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcworCQlhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91CisJCWNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZQorCQkmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkCisJCSZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLiBTdWNoIEFib3V0cywKKwkJRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZAorCQljb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuCisJCXlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuPC9wPgogCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CisJPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWQorCQlSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQKKwkJQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVAorCQlBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5FY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbDwvYT4pCisJCTwvbGk+CisJCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KQorCQk8L2xpPgorCQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPikKKwkJPC9saT4KKwkJPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KQorCQk8L2xpPgorCTwvdWw+CiAKLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KKwk8cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORAorCQlDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwKKwkJb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UKKwkJRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdAorCQlwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgogCiAKLTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgorCTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgogCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZQotICAgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KLSAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgiU3BlY2lmaWNhdGlvbiIpLjwvcD4KKwk8cD4KKwkJVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcworCQlvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlCisJCU1hbmFnZXIgKCZxdW90O1Byb3Zpc2lvbmluZyBUZWNobm9sb2d5JnF1b3Q7KSBmb3IgdGhlIHB1cnBvc2Ugb2YKKwkJYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCisJCW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcworCQljYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCisJCWluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0CisJCXBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+CisJCSgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS4KKwk8L3A+CiAKLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KKwk8cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvCisJCWluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcKKwkJdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZQorCQl0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcKKwkJVGVjaG5vbG9neSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZworCQlUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoCisJCXRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZQorCQlhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+CiAKLTxvbD4KLSAgICAgICA8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAotICAgICAgIHByb2R1Y3QuPC9saT4KLSAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQotICAgICAgIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAotICAgICAgIE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4KLSAgICAgICB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaAotICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLjwvbGk+Ci08L29sPgorCTxvbD4KKwkJPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgmcXVvdDtQcm92aXNpb25pbmcKKwkJCVByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nCisJCQlUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoJnF1b3Q7VGFyZ2V0IE1hY2hpbmUmcXVvdDspIHdpdGggdGhlIGludGVudAorCQkJb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuCisJCQlFY2xpcHNlLWJhc2VkIHByb2R1Y3QuPC9saT4KKwkJPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQorCQkJbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCisJCQlhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgorCQk8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIKKwkJCXRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUgKCZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCZxdW90OykgYW5kIHN1Y2gKKwkJCUluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKKwkJCU1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisJCQl0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5CisJCQl0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUKKwkJCUFncmVlbWVudC4gVXBvbiBzdWNoIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUKKwkJCXByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUuPC9saT4KKwk8L29sPgogCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KKwk8aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KIAotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KKwk8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoCisJCXlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQKKwkJdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4KKwkJQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLAorCQlyZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsCisJCWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KIAotPHA+PHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+Ci0KLQotPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisJPHA+CisJCTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mCisJCQlPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPgorCTwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc291cmNlLmZlYXR1cmUvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc291cmNlLmZlYXR1cmUvcG9tLnhtbAppbmRleCA2NDhjZTYyLi43YzgzMjQxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UuZmVhdHVyZS9wb20ueG1sCkBAIC01MCw3ICs1MCw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5qZ2l0LnR5Y2hvLnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjQtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZTwvZ3JvdXBJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggZWZjMzY0YS4uZmM3ZGZhNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTIsNCArMiw0IEBACiBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCiBCdW5kbGUtTmFtZTogSkdpdCBUYXJnZXQgUGxhdGZvcm0gQnVuZGxlCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnRhcmdldAotQnVuZGxlLVZlcnNpb246IDQuMTEuNC5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC41LnRhcmdldCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC41LnRhcmdldAppbmRleCAwYzFkNWJiLi5kZmI1YThmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuNS50YXJnZXQKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjUudGFyZ2V0CkBAIC0xLDcgKzEsNyBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CiA8P3BkZT8+CiA8IS0tIGdlbmVyYXRlZCB3aXRoIGh0dHBzOi8vZ2l0aHViLmNvbS9tYmFyYmVyby9mci5vYmVvLnJlbGVuZy50YXJnZXRwbGF0Zm9ybSAtLT4KLTx0YXJnZXQgbmFtZT0iamdpdC00LjUiIHNlcXVlbmNlTnVtYmVyPSIxNTM1MTc2MzQ3Ij4KKzx0YXJnZXQgbmFtZT0iamdpdC00LjUiIHNlcXVlbmNlTnVtYmVyPSIxNTM1MTc5MjU0Ij4KICAgPGxvY2F0aW9ucz4KICAgICA8bG9jYXRpb24gaW5jbHVkZU1vZGU9InNsaWNlciIgaW5jbHVkZUFsbFBsYXRmb3Jtcz0iZmFsc2UiIGluY2x1ZGVTb3VyY2U9InRydWUiIGluY2x1ZGVDb25maWd1cmVQaGFzZT0idHJ1ZSIgdHlwZT0iSW5zdGFsbGFibGVVbml0Ij4KICAgICAgIDx1bml0IGlkPSJvcmcuZWNsaXBzZS5qZXR0eS5jbGllbnQiIHZlcnNpb249IjkuNC44LnYyMDE3MTEyMSIvPgpAQCAtMzksNiArMzksNyBAQAogICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUubG9nNGouc291cmNlIiB2ZXJzaW9uPSIxLjIuMTUudjIwMTAxMjA3MDgxNSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5rb2hzdWtlLmFyZ3M0aiIgdmVyc2lvbj0iMi4zMy4wLnYyMDE2MDMyMy0yMjE4Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmtvaHN1a2UuYXJnczRqLnNvdXJjZSIgdmVyc2lvbj0iMi4zMy4wLnYyMDE2MDMyMy0yMjE4Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0IiB2ZXJzaW9uPSIxLjEuMC52MjAwOTA1MDEwNzEwMDAiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QuY29yZSIgdmVyc2lvbj0iMS4zLjAudjIwMTgwNDIwLTE1MTkiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QuY29yZS5zb3VyY2UiIHZlcnNpb249IjEuMy4wLnYyMDE4MDQyMC0xNTE5Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LmxpYnJhcnkiIHZlcnNpb249IjEuMy4wLnYyMDE4MDUyNC0yMjQ2Ii8+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuNi50YXJnZXQgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuNi50YXJnZXQKaW5kZXggZTA1YzQxMC4uZGJmZDY5NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjYudGFyZ2V0CisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC42LnRhcmdldApAQCAtMSw3ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgogPD9wZGU/PgogPCEtLSBnZW5lcmF0ZWQgd2l0aCBodHRwczovL2dpdGh1Yi5jb20vbWJhcmJlcm8vZnIub2Jlby5yZWxlbmcudGFyZ2V0cGxhdGZvcm0gLS0+Ci08dGFyZ2V0IG5hbWU9ImpnaXQtNC42IiBzZXF1ZW5jZU51bWJlcj0iMTUzNTE3NjMzNSI+Cis8dGFyZ2V0IG5hbWU9ImpnaXQtNC42IiBzZXF1ZW5jZU51bWJlcj0iMTUzNTE3OTI0MSI+CiAgIDxsb2NhdGlvbnM+CiAgICAgPGxvY2F0aW9uIGluY2x1ZGVNb2RlPSJzbGljZXIiIGluY2x1ZGVBbGxQbGF0Zm9ybXM9ImZhbHNlIiBpbmNsdWRlU291cmNlPSJ0cnVlIiBpbmNsdWRlQ29uZmlndXJlUGhhc2U9InRydWUiIHR5cGU9Ikluc3RhbGxhYmxlVW5pdCI+CiAgICAgICA8dW5pdCBpZD0ib3JnLmVjbGlwc2UuamV0dHkuY2xpZW50IiB2ZXJzaW9uPSI5LjQuOC52MjAxNzExMjEiLz4KQEAgLTM5LDYgKzM5LDcgQEAKICAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmxvZzRqLnNvdXJjZSIgdmVyc2lvbj0iMS4yLjE1LnYyMDEwMTIwNzA4MTUiLz4KICAgICAgIDx1bml0IGlkPSJvcmcua29oc3VrZS5hcmdzNGoiIHZlcnNpb249IjIuMzMuMC52MjAxNjAzMjMtMjIxOCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5rb2hzdWtlLmFyZ3M0ai5zb3VyY2UiIHZlcnNpb249IjIuMzMuMC52MjAxNjAzMjMtMjIxOCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdCIgdmVyc2lvbj0iMS4xLjAudjIwMDkwNTAxMDcxMDAwIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LmNvcmUiIHZlcnNpb249IjEuMy4wLnYyMDE4MDQyMC0xNTE5Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LmNvcmUuc291cmNlIiB2ZXJzaW9uPSIxLjMuMC52MjAxODA0MjAtMTUxOSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5saWJyYXJ5IiB2ZXJzaW9uPSIxLjMuMC52MjAxODA1MjQtMjI0NiIvPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjcudGFyZ2V0IGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjcudGFyZ2V0CmluZGV4IDIwYjBhMjkuLmJlNzcxOWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC43LnRhcmdldAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuNy50YXJnZXQKQEAgLTEsNyArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KIDw/cGRlPz4KIDwhLS0gZ2VuZXJhdGVkIHdpdGggaHR0cHM6Ly9naXRodWIuY29tL21iYXJiZXJvL2ZyLm9iZW8ucmVsZW5nLnRhcmdldHBsYXRmb3JtIC0tPgotPHRhcmdldCBuYW1lPSJqZ2l0LTQuNyIgc2VxdWVuY2VOdW1iZXI9IjE1MzUxNzYzMTQiPgorPHRhcmdldCBuYW1lPSJqZ2l0LTQuNyIgc2VxdWVuY2VOdW1iZXI9IjE1MzUxNzkyMjEiPgogICA8bG9jYXRpb25zPgogICAgIDxsb2NhdGlvbiBpbmNsdWRlTW9kZT0ic2xpY2VyIiBpbmNsdWRlQWxsUGxhdGZvcm1zPSJmYWxzZSIgaW5jbHVkZVNvdXJjZT0idHJ1ZSIgaW5jbHVkZUNvbmZpZ3VyZVBoYXNlPSJ0cnVlIiB0eXBlPSJJbnN0YWxsYWJsZVVuaXQiPgogICAgICAgPHVuaXQgaWQ9Im9yZy5lY2xpcHNlLmpldHR5LmNsaWVudCIgdmVyc2lvbj0iOS40LjgudjIwMTcxMTIxIi8+CkBAIC0zOSw2ICszOSw3IEBACiAgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5sb2c0ai5zb3VyY2UiIHZlcnNpb249IjEuMi4xNS52MjAxMDEyMDcwODE1Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmtvaHN1a2UuYXJnczRqIiB2ZXJzaW9uPSIyLjMzLjAudjIwMTYwMzIzLTIyMTgiLz4KICAgICAgIDx1bml0IGlkPSJvcmcua29oc3VrZS5hcmdzNGouc291cmNlIiB2ZXJzaW9uPSIyLjMzLjAudjIwMTYwMzIzLTIyMTgiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QiIHZlcnNpb249IjEuMS4wLnYyMDA5MDUwMTA3MTAwMCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5jb3JlIiB2ZXJzaW9uPSIxLjMuMC52MjAxODA0MjAtMTUxOSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5jb3JlLnNvdXJjZSIgdmVyc2lvbj0iMS4zLjAudjIwMTgwNDIwLTE1MTkiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QubGlicmFyeSIgdmVyc2lvbj0iMS4zLjAudjIwMTgwNTI0LTIyNDYiLz4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC44LnRhcmdldCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC44LnRhcmdldAppbmRleCBiODRmYzIwLi4zZGUxNzJiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuOC50YXJnZXQKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjgudGFyZ2V0CkBAIC0xLDcgKzEsNyBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CiA8P3BkZT8+CiA8IS0tIGdlbmVyYXRlZCB3aXRoIGh0dHBzOi8vZ2l0aHViLmNvbS9tYmFyYmVyby9mci5vYmVvLnJlbGVuZy50YXJnZXRwbGF0Zm9ybSAtLT4KLTx0YXJnZXQgbmFtZT0iamdpdC00LjgiIHNlcXVlbmNlTnVtYmVyPSIxNTM1MTc2MzAxIj4KKzx0YXJnZXQgbmFtZT0iamdpdC00LjgiIHNlcXVlbmNlTnVtYmVyPSIxNTM1MTc5MjA1Ij4KICAgPGxvY2F0aW9ucz4KICAgICA8bG9jYXRpb24gaW5jbHVkZU1vZGU9InNsaWNlciIgaW5jbHVkZUFsbFBsYXRmb3Jtcz0iZmFsc2UiIGluY2x1ZGVTb3VyY2U9InRydWUiIGluY2x1ZGVDb25maWd1cmVQaGFzZT0idHJ1ZSIgdHlwZT0iSW5zdGFsbGFibGVVbml0Ij4KICAgICAgIDx1bml0IGlkPSJvcmcuZWNsaXBzZS5qZXR0eS5jbGllbnQiIHZlcnNpb249IjkuNC44LnYyMDE3MTEyMSIvPgpAQCAtMzksNiArMzksNyBAQAogICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUubG9nNGouc291cmNlIiB2ZXJzaW9uPSIxLjIuMTUudjIwMTAxMjA3MDgxNSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5rb2hzdWtlLmFyZ3M0aiIgdmVyc2lvbj0iMi4zMy4wLnYyMDE2MDMyMy0yMjE4Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmtvaHN1a2UuYXJnczRqLnNvdXJjZSIgdmVyc2lvbj0iMi4zMy4wLnYyMDE2MDMyMy0yMjE4Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0IiB2ZXJzaW9uPSIxLjEuMC52MjAwOTA1MDEwNzEwMDAiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QuY29yZSIgdmVyc2lvbj0iMS4zLjAudjIwMTgwNDIwLTE1MTkiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QuY29yZS5zb3VyY2UiIHZlcnNpb249IjEuMy4wLnYyMDE4MDQyMC0xNTE5Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LmxpYnJhcnkiIHZlcnNpb249IjEuMy4wLnYyMDE4MDUyNC0yMjQ2Ii8+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9vcmJpdC9SMjAxODA2MDYxNDUxMjQtUGhvdG9uLnRwZCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L29yYml0L1IyMDE4MDYwNjE0NTEyNC1QaG90b24udHBkCmluZGV4IGY0ZWM1MGQuLmVjZWM0MWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L29yYml0L1IyMDE4MDYwNjE0NTEyNC1QaG90b24udHBkCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L29yYml0L1IyMDE4MDYwNjE0NTEyNC1QaG90b24udHBkCkBAIC0xOCw2ICsxOCw3IEBACiAJb3JnLmFwYWNoZS5sb2c0ai5zb3VyY2UgWzEuMi4xNS52MjAxMDEyMDcwODE1LDEuMi4xNS52MjAxMDEyMDcwODE1XQogCW9yZy5rb2hzdWtlLmFyZ3M0aiBbMi4zMy4wLnYyMDE2MDMyMy0yMjE4LDIuMzMuMC52MjAxNjAzMjMtMjIxOF0KIAlvcmcua29oc3VrZS5hcmdzNGouc291cmNlIFsyLjMzLjAudjIwMTYwMzIzLTIyMTgsMi4zMy4wLnYyMDE2MDMyMy0yMjE4XQorCW9yZy5oYW1jcmVzdCBbMS4xLjAudjIwMDkwNTAxMDcxMDAwLDEuMS4wLnYyMDA5MDUwMTA3MTAwMF0KIAlvcmcuaGFtY3Jlc3QuY29yZSBbMS4zLjAudjIwMTgwNDIwLTE1MTksMS4zLjAudjIwMTgwNDIwLTE1MTldCiAJb3JnLmhhbWNyZXN0LmNvcmUuc291cmNlIFsxLjMuMC52MjAxODA0MjAtMTUxOSwxLjMuMC52MjAxODA0MjAtMTUxOV0KIAlvcmcuaGFtY3Jlc3QubGlicmFyeSBbMS4zLjAudjIwMTgwNTI0LTIyNDYsMS4zLjAudjIwMTgwNTI0LTIyNDZdCkBAIC00NCw0ICs0NSw0IEBACiAJb3JnLnNsZjRqLmltcGwubG9nNGoxMi5zb3VyY2UgWzEuNy4yLnYyMDEzMTEwNS0yMjAwLDEuNy4yLnYyMDEzMTEwNS0yMjAwXQogCWNvbS5qY3JhZnQuanpsaWIgWzEuMS4xLnYyMDEyMDUxMDIzMDUsMS4xLjEudjIwMTIwNTEwMjMwNV0KIAljb20uamNyYWZ0Lmp6bGliLnNvdXJjZSBbMS4xLjEudjIwMTIwNTEwMjMwNSwxLjEuMS52MjAxMjA1MTAyMzA1XQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9wb20ueG1sCmluZGV4IDQ2YzE0YjQuLjNjNjBhODMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvcG9tLnhtbApAQCAtNDksNyArNDksNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+amdpdC50eWNoby5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS40LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9wb20ueG1sCmluZGV4IDYzYmJlNjIuLjNjYjIxYzEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvcG9tLnhtbApAQCAtNTMsNyArNTMsNyBAQAogCiAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgIDxhcnRpZmFjdElkPmpnaXQudHljaG8ucGFyZW50PC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj40LjExLjQtU05BUFNIT1Q8L3ZlcnNpb24+CisgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgogCiAgIDxuYW1lPkpHaXQgVHljaG8gUGFyZW50PC9uYW1lPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggNzIxMGQwYy4uMzk5MTBjZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDI4ICszLDI4IEBACiBCdW5kbGUtTmFtZTogJXBsdWdpbl9uYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QKLUJ1bmRsZS1WZXJzaW9uOiA0LjExLjQucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNS4wLjQucXVhbGlmaWVyCiBCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJfbmFtZQogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xLjgKLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZGlmZjt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGU7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSI0LjExLjQiLAotIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2U7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnBnbTt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucGdtLmludGVybmFsO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5wZ20ub3B0O3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW87dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKK0ltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5kaWZmO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iNS4wLjQiLAorIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5tZXJnZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnBnbTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5pbnRlcm5hbDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5vcHQ7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKICBvcmcuaGFtY3Jlc3QuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIsCiAgb3JnLmp1bml0O3ZlcnNpb249Ils0LjEyLDUuMC4wKSIsCiAgb3JnLmp1bml0LnJ1bGVzO3ZlcnNpb249Ils0LjEyLDUuMC4wKSIsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3BvbS54bWwKaW5kZXggN2JiZWFmMC4uMzBjMzJlZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvcG9tLnhtbApAQCAtNTAsNyArNTAsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS40LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0PC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ0xJUmVwb3NpdG9yeVRlc3RDYXNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9DTElSZXBvc2l0b3J5VGVzdENhc2UuamF2YQppbmRleCAwZWVhYmFiLi4wZDE4OTRiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9DTElSZXBvc2l0b3J5VGVzdENhc2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9DTElSZXBvc2l0b3J5VGVzdENhc2UuamF2YQpAQCAtMTIyLDE3ICsxMjIsMTcgQEAKIAkJcmV0dXJuIEpHaXRUZXN0VXRpbC53cml0ZUxpbmsoZGIsIGxpbmssIHRhcmdldCk7CiAJfQogCi0JcHJvdGVjdGVkIEZpbGUgd3JpdGVUcmFzaEZpbGUoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBkYXRhKQorCXByb3RlY3RlZCBGaWxlIHdyaXRlVHJhc2hGaWxlKFN0cmluZyBuYW1lLCBTdHJpbmcgZGF0YSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBKR2l0VGVzdFV0aWwud3JpdGVUcmFzaEZpbGUoZGIsIG5hbWUsIGRhdGEpOwogCX0KIAogCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgcmVhZChmaW5hbCBGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJvdGVjdGVkIFN0cmluZyByZWFkKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIEpHaXRUZXN0VXRpbC5yZWFkKGZpbGUpOwogCX0KIAotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZVRyYXNoRmlsZShmaW5hbCBTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgdm9pZCBkZWxldGVUcmFzaEZpbGUoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCUpHaXRUZXN0VXRpbC5kZWxldGVUcmFzaEZpbGUoZGIsIG5hbWUpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQ0xJR2l0Q29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQ0xJR2l0Q29tbWFuZC5qYXZhCmluZGV4IDY5ZWIxOTguLjQ0YWQ3OWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0NMSUdpdENvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9DTElHaXRDb21tYW5kLmphdmEKQEAgLTE1Nyw3ICsxNTcsNyBAQAogCX0KIAogCUBPdmVycmlkZQotCXZvaWQgaW5pdChmaW5hbCBUZXh0QnVpbHRpbiBjbWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJdm9pZCBpbml0KFRleHRCdWlsdGluIGNtZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJY21kLm91dHMgPSByZXN1bHQub3V0OwogCQljbWQuZXJycyA9IHJlc3VsdC5lcnI7CiAJCXN1cGVyLmluaXQoY21kKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL0FyY2hpdmVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9BcmNoaXZlVGVzdC5qYXZhCmluZGV4IGU1Yzg1ZWIuLmFmZWI1ZWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL0FyY2hpdmVUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wZ20vQXJjaGl2ZVRlc3QuamF2YQpAQCAtNDIsNyArNDIsNyBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQucGdtOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0QXJyYXlFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CkBAIC02MTIsNyArNjEyLDcgQEAKIAogCXByaXZhdGUgQnVmZmVyZWRSZWFkZXIgcmVhZEZyb21Qcm9jZXNzKFByb2Nlc3MgcHJvYykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXJldHVybiBuZXcgQnVmZmVyZWRSZWFkZXIoCi0JCQkJbmV3IElucHV0U3RyZWFtUmVhZGVyKHByb2MuZ2V0SW5wdXRTdHJlYW0oKSwgVVRGXzgpKTsKKwkJCQluZXcgSW5wdXRTdHJlYW1SZWFkZXIocHJvYy5nZXRJbnB1dFN0cmVhbSgpLCBDSEFSU0VUKSk7CiAJfQogCiAJcHJpdmF0ZSB2b2lkIGdyZXBGb3JFbnRyeShTdHJpbmcgbmFtZSwgU3RyaW5nIG1vZGUsIFN0cmluZy4uLiBjbWRsaW5lKQpAQCAtNzAwLDcgKzcwMCw3IEBACiAJCXJldHVybiBsLnRvQXJyYXkobmV3IFN0cmluZ1tsLnNpemUoKV0pOwogCX0KIAotCXByaXZhdGUgc3RhdGljIEZ1dHVyZTxPYmplY3Q+IHdyaXRlQXN5bmMoZmluYWwgT3V0cHV0U3RyZWFtIHN0cmVhbSwgZmluYWwgYnl0ZVtdIGRhdGEpIHsKKwlwcml2YXRlIHN0YXRpYyBGdXR1cmU8T2JqZWN0PiB3cml0ZUFzeW5jKE91dHB1dFN0cmVhbSBzdHJlYW0sIGJ5dGVbXSBkYXRhKSB7CiAJCUV4ZWN1dG9yU2VydmljZSBleGVjdXRvciA9IEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRFeGVjdXRvcigpOwogCiAJCXJldHVybiBleGVjdXRvci5zdWJtaXQobmV3IENhbGxhYmxlPE9iamVjdD4oKSB7CkBAIC03NTAsNyArNzUwLDcgQEAKIAkJCS8vIGZvdW5kIQogCQkJTGlzdDxTdHJpbmc+IGwgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAkJCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKLQkJCQkJbmV3IElucHV0U3RyZWFtUmVhZGVyKGluLCBVVEZfOCkpOworCQkJCQluZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4sIENIQVJTRVQpKTsKIAkJCVN0cmluZyBsaW5lOwogCQkJd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpCiAJCQkJbC5hZGQobGluZSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9GZXRjaFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL0ZldGNoVGVzdC5qYXZhCmluZGV4IDk2ODVkNDUuLmRkZTFhMzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL0ZldGNoVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL0ZldGNoVGVzdC5qYXZhCkBAIC05Miw2ICs5MiwxOSBAQAogCX0KIAogCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEZldGNoRm9yY2VVcGRhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nW10gcmVzdWx0ID0gZXhlY3V0ZSgKKwkJCQkiZ2l0IGZldGNoIHRlc3QgcmVmcy9oZWFkcy9tYXN0ZXI6cmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIiKTsKKwkJYXNzZXJ0RXF1YWxzKCIgKiBbbmV3IGJyYW5jaF0gICAgICBtYXN0ZXIgICAgIC0+IG9yaWdpbi9tYXN0ZXIiLAorCQkJCXJlc3VsdFsxXSk7CisJCWFzc2VydEVxdWFscygiICogW25ldyB0YWddICAgICAgICAgdGFnICAgICAgICAtPiB0YWciLCByZXN1bHRbMl0pOworCQlyZW1vdGVHaXQuY29tbWl0KCkuc2V0QW1lbmQodHJ1ZSkuc2V0TWVzc2FnZSgiYW1lbmRlZCIpLmNhbGwoKTsKKwkJcmVzdWx0ID0gZXhlY3V0ZSgKKwkJCQkiZ2l0IGZldGNoIC1mIHRlc3QgcmVmcy9oZWFkcy9tYXN0ZXI6cmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIiKTsKKwkJYXNzZXJ0RXF1YWxzKCIiLCByZXN1bHRbMF0pOworCX0KKworCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdEZldGNoTm9UYWdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCVN0cmluZ1tdIHJlc3VsdCA9IGV4ZWN1dGUoImdpdCBmZXRjaCAtLW5vLXRhZ3MgdGVzdCByZWZzL2hlYWRzL21hc3RlcjpyZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlciIpOwogCQlhc3NlcnRFcXVhbHMoIiAqIFtuZXcgYnJhbmNoXSAgICAgIG1hc3RlciAgICAgLT4gb3JpZ2luL21hc3RlciIsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Qcm94eUNvbmZpZ1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL1Byb3h5Q29uZmlnVGVzdC5qYXZhCmluZGV4IDA2ZTdhMWQuLjQwYTIyM2QgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL1Byb3h5Q29uZmlnVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL1Byb3h5Q29uZmlnVGVzdC5qYXZhCkBAIC00Nyw2ICs0Nyw3IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCkBAIC0yMDMsNyArMjA0LDcgQEAKIAkJCXdoaWxlICgobGVuZ3RoID0gaW5wdXRTdHJlYW0ucmVhZChidWZmZXIpKSAhPSAtMSkgewogCQkJCXJlc3VsdC53cml0ZShidWZmZXIsIDAsIGxlbmd0aCk7CiAJCQl9Ci0JCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCJVVEYtOCIpOworCQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZyhDb25zdGFudHMuQ0hBUkFDVEVSX0VOQ09ESU5HKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL1RhZ1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL1RhZ1Rlc3QuamF2YQppbmRleCAwMzM5MWEwLi5kMzhhNDFkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9UYWdUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wZ20vVGFnVGVzdC5qYXZhCkBAIC00MywxMCArNDMsMTEgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5wZ207CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuR2l0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNMSVJlcG9zaXRvcnlUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIApAQCAtNzUsMTMgKzc2LDkgQEAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RUYWdEZWxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZ2l0LnRhZygpLnNldE5hbWUoInRlc3QiKS5jYWxsKCk7Ci0KLQkJUmVmIHJlZiA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0VGFncygpLmdldCgidGVzdCIpOwotCQlhc3NlcnRFcXVhbHMoInJlZnMvdGFncy90ZXN0IiwgcmVmLmdldE5hbWUoKSk7Ci0KKwkJYXNzZXJ0Tm90TnVsbChnaXQuZ2V0UmVwb3NpdG9yeSgpLmV4YWN0UmVmKCJyZWZzL3RhZ3MvdGVzdCIpKTsKIAkJYXNzZXJ0RXF1YWxzKCIiLCBleGVjdXRlVW5jaGVja2VkKCJnaXQgdGFnIC1kIHRlc3QiKVswXSk7Ci0JCVJlZiBkZWxldGVkUmVmID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRUYWdzKCkuZ2V0KCJ0ZXN0Iik7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBkZWxldGVkUmVmKTsKKwkJYXNzZXJ0TnVsbChnaXQuZ2V0UmVwb3NpdG9yeSgpLmV4YWN0UmVmKCJyZWZzL3RhZ3MvdGVzdCIpKTsKIAl9CiAKIAlAVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vQlVJTEQgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9CVUlMRAppbmRleCAwNzkyMjY4Li5kZGM4NGJlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9CVUlMRAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9CVUlMRApAQCAtMjUsNiArMjUsMTIgQEAKICAgICBdLAogKQogCitqYXZhX2JpbmFyeSgKKyAgICBuYW1lID0gImpnaXQiLAorICAgIG1haW5fY2xhc3MgPSAib3JnLmVjbGlwc2UuamdpdC5wZ20uTWFpbiIsCisgICAgcnVudGltZV9kZXBzID0gWyI6cGdtIl0sCispCisKIGphdmFfaW1wb3J0KAogICAgIG5hbWUgPSAic2VydmljZXMiLAogICAgIGphcnMgPSBbIjpzZXJ2aWNlc19qYXIiXSwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggMWMzOTc0Mi4uZjhhYTA5NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsNyArMyw3IEBACiBCdW5kbGUtTmFtZTogJXBsdWdpbl9uYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQucGdtCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnBnbQotQnVuZGxlLVZlcnNpb246IDQuMTEuNC5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKIEJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlcl9uYW1lCiBCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCkBAIC0yOCw0OSArMjgsNDkgQEAKICBvcmcuZWNsaXBzZS5qZXR0eS51dGlsLmxvZzt2ZXJzaW9uPSJbOS40LjUsMTAuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamV0dHkudXRpbC5zZWN1cml0eTt2ZXJzaW9uPSJbOS40LjUsMTAuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamV0dHkudXRpbC50aHJlYWQ7dmVyc2lvbj0iWzkuNC41LDEwLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hd3R1aTt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYmxhbWU7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmRpZmY7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG87dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmtldGNoO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmlvO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGU7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdHJlZTt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMubGliO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLmZzO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnMzO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm5vdGVzO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZwbG90O3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHAuYXBhY2hlO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXI7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW87dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYXd0dWk7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ibGFtZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmRpZmY7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG87dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5rZXRjaDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZGZzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5pbzt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucGFjazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRyZWU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMubGliO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlcjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuZnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnMzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2U7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ub3Rlczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldnBsb3Q7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5maWx0ZXI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5hcGFjaGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAogIG9yZy5rb2hzdWtlLmFyZ3M0ajt2ZXJzaW9uPSJbMi4zMy4wLDMuMC4wKSIsCiAgb3JnLmtvaHN1a2UuYXJnczRqLnNwaTt2ZXJzaW9uPSJbMi4zMy4wLDMuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmNvbnNvbGU7dmVyc2lvbj0iNC4xMS40IjsKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmNvbnNvbGU7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwiLAotIG9yZy5lY2xpcHNlLmpnaXQucGdtO3ZlcnNpb249IjQuMTEuNCI7Cisgb3JnLmVjbGlwc2UuamdpdC5wZ207dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5vcHQsCkBAIC04MSwxMSArODEsMTEgQEAKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGssCiAgICBqYXZheC5zd2luZywKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0IiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5kZWJ1Zzt2ZXJzaW9uPSI0LjExLjQiOworIG9yZy5lY2xpcHNlLmpnaXQucGdtLmRlYnVnO3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbywKICAgIG9yZy5lY2xpcHNlLmpnaXQucGdtIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5pbnRlcm5hbDt2ZXJzaW9uPSI0LjExLjQiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3Qsb3JnLmVjbGlwc2UuamdpdC50ZXN0IiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5vcHQ7dmVyc2lvbj0iNC4xMS40IjsKKyBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5pbnRlcm5hbDt2ZXJzaW9uPSI1LjAuNCI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdCxvcmcuZWNsaXBzZS5qZ2l0LnRlc3QiLAorIG9yZy5lY2xpcHNlLmpnaXQucGdtLm9wdDt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQucmV2d2FsaywKICAgIG9yZy5rb2hzdWtlLmFyZ3M0ai5zcGksCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKaW5kZXggODI1ZDhjOS4uMWQ0NTc1ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgpAQCAtMyw1ICszLDUgQEAKIEJ1bmRsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnBnbSAtIFNvdXJjZXMKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQucGdtLnNvdXJjZQogQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcgLSBKR2l0Ci1CdW5kbGUtVmVyc2lvbjogNC4xMS40LnF1YWxpZmllcgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQucGdtO3ZlcnNpb249IjQuMTEuNC5xdWFsaWZpZXIiO3Jvb3RzPSIuIgorQnVuZGxlLVZlcnNpb246IDUuMC40LnF1YWxpZmllcgorRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQucGdtO3ZlcnNpb249IjUuMC40LnF1YWxpZmllciI7cm9vdHM9Ii4iCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vcG9tLnhtbAppbmRleCA5ZTg0MTA1Li5kYjY3NDVlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3BvbS54bWwKQEAgLTUwLDcgKzUwLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuNC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5wZ208L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9wZ20vaW50ZXJuYWwvQ0xJVGV4dC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvcGdtL2ludGVybmFsL0NMSVRleHQucHJvcGVydGllcwppbmRleCBjYjBlYTFiLi5lOTM3MDkzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9wZ20vaW50ZXJuYWwvQ0xJVGV4dC5wcm9wZXJ0aWVzCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9pbnRlcm5hbC9DTElUZXh0LnByb3BlcnRpZXMKQEAgLTM0Myw2ICszNDMsNyBAQAogdXNhZ2VfZm9yY2VDaGVja291dD13aGVuIHN3aXRjaGluZyBicmFuY2hlcywgcHJvY2VlZCBldmVuIGlmIHRoZSBpbmRleCBvciB0aGUgd29ya2luZyB0cmVlIGRpZmZlcnMgZnJvbSBIRUFECiB1c2FnZV9mb3JjZUNsZWFuPXJlcXVpcmVkIHRvIGRlbGV0ZSBmaWxlcyBvciBkaXJlY3RvcmllcwogdXNhZ2VfZm9yY2VDcmVhdGVCcmFuY2hFdmVuRXhpc3RzPWZvcmNlIGNyZWF0ZSBicmFuY2ggZXZlbiBleGlzdHMKK3VzYWdlX2ZvcmNlZEZldGNoPWZvcmNlIHJlZiB1cGRhdGUgZmV0Y2ggb3B0aW9uCiB1c2FnZV9mb3JjZVJlcGxhY2luZ0FuRXhpc3RpbmdUYWc9Zm9yY2UgcmVwbGFjaW5nIGFuIGV4aXN0aW5nIHRhZwogdXNhZ2VfZ2V0QW5kU2V0T3B0aW9ucz1HZXQgYW5kIHNldCByZXBvc2l0b3J5IG9yIGdsb2JhbCBvcHRpb25zCiB1c2FnZV9ncm91cHM9UmVzdHJpY3QgbWFuaWZlc3QgcHJvamVjdHMgdG8gb25lcyB3aXRoIHNwZWNpZmllZCBncm91cChzKSwgdXNlICItIiBmb3IgZXhjbHVkaW5nIFtkZWZhdWx0fGFsbHxHMSxHMixHM3xHNCwtRzUsLUc2XQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0Fic3RyYWN0RmV0Y2hDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQWJzdHJhY3RGZXRjaENvbW1hbmQuamF2YQppbmRleCBmMDc1NGIxLi45MjIzZTBmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQWJzdHJhY3RGZXRjaENvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQWJzdHJhY3RGZXRjaENvbW1hbmQuamF2YQpAQCAtNzQsMTAgKzc0LDEwIEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgaWYgYW55LgogCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dGZXRjaFJlc3VsdChmaW5hbCBGZXRjaFJlc3VsdCByKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCB2b2lkIHNob3dGZXRjaFJlc3VsdChGZXRjaFJlc3VsdCByKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0cnkgKE9iamVjdFJlYWRlciByZWFkZXIgPSBkYi5uZXdPYmplY3RSZWFkZXIoKSkgewogCQkJYm9vbGVhbiBzaG93blVSSSA9IGZhbHNlOwotCQkJZm9yIChmaW5hbCBUcmFja2luZ1JlZlVwZGF0ZSB1IDogci5nZXRUcmFja2luZ1JlZlVwZGF0ZXMoKSkgeworCQkJZm9yIChUcmFja2luZ1JlZlVwZGF0ZSB1IDogci5nZXRUcmFja2luZ1JlZlVwZGF0ZXMoKSkgewogCQkJCWlmICghdmVyYm9zZSAmJiB1LmdldFJlc3VsdCgpID09IFJlZlVwZGF0ZS5SZXN1bHQuTk9fQ0hBTkdFKQogCQkJCQljb250aW51ZTsKIApAQCAtMTgxLDcgKzE4MSw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBjaGFyIHNob3J0VHlwZU9mKGZpbmFsIFJlZlVwZGF0ZS5SZXN1bHQgcikgeworCXByaXZhdGUgc3RhdGljIGNoYXIgc2hvcnRUeXBlT2YoUmVmVXBkYXRlLlJlc3VsdCByKSB7CiAJCWlmIChyID09IFJlZlVwZGF0ZS5SZXN1bHQuTE9DS19GQUlMVVJFKQogCQkJcmV0dXJuICchJzsKIAkJaWYgKHIgPT0gUmVmVXBkYXRlLlJlc3VsdC5JT19GQUlMVVJFKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0FtYXpvblMzQ2xpZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQW1hem9uUzNDbGllbnQuamF2YQppbmRleCBjY2U4ODliLi5mNGY4ZDhmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQW1hem9uUzNDbGllbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQW1hem9uUzNDbGllbnQuamF2YQpAQCAtMTA1LDcgKzEwNSw3IEBACiAJCQl9CiAKIAkJfSBlbHNlIGlmICgibHMiLmVxdWFscyhvcCkgfHwgImxpc3QiLmVxdWFscyhvcCkpIHsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCWZvciAoZmluYWwgU3RyaW5nIGsgOiBzMy5saXN0KGJ1Y2tldCwga2V5KSkKKwkJCWZvciAoU3RyaW5nIGsgOiBzMy5saXN0KGJ1Y2tldCwga2V5KSkKIAkJCQlvdXR3LnByaW50bG4oayk7CiAKIAkJfSBlbHNlIGlmICgicm0iLmVxdWFscyhvcCkgfHwgImRlbGV0ZSIuZXF1YWxzKG9wKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9CcmFuY2guamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9CcmFuY2guamF2YQppbmRleCBlNjY4NWMyLi5hODgzNTRkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQnJhbmNoLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0JyYW5jaC5qYXZhCkBAIC0yOTIsNyArMjkyLDcgQEAKIAkJCQlhZGRSZWZzKHJlZnMsIENvbnN0YW50cy5SX1JFTU9URVMpOwogCiAJCQkJdHJ5IChPYmplY3RSZWFkZXIgcmVhZGVyID0gZGIubmV3T2JqZWN0UmVhZGVyKCkpIHsKLQkJCQkJZm9yIChmaW5hbCBFbnRyeTxTdHJpbmcsIFJlZj4gZSA6IHByaW50UmVmcy5lbnRyeVNldCgpKSB7CisJCQkJCWZvciAoRW50cnk8U3RyaW5nLCBSZWY+IGUgOiBwcmludFJlZnMuZW50cnlTZXQoKSkgewogCQkJCQkJZmluYWwgUmVmIHJlZiA9IGUuZ2V0VmFsdWUoKTsKIAkJCQkJCXByaW50SGVhZChyZWFkZXIsIGUuZ2V0S2V5KCksCiAJCQkJCQkJCWN1cnJlbnQuZXF1YWxzKHJlZi5nZXROYW1lKCkpLCByZWYpOwpAQCAtMzAyLDE1ICszMDIsMTUgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBhZGRSZWZzKGZpbmFsIENvbGxlY3Rpb248UmVmPiByZWZzLCBmaW5hbCBTdHJpbmcgcHJlZml4KSB7Ci0JCWZvciAoZmluYWwgUmVmIHJlZiA6IFJlZkNvbXBhcmF0b3Iuc29ydChyZWZzKSkgeworCXByaXZhdGUgdm9pZCBhZGRSZWZzKENvbGxlY3Rpb248UmVmPiByZWZzLCBTdHJpbmcgcHJlZml4KSB7CisJCWZvciAoUmVmIHJlZiA6IFJlZkNvbXBhcmF0b3Iuc29ydChyZWZzKSkgewogCQkJZmluYWwgU3RyaW5nIG5hbWUgPSByZWYuZ2V0TmFtZSgpOwogCQkJaWYgKG5hbWUuc3RhcnRzV2l0aChwcmVmaXgpKQogCQkJCWFkZFJlZihuYW1lLnN1YnN0cmluZyhuYW1lLmluZGV4T2YoJy8nLCA1KSArIDEpLCByZWYpOwogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGFkZFJlZihmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgUmVmIHJlZikgeworCXByaXZhdGUgdm9pZCBhZGRSZWYoU3RyaW5nIG5hbWUsIFJlZiByZWYpIHsKIAkJcHJpbnRSZWZzLnB1dChuYW1lLCByZWYpOwogCQltYXhOYW1lTGVuZ3RoID0gTWF0aC5tYXgobWF4TmFtZUxlbmd0aCwgbmFtZS5sZW5ndGgoKSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0NvbW1hbmRDYXRhbG9nLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQ29tbWFuZENhdGFsb2cuamF2YQppbmRleCA4MWFlZWY4Li41NzU0ZDdjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQ29tbWFuZENhdGFsb2cuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQ29tbWFuZENhdGFsb2cuamF2YQpAQCAtNDMsMTEgKzQzLDEwIEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5wZ207CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CiBpbXBvcnQgamF2YS5uZXQuVVJMOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC04OCw3ICs4Nyw3IEBACiAJICogICAgICAgICAgICB3YXMgZGVyaXZlZCBmcm9tIHRoZSBEYXNoTG93ZXJDYXNlRm9ybSBjbGFzcyBuYW1lLgogCSAqIEByZXR1cm4gdGhlIGNvbW1hbmQgaW5zdGFuY2U7IG51bGwgaWYgbm8gY29tbWFuZCBleGlzdHMgYnkgdGhhdCBuYW1lLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tbWFuZFJlZiBnZXQoZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlwdWJsaWMgc3RhdGljIENvbW1hbmRSZWYgZ2V0KFN0cmluZyBuYW1lKSB7CiAJCXJldHVybiBJTlNUQU5DRS5jb21tYW5kcy5nZXQobmFtZSk7CiAJfQogCkBAIC0xMDgsMTcgKzEwNywxNyBAQAogCSAqLwogCXB1YmxpYyBzdGF0aWMgQ29tbWFuZFJlZltdIGNvbW1vbigpIHsKIAkJZmluYWwgQXJyYXlMaXN0PENvbW1hbmRSZWY+IGNvbW1vbiA9IG5ldyBBcnJheUxpc3Q8PigpOwotCQlmb3IgKGZpbmFsIENvbW1hbmRSZWYgYyA6IElOU1RBTkNFLmNvbW1hbmRzLnZhbHVlcygpKQorCQlmb3IgKENvbW1hbmRSZWYgYyA6IElOU1RBTkNFLmNvbW1hbmRzLnZhbHVlcygpKQogCQkJaWYgKGMuaXNDb21tb24oKSkKIAkJCQljb21tb24uYWRkKGMpOwogCQlyZXR1cm4gdG9Tb3J0ZWRBcnJheShjb21tb24pOwogCX0KIAotCXByaXZhdGUgc3RhdGljIENvbW1hbmRSZWZbXSB0b1NvcnRlZEFycmF5KGZpbmFsIENvbGxlY3Rpb248Q29tbWFuZFJlZj4gYykgeworCXByaXZhdGUgc3RhdGljIENvbW1hbmRSZWZbXSB0b1NvcnRlZEFycmF5KENvbGxlY3Rpb248Q29tbWFuZFJlZj4gYykgewogCQlmaW5hbCBDb21tYW5kUmVmW10gciA9IGMudG9BcnJheShuZXcgQ29tbWFuZFJlZltjLnNpemUoKV0pOwogCQlBcnJheXMuc29ydChyLCBuZXcgQ29tcGFyYXRvcjxDb21tYW5kUmVmPigpIHsKIAkJCUBPdmVycmlkZQotCQkJcHVibGljIGludCBjb21wYXJlKGZpbmFsIENvbW1hbmRSZWYgbzEsIGZpbmFsIENvbW1hbmRSZWYgbzIpIHsKKwkJCXB1YmxpYyBpbnQgY29tcGFyZShDb21tYW5kUmVmIG8xLCBDb21tYW5kUmVmIG8yKSB7CiAJCQkJcmV0dXJuIG8xLmdldE5hbWUoKS5jb21wYXJlVG8obzIuZ2V0TmFtZSgpKTsKIAkJCX0KIAkJfSk7CkBAIC0xNDcsMzYgKzE0NiwyMCBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHNjYW4oZmluYWwgVVJMIGNVcmwpIHsKLQkJZmluYWwgQnVmZmVyZWRSZWFkZXIgY0luOwotCQl0cnkgewotCQkJZmluYWwgSW5wdXRTdHJlYW0gaW4gPSBjVXJsLm9wZW5TdHJlYW0oKTsKLQkJCWNJbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4sIFVURl84KSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGVycikgewotCQkJLy8gSWYgd2UgY2Fubm90IHJlYWQgZnJvbSB0aGUgc2VydmljZSBsaXN0LCBnbyB0byB0aGUgbmV4dC4KLQkJCS8vCi0JCQlyZXR1cm47Ci0JCX0KLQotCQl0cnkgeworCXByaXZhdGUgdm9pZCBzY2FuKFVSTCBjVXJsKSB7CisJCXRyeSAoQnVmZmVyZWRSZWFkZXIgY0luID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorCQkJCW5ldyBJbnB1dFN0cmVhbVJlYWRlcihjVXJsLm9wZW5TdHJlYW0oKSwgQ0hBUlNFVCkpKSB7CiAJCQlTdHJpbmcgbGluZTsKIAkJCXdoaWxlICgobGluZSA9IGNJbi5yZWFkTGluZSgpKSAhPSBudWxsKSB7CiAJCQkJaWYgKGxpbmUubGVuZ3RoKCkgPiAwICYmICFsaW5lLnN0YXJ0c1dpdGgoIiMiKSkgLy8kTk9OLU5MUy0xJAogCQkJCQlsb2FkKGxpbmUpOwogCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlcnIpIHsKLQkJCS8vIElmIHdlIGZhaWxlZCBkdXJpbmcgYSByZWFkLCBpZ25vcmUgdGhlIGVycm9yLgotCQkJLy8KLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJY0luLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gSWdub3JlIHRoZSBjbG9zZSBlcnJvcjsgd2UgYXJlIG9ubHkgcmVhZGluZy4KLQkJCX0KKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJLy8gSWdub3JlIGVycm9ycwogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGxvYWQoZmluYWwgU3RyaW5nIGNuKSB7CisJcHJpdmF0ZSB2b2lkIGxvYWQoU3RyaW5nIGNuKSB7CiAJCWZpbmFsIENsYXNzPD8gZXh0ZW5kcyBUZXh0QnVpbHRpbj4gY2xheno7CiAJCXRyeSB7CiAJCQljbGF6eiA9IENsYXNzLmZvck5hbWUoY24sIGZhbHNlLCBsZHIpLmFzU3ViY2xhc3MoVGV4dEJ1aWx0aW4uY2xhc3MpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0NvbW1hbmRSZWYuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Db21tYW5kUmVmLmphdmEKaW5kZXggMmM5YmMwZC4uMTc3M2RlNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0NvbW1hbmRSZWYuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQ29tbWFuZFJlZi5qYXZhCkBAIC02NiwyOSArNjYsMjkgQEAKIAogCWJvb2xlYW4gY29tbW9uOwogCi0JQ29tbWFuZFJlZihmaW5hbCBDbGFzczw/IGV4dGVuZHMgVGV4dEJ1aWx0aW4+IGNsYXp6KSB7CisJQ29tbWFuZFJlZihDbGFzczw/IGV4dGVuZHMgVGV4dEJ1aWx0aW4+IGNsYXp6KSB7CiAJCXRoaXMoY2xhenosIGd1ZXNzTmFtZShjbGF6eikpOwogCX0KIAotCUNvbW1hbmRSZWYoZmluYWwgQ2xhc3M8PyBleHRlbmRzIFRleHRCdWlsdGluPiBjbGF6eiwgZmluYWwgQ29tbWFuZCBjbWQpIHsKKwlDb21tYW5kUmVmKENsYXNzPD8gZXh0ZW5kcyBUZXh0QnVpbHRpbj4gY2xhenosIENvbW1hbmQgY21kKSB7CiAJCXRoaXMoY2xhenosIGNtZC5uYW1lKCkubGVuZ3RoKCkgPiAwID8gY21kLm5hbWUoKSA6IGd1ZXNzTmFtZShjbGF6eikpOwogCQl1c2FnZSA9IGNtZC51c2FnZSgpOwogCQljb21tb24gPSBjbWQuY29tbW9uKCk7CiAJfQogCi0JcHJpdmF0ZSBDb21tYW5kUmVmKGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBUZXh0QnVpbHRpbj4gY2xhenosIGZpbmFsIFN0cmluZyBjbikgeworCXByaXZhdGUgQ29tbWFuZFJlZihDbGFzczw/IGV4dGVuZHMgVGV4dEJ1aWx0aW4+IGNsYXp6LCBTdHJpbmcgY24pIHsKIAkJaW1wbCA9IGNsYXp6OwogCQluYW1lID0gY247CiAJCXVzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ3Vlc3NOYW1lKGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBUZXh0QnVpbHRpbj4gY2xhenopIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ3Vlc3NOYW1lKENsYXNzPD8gZXh0ZW5kcyBUZXh0QnVpbHRpbj4gY2xhenopIHsKIAkJZmluYWwgU3RyaW5nQnVpbGRlciBzID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJaWYgKGNsYXp6LmdldE5hbWUoKS5zdGFydHNXaXRoKCJvcmcuZWNsaXBzZS5qZ2l0LnBnbS5kZWJ1Zy4iKSkgLy8kTk9OLU5MUy0xJAogCQkJcy5hcHBlbmQoImRlYnVnLSIpOyAvLyROT04tTkxTLTEkCiAKIAkJYm9vbGVhbiBsYXN0V2FzRGFzaCA9IHRydWU7Ci0JCWZvciAoZmluYWwgY2hhciBjIDogY2xhenouZ2V0U2ltcGxlTmFtZSgpLnRvQ2hhckFycmF5KCkpIHsKKwkJZm9yIChjaGFyIGMgOiBjbGF6ei5nZXRTaW1wbGVOYW1lKCkudG9DaGFyQXJyYXkoKSkgewogCQkJaWYgKENoYXJhY3Rlci5pc1VwcGVyQ2FzZShjKSkgewogCQkJCWlmICghbGFzdFdhc0Rhc2gpCiAJCQkJCXMuYXBwZW5kKCctJyk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vRGFlbW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vRGFlbW9uLmphdmEKaW5kZXggZDBhZGE2Ny4uMzE5YjVlMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RhZW1vbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EYWVtb24uamF2YQpAQCAtMTQyLDcgKzE0Miw3IEBACiAJCQlwYWNrQ29uZmlnLnNldEV4ZWN1dG9yKEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2wodGhyZWFkcykpOwogCiAJCWZpbmFsIEZpbGVSZXNvbHZlcjxEYWVtb25DbGllbnQ+IHJlc29sdmVyID0gbmV3IEZpbGVSZXNvbHZlcjw+KCk7Ci0JCWZvciAoZmluYWwgRmlsZSBmIDogZGlyZWN0b3J5KSB7CisJCWZvciAoRmlsZSBmIDogZGlyZWN0b3J5KSB7CiAJCQlvdXR3LnByaW50bG4oTWVzc2FnZUZvcm1hdC5mb3JtYXQoQ0xJVGV4dC5nZXQoKS5leHBvcnRpbmcsIGYuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKIAkJCXJlc29sdmVyLmV4cG9ydERpcmVjdG9yeShmKTsKIAkJfQpAQCAtMTU3LDE0ICsxNTcsMTQgQEAKIAkJaWYgKDAgPD0gdGltZW91dCkKIAkJCWQuc2V0VGltZW91dCh0aW1lb3V0KTsKIAotCQlmb3IgKGZpbmFsIFN0cmluZyBuIDogZW5hYmxlKQorCQlmb3IgKFN0cmluZyBuIDogZW5hYmxlKQogCQkJc2VydmljZShkLCBuKS5zZXRFbmFibGVkKHRydWUpOwotCQlmb3IgKGZpbmFsIFN0cmluZyBuIDogZGlzYWJsZSkKKwkJZm9yIChTdHJpbmcgbiA6IGRpc2FibGUpCiAJCQlzZXJ2aWNlKGQsIG4pLnNldEVuYWJsZWQoZmFsc2UpOwogCi0JCWZvciAoZmluYWwgU3RyaW5nIG4gOiBjYW5PdmVycmlkZSkKKwkJZm9yIChTdHJpbmcgbiA6IGNhbk92ZXJyaWRlKQogCQkJc2VydmljZShkLCBuKS5zZXRPdmVycmlkYWJsZSh0cnVlKTsKLQkJZm9yIChmaW5hbCBTdHJpbmcgbiA6IGZvcmJpZE92ZXJyaWRlKQorCQlmb3IgKFN0cmluZyBuIDogZm9yYmlkT3ZlcnJpZGUpCiAJCQlzZXJ2aWNlKGQsIG4pLnNldE92ZXJyaWRhYmxlKGZhbHNlKTsKIAkJaWYgKGtldGNoU2VydmVyVHlwZSA9PSBLZXRjaFNlcnZlclR5cGUuTEVBREVSKSB7CiAJCQlzdGFydEtldGNoTGVhZGVyKGQpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RpZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RpZS5qYXZhCmluZGV4IDU5ZGU4MGMuLjRlYzVmMDQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EaWUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vRGllLmphdmEKQEAgLTYzLDcgKzYzLDcgQEAKIAkgKiBAcGFyYW0gd2h5CiAJICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBzaG93IHRvIHRoZSBlbmQtdXNlci4KIAkgKi8KLQlwdWJsaWMgRGllKGZpbmFsIFN0cmluZyB3aHkpIHsKKwlwdWJsaWMgRGllKFN0cmluZyB3aHkpIHsKIAkJc3VwZXIod2h5KTsKIAl9CiAKQEAgLTc1LDcgKzc1LDcgQEAKIAkgKiBAcGFyYW0gY2F1c2UKIAkgKiAgICAgICAgICAgIHdoeSB0aGUgY29tbWFuZCBoYXMgZmFpbGVkLgogCSAqLwotCXB1YmxpYyBEaWUoZmluYWwgU3RyaW5nIHdoeSwgZmluYWwgVGhyb3dhYmxlIGNhdXNlKSB7CisJcHVibGljIERpZShTdHJpbmcgd2h5LCBUaHJvd2FibGUgY2F1c2UpIHsKIAkJc3VwZXIod2h5LCBjYXVzZSk7CiAJfQogCkBAIC0xMDAsNyArMTAwLDcgQEAKIAkgKiAgICAgICAgICAgIGNhbiBiZSBudWxsCiAJICogQHNpbmNlIDQuMgogCSAqLwotCXB1YmxpYyBEaWUoYm9vbGVhbiBhYm9ydGVkLCBmaW5hbCBUaHJvd2FibGUgY2F1c2UpIHsKKwlwdWJsaWMgRGllKGJvb2xlYW4gYWJvcnRlZCwgVGhyb3dhYmxlIGNhdXNlKSB7CiAJCXN1cGVyKGNhdXNlICE9IG51bGwgPyBjYXVzZS5nZXRNZXNzYWdlKCkgOiBudWxsLCBjYXVzZSk7CiAJCXRoaXMuYWJvcnRlZCA9IGFib3J0ZWQ7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RpZmYuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EaWZmLmphdmEKaW5kZXggZWQ2ZjdiNC4uOTdlM2RmMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RpZmYuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vRGlmZi5qYXZhCkBAIC0xNzAsNyArMTcwLDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdChmaW5hbCBSZXBvc2l0b3J5IHJlcG9zaXRvcnksIGZpbmFsIFN0cmluZyBnaXREaXIpIHsKKwlwcm90ZWN0ZWQgdm9pZCBpbml0KFJlcG9zaXRvcnkgcmVwb3NpdG9yeSwgU3RyaW5nIGdpdERpcikgewogCQlzdXBlci5pbml0KHJlcG9zaXRvcnksIGdpdERpcik7CiAJCWRpZmZGbXQgPSBuZXcgRGlmZkZvcm1hdHRlcihuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0ob3V0cykpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EaWZmVHJlZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RpZmZUcmVlLmphdmEKaW5kZXggNTEwNDA2My4uNDJhYWJjMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RpZmZUcmVlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RpZmZUcmVlLmphdmEKQEAgLTc1LDkgKzc1LDkgQEAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHdhbGsgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgd2FsayA9IG5ldyBUcmVlV2FsayhkYikpIHsKIAkJCXdhbGsuc2V0UmVjdXJzaXZlKHJlY3Vyc2l2ZSk7Ci0JCQlmb3IgKGZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGkgOiB0cmVlcykKKwkJCWZvciAoQWJzdHJhY3RUcmVlSXRlcmF0b3IgaSA6IHRyZWVzKQogCQkJCXdhbGsuYWRkVHJlZShpKTsKIAkJCXdhbGsuc2V0RmlsdGVyKEFuZFRyZWVGaWx0ZXIuY3JlYXRlKFRyZWVGaWx0ZXIuQU5ZX0RJRkYsIHBhdGhGaWx0ZXIpKTsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0ZldGNoLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vRmV0Y2guamF2YQppbmRleCBiYzc2MzcyLi42MWZkNTIxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vRmV0Y2guamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vRmV0Y2guamF2YQpAQCAtMTAwLDYgKzEwMCw5IEBACiAJCXRhZ3MgPSBCb29sZWFuLkZBTFNFOwogCX0KIAorCUBPcHRpb24obmFtZSA9ICItLWZvcmNlIiwgdXNhZ2UgPSAidXNhZ2VfZm9yY2VkRmV0Y2giLCBhbGlhc2VzID0geyAiLWYiIH0pCisJcHJpdmF0ZSBCb29sZWFuIGZvcmNlOworCiAJcHJpdmF0ZSBGZXRjaFJlY3Vyc2VTdWJtb2R1bGVzTW9kZSByZWN1cnNlU3VibW9kdWxlczsKIAogCUBPcHRpb24obmFtZSA9ICItLXJlY3Vyc2Utc3VibW9kdWxlcyIsIHVzYWdlID0gInVzYWdlX3JlY3Vyc2VTdWJtb2R1bGVzIikKQEAgLTE1NSw2ICsxNTgsOSBAQAogCQkJaWYgKHF1aWV0ID09IG51bGwgfHwgIXF1aWV0LmJvb2xlYW5WYWx1ZSgpKQogCQkJCWZldGNoLnNldFByb2dyZXNzTW9uaXRvcihuZXcgVGV4dFByb2dyZXNzTW9uaXRvcihlcnJ3KSk7CiAJCQlmZXRjaC5zZXRSZWN1cnNlU3VibW9kdWxlcyhyZWN1cnNlU3VibW9kdWxlcykuc2V0Q2FsbGJhY2sodGhpcyk7CisJCQlpZiAoZm9yY2UgIT0gbnVsbCkgeworCQkJCWZldGNoLnNldEZvcmNlVXBkYXRlKGZvcmNlLmJvb2xlYW5WYWx1ZSgpKTsKKwkJCX0KIAogCQkJRmV0Y2hSZXN1bHQgcmVzdWx0ID0gZmV0Y2guY2FsbCgpOwogCQkJaWYgKHJlc3VsdC5nZXRUcmFja2luZ1JlZlVwZGF0ZXMoKS5pc0VtcHR5KCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9HbG9nLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vR2xvZy5qYXZhCmluZGV4IGEwODFiNzguLjJiNWFmNWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9HbG9nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0dsb2cuamF2YQpAQCAtNzUsNyArNzUsNyBAQAogCQlmcmFtZSA9IG5ldyBKRnJhbWUoKTsKIAkJZnJhbWUuYWRkV2luZG93TGlzdGVuZXIobmV3IFdpbmRvd0FkYXB0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoZmluYWwgV2luZG93RXZlbnQgZSkgeworCQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhXaW5kb3dFdmVudCBlKSB7CiAJCQkJZnJhbWUuZGlzcG9zZSgpOwogCQkJfQogCQl9KTsKQEAgLTExNiw3ICsxMTYsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzaG93KGZpbmFsIFJldkNvbW1pdCBjKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgdm9pZCBzaG93KFJldkNvbW1pdCBjKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTG9nLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTG9nLmphdmEKaW5kZXggNzU1NDJkNC4uYWQ5MmE3OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0xvZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Mb2cuamF2YQpAQCAtMTg2LDcgKzE4Niw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXQoZmluYWwgUmVwb3NpdG9yeSByZXBvc2l0b3J5LCBmaW5hbCBTdHJpbmcgZ2l0RGlyKSB7CisJcHJvdGVjdGVkIHZvaWQgaW5pdChSZXBvc2l0b3J5IHJlcG9zaXRvcnksIFN0cmluZyBnaXREaXIpIHsKIAkJc3VwZXIuaW5pdChyZXBvc2l0b3J5LCBnaXREaXIpOwogCQlkaWZmRm10ID0gbmV3IERpZmZGb3JtYXR0ZXIobmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG91dHMpKTsKIAl9CkBAIC0yNDEsNyArMjQxLDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2hvdyhmaW5hbCBSZXZDb21taXQgYykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJvdGVjdGVkIHZvaWQgc2hvdyhSZXZDb21taXQgYykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCW91dHcucHJpbnQoQ0xJVGV4dC5nZXQoKS5jb21taXRMYWJlbCk7CiAJCW91dHcucHJpbnQoIiAiKTsgLy8kTk9OLU5MUy0xJAogCQljLmdldElkKCkuY29weVRvKG91dGJ1ZmZlciwgb3V0dyk7CkBAIC0yNjYsNyArMjY2LDcgQEAKIAogCQlvdXR3LnByaW50bG4oKTsKIAkJZmluYWwgU3RyaW5nW10gbGluZXMgPSBjLmdldEZ1bGxNZXNzYWdlKCkuc3BsaXQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChmaW5hbCBTdHJpbmcgcyA6IGxpbmVzKSB7CisJCWZvciAoU3RyaW5nIHMgOiBsaW5lcykgewogCQkJb3V0dy5wcmludCgiICAgICIpOyAvLyROT04tTkxTLTEkCiAJCQlvdXR3LnByaW50KHMpOwogCQkJb3V0dy5wcmludGxuKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTHNSZW1vdGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Mc1JlbW90ZS5qYXZhCmluZGV4IDkwMTNmZjYuLjI3MTFjMTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Mc1JlbW90ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Mc1JlbW90ZS5qYXZhCkBAIC04Myw3ICs4Myw3IEBACiAJCQl9CiAJCX0pOwogCQlyZWZzLmFkZEFsbChjb21tYW5kLmNhbGwoKSk7Ci0JCWZvciAoZmluYWwgUmVmIHIgOiByZWZzKSB7CisJCWZvciAoUmVmIHIgOiByZWZzKSB7CiAJCQlzaG93KHIuZ2V0T2JqZWN0SWQoKSwgci5nZXROYW1lKCkpOwogCQkJaWYgKHIuZ2V0UGVlbGVkT2JqZWN0SWQoKSAhPSBudWxsKQogCQkJCXNob3coci5nZXRQZWVsZWRPYmplY3RJZCgpLCByLmdldE5hbWUoKSArICJee30iKTsgLy8kTk9OLU5MUy0xJApAQCAtOTYsNyArOTYsNyBAQAogCQlyZXR1cm4gZmFsc2U7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHNob3coZmluYWwgQW55T2JqZWN0SWQgaWQsIGZpbmFsIFN0cmluZyBuYW1lKQorCXByaXZhdGUgdm9pZCBzaG93KEFueU9iamVjdElkIGlkLCBTdHJpbmcgbmFtZSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCW91dHcucHJpbnQoaWQubmFtZSgpKTsKIAkJb3V0dy5wcmludCgnXHQnKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Mc1RyZWUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Mc1RyZWUuamF2YQppbmRleCBjNTdmOWYyLi4wMWZhN2VlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTHNUcmVlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0xzVHJlZS5qYXZhCkBAIC03Myw3ICs3Myw3IEBACiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJ5IChmaW5hbCBUcmVlV2FsayB3YWxrID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQl0cnkgKFRyZWVXYWxrIHdhbGsgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQl3YWxrLnJlc2V0KCk7IC8vIGRyb3AgdGhlIGZpcnN0IGVtcHR5IHRyZWUsIHdoaWNoIHdlIGRvIG5vdCBuZWVkIGhlcmUKIAkJCWlmIChwYXRocy5zaXplKCkgPiAwKQogCQkJCXdhbGsuc2V0RmlsdGVyKFBhdGhGaWx0ZXJHcm91cC5jcmVhdGVGcm9tU3RyaW5ncyhwYXRocykpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL01haW4uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9NYWluLmphdmEKaW5kZXggYTM3NmJjMC4uYWM1M2RlOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL01haW4uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTWFpbi5qYXZhCkBAIC00NCw3ICs0NCw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5wZ207CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtNzEsNiArNzEsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucGdtLmludGVybmFsLkNMSVRleHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5wZ20ub3B0LkNtZExpbmVQYXJzZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5wZ20ub3B0LlN1YmNvbW1hbmRIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlLldpbmRvd0NhY2hlQ29uZmlnOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lkh0dHBUcmFuc3BvcnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5hcGFjaGUuSHR0cENsaWVudENvbm5lY3Rpb25GYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5DYWNoZWRBdXRoZW50aWNhdG9yOwpAQCAtMTA1LDEwICsxMDYsMTkgQEAKIAogCXByaXZhdGUgRXhlY3V0b3JTZXJ2aWNlIGdjRXhlY3V0b3I7CiAKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUIgPSAxMDI0ICogMTAyNDsKKwogCS8qKgogCSAqIDxwPkNvbnN0cnVjdG9yIGZvciBNYWluLjwvcD4KIAkgKi8KIAlwdWJsaWMgTWFpbigpIHsKKwkJZmluYWwgV2luZG93Q2FjaGVDb25maWcgYyA9IG5ldyBXaW5kb3dDYWNoZUNvbmZpZygpOworCQljLnNldFBhY2tlZEdpdE1NQVAodHJ1ZSk7CisJCWMuc2V0UGFja2VkR2l0V2luZG93U2l6ZSg4ICogMTAyNCk7CisJCWMuc2V0UGFja2VkR2l0TGltaXQoMTAgKiBNQik7CisJCWMuc2V0RGVsdGFCYXNlQ2FjaGVMaW1pdCgxMCAqIE1CKTsKKwkJYy5zZXRTdHJlYW1GaWxlVGhyZXNob2xkKDUwICogTUIpOworCQljLmluc3RhbGwoKTsKIAkJSHR0cFRyYW5zcG9ydC5zZXRDb25uZWN0aW9uRmFjdG9yeShuZXcgSHR0cENsaWVudENvbm5lY3Rpb25GYWN0b3J5KCkpOwogCQlCdWlsdGluTEZTLnJlZ2lzdGVyKCk7CiAJCWdjRXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IobmV3IFRocmVhZEZhY3RvcnkoKSB7CkBAIC0xMzEsNyArMTQxLDcgQEAKIAkgKiAgICAgICAgICAgIGFyZ3VtZW50cy4KIAkgKiBAdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihmaW5hbCBTdHJpbmdbXSBhcmd2KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd2KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJLy8gbWFrZSBzdXJlIGJ1aWx0LWluIGZpbHRlcnMgYXJlIHJlZ2lzdGVyZWQKIAkJQnVpbHRpbkxGUy5yZWdpc3RlcigpOwogCkBAIC0xNTUsNyArMTY1LDcgQEAKIAkgKiAgICAgICAgICAgIGFyZ3VtZW50cy4KIAkgKiBAdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBydW4oZmluYWwgU3RyaW5nW10gYXJndikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJvdGVjdGVkIHZvaWQgcnVuKFN0cmluZ1tdIGFyZ3YpIHRocm93cyBFeGNlcHRpb24gewogCQl3cml0ZXIgPSBjcmVhdGVFcnJvcldyaXRlcigpOwogCQl0cnkgewogCQkJaWYgKCFpbnN0YWxsQ29uc29sZSgpKSB7CkBAIC0yMTcsMTAgKzIyNywxMCBAQAogCX0KIAogCVByaW50V3JpdGVyIGNyZWF0ZUVycm9yV3JpdGVyKCkgewotCQlyZXR1cm4gbmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoU3lzdGVtLmVyciwgVVRGXzgpKTsKKwkJcmV0dXJuIG5ldyBQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKFN5c3RlbS5lcnIsIENIQVJTRVQpKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgZXhlY3V0ZShmaW5hbCBTdHJpbmdbXSBhcmd2KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgZXhlY3V0ZShTdHJpbmdbXSBhcmd2KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgQ21kTGluZVBhcnNlciBjbHAgPSBuZXcgU3ViY29tbWFuZExpbmVQYXJzZXIodGhpcyk7CiAKIAkJdHJ5IHsKQEAgLTI0NiwxMiArMjU2LDEyIEBACiAJCQkJd3JpdGVyLnByaW50bG4oQ0xJVGV4dC5nZXQoKS5tb3N0Q29tbW9ubHlVc2VkQ29tbWFuZHNBcmUpOwogCQkJCWZpbmFsIENvbW1hbmRSZWZbXSBjb21tb24gPSBDb21tYW5kQ2F0YWxvZy5jb21tb24oKTsKIAkJCQlpbnQgd2lkdGggPSAwOwotCQkJCWZvciAoZmluYWwgQ29tbWFuZFJlZiBjIDogY29tbW9uKSB7CisJCQkJZm9yIChDb21tYW5kUmVmIGMgOiBjb21tb24pIHsKIAkJCQkJd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgYy5nZXROYW1lKCkubGVuZ3RoKCkpOwogCQkJCX0KIAkJCQl3aWR0aCArPSAyOwogCi0JCQkJZm9yIChmaW5hbCBDb21tYW5kUmVmIGMgOiBjb21tb24pIHsKKwkJCQlmb3IgKENvbW1hbmRSZWYgYyA6IGNvbW1vbikgewogCQkJCQl3cml0ZXIucHJpbnQoJyAnKTsKIAkJCQkJd3JpdGVyLnByaW50KGMuZ2V0TmFtZSgpKTsKIAkJCQkJZm9yIChpbnQgaSA9IGMuZ2V0TmFtZSgpLmxlbmd0aCgpOyBpIDwgd2lkdGg7IGkrKykgewpAQCAtMjg2LDcgKzI5Niw3IEBACiAJCX0KIAl9CiAKLQl2b2lkIGluaXQoZmluYWwgVGV4dEJ1aWx0aW4gY21kKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXZvaWQgaW5pdChUZXh0QnVpbHRpbiBjbWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmIChjbWQucmVxdWlyZXNSZXBvc2l0b3J5KCkpIHsKIAkJCWNtZC5pbml0KG9wZW5HaXREaXIoZ2l0ZGlyKSwgbnVsbCk7CiAJCX0gZWxzZSB7CkBAIC0zNTAsNyArMzYwLDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgaW5zdGFsbChmaW5hbCBTdHJpbmcgbmFtZSkKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGluc3RhbGwoU3RyaW5nIG5hbWUpCiAJCQl0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKIAkJCU5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CiAJCXRyeSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTWVyZ2VCYXNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTWVyZ2VCYXNlLmphdmEKaW5kZXggNjJhODhhZS4uNjg0MmQ4ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL01lcmdlQmFzZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9NZXJnZUJhc2UuamF2YQpAQCAtNjgsNyArNjgsNyBAQAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZvciAoZmluYWwgUmV2Q29tbWl0IGMgOiBjb21taXRzKQorCQlmb3IgKFJldkNvbW1pdCBjIDogY29tbWl0cykKIAkJCWFyZ1dhbGsubWFya1N0YXJ0KGMpOwogCQlhcmdXYWxrLnNldFJldkZpbHRlcihSZXZGaWx0ZXIuTUVSR0VfQkFTRSk7CiAJCWludCBtYXggPSBhbGwgPyBJbnRlZ2VyLk1BWF9WQUxVRSA6IDE7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUHVzaC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1B1c2guamF2YQppbmRleCAzMDlkY2EyLi5iZThhZDM3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUHVzaC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9QdXNoLmphdmEKQEAgLTE0OSw3ICsxNDksNyBAQAogCQlib29sZWFuIGV2ZXJ5dGhpbmdVcFRvRGF0ZSA9IHRydWU7CiAKIAkJLy8gYXQgZmlyc3QsIHByaW50IHVwLXRvLWRhdGUgb25lcy4uLgotCQlmb3IgKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSBycnUgOiByZXN1bHQuZ2V0UmVtb3RlVXBkYXRlcygpKSB7CisJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHJydSA6IHJlc3VsdC5nZXRSZW1vdGVVcGRhdGVzKCkpIHsKIAkJCWlmIChycnUuZ2V0U3RhdHVzKCkgPT0gU3RhdHVzLlVQX1RPX0RBVEUpIHsKIAkJCQlpZiAodmVyYm9zZSkKIAkJCQkJcHJpbnRSZWZVcGRhdGVSZXN1bHQocmVhZGVyLCB1cmksIHJlc3VsdCwgcnJ1KTsKQEAgLTE1NywxMyArMTU3LDEzIEBACiAJCQkJZXZlcnl0aGluZ1VwVG9EYXRlID0gZmFsc2U7CiAJCX0KIAotCQlmb3IgKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSBycnUgOiByZXN1bHQuZ2V0UmVtb3RlVXBkYXRlcygpKSB7CisJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHJydSA6IHJlc3VsdC5nZXRSZW1vdGVVcGRhdGVzKCkpIHsKIAkJCS8vIC4uLnRoZW4gc3VjY2Vzc2Z1bCB1cGRhdGVzLi4uCiAJCQlpZiAocnJ1LmdldFN0YXR1cygpID09IFN0YXR1cy5PSykKIAkJCQlwcmludFJlZlVwZGF0ZVJlc3VsdChyZWFkZXIsIHVyaSwgcmVzdWx0LCBycnUpOwogCQl9CiAKLQkJZm9yIChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgcnJ1IDogcmVzdWx0LmdldFJlbW90ZVVwZGF0ZXMoKSkgeworCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSBycnUgOiByZXN1bHQuZ2V0UmVtb3RlVXBkYXRlcygpKSB7CiAJCQkvLyAuLi5maW5hbGx5LCBvdGhlcnMgKHByb2JsZW1hdGljKQogCQkJaWYgKHJydS5nZXRTdGF0dXMoKSAhPSBTdGF0dXMuT0sKIAkJCQkJJiYgcnJ1LmdldFN0YXR1cygpICE9IFN0YXR1cy5VUF9UT19EQVRFKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1JlbW90ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1JlbW90ZS5qYXZhCmluZGV4IDk0OGNiYzUuLjMzMDhlMTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZW1vdGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUmVtb3RlLmphdmEKQEAgLTE0Niw3ICsxNDYsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwcmludFVzYWdlKGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBDbWRMaW5lUGFyc2VyIGNscCkKKwlwdWJsaWMgdm9pZCBwcmludFVzYWdlKFN0cmluZyBtZXNzYWdlLCBDbWRMaW5lUGFyc2VyIGNscCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWVycncucHJpbnRsbihtZXNzYWdlKTsKIAkJZXJydy5wcmludGxuKCJqZ2l0IHJlbW90ZSBbLS12ZXJib3NlICgtdildIFstLWhlbHAgKC1oKV0iKTsgLy8kTk9OLU5MUy0xJApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1Jldkxpc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZXZMaXN0LmphdmEKaW5kZXggOGM4OGE1Yy4uMTAxZmJiMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1Jldkxpc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUmV2TGlzdC5qYXZhCkBAIC01Myw3ICs1Myw3IEBACiBjbGFzcyBSZXZMaXN0IGV4dGVuZHMgUmV2V2Fsa1RleHRCdWlsdGluIHsKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNob3coZmluYWwgUmV2Q29tbWl0IGMpIHRocm93cyBFeGNlcHRpb24geworCXByb3RlY3RlZCB2b2lkIHNob3coUmV2Q29tbWl0IGMpIHRocm93cyBFeGNlcHRpb24gewogCQlpZiAoYy5oYXMoUmV2RmxhZy5VTklOVEVSRVNUSU5HKSkKIAkJCW91dHcucHJpbnQoJy0nKTsKIAkJYy5nZXRJZCgpLmNvcHlUbyhvdXRidWZmZXIsIG91dHcpOwpAQCAtNjcsNyArNjcsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzaG93KGZpbmFsIE9iamVjdFdhbGsgb3csIGZpbmFsIFJldk9iamVjdCBvYmopCisJcHJvdGVjdGVkIHZvaWQgc2hvdyhPYmplY3RXYWxrIG93LCBSZXZPYmplY3Qgb2JqKQogCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWlmIChvYmouaGFzKFJldkZsYWcuVU5JTlRFUkVTVElORykpCiAJCQlvdXR3LnByaW50KCctJyk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUmV2UGFyc2UuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZXZQYXJzZS5qYXZhCmluZGV4IDIxYWRmNzMuLmFjMDhjZDYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZXZQYXJzZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZXZQYXJzZS5qYXZhCkBAIC00NSwxMSArNDUsOCBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQucGdtOwogCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZkRhdGFiYXNlLkFMTDsKLQogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZjsKQEAgLTc0LDggKzcxLDcgQEAKIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJaWYgKGFsbCkgewotCQkJTWFwPFN0cmluZywgUmVmPiBhbGxSZWZzID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKEFMTCk7Ci0JCQlmb3IgKGZpbmFsIFJlZiByIDogYWxsUmVmcy52YWx1ZXMoKSkgeworCQkJZm9yIChSZWYgciA6IGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpKSB7CiAJCQkJT2JqZWN0SWQgb2JqZWN0SWQgPSByLmdldE9iamVjdElkKCk7CiAJCQkJLy8gZ2V0UmVmcyBza2lwcyBkYW5nbGluZyBzeW1yZWZzLCBzbyBvYmplY3RJZCBzaG91bGQgbmV2ZXIgYmUKIAkJCQkvLyBudWxsLgpAQCAtOTEsNyArODcsNyBAQAogCQkJCQkJQ0xJVGV4dC5mb3JtYXQoQ0xJVGV4dC5nZXQoKS5uZWVkU2luZ2xlUmV2aXNpb24pKTsKIAkJCX0KIAotCQkJZm9yIChmaW5hbCBPYmplY3RJZCBvIDogY29tbWl0cykgeworCQkJZm9yIChPYmplY3RJZCBvIDogY29tbWl0cykgewogCQkJCW91dHcucHJpbnRsbihvLm5hbWUoKSk7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZXZXYWxrVGV4dEJ1aWx0aW4uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZXZXYWxrVGV4dEJ1aWx0aW4uamF2YQppbmRleCAzZmM5MTAxLi4xNWFiZWFjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUmV2V2Fsa1RleHRCdWlsdGluLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1JldldhbGtUZXh0QnVpbHRpbi5qYXZhCkBAIC00NywxNCArNDcsMTIgQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYuRGlmZkNvbmZpZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5JbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmRGF0YWJhc2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5wZ20uaW50ZXJuYWwuQ0xJVGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5vcHQuUGF0aFRyZWVGaWx0ZXJIYW5kbGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5Gb2xsb3dGaWx0ZXI7CkBAIC05Myw3ICs5MSw3IEBACiAKIAlwcml2YXRlIGZpbmFsIEVudW1TZXQ8UmV2U29ydD4gc29ydGluZyA9IEVudW1TZXQubm9uZU9mKFJldlNvcnQuY2xhc3MpOwogCi0JcHJpdmF0ZSB2b2lkIGVuYWJsZVJldlNvcnQoZmluYWwgUmV2U29ydCB0eXBlLCBmaW5hbCBib29sZWFuIG9uKSB7CisJcHJpdmF0ZSB2b2lkIGVuYWJsZVJldlNvcnQoUmV2U29ydCB0eXBlLCBib29sZWFuIG9uKSB7CiAJCWlmIChvbikKIAkJCXNvcnRpbmcuYWRkKHR5cGUpOwogCQllbHNlCkBAIC0xMDEsMjIgKzk5LDIyIEBACiAJfQogCiAJQE9wdGlvbihuYW1lID0gIi0tZGF0ZS1vcmRlciIpCi0Jdm9pZCBlbmFibGVEYXRlT3JkZXIoZmluYWwgYm9vbGVhbiBvbikgeworCXZvaWQgZW5hYmxlRGF0ZU9yZGVyKGJvb2xlYW4gb24pIHsKIAkJZW5hYmxlUmV2U29ydChSZXZTb3J0LkNPTU1JVF9USU1FX0RFU0MsIG9uKTsKIAl9CiAKIAlAT3B0aW9uKG5hbWUgPSAiLS10b3BvLW9yZGVyIikKLQl2b2lkIGVuYWJsZVRvcG9PcmRlcihmaW5hbCBib29sZWFuIG9uKSB7CisJdm9pZCBlbmFibGVUb3BvT3JkZXIoYm9vbGVhbiBvbikgewogCQllbmFibGVSZXZTb3J0KFJldlNvcnQuVE9QTywgb24pOwogCX0KIAogCUBPcHRpb24obmFtZSA9ICItLXJldmVyc2UiKQotCXZvaWQgZW5hYmxlUmV2ZXJzZShmaW5hbCBib29sZWFuIG9uKSB7CisJdm9pZCBlbmFibGVSZXZlcnNlKGJvb2xlYW4gb24pIHsKIAkJZW5hYmxlUmV2U29ydChSZXZTb3J0LlJFVkVSU0UsIG9uKTsKIAl9CiAKIAlAT3B0aW9uKG5hbWUgPSAiLS1ib3VuZGFyeSIpCi0Jdm9pZCBlbmFibGVCb3VuZGFyeShmaW5hbCBib29sZWFuIG9uKSB7CisJdm9pZCBlbmFibGVCb3VuZGFyeShib29sZWFuIG9uKSB7CiAJCWVuYWJsZVJldlNvcnQoUmV2U29ydC5CT1VOREFSWSwgb24pOwogCX0KIApAQCAtMTMyLDE3ICsxMzAsMTcgQEAKIAlwcml2YXRlIGZpbmFsIExpc3Q8UmV2RmlsdGVyPiByZXZMaW1pdGVyID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKIAlAT3B0aW9uKG5hbWUgPSAiLS1hdXRob3IiKQotCXZvaWQgYWRkQXV0aG9yUmV2RmlsdGVyKGZpbmFsIFN0cmluZyB3aG8pIHsKKwl2b2lkIGFkZEF1dGhvclJldkZpbHRlcihTdHJpbmcgd2hvKSB7CiAJCXJldkxpbWl0ZXIuYWRkKEF1dGhvclJldkZpbHRlci5jcmVhdGUod2hvKSk7CiAJfQogCiAJQE9wdGlvbihuYW1lID0gIi0tY29tbWl0dGVyIikKLQl2b2lkIGFkZENvbW1pdHRlclJldkZpbHRlcihmaW5hbCBTdHJpbmcgd2hvKSB7CisJdm9pZCBhZGRDb21taXR0ZXJSZXZGaWx0ZXIoU3RyaW5nIHdobykgewogCQlyZXZMaW1pdGVyLmFkZChDb21taXR0ZXJSZXZGaWx0ZXIuY3JlYXRlKHdobykpOwogCX0KIAogCUBPcHRpb24obmFtZSA9ICItLWdyZXAiKQotCXZvaWQgYWRkQ01lc3NhZ2VSZXZGaWx0ZXIoZmluYWwgU3RyaW5nIG1zZykgeworCXZvaWQgYWRkQ01lc3NhZ2VSZXZGaWx0ZXIoU3RyaW5nIG1zZykgewogCQlyZXZMaW1pdGVyLmFkZChNZXNzYWdlUmV2RmlsdGVyLmNyZWF0ZShtc2cpKTsKIAl9CiAKQEAgLTE1Myw3ICsxNTEsNyBAQAogCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewogCQl3YWxrID0gY3JlYXRlV2FsaygpOwotCQlmb3IgKGZpbmFsIFJldlNvcnQgcyA6IHNvcnRpbmcpCisJCWZvciAoUmV2U29ydCBzIDogc29ydGluZykKIAkJCXdhbGsuc29ydChzLCB0cnVlKTsKIAogCQlpZiAocGF0aEZpbHRlciA9PSBUcmVlRmlsdGVyLkFMTCkgewpAQCAtMTcxLDkgKzE2OSw3IEBACiAJCQl3YWxrLnNldFJldkZpbHRlcihBbmRSZXZGaWx0ZXIuY3JlYXRlKHJldkxpbWl0ZXIpKTsKIAogCQlpZiAoYWxsKSB7Ci0JCQlNYXA8U3RyaW5nLCBSZWY+IHJlZnMgPQotCQkJCWRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhSZWZEYXRhYmFzZS5BTEwpOwotCQkJZm9yIChSZWYgYSA6IHJlZnMudmFsdWVzKCkpIHsKKwkJCWZvciAoUmVmIGEgOiBkYi5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoKSkgewogCQkJCU9iamVjdElkIG9pZCA9IGEuZ2V0UGVlbGVkT2JqZWN0SWQoKTsKIAkJCQlpZiAob2lkID09IG51bGwpCiAJCQkJCW9pZCA9IGEuZ2V0T2JqZWN0SWQoKTsKQEAgLTE5MSw3ICsxODcsNyBAQAogCQkJCXRocm93IGRpZShNZXNzYWdlRm9ybWF0LmZvcm1hdChDTElUZXh0LmdldCgpLmNhbm5vdFJlc29sdmUsIENvbnN0YW50cy5IRUFEKSk7CiAJCQljb21taXRzLmFkZCh3YWxrLnBhcnNlQ29tbWl0KGhlYWQpKTsKIAkJfQotCQlmb3IgKGZpbmFsIFJldkNvbW1pdCBjIDogY29tbWl0cykgeworCQlmb3IgKFJldkNvbW1pdCBjIDogY29tbWl0cykgewogCQkJZmluYWwgUmV2Q29tbWl0IHJlYWwgPSBhcmdXYWxrID09IHdhbGsgPyBjIDogd2Fsay5wYXJzZUNvbW1pdChjKTsKIAkJCWlmIChjLmhhcyhSZXZGbGFnLlVOSU5URVJFU1RJTkcpKQogCQkJCXdhbGsubWFya1VuaW50ZXJlc3RpbmcocmVhbCk7CkBAIC0yMzcsNyArMjMzLDcgQEAKIAkgKi8KIAlwcm90ZWN0ZWQgaW50IHdhbGtMb29wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWludCBuID0gMDsKLQkJZm9yIChmaW5hbCBSZXZDb21taXQgYyA6IHdhbGspIHsKKwkJZm9yIChSZXZDb21taXQgYyA6IHdhbGspIHsKIAkJCWlmICgrK24gPiBtYXhDb3VudCAmJiBtYXhDb3VudCA+PSAwKQogCQkJCWJyZWFrOwogCQkJc2hvdyhjKTsKQEAgLTI2NCw3ICsyNjAsNyBAQAogCSAqICAgICAgICAgICAgVGhlIGN1cnJlbnQge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXR9CiAJICogQHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCiAJICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2hvdyhmaW5hbCBSZXZDb21taXQgYykgdGhyb3dzIEV4Y2VwdGlvbjsKKwlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzaG93KFJldkNvbW1pdCBjKSB0aHJvd3MgRXhjZXB0aW9uOwogCiAJLyoqCiAJICogIlNob3ciIHRoZSBjdXJyZW50IFJldkNvbW1pdCB3aGVuIGNhbGxlZCBmcm9tIHRoZSBtYWluIHByb2Nlc3NpbmcgbG9vcC4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9TaG93LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vU2hvdy5qYXZhCmluZGV4IGRlMDQwNDUuLjg5YTE1ZmUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9TaG93LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1Nob3cuamF2YQpAQCAtMTY3LDcgKzE2Nyw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXQoZmluYWwgUmVwb3NpdG9yeSByZXBvc2l0b3J5LCBmaW5hbCBTdHJpbmcgZ2l0RGlyKSB7CisJcHJvdGVjdGVkIHZvaWQgaW5pdChSZXBvc2l0b3J5IHJlcG9zaXRvcnksIFN0cmluZyBnaXREaXIpIHsKIAkJc3VwZXIuaW5pdChyZXBvc2l0b3J5LCBnaXREaXIpOwogCQlkaWZmRm10ID0gbmV3IERpZmZGb3JtYXR0ZXIobmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG91dHMpKTsKIAl9CkBAIC0yNDgsNyArMjQ4LDcgQEAKIAogCQlvdXR3LnByaW50bG4oKTsKIAkJZmluYWwgU3RyaW5nW10gbGluZXMgPSB0YWcuZ2V0RnVsbE1lc3NhZ2UoKS5zcGxpdCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGZpbmFsIFN0cmluZyBzIDogbGluZXMpIHsKKwkJZm9yIChTdHJpbmcgcyA6IGxpbmVzKSB7CiAJCQlvdXR3LnByaW50KCIgICAgIik7IC8vJE5PTi1OTFMtMSQKIAkJCW91dHcucHJpbnQocyk7CiAJCQlvdXR3LnByaW50bG4oKTsKQEAgLTI1OSw3ICsyNTksNyBAQAogCiAJcHJpdmF0ZSB2b2lkIHNob3coUmV2VHJlZSBvYmopIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHdhbGsgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgd2FsayA9IG5ldyBUcmVlV2FsayhkYikpIHsKIAkJCXdhbGsucmVzZXQoKTsKIAkJCXdhbGsuYWRkVHJlZShvYmopOwogCkBAIC0yNzMsNyArMjczLDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBzaG93KFJldldhbGsgcncsIGZpbmFsIFJldkNvbW1pdCBjKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgc2hvdyhSZXZXYWxrIHJ3LCBSZXZDb21taXQgYykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNoYXJbXSBvdXRidWZmZXIgPSBuZXcgY2hhcltDb25zdGFudHMuT0JKRUNUX0lEX0xFTkdUSCAqIDJdOwogCiAJCW91dHcucHJpbnQoQ0xJVGV4dC5nZXQoKS5jb21taXRMYWJlbCk7CkBAIC0yOTIsNyArMjkyLDcgQEAKIAogCQlvdXR3LnByaW50bG4oKTsKIAkJZmluYWwgU3RyaW5nW10gbGluZXMgPSBjLmdldEZ1bGxNZXNzYWdlKCkuc3BsaXQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChmaW5hbCBTdHJpbmcgcyA6IGxpbmVzKSB7CisJCWZvciAoU3RyaW5nIHMgOiBsaW5lcykgewogCQkJb3V0dy5wcmludCgiICAgICIpOyAvLyROT04tTkxTLTEkCiAJCQlvdXR3LnByaW50KHMpOwogCQkJb3V0dy5wcmludGxuKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vU2hvd1JlZi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1Nob3dSZWYuamF2YQppbmRleCA3YjU5ZDQzLi42MzE4YTYzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vU2hvd1JlZi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9TaG93UmVmLmphdmEKQEAgLTQ1LDIzICs0NSwxOSBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQucGdtOwogCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZkRhdGFiYXNlLkFMTDsKLQogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQW55T2JqZWN0SWQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZkNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlJlZk1hcDsKIAogQENvbW1hbmQodXNhZ2UgPSAidXNhZ2VfU2hvd1JlZiIpCiBjbGFzcyBTaG93UmVmIGV4dGVuZHMgVGV4dEJ1aWx0aW4gewogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZvciAoZmluYWwgUmVmIHIgOiBnZXRTb3J0ZWRSZWZzKCkpIHsKKwkJZm9yIChSZWYgciA6IGdldFNvcnRlZFJlZnMoKSkgewogCQkJc2hvdyhyLmdldE9iamVjdElkKCksIHIuZ2V0TmFtZSgpKTsKIAkJCWlmIChyLmdldFBlZWxlZE9iamVjdElkKCkgIT0gbnVsbCkKIAkJCQlzaG93KHIuZ2V0UGVlbGVkT2JqZWN0SWQoKSwgci5nZXROYW1lKCkgKyAiXnt9Iik7IC8vJE5PTi1OTFMtMSQKQEAgLTY5LDE0ICs2NSwxMyBAQAogCX0KIAogCXByaXZhdGUgSXRlcmFibGU8UmVmPiBnZXRTb3J0ZWRSZWZzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU1hcDxTdHJpbmcsIFJlZj4gYWxsID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKEFMTCk7Ci0JCWlmIChhbGwgaW5zdGFuY2VvZiBSZWZNYXAKLQkJCQl8fCAoYWxsIGluc3RhbmNlb2YgU29ydGVkTWFwICYmICgoU29ydGVkTWFwKSBhbGwpLmNvbXBhcmF0b3IoKSA9PSBudWxsKSkKLQkJCXJldHVybiBhbGwudmFsdWVzKCk7Ci0JCXJldHVybiBSZWZDb21wYXJhdG9yLnNvcnQoYWxsLnZhbHVlcygpKTsKKwkJTGlzdDxSZWY+IGFsbCA9IGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpOworCQkvLyBUT0RPKGpybikgY2hlY2sgaWYgd2UgY2FuIHJlaW50cm9kdWNlIGZhc3QtcGF0aCBieSBlLmcuIGltcGxlbWVudGluZworCQkvLyBTb3J0ZWRMaXN0CisJCXJldHVybiBSZWZDb21wYXJhdG9yLnNvcnQoYWxsKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgc2hvdyhmaW5hbCBBbnlPYmplY3RJZCBpZCwgZmluYWwgU3RyaW5nIG5hbWUpCisJcHJpdmF0ZSB2b2lkIHNob3coQW55T2JqZWN0SWQgaWQsIFN0cmluZyBuYW1lKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJb3V0dy5wcmludChpZC5uYW1lKCkpOwogCQlvdXR3LnByaW50KCdcdCcpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1RleHRCdWlsdGluLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vVGV4dEJ1aWx0aW4uamF2YQppbmRleCBiYzM3NTVkLi43ZTViNTQ1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vVGV4dEJ1aWx0aW4uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vVGV4dEJ1aWx0aW4uamF2YQpAQCAtMTI5LDcgKzEyOSw3IEBACiAJLyoqIFJldldhbGsgdXNlZCBkdXJpbmcgY29tbWFuZCBsaW5lIHBhcnNpbmcsIGlmIGl0IHdhcyByZXF1aXJlZC4gKi8KIAlwcm90ZWN0ZWQgUmV2V2FsayBhcmdXYWxrOwogCi0JZmluYWwgdm9pZCBzZXRDb21tYW5kTmFtZShmaW5hbCBTdHJpbmcgbmFtZSkgeworCWZpbmFsIHZvaWQgc2V0Q29tbWFuZE5hbWUoU3RyaW5nIG5hbWUpIHsKIAkJY29tbWFuZE5hbWUgPSBuYW1lOwogCX0KIApAQCAtMTc2LDcgKzE3Niw3IEBACiAJICogICAgICAgICAgICB2YWx1ZSBvZiB0aGUge0Bjb2RlIC0tZ2l0LWRpcn0gY29tbWFuZCBsaW5lIG9wdGlvbiwgaWYKIAkgKiAgICAgICAgICAgIHtAY29kZSByZXBvc2l0b3J5fSBpcyBudWxsLgogCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoZmluYWwgUmVwb3NpdG9yeSByZXBvc2l0b3J5LCBmaW5hbCBTdHJpbmcgZ2l0RGlyKSB7CisJcHJvdGVjdGVkIHZvaWQgaW5pdChSZXBvc2l0b3J5IHJlcG9zaXRvcnksIFN0cmluZyBnaXREaXIpIHsKIAkJdHJ5IHsKIAkJCWZpbmFsIFN0cmluZyBvdXRwdXRFbmNvZGluZyA9IHJlcG9zaXRvcnkgIT0gbnVsbCA/IHJlcG9zaXRvcnkKIAkJCQkJLmdldENvbmZpZygpLmdldFN0cmluZygiaTE4biIsIG51bGwsICJsb2dPdXRwdXRFbmNvZGluZyIpIDogbnVsbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCkBAIC0yMzksNyArMjM5LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBhcmd1bWVudHMgc3VwcGxpZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgaWYgYW55LgogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqLwotCXByb3RlY3RlZCB2b2lkIHBhcnNlQXJndW1lbnRzKGZpbmFsIFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJvdGVjdGVkIHZvaWQgcGFyc2VBcmd1bWVudHMoU3RyaW5nW10gYXJncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgQ21kTGluZVBhcnNlciBjbHAgPSBuZXcgQ21kTGluZVBhcnNlcih0aGlzKTsKIAkJaGVscCA9IGNvbnRhaW5zSGVscChhcmdzKTsKIAkJdHJ5IHsKQEAgLTI2Nyw3ICsyNjcsNyBAQAogCSAqICAgICAgICAgICAgYSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5wZ20ub3B0LkNtZExpbmVQYXJzZXJ9IG9iamVjdC4KIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgdm9pZCBwcmludFVzYWdlQW5kRXhpdChmaW5hbCBDbWRMaW5lUGFyc2VyIGNscCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBwcmludFVzYWdlQW5kRXhpdChDbWRMaW5lUGFyc2VyIGNscCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcHJpbnRVc2FnZUFuZEV4aXQoIiIsIGNscCk7IC8vJE5PTi1OTFMtMSQKIAl9CiAKQEAgLTI4MCw3ICsyODAsNyBAQAogCSAqICAgICAgICAgICAgYSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5wZ20ub3B0LkNtZExpbmVQYXJzZXJ9IG9iamVjdC4KIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgdm9pZCBwcmludFVzYWdlQW5kRXhpdChmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgQ21kTGluZVBhcnNlciBjbHApIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgcHJpbnRVc2FnZUFuZEV4aXQoU3RyaW5nIG1lc3NhZ2UsIENtZExpbmVQYXJzZXIgY2xwKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlwcmludFVzYWdlKG1lc3NhZ2UsIGNscCk7CiAJCXRocm93IGRpZSh0cnVlKTsKIAl9CkBAIC0yOTUsNyArMjk1LDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiBAc2luY2UgNC4yCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbnRVc2FnZShmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgQ21kTGluZVBhcnNlciBjbHApCisJcHJvdGVjdGVkIHZvaWQgcHJpbnRVc2FnZShTdHJpbmcgbWVzc2FnZSwgQ21kTGluZVBhcnNlciBjbHApCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQllcnJ3LnByaW50bG4obWVzc2FnZSk7CiAJCWVycncucHJpbnQoImpnaXQgIik7IC8vJE5PTi1OTFMtMSQKQEAgLTM2MSw3ICszNjEsNyBAQAogCQlyZXR1cm4gZGI7CiAJfQogCi0JT2JqZWN0SWQgcmVzb2x2ZShmaW5hbCBTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlPYmplY3RJZCByZXNvbHZlKFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBPYmplY3RJZCByID0gZGIucmVzb2x2ZShzKTsKIAkJaWYgKHIgPT0gbnVsbCkKIAkJCXRocm93IGRpZShNZXNzYWdlRm9ybWF0LmZvcm1hdChDTElUZXh0LmdldCgpLm5vdEFSZXZpc2lvbiwgcykpOwpAQCAtMzc1LDcgKzM3NSw3IEBACiAJICogICAgICAgICAgICB0ZXh0dWFsIGV4cGxhbmF0aW9uCiAJICogQHJldHVybiBhIHJ1bnRpbWUgZXhjZXB0aW9uIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gdGhyb3cKIAkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIERpZSBkaWUoZmluYWwgU3RyaW5nIHdoeSkgeworCXByb3RlY3RlZCBzdGF0aWMgRGllIGRpZShTdHJpbmcgd2h5KSB7CiAJCXJldHVybiBuZXcgRGllKHdoeSk7CiAJfQogCkBAIC0zODgsNyArMzg4LDcgQEAKIAkgKiAgICAgICAgICAgIHdoeSB0aGUgY29tbWFuZCBoYXMgZmFpbGVkLgogCSAqIEByZXR1cm4gYSBydW50aW1lIGV4Y2VwdGlvbiB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIHRocm93CiAJICovCi0JcHJvdGVjdGVkIHN0YXRpYyBEaWUgZGllKGZpbmFsIFN0cmluZyB3aHksIGZpbmFsIFRocm93YWJsZSBjYXVzZSkgeworCXByb3RlY3RlZCBzdGF0aWMgRGllIGRpZShTdHJpbmcgd2h5LCBUaHJvd2FibGUgY2F1c2UpIHsKIAkJcmV0dXJuIG5ldyBEaWUod2h5LCBjYXVzZSk7CiAJfQogCkBAIC00MTYsNyArNDE2LDcgQEAKIAkgKiBAcmV0dXJuIGEgcnVudGltZSBleGNlcHRpb24gdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byB0aHJvdwogCSAqIEBzaW5jZSA0LjIKIAkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIERpZSBkaWUoYm9vbGVhbiBhYm9ydGVkLCBmaW5hbCBUaHJvd2FibGUgY2F1c2UpIHsKKwlwcm90ZWN0ZWQgc3RhdGljIERpZSBkaWUoYm9vbGVhbiBhYm9ydGVkLCBUaHJvd2FibGUgY2F1c2UpIHsKIAkJcmV0dXJuIG5ldyBEaWUoYWJvcnRlZCwgY2F1c2UpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1ZlcnNpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9WZXJzaW9uLmphdmEKaW5kZXggNWVmYzAzYi4uNThhY2M1YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1ZlcnNpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vVmVyc2lvbi5qYXZhCkBAIC05NiwxNCArOTYsOSBAQAogCX0KIAogCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRCdW5kbGVWZXJzaW9uKFVSTCB1cmwpIHsKLQkJdHJ5IHsKLQkJCUlucHV0U3RyZWFtIGlzID0gdXJsLm9wZW5TdHJlYW0oKTsKLQkJCXRyeSB7Ci0JCQkJTWFuaWZlc3QgbWFuaWZlc3QgPSBuZXcgTWFuaWZlc3QoaXMpOwotCQkJCXJldHVybiBtYW5pZmVzdC5nZXRNYWluQXR0cmlidXRlcygpLmdldFZhbHVlKCJCdW5kbGUtVmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGZpbmFsbHkgewotCQkJCWlzLmNsb3NlKCk7Ci0JCQl9CisJCXRyeSAoSW5wdXRTdHJlYW0gaXMgPSB1cmwub3BlblN0cmVhbSgpKSB7CisJCQlNYW5pZmVzdCBtYW5pZmVzdCA9IG5ldyBNYW5pZmVzdChpcyk7CisJCQlyZXR1cm4gbWFuaWZlc3QuZ2V0TWFpbkF0dHJpYnV0ZXMoKS5nZXRWYWx1ZSgiQnVuZGxlLVZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAJCQkvLyBkbyBub3RoaW5nIC0gd2lsbCByZXR1cm4gbnVsbAogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvQmVuY2htYXJrUmVmdGFibGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9CZW5jaG1hcmtSZWZ0YWJsZS5qYXZhCmluZGV4IDI0OGVhYWMuLjU3NWExMjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9CZW5jaG1hcmtSZWZ0YWJsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9CZW5jaG1hcmtSZWZ0YWJsZS5qYXZhCkBAIC00Myw3ICs0Myw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5wZ20uZGVidWc7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkhFQUQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5NQVNURVI7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5SX0hFQURTOwpAQCAtMTU0LDcgKzE1NCw3IEBACiAJCQl0aHJvd3MgSU9FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CiAJCVJlZkxpc3QuQnVpbGRlcjxSZWY+IGxpc3QgPSBuZXcgUmVmTGlzdC5CdWlsZGVyPD4oKTsKIAkJdHJ5IChCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoCi0JCQkJbmV3IEZpbGVJbnB1dFN0cmVhbShsc1JlbW90ZVBhdGgpLCBVVEZfOCkpKSB7CisJCQkJbmV3IEZpbGVJbnB1dFN0cmVhbShsc1JlbW90ZVBhdGgpLCBDSEFSU0VUKSkpIHsKIAkJCVJlZiBsYXN0ID0gbnVsbDsKIAkJCVN0cmluZyBsaW5lOwogCQkJd2hpbGUgKChsaW5lID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL01ha2VDYWNoZVRyZWUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9NYWtlQ2FjaGVUcmVlLmphdmEKaW5kZXggMTI3ZTU0MS4uMmExMzI2ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL01ha2VDYWNoZVRyZWUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvTWFrZUNhY2hlVHJlZS5qYXZhCkBAIC02NSw3ICs2NSw3IEBACiAJCXNob3codHJlZSk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHNob3coZmluYWwgRGlyQ2FjaGVUcmVlIHRyZWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIHNob3coRGlyQ2FjaGVUcmVlIHRyZWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCW91dHcucHJpbnRsbihNZXNzYWdlRm9ybWF0LmZvcm1hdChDTElUZXh0LmdldCgpLmNhY2hlVHJlZVBhdGhJbmZvLAogCQkJCXRyZWUuZ2V0UGF0aFN0cmluZygpLCB2YWx1ZU9mKHRyZWUuZ2V0RW50cnlTcGFuKCkpLAogCQkJCXZhbHVlT2YodHJlZS5nZXRDaGlsZENvdW50KCkpKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvUmVidWlsZENvbW1pdEdyYXBoLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvUmVidWlsZENvbW1pdEdyYXBoLmphdmEKaW5kZXggMmU0MWVlYy4uMmQxNmZlZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1JlYnVpbGRDb21taXRHcmFwaC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9SZWJ1aWxkQ29tbWl0R3JhcGguamF2YQpAQCAtNDMsOCArNDMsNiBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQucGdtLmRlYnVnOwogCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZkRhdGFiYXNlLkFMTDsKLQogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwpAQCAtMTE3LDcgKzExNSw3IEBACiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKCFyZWFsbHkgJiYgIWRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhBTEwpLmlzRW1wdHkoKSkgeworCQlpZiAoIXJlYWxseSAmJiBkYi5nZXRSZWZEYXRhYmFzZSgpLmhhc1JlZnMoKSkgewogCQkJRmlsZSBkaXJlY3RvcnkgPSBkYi5nZXREaXJlY3RvcnkoKTsKIAkJCVN0cmluZyBhYnNvbHV0ZVBhdGggPSBkaXJlY3RvcnkgPT0gbnVsbCA/ICJudWxsIiAvLyROT04tTkxTLTEkCiAJCQkJCTogZGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpOwpAQCAtMjI0LDcgKzIyMiw3IEBACiAKIAkJT2JqZWN0SWQgbmV3SWQ7CiAKLQkJVG9SZXdyaXRlKGZpbmFsIE9iamVjdElkIG8sIGZpbmFsIGxvbmcgdCwgZmluYWwgT2JqZWN0SWRbXSBwKSB7CisJCVRvUmV3cml0ZShPYmplY3RJZCBvLCBsb25nIHQsIE9iamVjdElkW10gcCkgewogCQkJb2xkSWQgPSBvOwogCQkJY29tbWl0VGltZSA9IHQ7CiAJCQlvbGRQYXJlbnRzID0gcDsKQEAgLTI0Nyw4ICsyNDUsNyBAQAogCiAJcHJpdmF0ZSB2b2lkIGRlbGV0ZUFsbFJlZnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgUmV2V2FsayBydyA9IG5ldyBSZXZXYWxrKGRiKTsKLQkJTWFwPFN0cmluZywgUmVmPiByZWZzID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKEFMTCk7Ci0JCWZvciAoZmluYWwgUmVmIHIgOiByZWZzLnZhbHVlcygpKSB7CisJCWZvciAoUmVmIHIgOiBkYi5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoKSkgewogCQkJaWYgKENvbnN0YW50cy5IRUFELmVxdWFscyhyLmdldE5hbWUoKSkpCiAJCQkJY29udGludWU7CiAJCQlmaW5hbCBSZWZVcGRhdGUgdSA9IGRiLnVwZGF0ZVJlZihyLmdldE5hbWUoKSk7CkBAIC0yNjEsNyArMjU4LDcgQEAKIAkJZmluYWwgTWFwPFN0cmluZywgUmVmPiByZWZzID0gY29tcHV0ZU5ld1JlZnMoKTsKIAkJbmV3IFJlZldyaXRlcihyZWZzLnZhbHVlcygpKSB7CiAJCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHdyaXRlRmlsZShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgYnl0ZVtdIGNvbnRlbnQpCisJCQlwcm90ZWN0ZWQgdm9pZCB3cml0ZUZpbGUoU3RyaW5nIG5hbWUsIGJ5dGVbXSBjb250ZW50KQogCQkJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCWZpbmFsIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRiLmdldERpcmVjdG9yeSgpLCBuYW1lKTsKIAkJCQlmaW5hbCBMb2NrRmlsZSBsY2sgPSBuZXcgTG9ja0ZpbGUoZmlsZSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvUmVidWlsZFJlZlRyZWUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9SZWJ1aWxkUmVmVHJlZS5qYXZhCmluZGV4IDMxNzI0ODMuLjA2MzYwMGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9SZWJ1aWxkUmVmVHJlZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9SZWJ1aWxkUmVmVHJlZS5qYXZhCkBAIC0xNTQsMTQgKzE1NCwxNCBAQAogCQkJCQloZWFkKSk7CiAJCX0KIAotCQlmb3IgKFJlZiByIDogcmVmZGIuZ2V0UmVmcyhSZWZEYXRhYmFzZS5BTEwpLnZhbHVlcygpKSB7CisJCWZvciAoUmVmIHIgOiByZWZkYi5nZXRSZWZzKCkpIHsKIAkJCWlmIChyLmdldE5hbWUoKS5lcXVhbHModHhuQ29tbWl0dGVkKSB8fCByLmdldE5hbWUoKS5lcXVhbHMoSEVBRCkKIAkJCQkJfHwgci5nZXROYW1lKCkuc3RhcnRzV2l0aCh0eG5OYW1lc3BhY2UpKSB7CiAJCQkJY29udGludWU7CiAJCQl9CiAJCQljbWRzLmFkZChuZXcgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRyZWUuQ29tbWFuZCgKIAkJCQkJbnVsbCwKLQkJCQkJZGIucGVlbChyKSkpOworCQkJCQlkYi5nZXRSZWZEYXRhYmFzZSgpLnBlZWwocikpKTsKIAkJfQogCQl0cmVlLmFwcGx5KGNtZHMpOwogCQlyZXR1cm4gdHJlZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9TaG93Q2FjaGVUcmVlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvU2hvd0NhY2hlVHJlZS5qYXZhCmluZGV4IDIwZmE0YTMuLjZiOTdlMDggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9TaG93Q2FjaGVUcmVlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1Nob3dDYWNoZVRyZWUuamF2YQpAQCAtNjcsNyArNjcsNyBAQAogCQlzaG93KHRyZWUpOwogCX0KIAotCXByaXZhdGUgdm9pZCBzaG93KGZpbmFsIERpckNhY2hlVHJlZSB0cmVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgdm9pZCBzaG93KERpckNhY2hlVHJlZSB0cmVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlvdXR3LnByaW50bG4oTWVzc2FnZUZvcm1hdC5mb3JtYXQoQ0xJVGV4dC5nZXQoKS5jYWNoZVRyZWVQYXRoSW5mbywKIAkJCQl0cmVlLmdldFBhdGhTdHJpbmcoKSwgdmFsdWVPZih0cmVlLmdldEVudHJ5U3BhbigpKSwKIAkJCQl2YWx1ZU9mKHRyZWUuZ2V0Q2hpbGRDb3VudCgpKSkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1Nob3dDb21tYW5kcy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1Nob3dDb21tYW5kcy5qYXZhCmluZGV4IGE5NjBlYzYuLmFmNTZkNjUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9TaG93Q29tbWFuZHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvU2hvd0NvbW1hbmRzLmphdmEKQEAgLTY1LDExICs2NSwxMSBAQAogCQlmaW5hbCBDb21tYW5kUmVmW10gbGlzdCA9IENvbW1hbmRDYXRhbG9nLmFsbCgpOwogCiAJCWludCB3aWR0aCA9IDA7Ci0JCWZvciAoZmluYWwgQ29tbWFuZFJlZiBjIDogbGlzdCkKKwkJZm9yIChDb21tYW5kUmVmIGMgOiBsaXN0KQogCQkJd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgYy5nZXROYW1lKCkubGVuZ3RoKCkpOwogCQl3aWR0aCArPSAyOwogCi0JCWZvciAoZmluYWwgQ29tbWFuZFJlZiBjIDogbGlzdCkgeworCQlmb3IgKENvbW1hbmRSZWYgYyA6IGxpc3QpIHsKIAkJCWVycncucHJpbnQoYy5pc0NvbW1vbigpID8gJyonIDogJyAnKTsKIAkJCWVycncucHJpbnQoJyAnKTsKIApAQCAtODcsNyArODcsNyBAQAogCQkvKiogKi8KIAkJVVNBR0UgewogCQkJQE92ZXJyaWRlCi0JCQl2b2lkIHByaW50KFRocm93aW5nUHJpbnRXcml0ZXIgZXJyLCBmaW5hbCBDb21tYW5kUmVmIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQl2b2lkIHByaW50KFRocm93aW5nUHJpbnRXcml0ZXIgZXJyLCBDb21tYW5kUmVmIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJU3RyaW5nIHVzYWdlID0gYy5nZXRVc2FnZSgpOwogCQkJCWlmICh1c2FnZSAhPSBudWxsICYmIHVzYWdlLmxlbmd0aCgpID4gMCkKIAkJCQkJZXJyLnByaW50KENMSVRleHQuZ2V0KCkucmVzb3VyY2VCdW5kbGUoKS5nZXRTdHJpbmcodXNhZ2UpKTsKQEAgLTk3LDcgKzk3LDcgQEAKIAkJLyoqICovCiAJCUNMQVNTRVMgewogCQkJQE92ZXJyaWRlCi0JCQl2b2lkIHByaW50KFRocm93aW5nUHJpbnRXcml0ZXIgZXJyLCBmaW5hbCBDb21tYW5kUmVmIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQl2b2lkIHByaW50KFRocm93aW5nUHJpbnRXcml0ZXIgZXJyLCBDb21tYW5kUmVmIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJZXJyLnByaW50KGMuZ2V0SW1wbGVtZW50YXRpb25DbGFzc05hbWUoKSk7CiAJCQl9CiAJCX0sCkBAIC0xMDUsNyArMTA1LDcgQEAKIAkJLyoqICovCiAJCVVSTFMgewogCQkJQE92ZXJyaWRlCi0JCQl2b2lkIHByaW50KFRocm93aW5nUHJpbnRXcml0ZXIgZXJyLCBmaW5hbCBDb21tYW5kUmVmIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQl2b2lkIHByaW50KFRocm93aW5nUHJpbnRXcml0ZXIgZXJyLCBDb21tYW5kUmVmIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJZmluYWwgQ2xhc3NMb2FkZXIgbGRyID0gYy5nZXRJbXBsZW1lbnRhdGlvbkNsYXNzTG9hZGVyKCk7CiAKIAkJCQlTdHJpbmcgY24gPSBjLmdldEltcGxlbWVudGF0aW9uQ2xhc3NOYW1lKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvU2hvd1BhY2tEZWx0YS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1Nob3dQYWNrRGVsdGEuamF2YQppbmRleCBiYmMxYjBmLi5mMzllY2JlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvU2hvd1BhY2tEZWx0YS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9TaG93UGFja0RlbHRhLmphdmEKQEAgLTEyNSwxMiArMTI1LDEzIEBACiAJCQlwdHIrKzsKIAkJcHRyKys7CiAKLQkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIiAvKiBqYXZhIDcgKi8pCi0JCVRlbXBvcmFyeUJ1ZmZlci5IZWFwIHJhdyA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuSGVhcChidWZBcnJheS5sZW5ndGgpOwotCQlJbmZsYXRlcklucHV0U3RyZWFtIGluZiA9IG5ldyBJbmZsYXRlcklucHV0U3RyZWFtKAotCQkJCW5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShidWZBcnJheSwgcHRyLCBidWZBcnJheS5sZW5ndGgpKTsKLQkJcmF3LmNvcHkoaW5mKTsKLQkJaW5mLmNsb3NlKCk7Ci0JCXJldHVybiByYXcudG9CeXRlQXJyYXkoKTsKKwkJdHJ5IChUZW1wb3JhcnlCdWZmZXIuSGVhcCByYXcgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkhlYXAoCisJCQkJYnVmQXJyYXkubGVuZ3RoKTsKKwkJCQlJbmZsYXRlcklucHV0U3RyZWFtIGluZiA9IG5ldyBJbmZsYXRlcklucHV0U3RyZWFtKAorCQkJCQkJbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ1ZkFycmF5LCBwdHIsCisJCQkJCQkJCWJ1ZkFycmF5Lmxlbmd0aCkpKSB7CisJCQlyYXcuY29weShpbmYpOworCQkJcmV0dXJuIHJhdy50b0J5dGVBcnJheSgpOworCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1RleHRIYXNoRnVuY3Rpb25zLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvVGV4dEhhc2hGdW5jdGlvbnMuamF2YQppbmRleCA4M2I3YmNlLi5iYjUxYjUwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvVGV4dEhhc2hGdW5jdGlvbnMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvVGV4dEhhc2hGdW5jdGlvbnMuamF2YQpAQCAtMjg4LDExICsyODgsOCBAQAogCQkJZWxzZQogCQkJCXJiLmZpbmRHaXREaXIoZGlyKTsKIAotCQkJUmVwb3NpdG9yeSByZXBvID0gcmIuYnVpbGQoKTsKLQkJCXRyeSB7CisJCQl0cnkgKFJlcG9zaXRvcnkgcmVwbyA9IHJiLmJ1aWxkKCkpIHsKIAkJCQlydW4ocmVwbyk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXJlcG8uY2xvc2UoKTsKIAkJCX0KIAkJfQogCX0KQEAgLTUwMiw3ICs0OTksNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgaW50IHRhYmxlQml0cyhmaW5hbCBpbnQgc3opIHsKKwlwcml2YXRlIHN0YXRpYyBpbnQgdGFibGVCaXRzKGludCBzeikgewogCQlpbnQgYml0cyA9IDMxIC0gSW50ZWdlci5udW1iZXJPZkxlYWRpbmdaZXJvcyhzeik7CiAJCWlmIChiaXRzID09IDApCiAJCQliaXRzID0gMTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9Xcml0ZVJlZnRhYmxlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvV3JpdGVSZWZ0YWJsZS5qYXZhCmluZGV4IDZjYmMxYjAuLmM1ZWEwMjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9Xcml0ZVJlZnRhYmxlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1dyaXRlUmVmdGFibGUuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQucGdtLmRlYnVnOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5IRUFEOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuTUFTVEVSOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuUl9IRUFEUzsKQEAgLTE5Miw3ICsxOTIsNyBAQAogCXN0YXRpYyBMaXN0PFJlZj4gcmVhZFJlZnMoU3RyaW5nIGlucHV0RmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJTGlzdDxSZWY+IHJlZnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAkJdHJ5IChCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKLQkJCQluZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShpbnB1dEZpbGUpLCBVVEZfOCkpKSB7CisJCQkJbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBGaWxlSW5wdXRTdHJlYW0oaW5wdXRGaWxlKSwgQ0hBUlNFVCkpKSB7CiAJCQlTdHJpbmcgbGluZTsKIAkJCXdoaWxlICgobGluZSA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKIAkJCQlPYmplY3RJZCBpZCA9IE9iamVjdElkLmZyb21TdHJpbmcobGluZS5zdWJzdHJpbmcoMCwgNDApKTsKQEAgLTIyNyw3ICsyMjcsNyBAQAogCiAJCUxpc3Q8TG9nRW50cnk+IGxvZyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAotCQkJCW5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKGxvZ1BhdGgpLCBVVEZfOCkpKSB7CisJCQkJbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBGaWxlSW5wdXRTdHJlYW0obG9nUGF0aCksIENIQVJTRVQpKSkgewogCQkJQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiAJCQlQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIihbXixdKykiIC8vIDE6IHJlZgogCQkJCQkrICIsKFswLTldKyg/OlsuXVswLTldKyk/KSIgLy8gMjogdGltZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9BYnN0cmFjdFRyZWVJdGVyYXRvckhhbmRsZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvQWJzdHJhY3RUcmVlSXRlcmF0b3JIYW5kbGVyLmphdmEKaW5kZXggNmZlNzkyNy4uYTE0ZjY1MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9BYnN0cmFjdFRyZWVJdGVyYXRvckhhbmRsZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L0Fic3RyYWN0VHJlZUl0ZXJhdG9ySGFuZGxlci5qYXZhCkBAIC05OCw3ICs5OCw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgcGFyc2VBcmd1bWVudHMoZmluYWwgUGFyYW1ldGVycyBwYXJhbXMpIHRocm93cyBDbWRMaW5lRXhjZXB0aW9uIHsKKwlwdWJsaWMgaW50IHBhcnNlQXJndW1lbnRzKFBhcmFtZXRlcnMgcGFyYW1zKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZyBuYW1lID0gcGFyYW1zLmdldFBhcmFtZXRlcigwKTsKIAogCQlpZiAobmV3IEZpbGUobmFtZSkuaXNEaXJlY3RvcnkoKSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9DbWRMaW5lUGFyc2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L0NtZExpbmVQYXJzZXIuamF2YQppbmRleCBlMDcxYmRmLi41Y2M5OGNhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L0NtZExpbmVQYXJzZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L0NtZExpbmVQYXJzZXIuamF2YQpAQCAtMTExLDcgKzExMSw3IEBACiAJICogICAgICAgICAgICAgaWYgdGhlIG9wdGlvbiBiZWFuIGNsYXNzIGlzIHVzaW5nIGFyZ3M0aiBhbm5vdGF0aW9ucwogCSAqICAgICAgICAgICAgIGluY29ycmVjdGx5LgogCSAqLwotCXB1YmxpYyBDbWRMaW5lUGFyc2VyKGZpbmFsIE9iamVjdCBiZWFuKSB7CisJcHVibGljIENtZExpbmVQYXJzZXIoT2JqZWN0IGJlYW4pIHsKIAkJdGhpcyhiZWFuLCBudWxsKTsKIAl9CiAKQEAgLTEzMCw3ICsxMzAsNyBAQAogCSAqICAgICAgICAgICAgIGlmIHRoZSBvcHRpb24gYmVhbiBjbGFzcyBpcyB1c2luZyBhcmdzNGogYW5ub3RhdGlvbnMKIAkgKiAgICAgICAgICAgICBpbmNvcnJlY3RseS4KIAkgKi8KLQlwdWJsaWMgQ21kTGluZVBhcnNlcihmaW5hbCBPYmplY3QgYmVhbiwgUmVwb3NpdG9yeSByZXBvKSB7CisJcHVibGljIENtZExpbmVQYXJzZXIoT2JqZWN0IGJlYW4sIFJlcG9zaXRvcnkgcmVwbykgewogCQlzdXBlcihiZWFuKTsKIAkJaWYgKGJlYW4gaW5zdGFuY2VvZiBUZXh0QnVpbHRpbikgewogCQkJY21kID0gKFRleHRCdWlsdGluKSBiZWFuOwpAQCAtMTQzLDcgKzE0Myw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHBhcnNlQXJndW1lbnQoZmluYWwgU3RyaW5nLi4uIGFyZ3MpIHRocm93cyBDbWRMaW5lRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBwYXJzZUFyZ3VtZW50KFN0cmluZy4uLiBhcmdzKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CiAJCWZpbmFsIEFycmF5TGlzdDxTdHJpbmc+IHRtcCA9IG5ldyBBcnJheUxpc3Q8PihhcmdzLmxlbmd0aCk7CiAJCWZvciAoaW50IGFyZ2kgPSAwOyBhcmdpIDwgYXJncy5sZW5ndGg7IGFyZ2krKykgewogCQkJZmluYWwgU3RyaW5nIHN0ciA9IGFyZ3NbYXJnaV07CkBAIC0yMzIsNyArMjMyLDcgQEAKIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGFycmF5IGNvbnRhaW5zIGhlbHAgb3B0aW9uCiAJICogQHNpbmNlIDQuMgogCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNvbnRhaW5zSGVscChmaW5hbCBTdHJpbmcuLi4gYXJncykgeworCXByb3RlY3RlZCBib29sZWFuIGNvbnRhaW5zSGVscChTdHJpbmcuLi4gYXJncykgewogCQlyZXR1cm4gVGV4dEJ1aWx0aW4uY29udGFpbnNIZWxwKGFyZ3MpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9PYmplY3RJZEhhbmRsZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvT2JqZWN0SWRIYW5kbGVyLmphdmEKaW5kZXggMGU1YjBmNS4uNWY3ZTgxZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9PYmplY3RJZEhhbmRsZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L09iamVjdElkSGFuZGxlci5qYXZhCkBAIC04NCw3ICs4NCw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgcGFyc2VBcmd1bWVudHMoZmluYWwgUGFyYW1ldGVycyBwYXJhbXMpIHRocm93cyBDbWRMaW5lRXhjZXB0aW9uIHsKKwlwdWJsaWMgaW50IHBhcnNlQXJndW1lbnRzKFBhcmFtZXRlcnMgcGFyYW1zKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZyBuYW1lID0gcGFyYW1zLmdldFBhcmFtZXRlcigwKTsKIAkJZmluYWwgT2JqZWN0SWQgaWQ7CiAJCXRyeSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L1BhdGhUcmVlRmlsdGVySGFuZGxlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9QYXRoVHJlZUZpbHRlckhhbmRsZXIuamF2YQppbmRleCAzM2Q2NjljLi5kOTlmODhlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L1BhdGhUcmVlRmlsdGVySGFuZGxlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvUGF0aFRyZWVGaWx0ZXJIYW5kbGVyLmphdmEKQEAgLTg0LDcgKzg0LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGludCBwYXJzZUFyZ3VtZW50cyhmaW5hbCBQYXJhbWV0ZXJzIHBhcmFtcykgdGhyb3dzIENtZExpbmVFeGNlcHRpb24geworCXB1YmxpYyBpbnQgcGFyc2VBcmd1bWVudHMoUGFyYW1ldGVycyBwYXJhbXMpIHRocm93cyBDbWRMaW5lRXhjZXB0aW9uIHsKIAkJZmluYWwgTGlzdDxQYXRoRmlsdGVyPiBmaWx0ZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJCWZvciAoaW50IGlkeCA9IDA7OyBpZHgrKykgewogCQkJZmluYWwgU3RyaW5nIHBhdGg7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L1JlZlNwZWNIYW5kbGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L1JlZlNwZWNIYW5kbGVyLmphdmEKaW5kZXggZGQ4NTIwYS4uMjk1NzdlZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9SZWZTcGVjSGFuZGxlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvUmVmU3BlY0hhbmRsZXIuamF2YQpAQCAtNzgsNyArNzgsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IHBhcnNlQXJndW1lbnRzKGZpbmFsIFBhcmFtZXRlcnMgcGFyYW1zKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CisJcHVibGljIGludCBwYXJzZUFyZ3VtZW50cyhQYXJhbWV0ZXJzIHBhcmFtcykgdGhyb3dzIENtZExpbmVFeGNlcHRpb24gewogCQlzZXR0ZXIuYWRkVmFsdWUobmV3IFJlZlNwZWMocGFyYW1zLmdldFBhcmFtZXRlcigwKSkpOwogCQlyZXR1cm4gMTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L1JldkNvbW1pdEhhbmRsZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvUmV2Q29tbWl0SGFuZGxlci5qYXZhCmluZGV4IGQyZmE3NjQuLmI5MjVlMzEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvUmV2Q29tbWl0SGFuZGxlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvUmV2Q29tbWl0SGFuZGxlci5qYXZhCkBAIC04OCw3ICs4OCw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgcGFyc2VBcmd1bWVudHMoZmluYWwgUGFyYW1ldGVycyBwYXJhbXMpIHRocm93cyBDbWRMaW5lRXhjZXB0aW9uIHsKKwlwdWJsaWMgaW50IHBhcnNlQXJndW1lbnRzKFBhcmFtZXRlcnMgcGFyYW1zKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CiAJCVN0cmluZyBuYW1lID0gcGFyYW1zLmdldFBhcmFtZXRlcigwKTsKIAogCQlib29sZWFuIGludGVyZXN0aW5nID0gdHJ1ZTsKQEAgLTExNSw3ICsxMTUsNyBAQAogCQlyZXR1cm4gMTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgYWRkT25lKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBib29sZWFuIGludGVyZXN0aW5nKQorCXByaXZhdGUgdm9pZCBhZGRPbmUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gaW50ZXJlc3RpbmcpCiAJCQl0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CiAJCWZpbmFsIE9iamVjdElkIGlkOwogCQl0cnkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9SZXZUcmVlSGFuZGxlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9SZXZUcmVlSGFuZGxlci5qYXZhCmluZGV4IDk0NDQzNjMuLjg1OTIyYTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvUmV2VHJlZUhhbmRsZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L1JldlRyZWVIYW5kbGVyLmphdmEKQEAgLTg3LDcgKzg3LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGludCBwYXJzZUFyZ3VtZW50cyhmaW5hbCBQYXJhbWV0ZXJzIHBhcmFtcykgdGhyb3dzIENtZExpbmVFeGNlcHRpb24geworCXB1YmxpYyBpbnQgcGFyc2VBcmd1bWVudHMoUGFyYW1ldGVycyBwYXJhbXMpIHRocm93cyBDbWRMaW5lRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nIG5hbWUgPSBwYXJhbXMuZ2V0UGFyYW1ldGVyKDApOwogCQlmaW5hbCBPYmplY3RJZCBpZDsKIAkJdHJ5IHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvU3ViY29tbWFuZEhhbmRsZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvU3ViY29tbWFuZEhhbmRsZXIuamF2YQppbmRleCBkNjAwNzFmLi45MmVlYmY0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L1N1YmNvbW1hbmRIYW5kbGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9TdWJjb21tYW5kSGFuZGxlci5qYXZhCkBAIC04NCw3ICs4NCw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgcGFyc2VBcmd1bWVudHMoZmluYWwgUGFyYW1ldGVycyBwYXJhbXMpIHRocm93cyBDbWRMaW5lRXhjZXB0aW9uIHsKKwlwdWJsaWMgaW50IHBhcnNlQXJndW1lbnRzKFBhcmFtZXRlcnMgcGFyYW1zKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZyBuYW1lID0gcGFyYW1zLmdldFBhcmFtZXRlcigwKTsKIAkJZmluYWwgQ29tbWFuZFJlZiBjciA9IENvbW1hbmRDYXRhbG9nLmdldChuYW1lKTsKIAkJaWYgKGNyID09IG51bGwpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggZWZmZmQwZS4uNGI4M2ZiMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMyw1OCArMyw1OCBAQAogQnVuZGxlLU5hbWU6ICVwbHVnaW5fbmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnRlc3QKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQudGVzdAotQnVuZGxlLVZlcnNpb246IDQuMTEuNC5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyX25hbWUKIEJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuOAogSW1wb3J0LVBhY2thZ2U6IGNvbS5nb29nbGVjb2RlLmphdmFld2FoO3ZlcnNpb249IlsxLjEuNiwyLjAuMCkiLAogIGNvbS5qY3JhZnQuanNjaDt2ZXJzaW9uPSJbMC4xLjU0LDAuMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXM7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmF3dHVpO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ibGFtZTt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZGlmZjt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGU7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXZlbnRzO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5mbm1hdGNoO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ob29rczt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaWdub3JlO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pZ25vcmUuaW50ZXJuYWw7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5mc2NrO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmlvO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGU7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdHJlZTt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmczt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5tZXJnZTt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ub3Rlczt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucGF0Y2g7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnBnbTt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucGdtLmludGVybmFsO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZwbG90O3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN1Ym1vZHVsZTt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cDt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsLnNoYTE7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYXd0dWk7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ibGFtZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmRpZmY7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmV2ZW50czt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmZubWF0Y2g7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaG9va3M7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pZ25vcmU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pZ25vcmUuaW50ZXJuYWw7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmZzY2s7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuaW87dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0cmVlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5tZXJnZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm5vdGVzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucGF0Y2g7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5wZ207dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5wZ20uaW50ZXJuYWw7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZwbG90O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuZmlsdGVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5wYWNrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3VibW9kdWxlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5zaGExO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAogIG9yZy5qdW5pdDt2ZXJzaW9uPSJbNC4xMiw1LjAuMCkiLAogIG9yZy5qdW5pdC5leHBlcmltZW50YWwudGhlb3JpZXM7dmVyc2lvbj0iWzQuMTIsNS4wLjApIiwKICBvcmcuanVuaXQucnVsZXM7dmVyc2lvbj0iWzQuMTIsNS4wLjApIiwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC9leHR0c3Qvb3JnL2VjbGlwc2UvamdpdC9pZ25vcmUvQ0dpdFZzSkdpdFJhbmRvbUlnbm9yZVBhdHRlcm5UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvZXh0dHN0L29yZy9lY2xpcHNlL2pnaXQvaWdub3JlL0NHaXRWc0pHaXRSYW5kb21JZ25vcmVQYXR0ZXJuVGVzdC5qYXZhCmluZGV4IDQzOGQyZDYuLjRkOWU4NjQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC9leHR0c3Qvb3JnL2VjbGlwc2UvamdpdC9pZ25vcmUvQ0dpdFZzSkdpdFJhbmRvbUlnbm9yZVBhdHRlcm5UZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L2V4dHRzdC9vcmcvZWNsaXBzZS9qZ2l0L2lnbm9yZS9DR2l0VnNKR2l0UmFuZG9tSWdub3JlUGF0dGVyblRlc3QuamF2YQpAQCAtNDIsNyArNDIsNyBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaWdub3JlOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTE1OCw3ICsxNTgsNyBAQAogCQkJdGhpcy5naXREaXIgPSBnaXREaXI7CiAJCQl0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuOwogCQkJRmlsZXMud3JpdGUoRmlsZVV0aWxzLnRvUGF0aChuZXcgRmlsZShnaXREaXIsICIuZ2l0aWdub3JlIikpLAotCQkJCQkocGF0dGVybiArICJcbiIpLmdldEJ5dGVzKFVURl84KSwgU3RhbmRhcmRPcGVuT3B0aW9uLkNSRUFURSwKKwkJCQkJKHBhdHRlcm4gKyAiXG4iKS5nZXRCeXRlcyhDSEFSU0VUKSwgU3RhbmRhcmRPcGVuT3B0aW9uLkNSRUFURSwKIAkJCQkJU3RhbmRhcmRPcGVuT3B0aW9uLlRSVU5DQVRFX0VYSVNUSU5HLAogCQkJCQlTdGFuZGFyZE9wZW5PcHRpb24uV1JJVEUpOwogCQl9CkBAIC0xODgsNyArMTg4LDcgQEAKIAkJCVByb2Nlc3MgcHJvYyA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoY29tbWFuZCwgbmV3IFN0cmluZ1swXSwKIAkJCQkJZ2l0RGlyKTsKIAkJCXRyeSAoT3V0cHV0U3RyZWFtIG91dCA9IHByb2MuZ2V0T3V0cHV0U3RyZWFtKCkpIHsKLQkJCQlvdXQud3JpdGUoKHBhdGggKyAiXG4iKS5nZXRCeXRlcyhVVEZfOCkpOworCQkJCW91dC53cml0ZSgocGF0aCArICJcbiIpLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJCQlvdXQuZmx1c2goKTsKIAkJCX0KIAkJCXJldHVybiBwcm9jOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L2V4dHRzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0VHaXRQYXRjaEhpc3RvcnlUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvZXh0dHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvRUdpdFBhdGNoSGlzdG9yeVRlc3QuamF2YQppbmRleCAzZjllZjEyLi43OWQ4ZDBlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvZXh0dHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvRUdpdFBhdGNoSGlzdG9yeVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvZXh0dHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvRUdpdFBhdGNoSGlzdG9yeVRlc3QuamF2YQpAQCAtODUsNyArODUsNyBAQAogCiAJCWludCBlcnJvcnM7CiAKLQkJUGF0Y2hSZWFkZXIoZmluYWwgSGFzaE1hcDxTdHJpbmcsIEhhc2hNYXA8U3RyaW5nLCBTdGF0SW5mbz4+IHMpCisJCVBhdGNoUmVhZGVyKEhhc2hNYXA8U3RyaW5nLCBIYXNoTWFwPFN0cmluZywgU3RhdEluZm8+PiBzKQogCQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlzdXBlcihuZXcgU3RyaW5nW10geyAiLXAiIH0pOwogCQkJc3RhdHMgPSBzOwpAQCAtMTAzLDcgKzEwMyw3IEBACiAJCQlwLnBhcnNlKGJ1ZiwgMCwgYnVmLmxlbmd0aCAtIDEpOwogCQkJYXNzZXJ0RXF1YWxzKCJGaWxlIGNvdW50ICIgKyBjaWQsIGZpbGVzLnNpemUoKSwgcC5nZXRGaWxlcygpLnNpemUoKSk7CiAJCQlpZiAoIXAuZ2V0RXJyb3JzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChmaW5hbCBGb3JtYXRFcnJvciBlIDogcC5nZXRFcnJvcnMoKSkgeworCQkJCWZvciAoRm9ybWF0RXJyb3IgZSA6IHAuZ2V0RXJyb3JzKCkpIHsKIAkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJlcnJvciAiICsgZS5nZXRNZXNzYWdlKCkpOwogCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgYXQgIiArIGUuZ2V0TGluZVRleHQoKSk7CiAJCQkJfQpAQCAtMTExLDcgKzExMSw3IEBACiAJCQkJZmFpbCgiVW5leHBlY3RlZCBlcnJvciBpbiAiICsgY2lkKTsKIAkJCX0KIAotCQkJZm9yIChmaW5hbCBGaWxlSGVhZGVyIGZoIDogcC5nZXRGaWxlcygpKSB7CisJCQlmb3IgKEZpbGVIZWFkZXIgZmggOiBwLmdldEZpbGVzKCkpIHsKIAkJCQlmaW5hbCBTdHJpbmcgZmlsZU5hbWU7CiAJCQkJaWYgKGZoLmdldENoYW5nZVR5cGUoKSAhPSBGaWxlSGVhZGVyLkNoYW5nZVR5cGUuREVMRVRFKQogCQkJCQlmaWxlTmFtZSA9IGZoLmdldE5ld1BhdGgoKTsKQEAgLTEyMSw3ICsxMjEsNyBAQAogCQkJCWZpbmFsIFN0cmluZyBuaWQgPSBmaWxlTmFtZSArICIgaW4gIiArIGNpZDsKIAkJCQlhc3NlcnROb3ROdWxsKCJObyAiICsgbmlkLCBzKTsKIAkJCQlpbnQgYWRkZWQgPSAwLCBkZWxldGVkID0gMDsKLQkJCQlmb3IgKGZpbmFsIEh1bmtIZWFkZXIgaCA6IGZoLmdldEh1bmtzKCkpIHsKKwkJCQlmb3IgKEh1bmtIZWFkZXIgaCA6IGZoLmdldEh1bmtzKCkpIHsKIAkJCQkJYWRkZWQgKz0gaC5nZXRPbGRJbWFnZSgpLmdldExpbmVzQWRkZWQoKTsKIAkJCQkJZGVsZXRlZCArPSBoLmdldE9sZEltYWdlKCkuZ2V0TGluZXNEZWxldGVkKCk7CiAJCQkJfQpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAJCQlhc3NlcnRUcnVlKCJNaXNzZWQgZmlsZXMgaW4gIiArIGNpZCwgZmlsZXMuaXNFbXB0eSgpKTsKIAkJfQogCi0JCXByaXZhdGUgc3RhdGljIHZvaWQgZHVtcChmaW5hbCBieXRlW10gYnVmKSB7CisJCXByaXZhdGUgc3RhdGljIHZvaWQgZHVtcChieXRlW10gYnVmKSB7CiAJCQlTdHJpbmcgc3RyOwogCQkJdHJ5IHsKIAkJCQlzdHIgPSBuZXcgU3RyaW5nKGJ1ZiwgMCwgYnVmLmxlbmd0aCAtIDEsICJJU08tODg1OS0xIik7CkBAIC0xODgsNyArMTg4LDcgQEAKIAlzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ29tbWl0UmVhZGVyIHsKIAkJcHJpdmF0ZSBQcm9jZXNzIHByb2M7CiAKLQkJQ29tbWl0UmVhZGVyKGZpbmFsIFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUNvbW1pdFJlYWRlcihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJZmluYWwgU3RyaW5nW10gcmVhbEFyZ3MgPSBuZXcgU3RyaW5nWzMgKyBhcmdzLmxlbmd0aCArIDFdOwogCQkJcmVhbEFyZ3NbMF0gPSAiZ2l0IjsKIAkJCXJlYWxBcmdzWzFdID0gImxvZyI7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvZXh0dHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvRmlsZVRyZWVJdGVyYXRvclBlcmZvcm1hbmNlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L2V4dHRzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0ZpbGVUcmVlSXRlcmF0b3JQZXJmb3JtYW5jZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjM4Mzg5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L2V4dHRzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0ZpbGVUcmVlSXRlcmF0b3JQZXJmb3JtYW5jZVRlc3QuamF2YQpAQCAtMCwwICsxLDkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4LCBUaG9tYXMgV29sZiA8dGhvbWFzLndvbGZAcGFyYW5vci5jaD4KKyAqIGFuZCBvdGhlciBjb3B5cmlnaHQgb3duZXJzIGFzIGRvY3VtZW50ZWQgaW4gdGhlIHByb2plY3QncyBJUCBsb2cuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2MS4wIHdoaWNoCisgKiBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgaXMgcmVwcm9kdWNlZCBiZWxvdywgYW5kIGlzCisgKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgSW5jLiBub3IgdGhlCisgKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqICAgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORAorICogQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCisgKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLkdpdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LlJlcG9zaXRvcnlUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlci5QYXRoRmlsdGVyOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFNpbXBsZSBwZXJmb3JtYW5jZSB0ZXN0IGZvciBnaXQgYWRkIC8gRmlsZVRyZWVJdGVyYXRvci4KKyAqLworcHVibGljIGNsYXNzIEZpbGVUcmVlSXRlcmF0b3JQZXJmb3JtYW5jZVRlc3QgZXh0ZW5kcyBSZXBvc2l0b3J5VGVzdENhc2UgeworCisJcHJpdmF0ZSBzdGF0aWMgaW50IE5fT0ZfRklMRVMgPSA1MDE7CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RQZXJmb3JtYW5jZSgpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKSkgeworCQkJbG9uZyB0aW1lc1tdID0gbmV3IGxvbmdbTl9PRl9GSUxFU107CisJCQlsb25nIHN1bSA9IDA7CisJCQlTdHJpbmcgbGFzdE5hbWUgPSBudWxsOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBOX09GX0ZJTEVTOyBpKyspIHsKKwkJCQlsYXN0TmFtZSA9ICJhIiArIChpICsgMTAwMDAwKSArICIudHh0IjsKKwkJCQl3cml0ZVRyYXNoRmlsZShsYXN0TmFtZSwgIiIpOworCQkJCWxvbmcgc3RhcnQgPSBTeXN0ZW0ubmFub1RpbWUoKTsKKwkJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4obGFzdE5hbWUpLmNhbGwoKTsKKwkJCQlsb25nIGVsYXBzZWQgPSBTeXN0ZW0ubmFub1RpbWUoKSAtIHN0YXJ0OworCQkJCXRpbWVzW2ldID0gZWxhcHNlZDsKKwkJCQlzdW0gKz0gZWxhcHNlZDsKKwkJCX0KKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiVG90YWwgKMK1cykgIiArIHN1bSAvIDEwMDAuMCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHRpbWVzLmxlbmd0aDsgaSsrKSB7CisJCQkJU3lzdGVtLm91dAorCQkJCQkJLnByaW50bG4oIlRpbWUgIiArIGkgKyAiICjCtXMpID0gIiArIHRpbWVzW2ldIC8gMTAwMC4wKTsKKwkJCX0KKwkJCUZpbGVUcmVlSXRlcmF0b3IgaXRlciA9IG5ldyBGaWxlVHJlZUl0ZXJhdG9yKGRiKTsKKwkJCXRyeSAoVHJlZVdhbGsgd2FsayA9IG5ldyBUcmVlV2FsayhkYikpIHsKKwkJCQl3YWxrLnNldEZpbHRlcihQYXRoRmlsdGVyLmNyZWF0ZShsYXN0TmFtZSkpOworCQkJCXdhbGsuYWRkVHJlZShpdGVyKTsKKwkJCQlsb25nIHN0YXJ0ID0gU3lzdGVtLm5hbm9UaW1lKCk7CisJCQkJaWYgKHdhbGsubmV4dCgpKSB7CisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiV2FsayB0aW1lICjCtXMpID0gIgorCQkJCQkJCSsgKFN5c3RlbS5uYW5vVGltZSgpIC0gc3RhcnQpIC8gMTAwMC4wKTsKKwkJCQl9IGVsc2UgeworCQkJCQlmYWlsKCJGaWxlIG5vdCBmb3VuZCIpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3BvbS54bWwKaW5kZXggZjkxNjM0Yy4uZTZjNzEyOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3BvbS54bWwKQEAgLTUyLDcgKzUyLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuNC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC50ZXN0PC9hcnRpZmFjdElkPgpAQCAtNjIsNiArNjIsMTAgQEAKICAgICBKVW5pdCB0ZXN0cyBmb3IgdGhlIGNvcmUgbGlicmFyeS4KICAgPC9kZXNjcmlwdGlvbj4KIAorICA8cHJvcGVydGllcz4KKyAgICA8bWF2ZW4uamF2YWRvYy5za2lwPnRydWU8L21hdmVuLmphdmFkb2Muc2tpcD4KKyAgPC9wcm9wZXJ0aWVzPgorCiAgIDxkZXBlbmRlbmNpZXM+CiAgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90ZXN0cy5iemwgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdGVzdHMuYnpsCmluZGV4IGM3NWFiNzYuLmYzNjgwMDAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90ZXN0cy5iemwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3Rlc3RzLmJ6bApAQCAtMTksNiArMTksMTAgQEAKICAgICAgICAgaWYgImxpYiIgbm90IGluIGxhYmVsczoKICAgICAgICAgICAgIGxhYmVscy5hcHBlbmQoImxpYiIpCiAKKyAgICAgICAgIyBUT0RPKGh0dHA6Ly9lY2xpcC5zZS81MzQyODUpOiBNYWtlIHRoaXMgdGVzdCBwYXNzIHJlbGlhYmx5CisgICAgICAgICMgYW5kIHJlbW92ZSB0aGUgZmxha3kgYXR0cmlidXRlLgorICAgICAgICBmbGFreSA9IHNyYy5lbmRzd2l0aCgiQ3Jpc3NDcm9zc01lcmdlVGVzdC5qYXZhIikKKwogICAgICAgICBhZGRpdGlvbmFsX2RlcHMgPSBbXQogICAgICAgICBpZiBzcmMuZW5kc3dpdGgoIlJvb3RMb2NhbGVUZXN0LmphdmEiKToKICAgICAgICAgICAgIGFkZGl0aW9uYWxfZGVwcyA9IFsKQEAgLTUyLDUgKzU2LDYgQEAKICAgICAgICAgICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Omp1bml0IiwKICAgICAgICAgICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LmxmczpqZ2l0LWxmcyIsCiAgICAgICAgICAgICBdLAorICAgICAgICAgICAgZmxha3kgPSBmbGFreSwKICAgICAgICAgICAgIGp2bV9mbGFncyA9IFsiLVhteDI1Nm0iLCAiLURmaWxlLmVuY29kaW5nPVVURi04Il0sCiAgICAgICAgICkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQXBwbHlDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9BcHBseUNvbW1hbmRUZXN0LmphdmEKaW5kZXggMTcyODA3Yy4uMWRkMzI5YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9BcHBseUNvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9BcHBseUNvbW1hbmRUZXN0LmphdmEKQEAgLTY0LDcgKzY0LDcgQEAKIAogCXByaXZhdGUgUmF3VGV4dCBiOwogCi0JcHJpdmF0ZSBBcHBseVJlc3VsdCBpbml0KGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcml2YXRlIEFwcGx5UmVzdWx0IGluaXQoU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24gewogCQlyZXR1cm4gaW5pdChuYW1lLCB0cnVlLCB0cnVlKTsKIAl9CiAKQEAgLTI3Myw3ICsyNzMsNyBAQAogCQlhc3NlcnRGYWxzZShuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLCAiTm9uQVNDSUlEZWwiKS5leGlzdHMoKSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIHJlYWRGaWxlKGZpbmFsIFN0cmluZyBwYXRjaEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIHJlYWRGaWxlKFN0cmluZyBwYXRjaEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIElucHV0U3RyZWFtIGluID0gZ2V0VGVzdFJlc291cmNlKHBhdGNoRmlsZSk7CiAJCWlmIChpbiA9PSBudWxsKSB7CiAJCQlmYWlsKCJObyAiICsgcGF0Y2hGaWxlICsgIiB0ZXN0IHZlY3RvciIpOwpAQCAtMjkxLDcgKzI5MSw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRUZXN0UmVzb3VyY2UoZmluYWwgU3RyaW5nIHBhdGNoRmlsZSkgeworCXByaXZhdGUgc3RhdGljIElucHV0U3RyZWFtIGdldFRlc3RSZXNvdXJjZShTdHJpbmcgcGF0Y2hGaWxlKSB7CiAJCXJldHVybiBBcHBseUNvbW1hbmRUZXN0LmNsYXNzLmdldENsYXNzTG9hZGVyKCkKIAkJCQkuZ2V0UmVzb3VyY2VBc1N0cmVhbSgib3JnL2VjbGlwc2UvamdpdC9kaWZmLyIgKyBwYXRjaEZpbGUpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQXJjaGl2ZUNvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0FyY2hpdmVDb21tYW5kVGVzdC5qYXZhCmluZGV4IGVkYWI5NmIuLjEzMDBmOTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQXJjaGl2ZUNvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9BcmNoaXZlQ29tbWFuZFRlc3QuamF2YQpAQCAtMjI5LDExICsyMjksNiBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHB1dEVudHJ5KE1vY2tPdXRwdXRTdHJlYW0gb3V0LCBTdHJpbmcgcGF0aCwgRmlsZU1vZGUgbW9kZSwgT2JqZWN0TG9hZGVyIGxvYWRlcikgewotCQkJcHV0RW50cnkob3V0LCBudWxsLCBwYXRoLCBtb2RlLCBsb2FkZXIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCiAJCXB1YmxpYyB2b2lkIHB1dEVudHJ5KE1vY2tPdXRwdXRTdHJlYW0gb3V0LCBPYmplY3RJZCB0cmVlLCBTdHJpbmcgcGF0aCwgRmlsZU1vZGUgbW9kZSwgT2JqZWN0TG9hZGVyIGxvYWRlcikgewogCQkJU3RyaW5nIGNvbnRlbnQgPSBtb2RlICE9IEZpbGVNb2RlLlRSRUUgPyBuZXcgU3RyaW5nKGxvYWRlci5nZXRCeXRlcygpKSA6IG51bGw7CiAJCQllbnRyaWVzLnB1dChwYXRoLCBjb250ZW50KTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQmxhbWVDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9CbGFtZUNvbW1hbmRUZXN0LmphdmEKaW5kZXggZjM3YWExMy4uN2ExZDIyMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9CbGFtZUNvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9CbGFtZUNvbW1hbmRUZXN0LmphdmEKQEAgLTEzNiw3ICsxMzYsNyBAQAogCQl0ZXN0UmVuYW1lKCJzdWJkaXIvZmlsZTEudHh0IiwgIm90aGVyZGlyL2ZpbGUxLnR4dCIpOwogCX0KIAotCXByaXZhdGUgdm9pZCB0ZXN0UmVuYW1lKGZpbmFsIFN0cmluZyBzb3VyY2VQYXRoLCBmaW5hbCBTdHJpbmcgZGVzdFBhdGgpCisJcHJpdmF0ZSB2b2lkIHRlc3RSZW5hbWUoU3RyaW5nIHNvdXJjZVBhdGgsIFN0cmluZyBkZXN0UGF0aCkKIAkJCXRocm93cyBFeGNlcHRpb24gewogCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKSkgewogCQkJU3RyaW5nW10gY29udGVudDEgPSBuZXcgU3RyaW5nW10geyAiYSIsICJiIiwgImMiIH07CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0JyYW5jaENvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0JyYW5jaENvbW1hbmRUZXN0LmphdmEKaW5kZXggMmZlNDBiOS4uMDhmMWZkZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9CcmFuY2hDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQnJhbmNoQ29tbWFuZFRlc3QuamF2YQpAQCAtMTkxLDYgKzE5MSwxOCBAQAogCQkJCS0gYWxsQmVmb3JlKTsKIAl9CiAKKwlAVGVzdChleHBlY3RlZCA9IEludmFsaWRSZWZOYW1lRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQnJhbmNoSEVBRCgpIHRocm93cyBFeGNlcHRpb24geworCQlnaXQuYnJhbmNoQ3JlYXRlKCkuc2V0TmFtZSgiSEVBRCIpLmNhbGwoKTsKKwkJZmFpbCgiQ3JlYXRlIGJyYW5jaCB3aXRoIGludmFsaWQgcmVmIG5hbWUgc2hvdWxkIGZhaWwiKTsKKwl9CisKKwlAVGVzdChleHBlY3RlZCA9IEludmFsaWRSZWZOYW1lRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQnJhbmNoRGFzaCgpIHRocm93cyBFeGNlcHRpb24geworCQlnaXQuYnJhbmNoQ3JlYXRlKCkuc2V0TmFtZSgiLXgiKS5jYWxsKCk7CisJCWZhaWwoIkNyZWF0ZSBicmFuY2ggd2l0aCBpbnZhbGlkIHJlZiBuYW1lIHNob3VsZCBmYWlsIik7CisJfQorCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0TGlzdEFsbEJyYW5jaGVzU2hvdWxkTm90RGllKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXNldFVwUmVwb1dpdGhSZW1vdGUoKS5icmFuY2hMaXN0KCkuc2V0TGlzdE1vZGUoTGlzdE1vZGUuQUxMKS5jYWxsKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NoZXJyeVBpY2tDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DaGVycnlQaWNrQ29tbWFuZFRlc3QuamF2YQppbmRleCAzNTRiOWM2Li5mYmMyY2Y2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NoZXJyeVBpY2tDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ2hlcnJ5UGlja0NvbW1hbmRUZXN0LmphdmEKQEAgLTMzOCw3ICszMzgsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBSZXZDb21taXQgcHJlcGFyZUNoZXJyeVBpY2soZmluYWwgR2l0IGdpdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSBSZXZDb21taXQgcHJlcGFyZUNoZXJyeVBpY2soR2l0IGdpdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCS8vIGNyZWF0ZSwgYWRkIGFuZCBjb21taXQgZmlsZSBhCiAJCXdyaXRlVHJhc2hGaWxlKCJhIiwgImEiKTsKIAkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJhIikuY2FsbCgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Db21taXRDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Db21taXRDb21tYW5kVGVzdC5qYXZhCmluZGV4IDBkZDM3NDkuLjNhMTNhYTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ29tbWl0Q29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NvbW1pdENvbW1hbmRUZXN0LmphdmEKQEAgLTU0LDcgKzU0LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuRW10cHlDb21taXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkVtcHR5Q29tbWl0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5Xcm9uZ1JlcG9zaXRvcnlTdGF0ZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYuRGlmZkVudHJ5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGUuRGlyQ2FjaGU7CkBAIC01NTMsOCArNTUzLDggQEAKIAkJCQlnaXQuY29tbWl0KCkuc2V0QXV0aG9yKCJOZXcgQXV0aG9yIiwgIm5ld2F1dGhvckBleGFtcGxlLm9yZyIpCiAJCQkJCQkuc2V0TWVzc2FnZSgiYWdhaW4gbm8gY2hhbmdlIikuc2V0QWxsb3dFbXB0eShmYWxzZSkKIAkJCQkJCS5jYWxsKCk7Ci0JCQkJZmFpbCgiRGlkbid0IGdldCB0aGUgZXhwZWN0ZWQgRW10cHlDb21taXRFeGNlcHRpb24iKTsKLQkJCX0gY2F0Y2ggKEVtdHB5Q29tbWl0RXhjZXB0aW9uIGUpIHsKKwkJCQlmYWlsKCJEaWRuJ3QgZ2V0IHRoZSBleHBlY3RlZCBFbXB0eUNvbW1pdEV4Y2VwdGlvbiIpOworCQkJfSBjYXRjaCAoRW1wdHlDb21taXRFeGNlcHRpb24gZSkgewogCQkJCS8vIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbgogCQkJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NvbW1pdE9ubHlUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NvbW1pdE9ubHlUZXN0LmphdmEKaW5kZXggY2MyMWI0Ny4uYmJkNmVjMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Db21taXRPbmx5VGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ29tbWl0T25seVRlc3QuamF2YQpAQCAtMTI4OSw3ICsxMjg5LDcgQEAKIAkJcmV0dXJuIG51bGw7CiAJfQogCi0Jc3RhdGljIHByaXZhdGUgU3RyaW5nIGdldEhlYWQoZmluYWwgR2l0IGdpdCwgZmluYWwgU3RyaW5nIHBhdGgpCisJc3RhdGljIHByaXZhdGUgU3RyaW5nIGdldEhlYWQoR2l0IGdpdCwgU3RyaW5nIHBhdGgpCiAJCQl0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCWZpbmFsIFJlcG9zaXRvcnkgcmVwbyA9IGdpdC5nZXRSZXBvc2l0b3J5KCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0Rlc2NyaWJlQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRGVzY3JpYmVDb21tYW5kVGVzdC5qYXZhCmluZGV4IDc5ZGEyZGEuLmE0MjJlZjkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRGVzY3JpYmVDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRGVzY3JpYmVDb21tYW5kVGVzdC5qYXZhCkBAIC01NCw3ICs1NCw2IEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuR2l0QVBJRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5SZWZOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5JbnZhbGlkUGF0dGVybkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LlJlcG9zaXRvcnlUZXN0Q2FzZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKQEAgLTY4LDEzICs2NywxOCBAQAogCiAJcHJpdmF0ZSBHaXQgZ2l0OwogCi0JQFBhcmFtZXRlcgorCUBQYXJhbWV0ZXIoMCkKIAlwdWJsaWMgYm9vbGVhbiB1c2VBbm5vdGF0ZWRUYWdzOwogCi0JQFBhcmFtZXRlcnMKKwlAUGFyYW1ldGVyKDEpCisJcHVibGljIGJvb2xlYW4gZGVzY3JpYmVVc2VBbGxUYWdzOworCisJQFBhcmFtZXRlcnMobmFtZSA9ICJnaXQgdGFnIC1hIHswfT8tYTogd2l0aCBnaXQgZGVzY3JpYmUgezF9Py0tdGFnczoiKQogCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxCb29sZWFuW10+IGdldFVzZUFubm90YXRlZFRhZ3NWYWx1ZXMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBCb29sZWFuW11bXSB7IHsgQm9vbGVhbi5UUlVFIH0sCi0JCQkJeyBCb29sZWFuLkZBTFNFIH0gfSk7CisJCXJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBCb29sZWFuW11bXSB7IHsgQm9vbGVhbi5UUlVFLCBCb29sZWFuLkZBTFNFIH0sCisJCQkJeyBCb29sZWFuLkZBTFNFLCBCb29sZWFuLkZBTFNFIH0sCisJCQkJeyBCb29sZWFuLlRSVUUsIEJvb2xlYW4uVFJVRSB9LAorCQkJCXsgQm9vbGVhbi5GQUxTRSwgQm9vbGVhbi5UUlVFIH0gfSk7CiAJfQogCiAJQE92ZXJyaWRlCkBAIC05OSwzNSArMTAzLDUyIEBACiAJCXRhZygiYm9iLXQyIik7CiAKIAkJT2JqZWN0SWQgYzQgPSBtb2RpZnkoImRkZCIpOworCQlhc3NlcnROYW1lU3RhcnRzV2l0aChjNCwgIjNlNTYzYzUiKTsKIAogCQlhc3NlcnROdWxsKGRlc2NyaWJlKGMxKSk7CiAJCWFzc2VydE51bGwoZGVzY3JpYmUoYzEsIHRydWUpKTsKIAkJYXNzZXJ0TnVsbChkZXNjcmliZShjMSwgImEqIiwgImIqIiwgImMqIikpOwotCi0JCWFzc2VydEVxdWFscygiYWxpY2UtdDEiLCBkZXNjcmliZShjMikpOwotCQlhc3NlcnRFcXVhbHMoImFsaWNlLXQxIiwgZGVzY3JpYmUoYzIsICJhbGljZSoiKSk7CiAJCWFzc2VydE51bGwoZGVzY3JpYmUoYzIsICJib2IqIikpOwogCQlhc3NlcnROdWxsKGRlc2NyaWJlKGMyLCAiP29iKiIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhbGljZS10MSIsIGRlc2NyaWJlKGMyLCAiYSoiLCAiYioiLCAiYyoiKSk7CiAKLQkJYXNzZXJ0RXF1YWxzKCJib2ItdDIiLCBkZXNjcmliZShjMykpOwotCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0wLWc0NDU3OWViIiwgZGVzY3JpYmUoYzMsIHRydWUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhbGljZS10MS0xLWc0NDU3OWViIiwgZGVzY3JpYmUoYzMsICJhbGljZSoiKSk7Ci0JCWFzc2VydEVxdWFscygiYWxpY2UtdDEtMS1nNDQ1NzllYiIsIGRlc2NyaWJlKGMzLCAiYT8/Yz8tdCoiKSk7Ci0JCWFzc2VydEVxdWFscygiYm9iLXQyIiwgZGVzY3JpYmUoYzMsICJib2IqIikpOwotCQlhc3NlcnRFcXVhbHMoImJvYi10MiIsIGRlc2NyaWJlKGMzLCAiP29iKiIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJib2ItdDIiLCBkZXNjcmliZShjMywgImEqIiwgImIqIiwgImMqIikpOworCQlpZiAodXNlQW5ub3RhdGVkVGFncyB8fCBkZXNjcmliZVVzZUFsbFRhZ3MpIHsKKwkJCWFzc2VydEVxdWFscygiYWxpY2UtdDEiLCBkZXNjcmliZShjMikpOworCQkJYXNzZXJ0RXF1YWxzKCJhbGljZS10MSIsIGRlc2NyaWJlKGMyLCAiYWxpY2UqIikpOworCQkJYXNzZXJ0RXF1YWxzKCJhbGljZS10MSIsIGRlc2NyaWJlKGMyLCAiYSoiLCAiYioiLCAiYyoiKSk7CiAKLQkJYXNzZXJ0TmFtZVN0YXJ0c1dpdGgoYzQsICIzZTU2M2M1Iik7Ci0JCS8vIHRoZSB2YWx1ZSB2ZXJpZmllZCB3aXRoIGdpdC1kZXNjcmliZSgxKQotCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0xLWczZTU2M2M1IiwgZGVzY3JpYmUoYzQpKTsKLQkJYXNzZXJ0RXF1YWxzKCJib2ItdDItMS1nM2U1NjNjNSIsIGRlc2NyaWJlKGM0LCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygiYWxpY2UtdDEtMi1nM2U1NjNjNSIsIGRlc2NyaWJlKGM0LCAiYWxpY2UqIikpOwotCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0xLWczZTU2M2M1IiwgZGVzY3JpYmUoYzQsICJib2IqIikpOwotCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0xLWczZTU2M2M1IiwgZGVzY3JpYmUoYzQsICJhKiIsICJiKiIsICJjKiIpKTsKKwkJCWFzc2VydEVxdWFscygiYm9iLXQyIiwgZGVzY3JpYmUoYzMpKTsKKwkJCWFzc2VydEVxdWFscygiYm9iLXQyLTAtZzQ0NTc5ZWIiLCBkZXNjcmliZShjMywgdHJ1ZSkpOworCQkJYXNzZXJ0RXF1YWxzKCJhbGljZS10MS0xLWc0NDU3OWViIiwgZGVzY3JpYmUoYzMsICJhbGljZSoiKSk7CisJCQlhc3NlcnRFcXVhbHMoImFsaWNlLXQxLTEtZzQ0NTc5ZWIiLCBkZXNjcmliZShjMywgImE/P2M/LXQqIikpOworCQkJYXNzZXJ0RXF1YWxzKCJib2ItdDIiLCBkZXNjcmliZShjMywgImJvYioiKSk7CisJCQlhc3NlcnRFcXVhbHMoImJvYi10MiIsIGRlc2NyaWJlKGMzLCAiP29iKiIpKTsKKwkJCWFzc2VydEVxdWFscygiYm9iLXQyIiwgZGVzY3JpYmUoYzMsICJhKiIsICJiKiIsICJjKiIpKTsKKworCQkJLy8gdGhlIHZhbHVlIHZlcmlmaWVkIHdpdGggZ2l0LWRlc2NyaWJlKDEpCisJCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0xLWczZTU2M2M1IiwgZGVzY3JpYmUoYzQpKTsKKwkJCWFzc2VydEVxdWFscygiYm9iLXQyLTEtZzNlNTYzYzUiLCBkZXNjcmliZShjNCwgdHJ1ZSkpOworCQkJYXNzZXJ0RXF1YWxzKCJhbGljZS10MS0yLWczZTU2M2M1IiwgZGVzY3JpYmUoYzQsICJhbGljZSoiKSk7CisJCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0xLWczZTU2M2M1IiwgZGVzY3JpYmUoYzQsICJib2IqIikpOworCQkJYXNzZXJ0RXF1YWxzKCJib2ItdDItMS1nM2U1NjNjNSIsIGRlc2NyaWJlKGM0LCAiYSoiLCAiYioiLCAiYyoiKSk7CisJCX0gZWxzZSB7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVzY3JpYmUoYzIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLCBkZXNjcmliZShjMykpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlc2NyaWJlKGM0KSk7CisJCX0KIAogCQkvLyB0ZXN0IGRlZmF1bHQgdGFyZ2V0Ci0JCWFzc2VydEVxdWFscygiYm9iLXQyLTEtZzNlNTYzYzUiLCBnaXQuZGVzY3JpYmUoKS5jYWxsKCkpOworCQlpZiAodXNlQW5ub3RhdGVkVGFncykgeworCQkJYXNzZXJ0RXF1YWxzKCJib2ItdDItMS1nM2U1NjNjNSIsIGdpdC5kZXNjcmliZSgpLmNhbGwoKSk7CisJCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0xLWczZTU2M2M1IiwKKwkJCQkJZ2l0LmRlc2NyaWJlKCkuc2V0VGFncyhmYWxzZSkuY2FsbCgpKTsKKwkJCWFzc2VydEVxdWFscygiYm9iLXQyLTEtZzNlNTYzYzUiLAorCQkJCQlnaXQuZGVzY3JpYmUoKS5zZXRUYWdzKHRydWUpLmNhbGwoKSk7CisJCX0gZWxzZSB7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwgZ2l0LmRlc2NyaWJlKCkuY2FsbCgpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLCBnaXQuZGVzY3JpYmUoKS5zZXRUYWdzKGZhbHNlKS5jYWxsKCkpOworCQkJYXNzZXJ0RXF1YWxzKCJib2ItdDItMS1nM2U1NjNjNSIsCisJCQkJCWdpdC5kZXNjcmliZSgpLnNldFRhZ3ModHJ1ZSkuY2FsbCgpKTsKKwkJfQogCX0KIAogCUBUZXN0CkBAIC0xMzcsNyArMTU4LDE0IEBACiAJCXRhZygidjEuMS4xIik7CiAJCU9iamVjdElkIGMyID0gbW9kaWZ5KCJiYmIiKTsKIAotCQkvLyBFbnN1cmUgdGhhdCBpZiB3ZSdyZSBpbnRlcmVzdGVkIGluIGFueSB0YWdzLCB3ZSBnZXQgdGhlIGZpcnN0IG1hdGNoIGFzIHBlciBHaXQgYmVoYXZpb3VyCisJCWlmICghdXNlQW5ub3RhdGVkVGFncyAmJiAhZGVzY3JpYmVVc2VBbGxUYWdzKSB7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVzY3JpYmUoYzEpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLCBkZXNjcmliZShjMikpOworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gRW5zdXJlIHRoYXQgaWYgd2UncmUgaW50ZXJlc3RlZCBpbiBhbnkgdGFncywgd2UgZ2V0IHRoZSBmaXJzdCBtYXRjaAorCQkvLyBhcyBwZXIgR2l0IGJlaGF2aW91cgogCQlhc3NlcnRFcXVhbHMoInYxLjAuMCIsIGRlc2NyaWJlKGMxKSk7CiAJCWFzc2VydEVxdWFscygidjEuMC4wLTEtZzM3NDdkYjMiLCBkZXNjcmliZShjMikpOwogCkBAIC0xNzksNyArMjA3LDExIEBACiAJCU9iamVjdElkIGM0ID0gbWVyZ2UoYzIpOwogCiAJCWFzc2VydE5hbWVTdGFydHNXaXRoKGM0LCAiMTE5ODkyYiIpOwotCQlhc3NlcnRFcXVhbHMoInQtMi1nMTE5ODkyYiIsIGRlc2NyaWJlKGM0KSk7IC8vIDIgY29tbWl0czogYzQgYW5kIGMzCisJCWlmICh1c2VBbm5vdGF0ZWRUYWdzIHx8IGRlc2NyaWJlVXNlQWxsVGFncykgeworCQkJYXNzZXJ0RXF1YWxzKCIyIGNvbW1pdHM6IGM0IGFuZCBjMyIsICJ0LTItZzExOTg5MmIiLCBkZXNjcmliZShjNCkpOworCQl9IGVsc2UgeworCQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlc2NyaWJlKGM0KSk7CisJCX0KIAkJYXNzZXJ0TnVsbChkZXNjcmliZShjMykpOwogCQlhc3NlcnROdWxsKGRlc2NyaWJlKGMzLCB0cnVlKSk7CiAJfQpAQCAtMjExLDE0ICsyNDMsNzYgQEAKIAkJYnJhbmNoKCJiIiwgYzEpOwogCiAJCU9iamVjdElkIGMzID0gbW9kaWZ5KCJjY2MiKTsKKwkJYXNzZXJ0TmFtZVN0YXJ0c1dpdGgoYzMsICIwMjQ0ZTdmIik7CiAKIAkJT2JqZWN0SWQgYzQgPSBtZXJnZShjMik7CiAKIAkJYXNzZXJ0TmFtZVN0YXJ0c1dpdGgoYzQsICIxMTk4OTJiIik7Ci0JCWFzc2VydEVxdWFscygidDItMi1nMTE5ODkyYiIsIGRlc2NyaWJlKGM0KSk7IC8vIDIgY29tbWl0czogYzQgYW5kIGMzCisKKwkJaWYgKHVzZUFubm90YXRlZFRhZ3MgfHwgZGVzY3JpYmVVc2VBbGxUYWdzKSB7CisJCQlhc3NlcnRFcXVhbHMoInQyLTItZzExOTg5MmIiLCBkZXNjcmliZShjNCkpOyAvLyAyIGNvbW1pdHM6IGM0IGFuZCBjMworCQkJYXNzZXJ0RXF1YWxzKCJ0MS0xLWcwMjQ0ZTdmIiwgZGVzY3JpYmUoYzMpKTsKKwkJfSBlbHNlIHsKKwkJCWFzc2VydEVxdWFscyhudWxsLCBkZXNjcmliZShjNCkpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlc2NyaWJlKGMzKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBXaGVuIHQxIGFubm90YXRlZCBkb21pbmF0ZXMgdDIgbGlnaHR3ZWlnaHQgdGFnCisJICoKKwkgKiA8cHJlPgorCSAqIHQxIC0rLT4gdDIgIC0KKwkgKiAgICAgfCAgICAgICB8CisJICogICAgICstPiBjMyAtKy0+IGM0CisJICogPC9wcmU+CisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdDFBbm5vdGF0ZWREb21pbmF0ZXNUMmxpZ2h0d2VpZ2h0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9iamVjdElkIGMxID0gbW9kaWZ5KCJhYWEiKTsKKwkJdGFnKCJ0MSIsIHVzZUFubm90YXRlZFRhZ3MpOworCisJCU9iamVjdElkIGMyID0gbW9kaWZ5KCJiYmIiKTsKKwkJdGFnKCJ0MiIsIGZhbHNlKTsKKworCQlhc3NlcnROYW1lU3RhcnRzV2l0aChjMiwgIjM3NDdkYjMiKTsKKwkJaWYgKHVzZUFubm90YXRlZFRhZ3MgJiYgIWRlc2NyaWJlVXNlQWxsVGFncykgeworCQkJYXNzZXJ0RXF1YWxzKAorCQkJCQkib25seSBhbm5vdGF0ZWQgdGFnIHQxIGV4cGVjdGVkIHRvIGJlIHVzZWQgZm9yIGRlc2NyaWJlIiwKKwkJCQkJInQxLTEtZzM3NDdkYjMiLCBkZXNjcmliZShjMikpOyAvLyAxIGNvbW1pdHM6IHQyIG92ZXJyaWRkZW4KKwkJCQkJCQkJCQkJCQkvLyBieSB0MQorCQl9IGVsc2UgaWYgKCF1c2VBbm5vdGF0ZWRUYWdzICYmICFkZXNjcmliZVVzZUFsbFRhZ3MpIHsKKwkJCWFzc2VydEVxdWFscygibm8gY29tbWl0cyB0byBkZXNjcmliZSBleHBlY3RlZCIsIG51bGwsIGRlc2NyaWJlKGMyKSk7CisJCX0gZWxzZSB7CisJCQlhc3NlcnRFcXVhbHMoImxpZ2h0d2VpZ2h0IHRhZyB0MiBleHBlY3RlZCBpbiBkZXNjcmliZSIsICJ0MiIsCisJCQkJCWRlc2NyaWJlKGMyKSk7CisJCX0KKworCQlicmFuY2goImIiLCBjMSk7CisKKwkJT2JqZWN0SWQgYzMgPSBtb2RpZnkoImNjYyIpOwogCiAJCWFzc2VydE5hbWVTdGFydHNXaXRoKGMzLCAiMDI0NGU3ZiIpOwotCQlhc3NlcnRFcXVhbHMoInQxLTEtZzAyNDRlN2YiLCBkZXNjcmliZShjMykpOworCQlpZiAodXNlQW5ub3RhdGVkVGFncyB8fCBkZXNjcmliZVVzZUFsbFRhZ3MpIHsKKwkJCWFzc2VydEVxdWFscygidDEtMS1nMDI0NGU3ZiIsIGRlc2NyaWJlKGMzKSk7CisJCX0KKworCQlPYmplY3RJZCBjNCA9IG1lcmdlKGMyKTsKKworCQlhc3NlcnROYW1lU3RhcnRzV2l0aChjNCwgIjExOTg5MmIiKTsKKwkJaWYgKGRlc2NyaWJlVXNlQWxsVGFncykgeworCQkJYXNzZXJ0RXF1YWxzKAorCQkJCQkiMiBjb21taXRzIGZvciBkZXNjcmliZSBjb21taXQgaW5jcmVtZW50IGV4cGVjdGVkIHNpbmNlIGxpZ2h0d2VpZ2h0IHRhZzogYzQgYW5kIGMzIiwKKwkJCQkJInQyLTItZzExOTg5MmIiLCBkZXNjcmliZShjNCkpOyAvLyAyIGNvbW1pdHM6IGM0IGFuZCBjMworCQl9IGVsc2UgaWYgKCF1c2VBbm5vdGF0ZWRUYWdzICYmICFkZXNjcmliZVVzZUFsbFRhZ3MpIHsKKwkJCWFzc2VydEVxdWFscygibm8gbWF0Y2hpbmcgY29tbWl0cyBleHBlY3RlZCIsIG51bGwsIGRlc2NyaWJlKGM0KSk7CisJCX0gZWxzZSB7CisJCQlhc3NlcnRFcXVhbHMoCisJCQkJCSIzIGNvbW1pdHMgZm9yIGRlc2NyaWJlIGNvbW1pdCBpbmNyZW1lbnQgZXhwZWN0ZWQgc2luY2UgYW5ub3RhdGVkIHRhZzogYzQgYW5kIGMzIGFuZCBjMiIsCisJCQkJCSJ0MS0zLWcxMTk4OTJiIiwgZGVzY3JpYmUoYzQpKTsgLy8KKwkJfQogCX0KIAogCS8qKgpAQCAtMjQ2LDcgKzM0MCwxMSBAQAogCQlPYmplY3RJZCBjNCA9IG1lcmdlKHQxKTsKIAogCQlhc3NlcnROYW1lU3RhcnRzV2l0aChjNCwgImJiMzg5YTQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0MS0zLWdiYjM4OWE0IiwgZGVzY3JpYmUoYzQpKTsKKwkJaWYgKHVzZUFubm90YXRlZFRhZ3MgfHwgZGVzY3JpYmVVc2VBbGxUYWdzKSB7CisJCQlhc3NlcnRFcXVhbHMoInQxLTMtZ2JiMzg5YTQiLCBkZXNjcmliZShjNCkpOworCQl9IGVsc2UgeworCQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlc2NyaWJlKGM0KSk7CisJCX0KIAl9CiAKIAkvKioKQEAgLTI3NSw3ICszNzMsMTEgQEAKIAkJT2JqZWN0SWQgYzQgPSBtZXJnZShjMik7CiAKIAkJYXNzZXJ0TmFtZVN0YXJ0c1dpdGgoYzQsICJiYjM4OWE0Iik7Ci0JCWFzc2VydEVxdWFscygidDItNC1nYmIzODlhNCIsIGRlc2NyaWJlKGM0KSk7CisJCWlmICh1c2VBbm5vdGF0ZWRUYWdzIHx8IGRlc2NyaWJlVXNlQWxsVGFncykgeworCQkJYXNzZXJ0RXF1YWxzKCJ0Mi00LWdiYjM4OWE0IiwgZGVzY3JpYmUoYzQpKTsKKwkJfSBlbHNlIHsKKwkJCWFzc2VydEVxdWFscyhudWxsLCBkZXNjcmliZShjNCkpOworCQl9CiAJfQogCiAJcHJpdmF0ZSBPYmplY3RJZCBtZXJnZShPYmplY3RJZCBjMikgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiB7CkBAIC0yODksMTAgKzM5MSwxNSBAQAogCX0KIAogCXByaXZhdGUgdm9pZCB0YWcoU3RyaW5nIHRhZykgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiB7CisJCXRhZyh0YWcsIHRoaXMudXNlQW5ub3RhdGVkVGFncyk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHRhZyhTdHJpbmcgdGFnLCBib29sZWFuIGFubm90YXRlZFRhZykgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiB7CiAJCVRhZ0NvbW1hbmQgdGFnQ29tbWFuZCA9IGdpdC50YWcoKS5zZXROYW1lKHRhZykKLQkJCQkuc2V0QW5ub3RhdGVkKHVzZUFubm90YXRlZFRhZ3MpOwotCQlpZiAodXNlQW5ub3RhdGVkVGFncykKKwkJCQkuc2V0QW5ub3RhdGVkKGFubm90YXRlZFRhZyk7CisJCWlmIChhbm5vdGF0ZWRUYWcpIHsKIAkJCXRhZ0NvbW1hbmQuc2V0TWVzc2FnZSh0YWcpOworCQl9CiAJCXRhZ0NvbW1hbmQuY2FsbCgpOwogCX0KIApAQCAtMzA0LDE1ICs0MTEsMTcgQEAKIAogCXByaXZhdGUgU3RyaW5nIGRlc2NyaWJlKE9iamVjdElkIGMxLCBib29sZWFuIGxvbmdEZXNjKQogCQkJdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2l0LmRlc2NyaWJlKCkuc2V0VGFyZ2V0KGMxKS5zZXRMb25nKGxvbmdEZXNjKS5jYWxsKCk7CisJCXJldHVybiBnaXQuZGVzY3JpYmUoKS5zZXRUYXJnZXQoYzEpLnNldFRhZ3MoZGVzY3JpYmVVc2VBbGxUYWdzKQorCQkJCS5zZXRMb25nKGxvbmdEZXNjKS5jYWxsKCk7CiAJfQogCiAJcHJpdmF0ZSBTdHJpbmcgZGVzY3JpYmUoT2JqZWN0SWQgYzEpIHRocm93cyBHaXRBUElFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIGRlc2NyaWJlKGMxLCBmYWxzZSk7CiAJfQogCi0JcHJpdmF0ZSBTdHJpbmcgZGVzY3JpYmUoT2JqZWN0SWQgYzEsIFN0cmluZy4uLiBwYXR0ZXJucykgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEludmFsaWRQYXR0ZXJuRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdpdC5kZXNjcmliZSgpLnNldFRhcmdldChjMSkuc2V0TWF0Y2gocGF0dGVybnMpLmNhbGwoKTsKKwlwcml2YXRlIFN0cmluZyBkZXNjcmliZShPYmplY3RJZCBjMSwgU3RyaW5nLi4uIHBhdHRlcm5zKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGdpdC5kZXNjcmliZSgpLnNldFRhcmdldChjMSkuc2V0VGFncyhkZXNjcmliZVVzZUFsbFRhZ3MpCisJCQkJLnNldE1hdGNoKHBhdHRlcm5zKS5jYWxsKCk7CiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnROYW1lU3RhcnRzV2l0aChPYmplY3RJZCBjNCwgU3RyaW5nIHByZWZpeCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Fb2xTdHJlYW1UeXBlVXRpbFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRW9sU3RyZWFtVHlwZVV0aWxUZXN0LmphdmEKaW5kZXggMWUzYTM5YS4uYmIzMDNjYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Fb2xTdHJlYW1UeXBlVXRpbFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0VvbFN0cmVhbVR5cGVVdGlsVGVzdC5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5hcGk7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29yZUNvbmZpZy5Fb2xTdHJlYW1UeXBlLkFVVE9fQ1JMRjsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29yZUNvbmZpZy5Fb2xTdHJlYW1UeXBlLkFVVE9fTEY7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvcmVDb25maWcuRW9sU3RyZWFtVHlwZS5ESVJFQ1Q7CkBAIC0xNTAsOCArMTUwLDggQEAKIAkJCUVvbFN0cmVhbVR5cGUgc3RyZWFtVHlwZVdpdGhCaW5hcnlDaGVjaywgU3RyaW5nIG91dHB1dCwKIAkJCVN0cmluZyBleHBlY3RlZENvbnZlcnNpb24pIHRocm93cyBFeGNlcHRpb24gewogCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYjsKLQkJYnl0ZVtdIG91dHB1dEJ5dGVzID0gb3V0cHV0LmdldEJ5dGVzKFVURl84KTsKLQkJYnl0ZVtdIGV4cGVjdGVkQ29udmVyc2lvbkJ5dGVzID0gZXhwZWN0ZWRDb252ZXJzaW9uLmdldEJ5dGVzKFVURl84KTsKKwkJYnl0ZVtdIG91dHB1dEJ5dGVzID0gb3V0cHV0LmdldEJ5dGVzKENIQVJTRVQpOworCQlieXRlW10gZXhwZWN0ZWRDb252ZXJzaW9uQnl0ZXMgPSBleHBlY3RlZENvbnZlcnNpb24uZ2V0Qnl0ZXMoQ0hBUlNFVCk7CiAKIAkJLy8gdGVzdCB1c2luZyBvdXRwdXQgdGV4dCBhbmQgYXNzdW1pbmcgaXQgd2FzIGRlY2xhcmVkIFRFWFQKIAkJYiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKQEAgLTI3Nyw4ICsyNzcsOCBAQAogCXByaXZhdGUgdm9pZCB0ZXN0Q2hlY2tpbihFb2xTdHJlYW1UeXBlIHN0cmVhbVR5cGVUZXh0LAogCQkJRW9sU3RyZWFtVHlwZSBzdHJlYW1UeXBlV2l0aEJpbmFyeUNoZWNrLCBTdHJpbmcgaW5wdXQsCiAJCQlTdHJpbmcgZXhwZWN0ZWRDb252ZXJzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYnl0ZVtdIGlucHV0Qnl0ZXMgPSBpbnB1dC5nZXRCeXRlcyhVVEZfOCk7Ci0JCWJ5dGVbXSBleHBlY3RlZENvbnZlcnNpb25CeXRlcyA9IGV4cGVjdGVkQ29udmVyc2lvbi5nZXRCeXRlcyhVVEZfOCk7CisJCWJ5dGVbXSBpbnB1dEJ5dGVzID0gaW5wdXQuZ2V0Qnl0ZXMoQ0hBUlNFVCk7CisJCWJ5dGVbXSBleHBlY3RlZENvbnZlcnNpb25CeXRlcyA9IGV4cGVjdGVkQ29udmVyc2lvbi5nZXRCeXRlcyhDSEFSU0VUKTsKIAogCQkvLyB0ZXN0IHVzaW5nIGlucHV0IHRleHQgYW5kIGFzc3VtaW5nIGl0IHdhcyBkZWNsYXJlZCBURVhUCiAJCXRyeSAoSW5wdXRTdHJlYW0gaW4gPSBFb2xTdHJlYW1UeXBlVXRpbC53cmFwSW5wdXRTdHJlYW0oCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0ZldGNoQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRmV0Y2hDb21tYW5kVGVzdC5qYXZhCmluZGV4IDUzMGZiMWIuLmFkYzRkOTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRmV0Y2hDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRmV0Y2hDb21tYW5kVGVzdC5qYXZhCkBAIC00MywxMiArNDMsMTcgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5hcGk7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCitpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LkpHaXRUZXN0VXRpbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LlJlcG9zaXRvcnlUZXN0Q2FzZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CkBAIC0xMDUsNiArMTEwLDI1IEBACiAJfQogCiAJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Rm9yY2VkRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmVtb3RlR2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImNvbW1pdCIpLmNhbGwoKTsKKwkJcmVtb3RlR2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImNvbW1pdDIiKS5jYWxsKCk7CisJCWdpdC5mZXRjaCgpLnNldFJlbW90ZSgidGVzdCIpCisJCQkJLnNldFJlZlNwZWNzKCJyZWZzL2hlYWRzL21hc3RlcjpyZWZzL2hlYWRzL21hc3RlciIpLmNhbGwoKTsKKworCQlyZW1vdGVHaXQuY29tbWl0KCkuc2V0QW1lbmQodHJ1ZSkuc2V0TWVzc2FnZSgiYW1lbmRlZCIpLmNhbGwoKTsKKwkJRmV0Y2hSZXN1bHQgcmVzID0gZ2l0LmZldGNoKCkuc2V0UmVtb3RlKCJ0ZXN0IikKKwkJCQkuc2V0UmVmU3BlY3MoInJlZnMvaGVhZHMvbWFzdGVyOnJlZnMvaGVhZHMvbWFzdGVyIikuY2FsbCgpOworCQlhc3NlcnRFcXVhbHMoUmVmVXBkYXRlLlJlc3VsdC5SRUpFQ1RFRCwKKwkJCQlyZXMuZ2V0VHJhY2tpbmdSZWZVcGRhdGUoInJlZnMvaGVhZHMvbWFzdGVyIikuZ2V0UmVzdWx0KCkpOworCQlyZXMgPSBnaXQuZmV0Y2goKS5zZXRSZW1vdGUoInRlc3QiKQorCQkJCS5zZXRSZWZTcGVjcygicmVmcy9oZWFkcy9tYXN0ZXI6cmVmcy9oZWFkcy9tYXN0ZXIiKQorCQkJCS5zZXRGb3JjZVVwZGF0ZSh0cnVlKS5jYWxsKCk7CisJCWFzc2VydEVxdWFscyhSZWZVcGRhdGUuUmVzdWx0LkZPUkNFRCwKKwkJCQlyZXMuZ2V0VHJhY2tpbmdSZWZVcGRhdGUoInJlZnMvaGVhZHMvbWFzdGVyIikuZ2V0UmVzdWx0KCkpOworCX0KKworCUBUZXN0CiAJcHVibGljIHZvaWQgZmV0Y2hBZGRzQnJhbmNoZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nIGJyYW5jaDEgPSAiYjEiOwogCQlmaW5hbCBTdHJpbmcgYnJhbmNoMiA9ICJiMiI7CkBAIC0yNzUsNiArMjk5LDQ1IEBACiAJfQogCiAJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RmV0Y2hXaXRoUHJ1bmVTaG91bGRLZWVwT3JpZ2luSGVhZCgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBDcmVhdGUgYSBjb21taXQgaW4gdGhlIHRlc3QgcmVwby4KKwkJY29tbWl0RmlsZSgiZm9vIiwgImZvbyIsICJtYXN0ZXIiKTsKKwkJLy8gUHJvZHVjZSBhIHJlYWwgY2xvbmUgb2YgdGhlIGdpdCByZXBvCisJCUdpdCBjbG9uZWQgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkKKwkJCQkuc2V0RGlyZWN0b3J5KGNyZWF0ZVRlbXBEaXJlY3RvcnkoInRlc3RDbG9uZVJlcG9zaXRvcnkiKSkKKwkJCQkuc2V0VVJJKCJmaWxlOi8vIgorCQkJCQkJKyBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldFdvcmtUcmVlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpCisJCQkJLmNhbGwoKTsKKwkJYXNzZXJ0Tm90TnVsbChjbG9uZWQpOworCQlSZXBvc2l0b3J5IGNsb25lZFJlcG8gPSBjbG9uZWQuZ2V0UmVwb3NpdG9yeSgpOworCQlhZGRSZXBvVG9DbG9zZShjbG9uZWRSZXBvKTsKKwkJT2JqZWN0SWQgb3JpZ2luTWFzdGVySWQgPSBjbG9uZWRSZXBvCisJCQkJLnJlc29sdmUoInJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyIik7CisJCWFzc2VydE5vdE51bGwoIlNob3VsZCBoYXZlIG9yaWdpbi9tYXN0ZXIiLCBvcmlnaW5NYXN0ZXJJZCk7CisJCWFzc2VydE5vdEVxdWFscygib3JpZ2luL21hc3RlciBzaG91bGQgbm90IGJlIHplcm8gSUQiLAorCQkJCU9iamVjdElkLnplcm9JZCgpLCBvcmlnaW5NYXN0ZXJJZCk7CisJCS8vIENhbm9uaWNhbCBnaXQgY3JlYXRlcyBvcmlnaW4vSEVBRDsgSkdpdCAoZm9yIG5vdykgZG9lc24ndC4gTGV0J3MKKwkJLy8gcHJldGVuZCB3ZSBkaWQgdGhlIGNsb25lIHZpYSBjb21tYW5kLWxpbmUgZ2l0LgorCQlPYmplY3RJZCBvcmlnaW5IZWFkSWQgPSBjbG9uZWRSZXBvLnJlc29sdmUoInJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRCIpOworCQlpZiAob3JpZ2luSGVhZElkID09IG51bGwpIHsKKwkJCUpHaXRUZXN0VXRpbC53cml0ZSgKKwkJCQkJbmV3IEZpbGUoY2xvbmVkUmVwby5nZXREaXJlY3RvcnkoKSwKKwkJCQkJCQkicmVmcy9yZW1vdGVzL29yaWdpbi9IRUFEIiksCisJCQkJCSJyZWY6IHJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyXG4iKTsKKwkJCW9yaWdpbkhlYWRJZCA9IGNsb25lZFJlcG8ucmVzb2x2ZSgicmVmcy9yZW1vdGVzL29yaWdpbi9IRUFEIik7CisJCX0KKwkJYXNzZXJ0RXF1YWxzKCJTaG91bGQgaGF2ZSBvcmlnaW4vSEVBRCIsIG9yaWdpbk1hc3RlcklkLCBvcmlnaW5IZWFkSWQpOworCQlGZXRjaFJlc3VsdCByZXN1bHQgPSBjbG9uZWQuZmV0Y2goKS5zZXRSZW1vdGUoIm9yaWdpbiIpCisJCQkJLnNldFJlbW92ZURlbGV0ZWRSZWZzKHRydWUpLmNhbGwoKTsKKwkJYXNzZXJ0VHJ1ZSgiRmV0Y2ggYWZ0ZXIgY2xvbmUgc2hvdWxkIGJlIHVwLXRvLWRhdGUiLAorCQkJCXJlc3VsdC5nZXRUcmFja2luZ1JlZlVwZGF0ZXMoKS5pc0VtcHR5KCkpOworCQlhc3NlcnRFcXVhbHMoIm9yaWdpbi9tYXN0ZXIgc2hvdWxkIHN0aWxsIGV4aXN0Iiwgb3JpZ2luTWFzdGVySWQsCisJCQkJY2xvbmVkUmVwby5yZXNvbHZlKCJyZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlciIpKTsKKwkJYXNzZXJ0RXF1YWxzKCJvcmlnaW4vSEVBRCBzaG91bGQgYmUgdW5jaGFuZ2VkIiwgb3JpZ2luSGVhZElkLAorCQkJCWNsb25lZFJlcG8ucmVzb2x2ZSgicmVmcy9yZW1vdGVzL29yaWdpbi9IRUFEIikpOworCX0KKworCUBUZXN0CiAJcHVibGljIHZvaWQgZmV0Y2hBZGRSZWZzV2l0aER1cGxpY2F0ZVJlZnNwZWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nIGJyYW5jaE5hbWUgPSAiYnJhbmNoIjsKIAkJZmluYWwgU3RyaW5nIHJlbW90ZUJyYW5jaE5hbWUgPSAidGVzdC8iICsgYnJhbmNoTmFtZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvTG9nQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvTG9nQ29tbWFuZFRlc3QuamF2YQppbmRleCBiZDBlZmFkLi40ZWY1MTFlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0xvZ0NvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Mb2dDb21tYW5kVGVzdC5qYXZhCkBAIC0xMTYsNyArMTE2LDcgQEAKIAkJSXRlcmF0b3I8UmV2Q29tbWl0PiBsb2cgPSBnaXQubG9nKCkuYWxsKCkuY2FsbCgpLml0ZXJhdG9yKCk7CiAJCWFzc2VydFRydWUobG9nLmhhc05leHQoKSk7CiAJCVJldkNvbW1pdCBjb21taXQgPSBsb2cubmV4dCgpOwotCQl0YWcgPSBkYi5wZWVsKHRhZyk7CisJCXRhZyA9IGRiLmdldFJlZkRhdGFiYXNlKCkucGVlbCh0YWcpOwogCiAJCWFzc2VydEVxdWFscyhjb21taXQuZ2V0TmFtZSgpLCB0YWcuZ2V0UGVlbGVkT2JqZWN0SWQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRUcnVlKGNvbW1pdHMuY29udGFpbnMoY29tbWl0KSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL01lcmdlQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvTWVyZ2VDb21tYW5kVGVzdC5qYXZhCmluZGV4IDRiMjMzNDkuLjlhZjAwM2QgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvTWVyZ2VDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvTWVyZ2VDb21tYW5kVGVzdC5qYXZhCkBAIC01NCw2ICs1NCw3IEBACiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuTWVyZ2VDb21tYW5kLkZhc3RGb3J3YXJkTW9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5NZXJnZVJlc3VsdC5NZXJnZVN0YXR1czsKQEAgLTE1ODQsMjcgKzE1ODUsMzEgQEAKIAkJYXNzZXJ0RXF1YWxzKE1lcmdlU3RhdHVzLkNPTkZMSUNUSU5HLCByZXN1bHQuZ2V0TWVyZ2VTdGF0dXMoKSk7CiAJfQogCisJcHJpdmF0ZSBSZWYgcHJlcGFyZVN1Y2Nlc3NmdWxNZXJnZShHaXQgZ2l0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJd3JpdGVUcmFzaEZpbGUoImEiLCAiMVxuYVxuM1xuIik7CisJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiYSIpLmNhbGwoKTsKKwkJUmV2Q29tbWl0IGluaXRpYWxDb21taXQgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiaW5pdGlhbCIpLmNhbGwoKTsKKworCQljcmVhdGVCcmFuY2goaW5pdGlhbENvbW1pdCwgInJlZnMvaGVhZHMvc2lkZSIpOworCQljaGVja291dEJyYW5jaCgicmVmcy9oZWFkcy9zaWRlIik7CisKKwkJd3JpdGVUcmFzaEZpbGUoImIiLCAiMVxuYlxuM1xuIik7CisJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiYiIpLmNhbGwoKTsKKwkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoInNpZGUiKS5jYWxsKCk7CisKKwkJY2hlY2tvdXRCcmFuY2goInJlZnMvaGVhZHMvbWFzdGVyIik7CisKKwkJd3JpdGVUcmFzaEZpbGUoImMiLCAiMVxuY1xuM1xuIik7CisJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiYyIpLmNhbGwoKTsKKwkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIm1haW4iKS5jYWxsKCk7CisKKwkJcmV0dXJuIGRiLmV4YWN0UmVmKCJyZWZzL2hlYWRzL3NpZGUiKTsKKwl9CisKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RNZXJnZVdpdGhNZXNzYWdlT3B0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpKSB7Ci0JCQl3cml0ZVRyYXNoRmlsZSgiYSIsICIxXG5hXG4zXG4iKTsKLQkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiYSIpLmNhbGwoKTsKLQkJCVJldkNvbW1pdCBpbml0aWFsQ29tbWl0ID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImluaXRpYWwiKS5jYWxsKCk7Ci0KLQkJCWNyZWF0ZUJyYW5jaChpbml0aWFsQ29tbWl0LCAicmVmcy9oZWFkcy9zaWRlIik7Ci0JCQljaGVja291dEJyYW5jaCgicmVmcy9oZWFkcy9zaWRlIik7Ci0KLQkJCXdyaXRlVHJhc2hGaWxlKCJiIiwgIjFcbmJcbjNcbiIpOwotCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJiIikuY2FsbCgpOwotCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoInNpZGUiKS5jYWxsKCk7Ci0KLQkJCWNoZWNrb3V0QnJhbmNoKCJyZWZzL2hlYWRzL21hc3RlciIpOwotCi0JCQl3cml0ZVRyYXNoRmlsZSgiYyIsICIxXG5jXG4zXG4iKTsKLQkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiYyIpLmNhbGwoKTsKLQkJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJtYWluIikuY2FsbCgpOwotCi0JCQlSZWYgc2lkZUJyYW5jaCA9IGRiLmV4YWN0UmVmKCJyZWZzL2hlYWRzL3NpZGUiKTsKKwkJCVJlZiBzaWRlQnJhbmNoID0gcHJlcGFyZVN1Y2Nlc3NmdWxNZXJnZShnaXQpOwogCiAJCQlnaXQubWVyZ2UoKS5pbmNsdWRlKHNpZGVCcmFuY2gpLnNldFN0cmF0ZWd5KE1lcmdlU3RyYXRlZ3kuUkVTT0xWRSkKIAkJCQkJLnNldE1lc3NhZ2UoInVzZXIgbWVzc2FnZSIpLmNhbGwoKTsKQEAgLTE2MTgsNiArMTYyMyw0MyBAQAogCX0KIAogCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdE1lcmdlV2l0aENoYW5nZUlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpKSB7CisJCQlSZWYgc2lkZUJyYW5jaCA9IHByZXBhcmVTdWNjZXNzZnVsTWVyZ2UoZ2l0KTsKKworCQkJZ2l0Lm1lcmdlKCkuaW5jbHVkZShzaWRlQnJhbmNoKS5zZXRTdHJhdGVneShNZXJnZVN0cmF0ZWd5LlJFU09MVkUpCisJCQkJCS5zZXRJbnNlcnRDaGFuZ2VJZCh0cnVlKS5jYWxsKCk7CisKKwkJCWFzc2VydE51bGwoZGIucmVhZE1lcmdlQ29tbWl0TXNnKCkpOworCisJCQlJdGVyYXRvcjxSZXZDb21taXQ+IGl0ID0gZ2l0LmxvZygpLmNhbGwoKS5pdGVyYXRvcigpOworCQkJUmV2Q29tbWl0IG5ld0hlYWQgPSBpdC5uZXh0KCk7CisJCQlTdHJpbmcgY29tbWl0TWVzc2FnZSA9IG5ld0hlYWQuZ2V0RnVsbE1lc3NhZ2UoKTsKKwkJCWFzc2VydFRydWUoUGF0dGVybi5jb21waWxlKCJcbkNoYW5nZS1JZDogSVswLTlhLWZBLUZdezQwfVxuIikKKwkJCQkJLm1hdGNoZXIoY29tbWl0TWVzc2FnZSkuZmluZCgpKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdE1lcmdlV2l0aE1lc3NhZ2VBbmRDaGFuZ2VJZCgpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKSkgeworCQkJUmVmIHNpZGVCcmFuY2ggPSBwcmVwYXJlU3VjY2Vzc2Z1bE1lcmdlKGdpdCk7CisKKwkJCWdpdC5tZXJnZSgpLmluY2x1ZGUoc2lkZUJyYW5jaCkuc2V0U3RyYXRlZ3koTWVyZ2VTdHJhdGVneS5SRVNPTFZFKQorCQkJCQkuc2V0TWVzc2FnZSgidXNlciBtZXNzYWdlIikuc2V0SW5zZXJ0Q2hhbmdlSWQodHJ1ZSkuY2FsbCgpOworCisJCQlhc3NlcnROdWxsKGRiLnJlYWRNZXJnZUNvbW1pdE1zZygpKTsKKworCQkJSXRlcmF0b3I8UmV2Q29tbWl0PiBpdCA9IGdpdC5sb2coKS5jYWxsKCkuaXRlcmF0b3IoKTsKKwkJCVJldkNvbW1pdCBuZXdIZWFkID0gaXQubmV4dCgpOworCQkJU3RyaW5nIGNvbW1pdE1lc3NhZ2UgPSBuZXdIZWFkLmdldEZ1bGxNZXNzYWdlKCk7CisJCQlhc3NlcnRUcnVlKGNvbW1pdE1lc3NhZ2Uuc3RhcnRzV2l0aCgidXNlciBtZXNzYWdlXG5cbiIpKTsKKwkJCWFzc2VydFRydWUoUGF0dGVybi5jb21waWxlKCJcbkNoYW5nZS1JZDogSVswLTlhLWZBLUZdezQwfVxuIikKKwkJCQkJLm1hdGNoZXIoY29tbWl0TWVzc2FnZSkuZmluZCgpKTsKKwkJfQorCX0KKworCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdE1lcmdlQ29uZmxpY3RXaXRoTWVzc2FnZU9wdGlvbigpIHRocm93cyBFeGNlcHRpb24gewogCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKSkgewogCQkJd3JpdGVUcmFzaEZpbGUoImEiLCAiMVxuYVxuM1xuIik7CkBAIC0xNjU3LDcgKzE2OTksNyBAQAogCQkJCS5nZXRXb3JrVHJlZSgpLCBwYXRoKSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgUmV2Q29tbWl0IGFkZEFsbEFuZENvbW1pdChmaW5hbCBHaXQgZ2l0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcml2YXRlIHN0YXRpYyBSZXZDb21taXQgYWRkQWxsQW5kQ29tbWl0KEdpdCBnaXQpIHRocm93cyBFeGNlcHRpb24gewogCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oIi4iKS5jYWxsKCk7CiAJCXJldHVybiBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgibWVzc2FnZSIpLmNhbGwoKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL05vdGVzQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvTm90ZXNDb21tYW5kVGVzdC5qYXZhCmluZGV4IDZlMDZlOTUuLmUyMzRhYTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvTm90ZXNDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvTm90ZXNDb21tYW5kVGVzdC5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5hcGk7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTg4LDcgKzg4LDcgQEAKIAkJZ2l0Lm5vdGVzQWRkKCkuc2V0T2JqZWN0SWQoY29tbWl0Mikuc2V0TWVzc2FnZSgiZGF0YSIpLmNhbGwoKTsKIAkJTm90ZSBub3RlID0gZ2l0Lm5vdGVzU2hvdygpLnNldE9iamVjdElkKGNvbW1pdDIpLmNhbGwoKTsKIAkJU3RyaW5nIGNvbnRlbnQgPSBuZXcgU3RyaW5nKGRiLm9wZW4obm90ZS5nZXREYXRhKCkpLmdldENhY2hlZEJ5dGVzKCksCi0JCQkJVVRGXzgpOworCQkJCUNIQVJTRVQpOwogCQlhc3NlcnRFcXVhbHMoY29udGVudCwgImRhdGEiKTsKIAogCQlnaXQubm90ZXNSZW1vdmUoKS5zZXRPYmplY3RJZChjb21taXQyKS5jYWxsKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1bGxDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdWxsQ29tbWFuZFRlc3QuamF2YQppbmRleCA5NDYxYzQyLi4wYjBlM2JmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1bGxDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVsbENvbW1hbmRUZXN0LmphdmEKQEAgLTQyLDcgKzQyLDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwpAQCAtNTkyLDcgKzU5Miw3IEBACiAJcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVRvRmlsZShGaWxlIGFjdEZpbGUsIFN0cmluZyBzdHJpbmcpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0cnkgKEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oYWN0RmlsZSkpIHsKLQkJCWZvcy53cml0ZShzdHJpbmcuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCWZvcy53cml0ZShzdHJpbmcuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQl9CiAJfQogCkBAIC02MDYsNyArNjA2LDcgQEAKIAkJCQlib3Mud3JpdGUoYnVmZmVyLCAwLCByZWFkKTsKIAkJCQlyZWFkID0gZmlzLnJlYWQoYnVmZmVyKTsKIAkJCX0KLQkJCVN0cmluZyBjb250ZW50ID0gbmV3IFN0cmluZyhib3MudG9CeXRlQXJyYXkoKSwgVVRGXzgpOworCQkJU3RyaW5nIGNvbnRlbnQgPSBuZXcgU3RyaW5nKGJvcy50b0J5dGVBcnJheSgpLCBDSEFSU0VUKTsKIAkJCWFzc2VydEVxdWFscyhzdHJpbmcsIGNvbnRlbnQpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdWxsQ29tbWFuZFdpdGhSZWJhc2VUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1bGxDb21tYW5kV2l0aFJlYmFzZVRlc3QuamF2YQppbmRleCA5MTNiNGFjLi5iMzQ5YzY2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1bGxDb21tYW5kV2l0aFJlYmFzZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1bGxDb21tYW5kV2l0aFJlYmFzZVRlc3QuamF2YQpAQCAtNDIsNyArNDIsNyBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuYXBpOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CkBAIC0zOTYsNyArMzk2LDcgQEAKIAlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlVG9GaWxlKEZpbGUgYWN0RmlsZSwgU3RyaW5nIHN0cmluZykKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRyeSAoRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShhY3RGaWxlKSkgewotCQkJZm9zLndyaXRlKHN0cmluZy5nZXRCeXRlcyhVVEZfOCkpOworCQkJZm9zLndyaXRlKHN0cmluZy5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCX0KIAl9CiAKQEAgLTQxMCw3ICs0MTAsNyBAQAogCQkJCWJvcy53cml0ZShidWZmZXIsIDAsIHJlYWQpOwogCQkJCXJlYWQgPSBmaXMucmVhZChidWZmZXIpOwogCQkJfQotCQkJU3RyaW5nIGNvbnRlbnQgPSBuZXcgU3RyaW5nKGJvcy50b0J5dGVBcnJheSgpLCBVVEZfOCk7CisJCQlTdHJpbmcgY29udGVudCA9IG5ldyBTdHJpbmcoYm9zLnRvQnl0ZUFycmF5KCksIENIQVJTRVQpOwogCQkJYXNzZXJ0RXF1YWxzKHN0cmluZywgY29udGVudCk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1c2hDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdXNoQ29tbWFuZFRlc3QuamF2YQppbmRleCBlMGMxNDk5Li4xYWYzN2UyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1c2hDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVzaENvbW1hbmRUZXN0LmphdmEKQEAgLTE1Miw3ICsxNTIsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBGaWxlIHdyaXRlSG9va0ZpbGUoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBkYXRhKQorCXByaXZhdGUgRmlsZSB3cml0ZUhvb2tGaWxlKFN0cmluZyBuYW1lLCBTdHJpbmcgZGF0YSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCUZpbGUgcGF0aCA9IG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCkgKyAiLy5naXQvaG9va3MvIiwgbmFtZSk7CiAJCUpHaXRUZXN0VXRpbC53cml0ZShwYXRoLCBkYXRhKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmViYXNlQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmViYXNlQ29tbWFuZFRlc3QuamF2YQppbmRleCAyYmY5MWFlLi45NmU3MDkxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1JlYmFzZUNvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZWJhc2VDb21tYW5kVGVzdC5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5hcGk7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOwogaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLm5vdDsKIGltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKQEAgLTE0NjQsNyArMTQ2NCw3IEBACiAJCWFzc2VydEVxdWFscygiR0lUX0FVVEhPUl9EQVRFPSdAMTIzNDU2Nzg5IC0wMTAwJyIsIGxpbmVzWzJdKTsKIAogCQlQZXJzb25JZGVudCBwYXJzZWRJZGVudCA9IGdpdC5yZWJhc2UoKS5wYXJzZUF1dGhvcigKLQkJCQljb252ZXJ0ZWRBdXRob3IuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCQljb252ZXJ0ZWRBdXRob3IuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlhc3NlcnRFcXVhbHMoaWRlbnQuZ2V0TmFtZSgpLCBwYXJzZWRJZGVudC5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoaWRlbnQuZ2V0RW1haWxBZGRyZXNzKCksIHBhcnNlZElkZW50LmdldEVtYWlsQWRkcmVzcygpKTsKIAkJLy8gdGhpcyBpcyByb3VuZGVkIHRvIHRoZSBsYXN0IHNlY29uZApAQCAtMTQ4MSw3ICsxNDgxLDcgQEAKIAkJYXNzZXJ0RXF1YWxzKCJHSVRfQVVUSE9SX0RBVEU9J0AxMjM0NTY3ODkgKzA5MzAnIiwgbGluZXNbMl0pOwogCiAJCXBhcnNlZElkZW50ID0gZ2l0LnJlYmFzZSgpLnBhcnNlQXV0aG9yKAotCQkJCWNvbnZlcnRlZEF1dGhvci5nZXRCeXRlcyhVVEZfOCkpOworCQkJCWNvbnZlcnRlZEF1dGhvci5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWFzc2VydEVxdWFscyhpZGVudC5nZXROYW1lKCksIHBhcnNlZElkZW50LmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscyhpZGVudC5nZXRFbWFpbEFkZHJlc3MoKSwgcGFyc2VkSWRlbnQuZ2V0RW1haWxBZGRyZXNzKCkpOwogCQlhc3NlcnRFcXVhbHMoMTIzNDU2Nzg5MDAwTCwgcGFyc2VkSWRlbnQuZ2V0V2hlbigpLmdldFRpbWUoKSk7CkBAIC0yMTA0LDcgKzIxMDQsNyBAQAogCQlpbnQgY291bnQgPSAwOwogCQlGaWxlIHRvZG9GaWxlID0gZ2V0VG9kb0ZpbGUoKTsKIAkJdHJ5IChCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoCi0JCQkJbmV3IEZpbGVJbnB1dFN0cmVhbSh0b2RvRmlsZSksIFVURl84KSkpIHsKKwkJCQluZXcgRmlsZUlucHV0U3RyZWFtKHRvZG9GaWxlKSwgQ0hBUlNFVCkpKSB7CiAJCQlTdHJpbmcgbGluZSA9IGJyLnJlYWRMaW5lKCk7CiAJCQl3aGlsZSAobGluZSAhPSBudWxsKSB7CiAJCQkJaW50IGZpcnN0QmxhbmsgPSBsaW5lLmluZGV4T2YoJyAnKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmVzZXRDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZXNldENvbW1hbmRUZXN0LmphdmEKaW5kZXggYmE1MTg4MS4uOGY1NmE5MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZXNldENvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZXNldENvbW1hbmRUZXN0LmphdmEKQEAgLTEwMCwzOSArMTAwLDM5IEBACiAJCUZpbGUgbmVzdGVkRmlsZSA9IG5ldyBGaWxlKGRpciwgImIudHh0Iik7CiAJCUZpbGVVdGlscy5jcmVhdGVOZXdGaWxlKG5lc3RlZEZpbGUpOwogCi0JCVByaW50V3JpdGVyIG5lc3RlckZpbGVXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIobmVzdGVkRmlsZSk7Ci0JCW5lc3RlckZpbGVXcml0ZXIucHJpbnQoImNvbnRlbnQiKTsKLQkJbmVzdGVyRmlsZVdyaXRlci5mbHVzaCgpOworCQl0cnkgKFByaW50V3JpdGVyIG5lc3RlZEZpbGVXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIobmVzdGVkRmlsZSkpIHsKKwkJCW5lc3RlZEZpbGVXcml0ZXIucHJpbnQoImNvbnRlbnQiKTsKKwkJCW5lc3RlZEZpbGVXcml0ZXIuZmx1c2goKTsKIAotCQkvLyBjcmVhdGUgZmlsZQotCQlpbmRleEZpbGUgPSBuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLCAiYS50eHQiKTsKLQkJRmlsZVV0aWxzLmNyZWF0ZU5ld0ZpbGUoaW5kZXhGaWxlKTsKLQkJUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKGluZGV4RmlsZSk7Ci0JCXdyaXRlci5wcmludCgiY29udGVudCIpOwotCQl3cml0ZXIuZmx1c2goKTsKKwkJCS8vIGNyZWF0ZSBmaWxlCisJCQlpbmRleEZpbGUgPSBuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLCAiYS50eHQiKTsKKwkJCUZpbGVVdGlscy5jcmVhdGVOZXdGaWxlKGluZGV4RmlsZSk7CisJCQl0cnkgKFByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihpbmRleEZpbGUpKSB7CisJCQkJd3JpdGVyLnByaW50KCJjb250ZW50Iik7CisJCQkJd3JpdGVyLmZsdXNoKCk7CiAKLQkJLy8gYWRkIGZpbGUgYW5kIGNvbW1pdCBpdAotCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImRpciIpLmFkZEZpbGVwYXR0ZXJuKCJhLnR4dCIpLmNhbGwoKTsKLQkJc2Vjb25kQ29tbWl0ID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZGluZyBhLnR4dCBhbmQgZGlyL2IudHh0IikKLQkJCQkuY2FsbCgpOworCQkJCS8vIGFkZCBmaWxlIGFuZCBjb21taXQgaXQKKwkJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImRpciIpLmFkZEZpbGVwYXR0ZXJuKCJhLnR4dCIpLmNhbGwoKTsKKwkJCQlzZWNvbmRDb21taXQgPSBnaXQuY29tbWl0KCkKKwkJCQkJCS5zZXRNZXNzYWdlKCJhZGRpbmcgYS50eHQgYW5kIGRpci9iLnR4dCIpLmNhbGwoKTsKIAotCQlwcmVzdGFnZSA9IERpckNhY2hlLnJlYWQoZGIuZ2V0SW5kZXhGaWxlKCksIGRiLmdldEZTKCkpLmdldEVudHJ5KAotCQkJCWluZGV4RmlsZS5nZXROYW1lKCkpOworCQkJCXByZXN0YWdlID0gRGlyQ2FjaGUucmVhZChkYi5nZXRJbmRleEZpbGUoKSwgZGIuZ2V0RlMoKSkKKwkJCQkJCS5nZXRFbnRyeShpbmRleEZpbGUuZ2V0TmFtZSgpKTsKIAotCQkvLyBtb2RpZnkgZmlsZSBhbmQgYWRkIHRvIGluZGV4Ci0JCXdyaXRlci5wcmludCgibmV3IGNvbnRlbnQiKTsKLQkJd3JpdGVyLmNsb3NlKCk7Ci0JCW5lc3RlckZpbGVXcml0ZXIucHJpbnQoIm5ldyBjb250ZW50Iik7Ci0JCW5lc3RlckZpbGVXcml0ZXIuY2xvc2UoKTsKKwkJCQkvLyBtb2RpZnkgZmlsZSBhbmQgYWRkIHRvIGluZGV4CisJCQkJd3JpdGVyLnByaW50KCJuZXcgY29udGVudCIpOworCQkJfQorCQkJbmVzdGVkRmlsZVdyaXRlci5wcmludCgibmV3IGNvbnRlbnQiKTsKKwkJfQogCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImEudHh0IikuYWRkRmlsZXBhdHRlcm4oImRpciIpLmNhbGwoKTsKIAogCQkvLyBjcmVhdGUgYSBmaWxlIG5vdCBhZGRlZCB0byB0aGUgaW5kZXgKIAkJdW50cmFja2VkRmlsZSA9IG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksCiAJCQkJIm5vdEFkZGVkVG9JbmRleC50eHQiKTsKIAkJRmlsZVV0aWxzLmNyZWF0ZU5ld0ZpbGUodW50cmFja2VkRmlsZSk7Ci0JCVByaW50V3JpdGVyIHdyaXRlcjIgPSBuZXcgUHJpbnRXcml0ZXIodW50cmFja2VkRmlsZSk7Ci0JCXdyaXRlcjIucHJpbnQoImNvbnRlbnQiKTsKLQkJd3JpdGVyMi5jbG9zZSgpOworCQl0cnkgKFByaW50V3JpdGVyIHdyaXRlcjIgPSBuZXcgUHJpbnRXcml0ZXIodW50cmFja2VkRmlsZSkpIHsKKwkJCXdyaXRlcjIucHJpbnQoImNvbnRlbnQiKTsKKwkJfQogCX0KIAogCUBUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1JldmVydENvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1JldmVydENvbW1hbmRUZXN0LmphdmEKaW5kZXggZWE2MzEwNC4uZDc3YzRlMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZXZlcnRDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmV2ZXJ0Q29tbWFuZFRlc3QuamF2YQpAQCAtMzc5LDcgKzM3OSw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIFJldkNvbW1pdCBwcmVwYXJlUmV2ZXJ0KGZpbmFsIEdpdCBnaXQpIHRocm93cyBFeGNlcHRpb24geworCXByaXZhdGUgUmV2Q29tbWl0IHByZXBhcmVSZXZlcnQoR2l0IGdpdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCS8vIGNyZWF0ZSwgYWRkIGFuZCBjb21taXQgZmlsZSBhCiAJCXdyaXRlVHJhc2hGaWxlKCJhIiwgImEiKTsKIAkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJhIikuY2FsbCgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGFzaENyZWF0ZUNvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoQ3JlYXRlQ29tbWFuZFRlc3QuamF2YQppbmRleCBiOWY5ZjViLi4zYjU4MmQ3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoQ3JlYXRlQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoQ3JlYXRlQ29tbWFuZFRlc3QuamF2YQpAQCAtOTQsNyArOTQsNyBAQAogCQl1bnRyYWNrZWRGaWxlID0gd3JpdGVUcmFzaEZpbGUoInVudHJhY2tlZC50eHQiLCAiY29udGVudCIpOwogCX0KIAotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVN0YXNoZWRDb21taXQoZmluYWwgUmV2Q29tbWl0IGNvbW1pdCkKKwlwcml2YXRlIHZvaWQgdmFsaWRhdGVTdGFzaGVkQ29tbWl0KFJldkNvbW1pdCBjb21taXQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl2YWxpZGF0ZVN0YXNoZWRDb21taXQoY29tbWl0LCAyKTsKIAl9CkBAIC0xNDAsNyArMTQwLDcgQEAKIAkJcmV0dXJuIHdhbGs7CiAJfQogCi0JcHJpdmF0ZSBMaXN0PERpZmZFbnRyeT4gZGlmZldvcmtpbmdBZ2FpbnN0SGVhZChmaW5hbCBSZXZDb21taXQgY29tbWl0KQorCXByaXZhdGUgTGlzdDxEaWZmRW50cnk+IGRpZmZXb3JraW5nQWdhaW5zdEhlYWQoUmV2Q29tbWl0IGNvbW1pdCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRyeSAoVHJlZVdhbGsgd2FsayA9IGNyZWF0ZVRyZWVXYWxrKCkpIHsKIAkJCXdhbGsuYWRkVHJlZShjb21taXQuZ2V0UGFyZW50KDApLmdldFRyZWUoKSk7CkBAIC0xNDksNyArMTQ5LDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgTGlzdDxEaWZmRW50cnk+IGRpZmZJbmRleEFnYWluc3RIZWFkKGZpbmFsIFJldkNvbW1pdCBjb21taXQpCisJcHJpdmF0ZSBMaXN0PERpZmZFbnRyeT4gZGlmZkluZGV4QWdhaW5zdEhlYWQoUmV2Q29tbWl0IGNvbW1pdCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRyeSAoVHJlZVdhbGsgd2FsayA9IGNyZWF0ZVRyZWVXYWxrKCkpIHsKIAkJCXdhbGsuYWRkVHJlZShjb21taXQuZ2V0UGFyZW50KDApLmdldFRyZWUoKSk7CkBAIC0xNTgsNyArMTU4LDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgTGlzdDxEaWZmRW50cnk+IGRpZmZJbmRleEFnYWluc3RXb3JraW5nKGZpbmFsIFJldkNvbW1pdCBjb21taXQpCisJcHJpdmF0ZSBMaXN0PERpZmZFbnRyeT4gZGlmZkluZGV4QWdhaW5zdFdvcmtpbmcoUmV2Q29tbWl0IGNvbW1pdCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRyeSAoVHJlZVdhbGsgd2FsayA9IGNyZWF0ZVRyZWVXYWxrKCkpIHsKIAkJCXdhbGsuYWRkVHJlZShjb21taXQuZ2V0UGFyZW50KDEpLmdldFRyZWUoKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1RhZ0NvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1RhZ0NvbW1hbmRUZXN0LmphdmEKaW5kZXggODcwOThiNi4uYTIyMGU3NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9UYWdDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvVGFnQ29tbWFuZFRlc3QuamF2YQpAQCAtNDIsNiArNDIsNyBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuYXBpOwogCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5SX1RBR1M7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKQEAgLTY2LDE5ICs2NywyMiBAQAogCQkJCVJldldhbGsgd2FsayA9IG5ldyBSZXZXYWxrKGRiKSkgewogCQkJUmV2Q29tbWl0IGNvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJpbml0aWFsIGNvbW1pdCIpLmNhbGwoKTsKIAkJCVJlZiB0YWdSZWYgPSBnaXQudGFnKCkuc2V0TmFtZSgidGFnIikuY2FsbCgpOwotCQkJYXNzZXJ0RXF1YWxzKGNvbW1pdC5nZXRJZCgpLCBkYi5wZWVsKHRhZ1JlZikuZ2V0UGVlbGVkT2JqZWN0SWQoKSk7CisJCQlhc3NlcnRFcXVhbHMoY29tbWl0LmdldElkKCksCisJCQkJCWRiLmdldFJlZkRhdGFiYXNlKCkucGVlbCh0YWdSZWYpLmdldFBlZWxlZE9iamVjdElkKCkpOwogCQkJYXNzZXJ0RXF1YWxzKCJ0YWciLCB3YWxrLnBhcnNlVGFnKHRhZ1JlZi5nZXRPYmplY3RJZCgpKS5nZXRUYWdOYW1lKCkpOwogCQl9CiAJfQogCiAJQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0VGFnZ2luZygpIHRocm93cyBHaXRBUElFeGNlcHRpb24sIEpHaXRJbnRlcm5hbEV4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgdGVzdFRhZ2dpbmcoKQorCQkJdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgSkdpdEludGVybmFsRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpKSB7CiAJCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiaW5pdGlhbCBjb21taXQiKS5jYWxsKCk7CiAJCQlSZXZDb21taXQgY29tbWl0ID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoInNlY29uZCBjb21taXQiKS5jYWxsKCk7CiAJCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgidGhpcmQgY29tbWl0IikuY2FsbCgpOwogCQkJUmVmIHRhZ1JlZiA9IGdpdC50YWcoKS5zZXRPYmplY3RJZChjb21taXQpLnNldE5hbWUoInRhZyIpLmNhbGwoKTsKLQkJCWFzc2VydEVxdWFscyhjb21taXQuZ2V0SWQoKSwgZGIucGVlbCh0YWdSZWYpLmdldFBlZWxlZE9iamVjdElkKCkpOworCQkJYXNzZXJ0RXF1YWxzKGNvbW1pdC5nZXRJZCgpLAorCQkJCQlkYi5nZXRSZWZEYXRhYmFzZSgpLnBlZWwodGFnUmVmKS5nZXRQZWVsZWRPYmplY3RJZCgpKTsKIAkJfQogCX0KIApAQCAtMTM1LDI2ICsxMzksMzAgQEAKIAkJfQogCX0KIAorCXByaXZhdGUgTGlzdDxSZWY+IGdldFRhZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmc0J5UHJlZml4KFJfVEFHUyk7CisJfQorCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpKSB7CiAJCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiaW5pdGlhbCBjb21taXQiKS5jYWxsKCk7CiAJCQlSZWYgdGFnUmVmID0gZ2l0LnRhZygpLnNldE5hbWUoInRhZyIpLmNhbGwoKTsKLQkJCWFzc2VydEVxdWFscygxLCBkYi5nZXRUYWdzKCkuc2l6ZSgpKTsKKwkJCWFzc2VydEVxdWFscygxLCBnZXRUYWdzKCkuc2l6ZSgpKTsKIAogCQkJTGlzdDxTdHJpbmc+IGRlbGV0ZWQgPSBnaXQudGFnRGVsZXRlKCkuc2V0VGFncyh0YWdSZWYuZ2V0TmFtZSgpKQogCQkJCQkuY2FsbCgpOwogCQkJYXNzZXJ0RXF1YWxzKDEsIGRlbGV0ZWQuc2l6ZSgpKTsKIAkJCWFzc2VydEVxdWFscyh0YWdSZWYuZ2V0TmFtZSgpLCBkZWxldGVkLmdldCgwKSk7Ci0JCQlhc3NlcnRFcXVhbHMoMCwgZGIuZ2V0VGFncygpLnNpemUoKSk7CisJCQlhc3NlcnRFcXVhbHMoMCwgZ2V0VGFncygpLnNpemUoKSk7CiAKIAkJCVJlZiB0YWdSZWYxID0gZ2l0LnRhZygpLnNldE5hbWUoInRhZzEiKS5jYWxsKCk7CiAJCQlSZWYgdGFnUmVmMiA9IGdpdC50YWcoKS5zZXROYW1lKCJ0YWcyIikuY2FsbCgpOwotCQkJYXNzZXJ0RXF1YWxzKDIsIGRiLmdldFRhZ3MoKS5zaXplKCkpOworCQkJYXNzZXJ0RXF1YWxzKDIsIGdldFRhZ3MoKS5zaXplKCkpOwogCQkJZGVsZXRlZCA9IGdpdC50YWdEZWxldGUoKS5zZXRUYWdzKHRhZ1JlZjEuZ2V0TmFtZSgpLCB0YWdSZWYyLmdldE5hbWUoKSkKIAkJCQkJLmNhbGwoKTsKIAkJCWFzc2VydEVxdWFscygyLCBkZWxldGVkLnNpemUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoMCwgZGIuZ2V0VGFncygpLnNpemUoKSk7CisJCQlhc3NlcnRFcXVhbHMoMCwgZ2V0VGFncygpLnNpemUoKSk7CiAJCX0KIAl9CiAKQEAgLTE2MywxMyArMTcxLDEzIEBACiAJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpKSB7CiAJCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiaW5pdGlhbCBjb21taXQiKS5jYWxsKCk7CiAJCQlSZWYgdGFnUmVmID0gZ2l0LnRhZygpLnNldE5hbWUoInRhZyIpLmNhbGwoKTsKLQkJCWFzc2VydEVxdWFscygxLCBkYi5nZXRUYWdzKCkuc2l6ZSgpKTsKKwkJCWFzc2VydEVxdWFscygxLCBnZXRUYWdzKCkuc2l6ZSgpKTsKIAogCQkJTGlzdDxTdHJpbmc+IGRlbGV0ZWQgPSBnaXQudGFnRGVsZXRlKCkKIAkJCQkJLnNldFRhZ3MoUmVwb3NpdG9yeS5zaG9ydGVuUmVmTmFtZSh0YWdSZWYuZ2V0TmFtZSgpKSkuY2FsbCgpOwogCQkJYXNzZXJ0RXF1YWxzKDEsIGRlbGV0ZWQuc2l6ZSgpKTsKIAkJCWFzc2VydEVxdWFscyh0YWdSZWYuZ2V0TmFtZSgpLCBkZWxldGVkLmdldCgwKSk7Ci0JCQlhc3NlcnRFcXVhbHMoMCwgZGIuZ2V0VGFncygpLnNpemUoKSk7CisJCQlhc3NlcnRFcXVhbHMoMCwgZ2V0VGFncygpLnNpemUoKSk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0Fic3RyYWN0RGlmZlRlc3RDYXNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlmZi9BYnN0cmFjdERpZmZUZXN0Q2FzZS5qYXZhCmluZGV4IDBmMTNhNjguLjMyZjM0MjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0Fic3RyYWN0RGlmZlRlc3RDYXNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvQWJzdHJhY3REaWZmVGVzdENhc2UuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuZGlmZjsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCkBAIC0yNDAsNiArMjQwLDYgQEAKIAkJCXIuYXBwZW5kKHRleHQuY2hhckF0KGkpKTsKIAkJCXIuYXBwZW5kKCdcbicpOwogCQl9Ci0JCXJldHVybiBuZXcgUmF3VGV4dChyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJcmV0dXJuIG5ldyBSYXdUZXh0KHIudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvRGlmZkZvcm1hdHRlclJlZmxvd1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0RpZmZGb3JtYXR0ZXJSZWZsb3dUZXN0LmphdmEKaW5kZXggNDllNWQxYi4uMGUzNDRmNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvRGlmZkZvcm1hdHRlclJlZmxvd1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlmZi9EaWZmRm9ybWF0dGVyUmVmbG93VGVzdC5qYXZhCkBAIC0xNDYsNyArMTQ2LDcgQEAKIAkJYXNzZXJ0Rm9ybWF0dGVkKCJaLnBhdGNoIik7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGluaXQoZmluYWwgU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIGluaXQoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWEgPSBuZXcgUmF3VGV4dChyZWFkRmlsZShuYW1lICsgIl9QcmVJbWFnZSIpKTsKIAkJYiA9IG5ldyBSYXdUZXh0KHJlYWRGaWxlKG5hbWUgKyAiX1Bvc3RJbWFnZSIpKTsKIAkJZmlsZSA9IHBhcnNlVGVzdFBhdGNoRmlsZShuYW1lICsgIi5wYXRjaCIpLmdldEZpbGVzKCkuZ2V0KDApOwpAQCAtMTU2LDEzICsxNTYsMTMgQEAKIAkJYXNzZXJ0Rm9ybWF0dGVkKEpHaXRUZXN0VXRpbC5nZXROYW1lKCkgKyAiLm91dCIpOwogCX0KIAotCXByaXZhdGUgdm9pZCBhc3NlcnRGb3JtYXR0ZWQoZmluYWwgU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIGFzc2VydEZvcm1hdHRlZChTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZm10LmZvcm1hdChmaWxlLCBhLCBiKTsKIAkJZmluYWwgU3RyaW5nIGV4cCA9IFJhd1BhcnNlVXRpbHMuZGVjb2RlKHJlYWRGaWxlKG5hbWUpKTsKIAkJYXNzZXJ0RXF1YWxzKGV4cCwgUmF3UGFyc2VVdGlscy5kZWNvZGUob3V0LnRvQnl0ZUFycmF5KCkpKTsKIAl9CiAKLQlwcml2YXRlIGJ5dGVbXSByZWFkRmlsZShmaW5hbCBTdHJpbmcgcGF0Y2hGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgYnl0ZVtdIHJlYWRGaWxlKFN0cmluZyBwYXRjaEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIElucHV0U3RyZWFtIGluID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGNoRmlsZSk7CiAJCWlmIChpbiA9PSBudWxsKSB7CiAJCQlmYWlsKCJObyAiICsgcGF0Y2hGaWxlICsgIiB0ZXN0IHZlY3RvciIpOwpAQCAtMTgwLDcgKzE4MCw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIFBhdGNoIHBhcnNlVGVzdFBhdGNoRmlsZShmaW5hbCBTdHJpbmcgcGF0Y2hGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgUGF0Y2ggcGFyc2VUZXN0UGF0Y2hGaWxlKFN0cmluZyBwYXRjaEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRyeSAoSW5wdXRTdHJlYW0gaW4gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0ocGF0Y2hGaWxlKSkgewogCQkJaWYgKGluID09IG51bGwpIHsKIAkJCQlmYWlsKCJObyAiICsgcGF0Y2hGaWxlICsgIiB0ZXN0IHZlY3RvciIpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvUmF3VGV4dFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1Jhd1RleHRUZXN0LmphdmEKaW5kZXggNmFkNTliOS4uNThhOGIyZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvUmF3VGV4dFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlmZi9SYXdUZXh0VGVzdC5qYXZhCkBAIC00NCw3ICs0NCw4IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5kaWZmOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0QXJyYXlFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CkBAIC02NSw2ICs2NiwxNiBAQAogCX0KIAogCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEJpbmFyeSgpIHsKKwkJU3RyaW5nIGlucHV0ID0gImZvby1hXG5mXDBvLWJcbiI7CisJCWJ5dGVbXSBkYXRhID0gQ29uc3RhbnRzLmVuY29kZUFTQ0lJKGlucHV0KTsKKwkJZmluYWwgUmF3VGV4dCBhID0gbmV3IFJhd1RleHQoZGF0YSk7CisJCWFzc2VydEFycmF5RXF1YWxzKGEuY29udGVudCwgZGF0YSk7CisJCWFzc2VydEVxdWFscyhhLnNpemUoKSwgMSk7CisJCWFzc2VydEVxdWFscyhhLmdldFN0cmluZygwLCAxLCBmYWxzZSksIGlucHV0KTsKKwl9CisKKwlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7CiAJCWZpbmFsIFJhd1RleHQgYSA9IG5ldyBSYXdUZXh0KENvbnN0YW50cy5lbmNvZGVBU0NJSSgiZm9vLWFcbmZvby1iXG4iKSk7CiAJCWZpbmFsIFJhd1RleHQgYiA9IG5ldyBSYXdUZXh0KENvbnN0YW50cy5lbmNvZGVBU0NJSSgiZm9vLWJcbmZvby1jXG4iKSk7CkBAIC0xMzYsOCArMTQ3LDggQEAKIAkJZSA9IGMucmVkdWNlQ29tbW9uU3RhcnRFbmQodCgiYWJReHkiKSwgdCgiYWJSeHkiKSwgZSk7CiAJCWFzc2VydEVxdWFscyhuZXcgRWRpdCgyLCAzLCAyLCAzKSwgZSk7CiAKLQkJUmF3VGV4dCBhID0gbmV3IFJhd1RleHQoInBcbmEgYlxuUVxuYyBkXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCVJhd1RleHQgYiA9IG5ldyBSYXdUZXh0KCJwXG5hICBiIFxuUlxuIGMgIGQgXG4iLmdldEJ5dGVzKFVURl84KSk7CisJCVJhd1RleHQgYSA9IG5ldyBSYXdUZXh0KCJwXG5hIGJcblFcbmMgZFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCVJhd1RleHQgYiA9IG5ldyBSYXdUZXh0KCJwXG5hICBiIFxuUlxuIGMgIGQgXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJZSA9IG5ldyBFZGl0KDAsIDQsIDAsIDQpOwogCQllID0gUmF3VGV4dENvbXBhcmF0b3IuV1NfSUdOT1JFX0FMTC5yZWR1Y2VDb21tb25TdGFydEVuZChhLCBiLCBlKTsKIAkJYXNzZXJ0RXF1YWxzKG5ldyBFZGl0KDIsIDMsIDIsIDMpLCBlKTsKQEAgLTE0OSwxNCArMTYwLDE0IEBACiAJCVJhd1RleHQgYjsKIAkJRWRpdCBlOwogCi0JCWEgPSBuZXcgUmF3VGV4dCgiUlxuIHlcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYiA9IG5ldyBSYXdUZXh0KCJTXG5cbiB5XG4iLmdldEJ5dGVzKFVURl84KSk7CisJCWEgPSBuZXcgUmF3VGV4dCgiUlxuIHlcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliID0gbmV3IFJhd1RleHQoIlNcblxuIHlcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQllID0gbmV3IEVkaXQoMCwgMiwgMCwgMyk7CiAJCWUgPSBSYXdUZXh0Q29tcGFyYXRvci5ERUZBVUxULnJlZHVjZUNvbW1vblN0YXJ0RW5kKGEsIGIsIGUpOwogCQlhc3NlcnRFcXVhbHMobmV3IEVkaXQoMCwgMSwgMCwgMiksIGUpOwogCi0JCWEgPSBuZXcgUmF3VGV4dCgiU1xuXG4geVxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliID0gbmV3IFJhd1RleHQoIlJcbiB5XG4iLmdldEJ5dGVzKFVURl84KSk7CisJCWEgPSBuZXcgUmF3VGV4dCgiU1xuXG4geVxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIgPSBuZXcgUmF3VGV4dCgiUlxuIHlcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQllID0gbmV3IEVkaXQoMCwgMywgMCwgMik7CiAJCWUgPSBSYXdUZXh0Q29tcGFyYXRvci5ERUZBVUxULnJlZHVjZUNvbW1vblN0YXJ0RW5kKGEsIGIsIGUpOwogCQlhc3NlcnRFcXVhbHMobmV3IEVkaXQoMCwgMiwgMCwgMSksIGUpOwpAQCAtMTY3LDggKzE3OCw4IEBACiAJCVJhd1RleHQgYTsKIAkJUmF3VGV4dCBiOwogCQlFZGl0IGU7Ci0JCWEgPSBuZXcgUmF3VGV4dCgic3RhcnQiLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIgPSBuZXcgUmF3VGV4dCgic3RhcnQgb2YgbGluZSIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYSA9IG5ldyBSYXdUZXh0KCJzdGFydCIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliID0gbmV3IFJhd1RleHQoInN0YXJ0IG9mIGxpbmUiLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJZSA9IG5ldyBFZGl0KDAsIDEsIDAsIDEpOwogCQllID0gUmF3VGV4dENvbXBhcmF0b3IuREVGQVVMVC5yZWR1Y2VDb21tb25TdGFydEVuZChhLCBiLCBlKTsKIAkJYXNzZXJ0RXF1YWxzKG5ldyBFZGl0KDAsIDEsIDAsIDEpLCBlKTsKQEAgLTE3OSw4ICsxOTAsOCBAQAogCQlSYXdUZXh0IGE7CiAJCVJhd1RleHQgYjsKIAkJRWRpdCBlOwotCQlhID0gbmV3IFJhd1RleHQoInN0YXJ0Ii5nZXRCeXRlcyhVVEZfOCkpOwotCQliID0gbmV3IFJhd1RleHQoInN0YXJ0IG9mXG5sYXN0bGluZSIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYSA9IG5ldyBSYXdUZXh0KCJzdGFydCIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliID0gbmV3IFJhd1RleHQoInN0YXJ0IG9mXG5sYXN0bGluZSIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQllID0gbmV3IEVkaXQoMCwgMSwgMCwgMik7CiAJCWUgPSBSYXdUZXh0Q29tcGFyYXRvci5ERUZBVUxULnJlZHVjZUNvbW1vblN0YXJ0RW5kKGEsIGIsIGUpOwogCQlhc3NlcnRFcXVhbHMobmV3IEVkaXQoMCwgMSwgMCwgMiksIGUpOwpAQCAtMjM5LDYgKzI1MCw2IEBACiAJCQlyLmFwcGVuZCh0ZXh0LmNoYXJBdChpKSk7CiAJCQlyLmFwcGVuZCgnXG4nKTsKIAkJfQotCQlyZXR1cm4gbmV3IFJhd1RleHQoci50b1N0cmluZygpLmdldEJ5dGVzKFVURl84KSk7CisJCXJldHVybiBuZXcgUmF3VGV4dChyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1NpbWlsYXJpdHlJbmRleFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1NpbWlsYXJpdHlJbmRleFRlc3QuamF2YQppbmRleCBmMTY4ZTgzLi41MWE2ZjgxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlmZi9TaW1pbGFyaXR5SW5kZXhUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvU2ltaWxhcml0eUluZGV4VGVzdC5qYXZhCkBAIC00Myw3ICs0Myw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5kaWZmOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKQEAgLTgyLDcgKzgyLDcgQEAKIAkJCQkrICJBXG4iIC8vCiAJCQkJKyAiQlxuIiAvLwogCQkJCSsgIkJcbiIgLy8KLQkJCQkrICJCXG4iKS5nZXRCeXRlcyhVVEZfOCk7CisJCQkJKyAiQlxuIikuZ2V0Qnl0ZXMoQ0hBUlNFVCk7CiAJCVNpbWlsYXJpdHlJbmRleCBzaSA9IG5ldyBTaW1pbGFyaXR5SW5kZXgoKTsKIAkJc2kuaGFzaChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oaW4pLCBpbi5sZW5ndGgsIGZhbHNlKTsKIAkJYXNzZXJ0RXF1YWxzKDIsIHNpLnNpemUoKSk7CkBAIC0xMzAsMTIgKzEzMCwxMiBAQAogCQkJCSsgIkRcclxuIiAvLwogCQkJCSsgIkJcclxuIjsKIAkJU2ltaWxhcml0eUluZGV4IHNyYyA9IG5ldyBTaW1pbGFyaXR5SW5kZXgoKTsKLQkJYnl0ZVtdIGJ5dGVzMSA9IHRleHQuZ2V0Qnl0ZXMoVVRGXzgpOworCQlieXRlW10gYnl0ZXMxID0gdGV4dC5nZXRCeXRlcyhDSEFSU0VUKTsKIAkJc3JjLmhhc2gobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzMSksIGJ5dGVzMS5sZW5ndGgsIHRydWUpOwogCQlzcmMuc29ydCgpOwogCiAJCVNpbWlsYXJpdHlJbmRleCBkc3QgPSBuZXcgU2ltaWxhcml0eUluZGV4KCk7Ci0JCWJ5dGVbXSBieXRlczIgPSB0ZXh0LnJlcGxhY2UoIlxyIiwgIiIpLmdldEJ5dGVzKFVURl84KTsKKwkJYnl0ZVtdIGJ5dGVzMiA9IHRleHQucmVwbGFjZSgiXHIiLCAiIikuZ2V0Qnl0ZXMoQ0hBUlNFVCk7CiAJCWRzdC5oYXNoKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlczIpLCBieXRlczIubGVuZ3RoLCB0cnVlKTsKIAkJZHN0LnNvcnQoKTsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlQnVpbGRlckl0ZXJhdG9yVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlQnVpbGRlckl0ZXJhdG9yVGVzdC5qYXZhCmluZGV4IDJiMTA4ODcuLjM1OThmM2EgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUJ1aWxkZXJJdGVyYXRvclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVCdWlsZGVySXRlcmF0b3JUZXN0LmphdmEKQEAgLTc4LDcgKzc4LDcgQEAKIAogCQlmaW5hbCBpbnQgZXhwSWR4ID0gMjsKIAkJZmluYWwgRGlyQ2FjaGVCdWlsZGVyIGIgPSBkYy5idWlsZGVyKCk7Ci0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQl0dy5hZGRUcmVlKG5ldyBEaXJDYWNoZUJ1aWxkSXRlcmF0b3IoYikpOwogCQkJdHcuc2V0UmVjdXJzaXZlKHRydWUpOwogCQkJdHcuc2V0RmlsdGVyKFBhdGhGaWx0ZXJHcm91cC5jcmVhdGVGcm9tU3RyaW5ncyhDb2xsZWN0aW9ucwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlQ0dpdENvbXBhdGFiaWxpdHlUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVDR2l0Q29tcGF0YWJpbGl0eVRlc3QuamF2YQppbmRleCBkZWMxNzYyLi5jMzYyZTc0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVDR2l0Q29tcGF0YWJpbGl0eVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVDR2l0Q29tcGF0YWJpbGl0eVRlc3QuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGU7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKQEAgLTk5LDcgKzk5LDcgQEAKIAkJYXNzZXJ0RXF1YWxzKGxzLnNpemUoKSwgZGMuZ2V0RW50cnlDb3VudCgpKTsKIAkJewogCQkJZmluYWwgSXRlcmF0b3I8Q0dpdEluZGV4UmVjb3JkPiBySXRyID0gbHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCQl0cnkgKFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgewogCQkJCXR3LnNldFJlY3Vyc2l2ZSh0cnVlKTsKIAkJCQl0dy5hZGRUcmVlKG5ldyBEaXJDYWNoZUl0ZXJhdG9yKGRjKSk7CiAJCQkJd2hpbGUgKHJJdHIuaGFzTmV4dCgpKSB7CkBAIC0xODAsNyArMTgwLDcgQEAKIAkJYXNzZXJ0RXF1YWxzKGNMaXN0LnNpemUoKSwgalRyZWUuZ2V0RW50cnlTcGFuKCkpOwogCiAJCWZpbmFsIEFycmF5TGlzdDxDR2l0THNUcmVlUmVjb3JkPiBzdWJ0cmVlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotCQlmb3IgKGZpbmFsIENHaXRMc1RyZWVSZWNvcmQgciA6IGNUcmVlLnZhbHVlcygpKSB7CisJCWZvciAoQ0dpdExzVHJlZVJlY29yZCByIDogY1RyZWUudmFsdWVzKCkpIHsKIAkJCWlmIChGaWxlTW9kZS5UUkVFLmVxdWFscyhyLm1vZGUpKQogCQkJCXN1YnRyZWVzLmFkZChyKTsKIAkJfQpAQCAtMjI5LDE0ICsyMjksMTQgQEAKIAkJYXNzZXJ0RXF1YWxzKGludGVudFRvQWRkLCBlbnRyeS5pc0ludGVudFRvQWRkKCkpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIEZpbGUgcGF0aE9mKGZpbmFsIFN0cmluZyBuYW1lKSB7CisJcHJpdmF0ZSBzdGF0aWMgRmlsZSBwYXRoT2YoU3RyaW5nIG5hbWUpIHsKIAkJcmV0dXJuIEpHaXRUZXN0VXRpbC5nZXRUZXN0UmVzb3VyY2VGaWxlKG5hbWUpOwogCX0KIAogCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIENHaXRJbmRleFJlY29yZD4gcmVhZExzRmlsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgTGlua2VkSGFzaE1hcDxTdHJpbmcsIENHaXRJbmRleFJlY29yZD4gciA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKIAkJdHJ5IChCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoCi0JCQkJbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoT2YoImdpdGdpdC5sc2ZpbGVzIikpLCBVVEZfOCkpKSB7CisJCQkJbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoT2YoImdpdGdpdC5sc2ZpbGVzIikpLCBDSEFSU0VUKSkpIHsKIAkJCVN0cmluZyBsaW5lOwogCQkJd2hpbGUgKChsaW5lID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgewogCQkJCWZpbmFsIENHaXRJbmRleFJlY29yZCBjciA9IG5ldyBDR2l0SW5kZXhSZWNvcmQobGluZSk7CkBAIC0yNDksNyArMjQ5LDcgQEAKIAlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBDR2l0THNUcmVlUmVjb3JkPiByZWFkTHNUcmVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIExpbmtlZEhhc2hNYXA8U3RyaW5nLCBDR2l0THNUcmVlUmVjb3JkPiByID0gbmV3IExpbmtlZEhhc2hNYXA8PigpOwogCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcigKLQkJCQluZXcgRmlsZUlucHV0U3RyZWFtKHBhdGhPZigiZ2l0Z2l0LmxzdHJlZSIpKSwgVVRGXzgpKSkgeworCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aE9mKCJnaXRnaXQubHN0cmVlIikpLCBDSEFSU0VUKSkpIHsKIAkJCVN0cmluZyBsaW5lOwogCQkJd2hpbGUgKChsaW5lID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgewogCQkJCWZpbmFsIENHaXRMc1RyZWVSZWNvcmQgY3IgPSBuZXcgQ0dpdExzVHJlZVJlY29yZChsaW5lKTsKQEAgLTI2OCw3ICsyNjgsNyBAQAogCiAJCWZpbmFsIFN0cmluZyBwYXRoOwogCi0JCUNHaXRJbmRleFJlY29yZChmaW5hbCBTdHJpbmcgbGluZSkgeworCQlDR2l0SW5kZXhSZWNvcmQoU3RyaW5nIGxpbmUpIHsKIAkJCWZpbmFsIGludCB0YWIgPSBsaW5lLmluZGV4T2YoJ1x0Jyk7CiAJCQlmaW5hbCBpbnQgc3AxID0gbGluZS5pbmRleE9mKCcgJyk7CiAJCQlmaW5hbCBpbnQgc3AyID0gbGluZS5pbmRleE9mKCcgJywgc3AxICsgMSk7CkBAIC0yODYsNyArMjg2LDcgQEAKIAogCQlmaW5hbCBTdHJpbmcgcGF0aDsKIAotCQlDR2l0THNUcmVlUmVjb3JkKGZpbmFsIFN0cmluZyBsaW5lKSB7CisJCUNHaXRMc1RyZWVSZWNvcmQoU3RyaW5nIGxpbmUpIHsKIAkJCWZpbmFsIGludCB0YWIgPSBsaW5lLmluZGV4T2YoJ1x0Jyk7CiAJCQlmaW5hbCBpbnQgc3AxID0gbGluZS5pbmRleE9mKCcgJyk7CiAJCQlmaW5hbCBpbnQgc3AyID0gbGluZS5pbmRleE9mKCcgJywgc3AxICsgMSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVFbnRyeVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUVudHJ5VGVzdC5qYXZhCmluZGV4IDA1ZmEwMDcuLjg2ZTI4NTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUVudHJ5VGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUVudHJ5VGVzdC5qYXZhCkBAIC0xODMsNyArMTgzLDcgQEAKIAkJY29weU1ldGFEYXRhSGVscGVyKHRydWUpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgY29weU1ldGFEYXRhSGVscGVyKGZpbmFsIGJvb2xlYW4ga2VlcFN0YWdlKSB7CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb3B5TWV0YURhdGFIZWxwZXIoYm9vbGVhbiBrZWVwU3RhZ2UpIHsKIAkJRGlyQ2FjaGVFbnRyeSBlID0gbmV3IERpckNhY2hlRW50cnkoInNvbWUvcGF0aCIsIERpckNhY2hlRW50cnkuU1RBR0VfMik7CiAJCWUuc2V0QXNzdW1lVmFsaWQoZmFsc2UpOwogCQllLnNldENyZWF0aW9uVGltZSgyTCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVJdGVyYXRvclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUl0ZXJhdG9yVGVzdC5qYXZhCmluZGV4IGRkMjQyZTUuLjgyNTY1ZmMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUl0ZXJhdG9yVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUl0ZXJhdG9yVGVzdC5qYXZhCkBAIC03Niw3ICs3Niw3IEBACiAJCWZpbmFsIERpckNhY2hlIGRjID0gRGlyQ2FjaGUubmV3SW5Db3JlKCk7CiAJCWFzc2VydEVxdWFscygwLCBkYy5nZXRFbnRyeUNvdW50KCkpOwogCi0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQl0dy5hZGRUcmVlKG5ldyBEaXJDYWNoZUl0ZXJhdG9yKGRjKSk7CiAJCQlhc3NlcnRGYWxzZSh0dy5uZXh0KCkpOwogCQl9CkBAIC0xMjYsNyArMTI2LDcgQEAKIAkJYi5maW5pc2goKTsKIAogCQlmaW5hbCBEaXJDYWNoZUl0ZXJhdG9yIGkgPSBuZXcgRGlyQ2FjaGVJdGVyYXRvcihkYyk7Ci0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQl0dy5hZGRUcmVlKGkpOwogCQkJaW50IHBhdGhJZHggPSAwOwogCQkJd2hpbGUgKHR3Lm5leHQoKSkgewpAQCAtMTY0LDcgKzE2NCw3IEBACiAJCWZpbmFsIGludCBleHBQb3NbXSA9IHsgMCwgLTEsIDQgfTsKIAogCQlmaW5hbCBEaXJDYWNoZUl0ZXJhdG9yIGkgPSBuZXcgRGlyQ2FjaGVJdGVyYXRvcihkYyk7Ci0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQl0dy5hZGRUcmVlKGkpOwogCQkJdHcuc2V0UmVjdXJzaXZlKGZhbHNlKTsKIAkJCWludCBwYXRoSWR4ID0gMDsKQEAgLTIwNSw3ICsyMDUsNyBAQAogCQliLmZpbmlzaCgpOwogCiAJCWZpbmFsIERpckNhY2hlSXRlcmF0b3IgaSA9IG5ldyBEaXJDYWNoZUl0ZXJhdG9yKGRjKTsKLQkJdHJ5IChmaW5hbCBUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKKwkJdHJ5IChUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKIAkJCXR3LmFkZFRyZWUoaSk7CiAJCQl0dy5zZXRSZWN1cnNpdmUodHJ1ZSk7CiAJCQlpbnQgcGF0aElkeCA9IDA7CkBAIC0yNDAsNyArMjQwLDcgQEAKIAkJCWIuYWRkKGVudHNbaV0pOwogCQliLmZpbmlzaCgpOwogCi0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQl0dy5hZGRUcmVlKG5ldyBEaXJDYWNoZUl0ZXJhdG9yKGRjKSk7CiAJCQl0dy5zZXRSZWN1cnNpdmUodHJ1ZSk7CiAJCQlpbnQgcGF0aElkeCA9IDA7CkBAIC00MDIsNyArNDAyLDcgQEAKIAkJCWIuYWRkKGVudHNbaV0pOwogCQliLmZpbmlzaCgpOwogCi0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQlmb3IgKGludCB2aWN0aW1JZHggPSAwOyB2aWN0aW1JZHggPCBwYXRocy5sZW5ndGg7IHZpY3RpbUlkeCsrKSB7CiAJCQkJdHcucmVzZXQoKTsKIAkJCQl0dy5hZGRUcmVlKG5ldyBEaXJDYWNoZUl0ZXJhdG9yKGRjKSk7CkBAIC00MzAsNyArNDMwLDcgQEAKIAkJZmluYWwgRGlyQ2FjaGUgZGMgPSBEaXJDYWNoZS5yZWFkKHBhdGgsIEZTLkRFVEVDVEVEKTsKIAkJYXNzZXJ0RXF1YWxzKDIsIGRjLmdldEVudHJ5Q291bnQoKSk7CiAKLQkJdHJ5IChmaW5hbCBUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKKwkJdHJ5IChUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKIAkJCXR3LnNldFJlY3Vyc2l2ZSh0cnVlKTsKIAkJCXR3LmFkZFRyZWUobmV3IERpckNhY2hlSXRlcmF0b3IoZGMpKTsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlTGFyZ2VQYXRoVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlTGFyZ2VQYXRoVGVzdC5qYXZhCmluZGV4IGVmM2U2MTEuLmRmYzEzNmMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUxhcmdlUGF0aFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVMYXJnZVBhdGhUZXN0LmphdmEKQEAgLTgxLDcgKzgxLDcgQEAKIAkJdGVzdExvbmdQYXRoKDE2Mzg0KTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgdGVzdExvbmdQYXRoKGZpbmFsIGludCBsZW4pIHRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uLAorCXByaXZhdGUgdm9pZCB0ZXN0TG9uZ1BhdGgoaW50IGxlbikgdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24sCiAJCQlJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZyBsb25nUGF0aCA9IG1ha2VMb25nUGF0aChsZW4pOwogCQlmaW5hbCBTdHJpbmcgc2hvcnRQYXRoID0gIn5+fiBzaG9ydGVyLXBhdGgiOwpAQCAtMTE5LDcgKzExOSw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbWFrZUxvbmdQYXRoKGZpbmFsIGludCBsZW4pIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbWFrZUxvbmdQYXRoKGludCBsZW4pIHsKIAkJZmluYWwgU3RyaW5nQnVpbGRlciByID0gbmV3IFN0cmluZ0J1aWxkZXIobGVuKTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykKIAkJCXIuYXBwZW5kKCdhJyArIChpICUgMjYpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL01hbmlmZXN0UGFyc2VyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vTWFuaWZlc3RQYXJzZXJUZXN0LmphdmEKaW5kZXggYzk2NzNhNi4uNjlhNDhjYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vTWFuaWZlc3RQYXJzZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vTWFuaWZlc3RQYXJzZXJUZXN0LmphdmEKQEAgLTQyLDcgKzQyLDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG87CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKQEAgLTgyLDcgKzgyLDcgQEAKIAogCQlNYW5pZmVzdFBhcnNlciBwYXJzZXIgPSBuZXcgTWFuaWZlc3RQYXJzZXIoCiAJCQkJbnVsbCwgbnVsbCwgIm1hc3RlciIsIGJhc2VVcmwsIG51bGwsIG51bGwpOwotCQlwYXJzZXIucmVhZChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oeG1sQ29udGVudC50b1N0cmluZygpLmdldEJ5dGVzKFVURl84KSkpOworCQlwYXJzZXIucmVhZChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oeG1sQ29udGVudC50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpKSk7CiAJCS8vIFVuZmlsdGVyZWQgcHJvamVjdHMgc2hvdWxkIGhhdmUgdGhlbSBhbGwuCiAJCXJlc3VsdHMuY2xlYXIoKTsKIAkJcmVzdWx0cy5hZGQoImZvbyIpOwpAQCAtMTM2LDcgKzEzNiw3IEBACiAJCQkJYmFzZVVybCwgbnVsbCwgbnVsbCk7CiAJCXRyeSB7CiAJCQlwYXJzZXIucmVhZChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCi0JCQkJCXhtbENvbnRlbnQudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpKTsKKwkJCQkJeG1sQ29udGVudC50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpKSk7CiAJCQlmYWlsKCJNYW5pZmVzdFBhcnNlciBkaWQgbm90IHRocm93IGV4Y2VwdGlvbiBmb3IgbWlzc2luZyBmZXRjaCIpOwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAJCQlhc3NlcnRUcnVlKGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFNBWEV4Y2VwdGlvbik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvQ29tbWFuZFN5bWxpbmtUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvQ29tbWFuZFN5bWxpbmtUZXN0LmphdmEKaW5kZXggMzQxY2M0Zi4uNTQ4YjkwMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVwb0NvbW1hbmRTeW1saW5rVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlcG9Db21tYW5kU3ltbGlua1Rlc3QuamF2YQpAQCAtMTE5LDQ1ICsxMTksNDcgQEAKIAkJCQkJLnNldFVSSShyb290VXJpKS5jYWxsKCk7CiAJCQkvLyBDbG9uZSBpdAogCQkJRmlsZSBkaXJlY3RvcnkgPSBjcmVhdGVUZW1wRGlyZWN0b3J5KCJ0ZXN0Q29weUZpbGVCYXJlIik7Ci0JCQlSZXBvc2l0b3J5IGxvY2FsRGIgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkuc2V0RGlyZWN0b3J5KGRpcmVjdG9yeSkKKwkJCXRyeSAoUmVwb3NpdG9yeSBsb2NhbERiID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpCisJCQkJCS5zZXREaXJlY3RvcnkoZGlyZWN0b3J5KQogCQkJCQkuc2V0VVJJKHJlbW90ZURiLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9TdHJpbmcoKSkuY2FsbCgpCi0JCQkJCS5nZXRSZXBvc2l0b3J5KCk7CisJCQkJCS5nZXRSZXBvc2l0b3J5KCkpIHsKIAotCQkJLy8gVGhlIExpbmtlZEhlbGxvIHN5bWxpbmsgc2hvdWxkIGV4aXN0LgotCQkJRmlsZSBsaW5rZWRoZWxsbyA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwgIkxpbmtlZEhlbGxvIik7Ci0JCQlhc3NlcnRUcnVlKCJUaGUgTGlua2VkSGVsbG8gZmlsZSBzaG91bGQgZXhpc3QiLAotCQkJCQlsb2NhbERiLmdldEZTKCkuZXhpc3RzKGxpbmtlZGhlbGxvKSk7Ci0JCQlhc3NlcnRUcnVlKCJUaGUgTGlua2VkSGVsbG8gZmlsZSBzaG91bGQgYmUgYSBzeW1saW5rIiwKLQkJCQkJbG9jYWxEYi5nZXRGUygpLmlzU3ltTGluayhsaW5rZWRoZWxsbykpOwotCQkJYXNzZXJ0RXF1YWxzKCJmb28vaGVsbG8udHh0IiwKLQkJCQkJbG9jYWxEYi5nZXRGUygpLnJlYWRTeW1MaW5rKGxpbmtlZGhlbGxvKSk7CisJCQkJLy8gVGhlIExpbmtlZEhlbGxvIHN5bWxpbmsgc2hvdWxkIGV4aXN0LgorCQkJCUZpbGUgbGlua2VkaGVsbG8gPSBuZXcgRmlsZShsb2NhbERiLmdldFdvcmtUcmVlKCksCisJCQkJCQkiTGlua2VkSGVsbG8iKTsKKwkJCQlhc3NlcnRUcnVlKCJUaGUgTGlua2VkSGVsbG8gZmlsZSBzaG91bGQgZXhpc3QiLAorCQkJCQkJbG9jYWxEYi5nZXRGUygpLmV4aXN0cyhsaW5rZWRoZWxsbykpOworCQkJCWFzc2VydFRydWUoIlRoZSBMaW5rZWRIZWxsbyBmaWxlIHNob3VsZCBiZSBhIHN5bWxpbmsiLAorCQkJCQkJbG9jYWxEYi5nZXRGUygpLmlzU3ltTGluayhsaW5rZWRoZWxsbykpOworCQkJCWFzc2VydEVxdWFscygiZm9vL2hlbGxvLnR4dCIsCisJCQkJCQlsb2NhbERiLmdldEZTKCkucmVhZFN5bUxpbmsobGlua2VkaGVsbG8pKTsKIAotCQkJLy8gVGhlIGZvby9MaW5rZWRIZWxsbyBmaWxlIHNob3VsZCBiZSBza2lwcGVkLgotCQkJRmlsZSBsaW5rZWRmb29oZWxsbyA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwgImZvby9MaW5rZWRIZWxsbyIpOwotCQkJYXNzZXJ0RmFsc2UoIlRoZSBmb28vTGlua2VkSGVsbG8gZmlsZSBzaG91bGQgYmUgc2tpcHBlZCIsCi0JCQkJCWxvY2FsRGIuZ2V0RlMoKS5leGlzdHMobGlua2VkZm9vaGVsbG8pKTsKKwkJCQkvLyBUaGUgZm9vL0xpbmtlZEhlbGxvIGZpbGUgc2hvdWxkIGJlIHNraXBwZWQuCisJCQkJRmlsZSBsaW5rZWRmb29oZWxsbyA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwKKwkJCQkJCSJmb28vTGlua2VkSGVsbG8iKTsKKwkJCQlhc3NlcnRGYWxzZSgiVGhlIGZvby9MaW5rZWRIZWxsbyBmaWxlIHNob3VsZCBiZSBza2lwcGVkIiwKKwkJCQkJCWxvY2FsRGIuZ2V0RlMoKS5leGlzdHMobGlua2VkZm9vaGVsbG8pKTsKIAotCQkJLy8gVGhlIHN1YmRpci9MaW5rZWRIZWxsbyBmaWxlIHNob3VsZCB1c2UgYSByZWxhdGl2ZSAuLi8KLQkJCUZpbGUgbGlua2Vkc3ViZGlyaGVsbG8gPSBuZXcgRmlsZShsb2NhbERiLmdldFdvcmtUcmVlKCksCi0JCQkJCSJzdWJkaXIvTGlua2VkSGVsbG8iKTsKLQkJCWFzc2VydFRydWUoIlRoZSBzdWJkaXIvTGlua2VkSGVsbG8gZmlsZSBzaG91bGQgZXhpc3QiLAotCQkJCQlsb2NhbERiLmdldEZTKCkuZXhpc3RzKGxpbmtlZHN1YmRpcmhlbGxvKSk7Ci0JCQlhc3NlcnRUcnVlKCJUaGUgc3ViZGlyL0xpbmtlZEhlbGxvIGZpbGUgc2hvdWxkIGJlIGEgc3ltbGluayIsCi0JCQkJCWxvY2FsRGIuZ2V0RlMoKS5pc1N5bUxpbmsobGlua2Vkc3ViZGlyaGVsbG8pKTsKLQkJCWFzc2VydEVxdWFscygiLi4vZm9vL2hlbGxvLnR4dCIsCi0JCQkJCWxvY2FsRGIuZ2V0RlMoKS5yZWFkU3ltTGluayhsaW5rZWRzdWJkaXJoZWxsbykpOworCQkJCS8vIFRoZSBzdWJkaXIvTGlua2VkSGVsbG8gZmlsZSBzaG91bGQgdXNlIGEgcmVsYXRpdmUgLi4vCisJCQkJRmlsZSBsaW5rZWRzdWJkaXJoZWxsbyA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwKKwkJCQkJCSJzdWJkaXIvTGlua2VkSGVsbG8iKTsKKwkJCQlhc3NlcnRUcnVlKCJUaGUgc3ViZGlyL0xpbmtlZEhlbGxvIGZpbGUgc2hvdWxkIGV4aXN0IiwKKwkJCQkJCWxvY2FsRGIuZ2V0RlMoKS5leGlzdHMobGlua2Vkc3ViZGlyaGVsbG8pKTsKKwkJCQlhc3NlcnRUcnVlKCJUaGUgc3ViZGlyL0xpbmtlZEhlbGxvIGZpbGUgc2hvdWxkIGJlIGEgc3ltbGluayIsCisJCQkJCQlsb2NhbERiLmdldEZTKCkuaXNTeW1MaW5rKGxpbmtlZHN1YmRpcmhlbGxvKSk7CisJCQkJYXNzZXJ0RXF1YWxzKCIuLi9mb28vaGVsbG8udHh0IiwKKwkJCQkJCWxvY2FsRGIuZ2V0RlMoKS5yZWFkU3ltTGluayhsaW5rZWRzdWJkaXJoZWxsbykpOwogCi0JCQkvLyBUaGUgYmFyL2Zvby9MaW5rZWRIZWxsbyBmaWxlIHNob3VsZCB1c2UgYSBzaW5nbGUgcmVsYXRpdmUgLi4vCi0JCQlGaWxlIGxpbmtlZGJhcmZvb2hlbGxvID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLAotCQkJCQkiYmFyL2Zvby9MaW5rZWRIZWxsbyIpOwotCQkJYXNzZXJ0VHJ1ZSgiVGhlIGJhci9mb28vTGlua2VkSGVsbG8gZmlsZSBzaG91bGQgZXhpc3QiLAotCQkJCQlsb2NhbERiLmdldEZTKCkuZXhpc3RzKGxpbmtlZGJhcmZvb2hlbGxvKSk7Ci0JCQlhc3NlcnRUcnVlKCJUaGUgYmFyL2Zvby9MaW5rZWRIZWxsbyBmaWxlIHNob3VsZCBiZSBhIHN5bWxpbmsiLAotCQkJCQlsb2NhbERiLmdldEZTKCkuaXNTeW1MaW5rKGxpbmtlZGJhcmZvb2hlbGxvKSk7Ci0JCQlhc3NlcnRFcXVhbHMoIi4uL2Jhei9oZWxsby50eHQiLAotCQkJCQlsb2NhbERiLmdldEZTKCkucmVhZFN5bUxpbmsobGlua2VkYmFyZm9vaGVsbG8pKTsKLQotCQkJbG9jYWxEYi5jbG9zZSgpOworCQkJCS8vIFRoZSBiYXIvZm9vL0xpbmtlZEhlbGxvIGZpbGUgc2hvdWxkIHVzZSBhIHNpbmdsZSByZWxhdGl2ZSAuLi8KKwkJCQlGaWxlIGxpbmtlZGJhcmZvb2hlbGxvID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLAorCQkJCQkJImJhci9mb28vTGlua2VkSGVsbG8iKTsKKwkJCQlhc3NlcnRUcnVlKCJUaGUgYmFyL2Zvby9MaW5rZWRIZWxsbyBmaWxlIHNob3VsZCBleGlzdCIsCisJCQkJCQlsb2NhbERiLmdldEZTKCkuZXhpc3RzKGxpbmtlZGJhcmZvb2hlbGxvKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiVGhlIGJhci9mb28vTGlua2VkSGVsbG8gZmlsZSBzaG91bGQgYmUgYSBzeW1saW5rIiwKKwkJCQkJCWxvY2FsRGIuZ2V0RlMoKS5pc1N5bUxpbmsobGlua2VkYmFyZm9vaGVsbG8pKTsKKwkJCQlhc3NlcnRFcXVhbHMoIi4uL2Jhei9oZWxsby50eHQiLAorCQkJCQkJbG9jYWxEYi5nZXRGUygpLnJlYWRTeW1MaW5rKGxpbmtlZGJhcmZvb2hlbGxvKSk7CisJCQl9CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlcG9Db21tYW5kVGVzdC5qYXZhCmluZGV4IDIyNTNhMDQuLmRmMzFhYjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlcG9Db21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlcG9Db21tYW5kVGVzdC5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CkBAIC0xNjAsNyArMTYwLDcgQEAKIAkJCQlSZWYgcmVmID0gci5maW5kUmVmKHJlZm5hbWUpOwogCQkJCWlmIChyZWYgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAKLQkJCQlyZWYgPSByLnBlZWwocmVmKTsKKwkJCQlyZWYgPSByLmdldFJlZkRhdGFiYXNlKCkucGVlbChyZWYpOwogCQkJCU9iamVjdElkIGlkID0gcmVmLmdldE9iamVjdElkKCk7CiAJCQkJcmV0dXJuIGlkOwogCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewpAQCAtMTg1LDEwOCArMTg1LDkzIEBACiAJCX0KIAl9CiAKKwlwcml2YXRlIFJlcG9zaXRvcnkgY2xvbmVSZXBvc2l0b3J5KFJlcG9zaXRvcnkgcmVwbywgYm9vbGVhbiBiYXJlKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlcG9zaXRvcnkgciA9IEdpdC5jbG9uZVJlcG9zaXRvcnkoKQorCQkJCS5zZXRVUkkocmVwby5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvU3RyaW5nKCkpCisJCQkJLnNldERpcmVjdG9yeShjcmVhdGVVbmlxdWVUZXN0R2l0RGlyKHRydWUpKS5zZXRCYXJlKGJhcmUpLmNhbGwoKQorCQkJCS5nZXRSZXBvc2l0b3J5KCk7CisJCWlmIChiYXJlKSB7CisJCQlhc3NlcnRUcnVlKHIuaXNCYXJlKCkpOworCQl9IGVsc2UgeworCQkJYXNzZXJ0RmFsc2Uoci5pc0JhcmUoKSk7CisJCX0KKwkJcmV0dXJuIHI7CisJfQorCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCBydW5Ud2ljZUlzTk9QKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVJlcG9zaXRvcnkgY2hpbGQgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkKLQkJCS5zZXRVUkkoZ3JvdXBBRGIuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1N0cmluZygpKQotCQkJLnNldERpcmVjdG9yeShjcmVhdGVVbmlxdWVUZXN0R2l0RGlyKHRydWUpKS5zZXRCYXJlKHRydWUpLmNhbGwoKQotCQkJLmdldFJlcG9zaXRvcnkoKTsKKwkJdHJ5IChSZXBvc2l0b3J5IGNoaWxkID0gY2xvbmVSZXBvc2l0b3J5KGdyb3VwQURiLCB0cnVlKTsKKwkJCQlSZXBvc2l0b3J5IGRlc3QgPSBjbG9uZVJlcG9zaXRvcnkoZGIsIHRydWUpKSB7CisJCQlTdHJpbmdCdWlsZGVyIHhtbENvbnRlbnQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQkJeG1sQ29udGVudC5hcHBlbmQoIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIikKKwkJCQkJLmFwcGVuZCgiPG1hbmlmZXN0PiIpCisJCQkJCS5hcHBlbmQoIjxyZW1vdGUgbmFtZT1cInJlbW90ZTFcIiBmZXRjaD1cIi4uXCIgLz4iKQorCQkJCQkuYXBwZW5kKCI8ZGVmYXVsdCByZXZpc2lvbj1cIm1hc3RlclwiIHJlbW90ZT1cInJlbW90ZTFcIiAvPiIpCisJCQkJCS5hcHBlbmQoIjxwcm9qZWN0IHBhdGg9XCJiYXNlXCIgbmFtZT1cInBsYXRmb3JtL2Jhc2VcIiAvPiIpCisJCQkJCS5hcHBlbmQoIjwvbWFuaWZlc3Q+Iik7CisJCQlSZXBvQ29tbWFuZCBjbWQgPSBuZXcgUmVwb0NvbW1hbmQoZGVzdCk7CiAKLQkJUmVwb3NpdG9yeSBkZXN0ID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpCi0JCQkuc2V0VVJJKGRiLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9TdHJpbmcoKSkKLQkJCS5zZXREaXJlY3RvcnkoY3JlYXRlVW5pcXVlVGVzdEdpdERpcih0cnVlKSkuc2V0QmFyZSh0cnVlKS5jYWxsKCkKLQkJCS5nZXRSZXBvc2l0b3J5KCk7CisJCQlJbmRleGVkUmVwb3MgcmVwb3MgPSBuZXcgSW5kZXhlZFJlcG9zKCk7CisJCQlyZXBvcy5wdXQoInBsYXRmb3JtL2Jhc2UiLCBjaGlsZCk7CiAKLQkJYXNzZXJ0VHJ1ZShkZXN0LmlzQmFyZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjaGlsZC5pc0JhcmUoKSk7CisJCQlSZXZDb21taXQgY29tbWl0ID0gY21kCisJCQkJCS5zZXRJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCisJCQkJCQkJeG1sQ29udGVudC50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpKSkKKwkJCQkJLnNldFJlbW90ZVJlYWRlcihyZXBvcykuc2V0VVJJKCJwbGF0Zm9ybS8iKQorCQkJCQkuc2V0VGFyZ2V0VVJJKCJwbGF0Zm9ybS9zdXBlcnByb2plY3QiKQorCQkJCQkuc2V0UmVjb3JkUmVtb3RlQnJhbmNoKHRydWUpLnNldFJlY29yZFN1Ym1vZHVsZUxhYmVscyh0cnVlKQorCQkJCQkuY2FsbCgpOwogCi0JCVN0cmluZ0J1aWxkZXIgeG1sQ29udGVudCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCXhtbENvbnRlbnQuYXBwZW5kKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiIpCi0JCQkuYXBwZW5kKCI8bWFuaWZlc3Q+IikKLQkJCS5hcHBlbmQoIjxyZW1vdGUgbmFtZT1cInJlbW90ZTFcIiBmZXRjaD1cIi4uXCIgLz4iKQotCQkJLmFwcGVuZCgiPGRlZmF1bHQgcmV2aXNpb249XCJtYXN0ZXJcIiByZW1vdGU9XCJyZW1vdGUxXCIgLz4iKQotCQkJLmFwcGVuZCgiPHByb2plY3QgcGF0aD1cImJhc2VcIiBuYW1lPVwicGxhdGZvcm0vYmFzZVwiIC8+IikKLQkJCS5hcHBlbmQoIjwvbWFuaWZlc3Q+Iik7Ci0JCVJlcG9Db21tYW5kIGNtZCA9IG5ldyBSZXBvQ29tbWFuZChkZXN0KTsKLQotCQlJbmRleGVkUmVwb3MgcmVwb3MgPSBuZXcgSW5kZXhlZFJlcG9zKCk7Ci0JCXJlcG9zLnB1dCgicGxhdGZvcm0vYmFzZSIsIGNoaWxkKTsKLQotCQlSZXZDb21taXQgY29tbWl0ID0gY21kCi0JCQkuc2V0SW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKAotCQkJCXhtbENvbnRlbnQudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpKQotCQkJLnNldFJlbW90ZVJlYWRlcihyZXBvcykKLQkJCS5zZXRVUkkoInBsYXRmb3JtLyIpCi0JCQkuc2V0VGFyZ2V0VVJJKCJwbGF0Zm9ybS9zdXBlcnByb2plY3QiKQotCQkJLnNldFJlY29yZFJlbW90ZUJyYW5jaCh0cnVlKQotCQkJLnNldFJlY29yZFN1Ym1vZHVsZUxhYmVscyh0cnVlKQotCQkJLmNhbGwoKTsKLQotCQlTdHJpbmcgZmlyc3RJZFN0ciA9IGNvbW1pdC5nZXRJZCgpLm5hbWUoKSArICI6IiArICIuZ2l0bW9kdWxlcyI7Ci0JCWNvbW1pdCA9IG5ldyBSZXBvQ29tbWFuZChkZXN0KQotCQkJLnNldElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKLQkJCQl4bWxDb250ZW50LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKSkKLQkJCS5zZXRSZW1vdGVSZWFkZXIocmVwb3MpCi0JCQkuc2V0VVJJKCJwbGF0Zm9ybS8iKQotCQkJLnNldFRhcmdldFVSSSgicGxhdGZvcm0vc3VwZXJwcm9qZWN0IikKLQkJCS5zZXRSZWNvcmRSZW1vdGVCcmFuY2godHJ1ZSkKLQkJCS5zZXRSZWNvcmRTdWJtb2R1bGVMYWJlbHModHJ1ZSkKLQkJCS5jYWxsKCk7Ci0JCVN0cmluZyBpZFN0ciA9IGNvbW1pdC5nZXRJZCgpLm5hbWUoKSArICI6IiArICIuZ2l0bW9kdWxlcyI7Ci0JCWFzc2VydEVxdWFscyhmaXJzdElkU3RyLCBpZFN0cik7Ci0JCWNoaWxkLmNsb3NlKCk7Ci0JCWRlc3QuY2xvc2UoKTsKKwkJCVN0cmluZyBmaXJzdElkU3RyID0gY29tbWl0LmdldElkKCkubmFtZSgpICsgIjoiICsgIi5naXRtb2R1bGVzIjsKKwkJCWNvbW1pdCA9IG5ldyBSZXBvQ29tbWFuZChkZXN0KQorCQkJCQkuc2V0SW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKAorCQkJCQkJCXhtbENvbnRlbnQudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKSkpCisJCQkJCS5zZXRSZW1vdGVSZWFkZXIocmVwb3MpLnNldFVSSSgicGxhdGZvcm0vIikKKwkJCQkJLnNldFRhcmdldFVSSSgicGxhdGZvcm0vc3VwZXJwcm9qZWN0IikKKwkJCQkJLnNldFJlY29yZFJlbW90ZUJyYW5jaCh0cnVlKS5zZXRSZWNvcmRTdWJtb2R1bGVMYWJlbHModHJ1ZSkKKwkJCQkJLmNhbGwoKTsKKwkJCVN0cmluZyBpZFN0ciA9IGNvbW1pdC5nZXRJZCgpLm5hbWUoKSArICI6IiArICIuZ2l0bW9kdWxlcyI7CisJCQlhc3NlcnRFcXVhbHMoZmlyc3RJZFN0ciwgaWRTdHIpOworCQl9CiAJfQogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCBhbmRyb2lkU2V0dXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUmVwb3NpdG9yeSBjaGlsZCA9IEdpdC5jbG9uZVJlcG9zaXRvcnkoKQotCQkJCS5zZXRVUkkoZ3JvdXBBRGIuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1N0cmluZygpKQotCQkJCS5zZXREaXJlY3RvcnkoY3JlYXRlVW5pcXVlVGVzdEdpdERpcih0cnVlKSkuc2V0QmFyZSh0cnVlKS5jYWxsKCkKLQkJCQkuZ2V0UmVwb3NpdG9yeSgpOworCQl0cnkgKFJlcG9zaXRvcnkgY2hpbGQgPSBjbG9uZVJlcG9zaXRvcnkoZ3JvdXBBRGIsIHRydWUpOworCQkJCVJlcG9zaXRvcnkgZGVzdCA9IGNsb25lUmVwb3NpdG9yeShkYiwgdHJ1ZSkpIHsKKwkJCVN0cmluZ0J1aWxkZXIgeG1sQ29udGVudCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCQl4bWxDb250ZW50LmFwcGVuZCgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iKQorCQkJCQkuYXBwZW5kKCI8bWFuaWZlc3Q+IikKKwkJCQkJLmFwcGVuZCgiPHJlbW90ZSBuYW1lPVwicmVtb3RlMVwiIGZldGNoPVwiLi5cIiAvPiIpCisJCQkJCS5hcHBlbmQoIjxkZWZhdWx0IHJldmlzaW9uPVwibWFzdGVyXCIgcmVtb3RlPVwicmVtb3RlMVwiIC8+IikKKwkJCQkJLmFwcGVuZCgiPHByb2plY3QgcGF0aD1cImJhc2VcIiBuYW1lPVwicGxhdGZvcm0vYmFzZVwiIC8+IikKKwkJCQkJLmFwcGVuZCgiPC9tYW5pZmVzdD4iKTsKKwkJCVJlcG9Db21tYW5kIGNtZCA9IG5ldyBSZXBvQ29tbWFuZChkZXN0KTsKIAotCQlSZXBvc2l0b3J5IGRlc3QgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkKLQkJCQkuc2V0VVJJKGRiLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9TdHJpbmcoKSkKLQkJCQkuc2V0RGlyZWN0b3J5KGNyZWF0ZVVuaXF1ZVRlc3RHaXREaXIodHJ1ZSkpLnNldEJhcmUodHJ1ZSkuY2FsbCgpCi0JCQkJLmdldFJlcG9zaXRvcnkoKTsKKwkJCUluZGV4ZWRSZXBvcyByZXBvcyA9IG5ldyBJbmRleGVkUmVwb3MoKTsKKwkJCXJlcG9zLnB1dCgicGxhdGZvcm0vYmFzZSIsIGNoaWxkKTsKIAotCQlhc3NlcnRUcnVlKGRlc3QuaXNCYXJlKCkpOwotCQlhc3NlcnRUcnVlKGNoaWxkLmlzQmFyZSgpKTsKKwkJCVJldkNvbW1pdCBjb21taXQgPSBjbWQKKwkJCQkJLnNldElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKKwkJCQkJCQl4bWxDb250ZW50LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpKQorCQkJCQkuc2V0UmVtb3RlUmVhZGVyKHJlcG9zKS5zZXRVUkkoInBsYXRmb3JtLyIpCisJCQkJCS5zZXRUYXJnZXRVUkkoInBsYXRmb3JtL3N1cGVycHJvamVjdCIpCisJCQkJCS5zZXRSZWNvcmRSZW1vdGVCcmFuY2godHJ1ZSkuc2V0UmVjb3JkU3VibW9kdWxlTGFiZWxzKHRydWUpCisJCQkJCS5jYWxsKCk7CiAKLQkJU3RyaW5nQnVpbGRlciB4bWxDb250ZW50ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJeG1sQ29udGVudC5hcHBlbmQoIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIikKLQkJCS5hcHBlbmQoIjxtYW5pZmVzdD4iKQotCQkJLmFwcGVuZCgiPHJlbW90ZSBuYW1lPVwicmVtb3RlMVwiIGZldGNoPVwiLi5cIiAvPiIpCi0JCQkuYXBwZW5kKCI8ZGVmYXVsdCByZXZpc2lvbj1cIm1hc3RlclwiIHJlbW90ZT1cInJlbW90ZTFcIiAvPiIpCi0JCQkuYXBwZW5kKCI8cHJvamVjdCBwYXRoPVwiYmFzZVwiIG5hbWU9XCJwbGF0Zm9ybS9iYXNlXCIgLz4iKQotCQkJLmFwcGVuZCgiPC9tYW5pZmVzdD4iKTsKLQkJUmVwb0NvbW1hbmQgY21kID0gbmV3IFJlcG9Db21tYW5kKGRlc3QpOworCQkJU3RyaW5nIGlkU3RyID0gY29tbWl0LmdldElkKCkubmFtZSgpICsgIjoiICsgIi5naXRtb2R1bGVzIjsKKwkJCU9iamVjdElkIG1vZElkID0gZGVzdC5yZXNvbHZlKGlkU3RyKTsKIAotCQlJbmRleGVkUmVwb3MgcmVwb3MgPSBuZXcgSW5kZXhlZFJlcG9zKCk7Ci0JCXJlcG9zLnB1dCgicGxhdGZvcm0vYmFzZSIsIGNoaWxkKTsKLQotCQlSZXZDb21taXQgY29tbWl0ID0gY21kCi0JCQkuc2V0SW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhtbENvbnRlbnQudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpKQotCQkJLnNldFJlbW90ZVJlYWRlcihyZXBvcykKLQkJCS5zZXRVUkkoInBsYXRmb3JtLyIpCi0JCQkuc2V0VGFyZ2V0VVJJKCJwbGF0Zm9ybS9zdXBlcnByb2plY3QiKQotCQkJLnNldFJlY29yZFJlbW90ZUJyYW5jaCh0cnVlKQotCQkJLnNldFJlY29yZFN1Ym1vZHVsZUxhYmVscyh0cnVlKQotCQkJLmNhbGwoKTsKLQotCQlTdHJpbmcgaWRTdHIgPSBjb21taXQuZ2V0SWQoKS5uYW1lKCkgKyAiOiIgKyAiLmdpdG1vZHVsZXMiOwotCQlPYmplY3RJZCBtb2RJZCA9IGRlc3QucmVzb2x2ZShpZFN0cik7Ci0KLQkJdHJ5IChPYmplY3RSZWFkZXIgcmVhZGVyID0gZGVzdC5uZXdPYmplY3RSZWFkZXIoKSkgewotCQkJYnl0ZVtdIGJ5dGVzID0gcmVhZGVyLm9wZW4obW9kSWQpLmdldENhY2hlZEJ5dGVzKEludGVnZXIuTUFYX1ZBTFVFKTsKLQkJCUNvbmZpZyBiYXNlID0gbmV3IENvbmZpZygpOwotCQkJQmxvYkJhc2VkQ29uZmlnIGNmZyA9IG5ldyBCbG9iQmFzZWRDb25maWcoYmFzZSwgYnl0ZXMpOwotCQkJU3RyaW5nIHN1YlVybCA9IGNmZy5nZXRTdHJpbmcoInN1Ym1vZHVsZSIsICJiYXNlIiwgInVybCIpOwotCQkJYXNzZXJ0RXF1YWxzKHN1YlVybCwgIi4uL2Jhc2UiKTsKKwkJCXRyeSAoT2JqZWN0UmVhZGVyIHJlYWRlciA9IGRlc3QubmV3T2JqZWN0UmVhZGVyKCkpIHsKKwkJCQlieXRlW10gYnl0ZXMgPSByZWFkZXIub3Blbihtb2RJZCkKKwkJCQkJCS5nZXRDYWNoZWRCeXRlcyhJbnRlZ2VyLk1BWF9WQUxVRSk7CisJCQkJQ29uZmlnIGJhc2UgPSBuZXcgQ29uZmlnKCk7CisJCQkJQmxvYkJhc2VkQ29uZmlnIGNmZyA9IG5ldyBCbG9iQmFzZWRDb25maWcoYmFzZSwgYnl0ZXMpOworCQkJCVN0cmluZyBzdWJVcmwgPSBjZmcuZ2V0U3RyaW5nKCJzdWJtb2R1bGUiLCAiYmFzZSIsICJ1cmwiKTsKKwkJCQlhc3NlcnRFcXVhbHMoc3ViVXJsLCAiLi4vYmFzZSIpOworCQkJfQogCQl9Ci0KLQkJY2hpbGQuY2xvc2UoKTsKLQkJZGVzdC5jbG9zZSgpOwogCX0KIAogCUBUZXN0CkBAIC0yOTksMjAwICsyODQsMTc0IEBACiAJCQkuYXBwZW5kKCI8cHJvamVjdCBwYXRoPVwiYmFzZVwiIG5hbWU9XCJwbGF0Zm9ybS9iYXNlXCIgLz4iKQogCQkJLmFwcGVuZCgiPC9tYW5pZmVzdD4iKTsKIAotCQlSZXBvc2l0b3J5IGRlc3QgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkKLQkJCQkuc2V0VVJJKGRiLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9TdHJpbmcoKSkKLQkJCQkuc2V0RGlyZWN0b3J5KGNyZWF0ZVVuaXF1ZVRlc3RHaXREaXIodHJ1ZSkpLnNldEJhcmUodHJ1ZSkuY2FsbCgpCi0JCQkJLmdldFJlcG9zaXRvcnkoKTsKKwkJdHJ5IChSZXBvc2l0b3J5IGRlc3QgPSBjbG9uZVJlcG9zaXRvcnkoZGIsIHRydWUpKSB7CisJCQlSZXZDb21taXQgY29tbWl0ID0gbmV3IFJlcG9Db21tYW5kKGRlc3QpCisJCQkJCS5zZXRJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCisJCQkJCQkJeG1sQ29udGVudC50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpKSkKKwkJCQkJLnNldFJlbW90ZVJlYWRlcihuZXcgSW5kZXhlZFJlcG9zKCkpLnNldFVSSSgicGxhdGZvcm0vIikKKwkJCQkJLnNldFRhcmdldFVSSSgicGxhdGZvcm0vc3VwZXJwcm9qZWN0IikKKwkJCQkJLnNldFJlY29yZFJlbW90ZUJyYW5jaCh0cnVlKS5zZXRJZ25vcmVSZW1vdGVGYWlsdXJlcyh0cnVlKQorCQkJCQkuc2V0UmVjb3JkU3VibW9kdWxlTGFiZWxzKHRydWUpLmNhbGwoKTsKIAotCQlhc3NlcnRUcnVlKGRlc3QuaXNCYXJlKCkpOworCQkJU3RyaW5nIGlkU3RyID0gY29tbWl0LmdldElkKCkubmFtZSgpICsgIjoiICsgIi5naXRtb2R1bGVzIjsKKwkJCU9iamVjdElkIG1vZElkID0gZGVzdC5yZXNvbHZlKGlkU3RyKTsKIAotCQlSZXZDb21taXQgY29tbWl0ID0gbmV3IFJlcG9Db21tYW5kKGRlc3QpCi0JCQkuc2V0SW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKAotCQkJCXhtbENvbnRlbnQudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpKQotCQkJLnNldFJlbW90ZVJlYWRlcihuZXcgSW5kZXhlZFJlcG9zKCkpCi0JCQkuc2V0VVJJKCJwbGF0Zm9ybS8iKQotCQkJLnNldFRhcmdldFVSSSgicGxhdGZvcm0vc3VwZXJwcm9qZWN0IikKLQkJCS5zZXRSZWNvcmRSZW1vdGVCcmFuY2godHJ1ZSkKLQkJCS5zZXRJZ25vcmVSZW1vdGVGYWlsdXJlcyh0cnVlKQotCQkJLnNldFJlY29yZFN1Ym1vZHVsZUxhYmVscyh0cnVlKQotCQkJLmNhbGwoKTsKLQotCQlTdHJpbmcgaWRTdHIgPSBjb21taXQuZ2V0SWQoKS5uYW1lKCkgKyAiOiIgKyAiLmdpdG1vZHVsZXMiOwotCQlPYmplY3RJZCBtb2RJZCA9IGRlc3QucmVzb2x2ZShpZFN0cik7Ci0KLQkJdHJ5IChPYmplY3RSZWFkZXIgcmVhZGVyID0gZGVzdC5uZXdPYmplY3RSZWFkZXIoKSkgewotCQkJYnl0ZVtdIGJ5dGVzID0gcmVhZGVyLm9wZW4obW9kSWQpLmdldENhY2hlZEJ5dGVzKEludGVnZXIuTUFYX1ZBTFVFKTsKLQkJCUNvbmZpZyBiYXNlID0gbmV3IENvbmZpZygpOwotCQkJQmxvYkJhc2VkQ29uZmlnIGNmZyA9IG5ldyBCbG9iQmFzZWRDb25maWcoYmFzZSwgYnl0ZXMpOwotCQkJU3RyaW5nIHN1YlVybCA9IGNmZy5nZXRTdHJpbmcoInN1Ym1vZHVsZSIsICJiYXNlIiwgInVybCIpOwotCQkJYXNzZXJ0RXF1YWxzKHN1YlVybCwgImh0dHBzOi8vaG9zdC5jb20vcGxhdGZvcm0vYmFzZSIpOworCQkJdHJ5IChPYmplY3RSZWFkZXIgcmVhZGVyID0gZGVzdC5uZXdPYmplY3RSZWFkZXIoKSkgeworCQkJCWJ5dGVbXSBieXRlcyA9IHJlYWRlci5vcGVuKG1vZElkKQorCQkJCQkJLmdldENhY2hlZEJ5dGVzKEludGVnZXIuTUFYX1ZBTFVFKTsKKwkJCQlDb25maWcgYmFzZSA9IG5ldyBDb25maWcoKTsKKwkJCQlCbG9iQmFzZWRDb25maWcgY2ZnID0gbmV3IEJsb2JCYXNlZENvbmZpZyhiYXNlLCBieXRlcyk7CisJCQkJU3RyaW5nIHN1YlVybCA9IGNmZy5nZXRTdHJpbmcoInN1Ym1vZHVsZSIsICJiYXNlIiwgInVybCIpOworCQkJCWFzc2VydEVxdWFscyhzdWJVcmwsICJodHRwczovL2hvc3QuY29tL3BsYXRmb3JtL2Jhc2UiKTsKKwkJCX0KIAkJfQotCi0JCWRlc3QuY2xvc2UoKTsKIAl9CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIGdlcnJpdFNldHVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVJlcG9zaXRvcnkgY2hpbGQgPQotCQkJR2l0LmNsb25lUmVwb3NpdG9yeSgpLnNldFVSSShncm91cEFEYi5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvU3RyaW5nKCkpCi0JCQkJLnNldERpcmVjdG9yeShjcmVhdGVVbmlxdWVUZXN0R2l0RGlyKHRydWUpKQotCQkJCS5zZXRCYXJlKHRydWUpLmNhbGwoKS5nZXRSZXBvc2l0b3J5KCk7CisJCXRyeSAoUmVwb3NpdG9yeSBjaGlsZCA9IGNsb25lUmVwb3NpdG9yeShncm91cEFEYiwgdHJ1ZSk7CisJCQkJUmVwb3NpdG9yeSBkZXN0ID0gY2xvbmVSZXBvc2l0b3J5KGRiLCB0cnVlKSkgeworCQkJU3RyaW5nQnVpbGRlciB4bWxDb250ZW50ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJCXhtbENvbnRlbnQuYXBwZW5kKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiIpCisJCQkJCS5hcHBlbmQoIjxtYW5pZmVzdD4iKQorCQkJCQkuYXBwZW5kKCI8cmVtb3RlIG5hbWU9XCJyZW1vdGUxXCIgZmV0Y2g9XCIuXCIgLz4iKQorCQkJCQkuYXBwZW5kKCI8ZGVmYXVsdCByZXZpc2lvbj1cIm1hc3RlclwiIHJlbW90ZT1cInJlbW90ZTFcIiAvPiIpCisJCQkJCS5hcHBlbmQoIjxwcm9qZWN0IHBhdGg9XCJwbHVnaW5zL2Nvb2tib29rXCIgbmFtZT1cInBsdWdpbnMvY29va2Jvb2tcIiAvPiIpCisJCQkJCS5hcHBlbmQoIjwvbWFuaWZlc3Q+Iik7CisJCQlSZXBvQ29tbWFuZCBjbWQgPSBuZXcgUmVwb0NvbW1hbmQoZGVzdCk7CiAKLQkJUmVwb3NpdG9yeSBkZXN0ID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpCi0JCQkuc2V0VVJJKGRiLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9TdHJpbmcoKSkuc2V0RGlyZWN0b3J5KGNyZWF0ZVVuaXF1ZVRlc3RHaXREaXIodHJ1ZSkpCi0JCQkuc2V0QmFyZSh0cnVlKS5jYWxsKCkuZ2V0UmVwb3NpdG9yeSgpOworCQkJSW5kZXhlZFJlcG9zIHJlcG9zID0gbmV3IEluZGV4ZWRSZXBvcygpOworCQkJcmVwb3MucHV0KCJwbHVnaW5zL2Nvb2tib29rIiwgY2hpbGQpOwogCi0JCWFzc2VydFRydWUoZGVzdC5pc0JhcmUoKSk7Ci0JCWFzc2VydFRydWUoY2hpbGQuaXNCYXJlKCkpOworCQkJUmV2Q29tbWl0IGNvbW1pdCA9IGNtZAorCQkJCQkuc2V0SW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKAorCQkJCQkJCXhtbENvbnRlbnQudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKSkpCisJCQkJCS5zZXRSZW1vdGVSZWFkZXIocmVwb3MpLnNldFVSSSgiIikuc2V0VGFyZ2V0VVJJKCJnZXJyaXQiKQorCQkJCQkuc2V0UmVjb3JkUmVtb3RlQnJhbmNoKHRydWUpLnNldFJlY29yZFN1Ym1vZHVsZUxhYmVscyh0cnVlKQorCQkJCQkuY2FsbCgpOwogCi0JCVN0cmluZ0J1aWxkZXIgeG1sQ29udGVudCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCXhtbENvbnRlbnQuYXBwZW5kKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiIpCi0JCQkuYXBwZW5kKCI8bWFuaWZlc3Q+IikKLQkJCS5hcHBlbmQoIjxyZW1vdGUgbmFtZT1cInJlbW90ZTFcIiBmZXRjaD1cIi5cIiAvPiIpCi0JCQkuYXBwZW5kKCI8ZGVmYXVsdCByZXZpc2lvbj1cIm1hc3RlclwiIHJlbW90ZT1cInJlbW90ZTFcIiAvPiIpCi0JCQkuYXBwZW5kKCI8cHJvamVjdCBwYXRoPVwicGx1Z2lucy9jb29rYm9va1wiIG5hbWU9XCJwbHVnaW5zL2Nvb2tib29rXCIgLz4iKQotCQkJLmFwcGVuZCgiPC9tYW5pZmVzdD4iKTsKLQkJUmVwb0NvbW1hbmQgY21kID0gbmV3IFJlcG9Db21tYW5kKGRlc3QpOworCQkJU3RyaW5nIGlkU3RyID0gY29tbWl0LmdldElkKCkubmFtZSgpICsgIjoiICsgIi5naXRtb2R1bGVzIjsKKwkJCU9iamVjdElkIG1vZElkID0gZGVzdC5yZXNvbHZlKGlkU3RyKTsKIAotCQlJbmRleGVkUmVwb3MgcmVwb3MgPSBuZXcgSW5kZXhlZFJlcG9zKCk7Ci0JCXJlcG9zLnB1dCgicGx1Z2lucy9jb29rYm9vayIsIGNoaWxkKTsKLQotCQlSZXZDb21taXQgY29tbWl0ID0gY21kCi0JCQkuc2V0SW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhtbENvbnRlbnQudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpKQotCQkJLnNldFJlbW90ZVJlYWRlcihyZXBvcykKLQkJCS5zZXRVUkkoIiIpCi0JCQkuc2V0VGFyZ2V0VVJJKCJnZXJyaXQiKQotCQkJLnNldFJlY29yZFJlbW90ZUJyYW5jaCh0cnVlKQotCQkJLnNldFJlY29yZFN1Ym1vZHVsZUxhYmVscyh0cnVlKQotCQkJLmNhbGwoKTsKLQotCQlTdHJpbmcgaWRTdHIgPSBjb21taXQuZ2V0SWQoKS5uYW1lKCkgKyAiOiIgKyAiLmdpdG1vZHVsZXMiOwotCQlPYmplY3RJZCBtb2RJZCA9IGRlc3QucmVzb2x2ZShpZFN0cik7Ci0KLQkJdHJ5IChPYmplY3RSZWFkZXIgcmVhZGVyID0gZGVzdC5uZXdPYmplY3RSZWFkZXIoKSkgewotCQkJYnl0ZVtdIGJ5dGVzID0gcmVhZGVyLm9wZW4obW9kSWQpLmdldENhY2hlZEJ5dGVzKEludGVnZXIuTUFYX1ZBTFVFKTsKLQkJCUNvbmZpZyBiYXNlID0gbmV3IENvbmZpZygpOwotCQkJQmxvYkJhc2VkQ29uZmlnIGNmZyA9IG5ldyBCbG9iQmFzZWRDb25maWcoYmFzZSwgYnl0ZXMpOwotCQkJU3RyaW5nIHN1YlVybCA9IGNmZy5nZXRTdHJpbmcoInN1Ym1vZHVsZSIsICJwbHVnaW5zL2Nvb2tib29rIiwgInVybCIpOwotCQkJYXNzZXJ0RXF1YWxzKHN1YlVybCwgIi4uL3BsdWdpbnMvY29va2Jvb2siKTsKKwkJCXRyeSAoT2JqZWN0UmVhZGVyIHJlYWRlciA9IGRlc3QubmV3T2JqZWN0UmVhZGVyKCkpIHsKKwkJCQlieXRlW10gYnl0ZXMgPSByZWFkZXIub3Blbihtb2RJZCkKKwkJCQkJCS5nZXRDYWNoZWRCeXRlcyhJbnRlZ2VyLk1BWF9WQUxVRSk7CisJCQkJQ29uZmlnIGJhc2UgPSBuZXcgQ29uZmlnKCk7CisJCQkJQmxvYkJhc2VkQ29uZmlnIGNmZyA9IG5ldyBCbG9iQmFzZWRDb25maWcoYmFzZSwgYnl0ZXMpOworCQkJCVN0cmluZyBzdWJVcmwgPSBjZmcuZ2V0U3RyaW5nKCJzdWJtb2R1bGUiLCAicGx1Z2lucy9jb29rYm9vayIsCisJCQkJCQkidXJsIik7CisJCQkJYXNzZXJ0RXF1YWxzKHN1YlVybCwgIi4uL3BsdWdpbnMvY29va2Jvb2siKTsKKwkJCX0KIAkJfQotCi0JCWNoaWxkLmNsb3NlKCk7Ci0JCWRlc3QuY2xvc2UoKTsKIAl9CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIGFic29sdXRlUmVtb3RlVVJMKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVJlcG9zaXRvcnkgY2hpbGQgPQotCQkJR2l0LmNsb25lUmVwb3NpdG9yeSgpLnNldFVSSShncm91cEFEYi5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvU3RyaW5nKCkpCi0JCQkJLnNldERpcmVjdG9yeShjcmVhdGVVbmlxdWVUZXN0R2l0RGlyKHRydWUpKQotCQkJCS5zZXRCYXJlKHRydWUpLmNhbGwoKS5nZXRSZXBvc2l0b3J5KCk7Ci0JCVJlcG9zaXRvcnkgZGVzdCA9IEdpdC5jbG9uZVJlcG9zaXRvcnkoKQotCQkJLnNldFVSSShkYi5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvU3RyaW5nKCkpLnNldERpcmVjdG9yeShjcmVhdGVVbmlxdWVUZXN0R2l0RGlyKHRydWUpKQotCQkJLnNldEJhcmUodHJ1ZSkuY2FsbCgpLmdldFJlcG9zaXRvcnkoKTsKLQkJU3RyaW5nIGFicyA9ICJodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20iOwotCQlTdHJpbmcgcmVwb1VybCA9ICJodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjIjsKLQkJYm9vbGVhbiBmZXRjaFNsYXNoID0gZmFsc2U7Ci0JCWJvb2xlYW4gYmFzZVNsYXNoID0gZmFsc2U7Ci0JCWRvIHsKKwkJdHJ5IChSZXBvc2l0b3J5IGNoaWxkID0gY2xvbmVSZXBvc2l0b3J5KGdyb3VwQURiLCB0cnVlKTsKKwkJCQlSZXBvc2l0b3J5IGRlc3QgPSBjbG9uZVJlcG9zaXRvcnkoZGIsIHRydWUpKSB7CisJCQlTdHJpbmcgYWJzID0gImh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbSI7CisJCQlTdHJpbmcgcmVwb1VybCA9ICJodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjIjsKKwkJCWJvb2xlYW4gZmV0Y2hTbGFzaCA9IGZhbHNlOworCQkJYm9vbGVhbiBiYXNlU2xhc2ggPSBmYWxzZTsKIAkJCWRvIHsKLQkJCQlTdHJpbmcgZmV0Y2hVcmwgPSBmZXRjaFNsYXNoID8gYWJzICsgIi8iIDogYWJzOwotCQkJCVN0cmluZyBiYXNlVXJsID0gYmFzZVNsYXNoID8gYWJzICsgIi8iIDogYWJzOworCQkJCWRvIHsKKwkJCQkJU3RyaW5nIGZldGNoVXJsID0gZmV0Y2hTbGFzaCA/IGFicyArICIvIiA6IGFiczsKKwkJCQkJU3RyaW5nIGJhc2VVcmwgPSBiYXNlU2xhc2ggPyBhYnMgKyAiLyIgOiBhYnM7CiAKLQkJCQlTdHJpbmdCdWlsZGVyIHhtbENvbnRlbnQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQkJCXhtbENvbnRlbnQuYXBwZW5kKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiIpCi0JCQkJCS5hcHBlbmQoIjxtYW5pZmVzdD4iKQotCQkJCQkuYXBwZW5kKCI8cmVtb3RlIG5hbWU9XCJvcmlnaW5cIiBmZXRjaD1cIiIgKyBmZXRjaFVybCArICJcIiAvPiIpCi0JCQkJCS5hcHBlbmQoIjxkZWZhdWx0IHJldmlzaW9uPVwibWFzdGVyXCIgcmVtb3RlPVwib3JpZ2luXCIgLz4iKQotCQkJCQkuYXBwZW5kKCI8cHJvamVjdCBwYXRoPVwic3JjXCIgbmFtZT1cImNocm9taXVtL3NyY1wiIC8+IikKLQkJCQkJLmFwcGVuZCgiPC9tYW5pZmVzdD4iKTsKLQkJCQlSZXBvQ29tbWFuZCBjbWQgPSBuZXcgUmVwb0NvbW1hbmQoZGVzdCk7CisJCQkJCVN0cmluZ0J1aWxkZXIgeG1sQ29udGVudCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCQkJCXhtbENvbnRlbnQuYXBwZW5kKAorCQkJCQkJCSI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiIpCisJCQkJCQkJLmFwcGVuZCgiPG1hbmlmZXN0PiIpCisJCQkJCQkJLmFwcGVuZCgiPHJlbW90ZSBuYW1lPVwib3JpZ2luXCIgZmV0Y2g9XCIiCisJCQkJCQkJCQkrIGZldGNoVXJsICsgIlwiIC8+IikKKwkJCQkJCQkuYXBwZW5kKCI8ZGVmYXVsdCByZXZpc2lvbj1cIm1hc3RlclwiIHJlbW90ZT1cIm9yaWdpblwiIC8+IikKKwkJCQkJCQkuYXBwZW5kKCI8cHJvamVjdCBwYXRoPVwic3JjXCIgbmFtZT1cImNocm9taXVtL3NyY1wiIC8+IikKKwkJCQkJCQkuYXBwZW5kKCI8L21hbmlmZXN0PiIpOworCQkJCQlSZXBvQ29tbWFuZCBjbWQgPSBuZXcgUmVwb0NvbW1hbmQoZGVzdCk7CiAKLQkJCQlJbmRleGVkUmVwb3MgcmVwb3MgPSBuZXcgSW5kZXhlZFJlcG9zKCk7Ci0JCQkJcmVwb3MucHV0KHJlcG9VcmwsIGNoaWxkKTsKKwkJCQkJSW5kZXhlZFJlcG9zIHJlcG9zID0gbmV3IEluZGV4ZWRSZXBvcygpOworCQkJCQlyZXBvcy5wdXQocmVwb1VybCwgY2hpbGQpOwogCi0JCQkJUmV2Q29tbWl0IGNvbW1pdCA9IGNtZAotCQkJCQkuc2V0SW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhtbENvbnRlbnQudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpKQotCQkJCQkuc2V0UmVtb3RlUmVhZGVyKHJlcG9zKQotCQkJCQkuc2V0VVJJKGJhc2VVcmwpCi0JCQkJCS5zZXRUYXJnZXRVUkkoImdlcnJpdCIpCi0JCQkJCS5zZXRSZWNvcmRSZW1vdGVCcmFuY2godHJ1ZSkKLQkJCQkJLnNldFJlY29yZFN1Ym1vZHVsZUxhYmVscyh0cnVlKQotCQkJCQkuY2FsbCgpOworCQkJCQlSZXZDb21taXQgY29tbWl0ID0gY21kCisJCQkJCQkJLnNldElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKKwkJCQkJCQkJCXhtbENvbnRlbnQudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKSkpCisJCQkJCQkJLnNldFJlbW90ZVJlYWRlcihyZXBvcykuc2V0VVJJKGJhc2VVcmwpCisJCQkJCQkJLnNldFRhcmdldFVSSSgiZ2Vycml0Iikuc2V0UmVjb3JkUmVtb3RlQnJhbmNoKHRydWUpCisJCQkJCQkJLnNldFJlY29yZFN1Ym1vZHVsZUxhYmVscyh0cnVlKS5jYWxsKCk7CiAKLQkJCQlTdHJpbmcgaWRTdHIgPSBjb21taXQuZ2V0SWQoKS5uYW1lKCkgKyAiOiIgKyAiLmdpdG1vZHVsZXMiOwotCQkJCU9iamVjdElkIG1vZElkID0gZGVzdC5yZXNvbHZlKGlkU3RyKTsKKwkJCQkJU3RyaW5nIGlkU3RyID0gY29tbWl0LmdldElkKCkubmFtZSgpICsgIjoiICsgIi5naXRtb2R1bGVzIjsKKwkJCQkJT2JqZWN0SWQgbW9kSWQgPSBkZXN0LnJlc29sdmUoaWRTdHIpOwogCi0JCQkJdHJ5IChPYmplY3RSZWFkZXIgcmVhZGVyID0gZGVzdC5uZXdPYmplY3RSZWFkZXIoKSkgewotCQkJCQlieXRlW10gYnl0ZXMgPSByZWFkZXIub3Blbihtb2RJZCkuZ2V0Q2FjaGVkQnl0ZXMoSW50ZWdlci5NQVhfVkFMVUUpOwotCQkJCQlDb25maWcgYmFzZSA9IG5ldyBDb25maWcoKTsKLQkJCQkJQmxvYkJhc2VkQ29uZmlnIGNmZyA9IG5ldyBCbG9iQmFzZWRDb25maWcoYmFzZSwgYnl0ZXMpOwotCQkJCQlTdHJpbmcgc3ViVXJsID0gY2ZnLmdldFN0cmluZygic3VibW9kdWxlIiwgInNyYyIsICJ1cmwiKTsKLQkJCQkJYXNzZXJ0RXF1YWxzKCJodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjIiwgc3ViVXJsKTsKLQkJCQl9Ci0JCQkJZmV0Y2hTbGFzaCA9ICFmZXRjaFNsYXNoOwotCQkJfSB3aGlsZSAoZmV0Y2hTbGFzaCk7Ci0JCQliYXNlU2xhc2ggPSAhYmFzZVNsYXNoOwotCQl9IHdoaWxlIChiYXNlU2xhc2gpOwotCQljaGlsZC5jbG9zZSgpOwotCQlkZXN0LmNsb3NlKCk7CisJCQkJCXRyeSAoT2JqZWN0UmVhZGVyIHJlYWRlciA9IGRlc3QubmV3T2JqZWN0UmVhZGVyKCkpIHsKKwkJCQkJCWJ5dGVbXSBieXRlcyA9IHJlYWRlci5vcGVuKG1vZElkKQorCQkJCQkJCQkuZ2V0Q2FjaGVkQnl0ZXMoSW50ZWdlci5NQVhfVkFMVUUpOworCQkJCQkJQ29uZmlnIGJhc2UgPSBuZXcgQ29uZmlnKCk7CisJCQkJCQlCbG9iQmFzZWRDb25maWcgY2ZnID0gbmV3IEJsb2JCYXNlZENvbmZpZyhiYXNlLCBieXRlcyk7CisJCQkJCQlTdHJpbmcgc3ViVXJsID0gY2ZnLmdldFN0cmluZygic3VibW9kdWxlIiwgInNyYyIsCisJCQkJCQkJCSJ1cmwiKTsKKwkJCQkJCWFzc2VydEVxdWFscygKKwkJCQkJCQkJImh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMiLAorCQkJCQkJCQlzdWJVcmwpOworCQkJCQl9CisJCQkJCWZldGNoU2xhc2ggPSAhZmV0Y2hTbGFzaDsKKwkJCQl9IHdoaWxlIChmZXRjaFNsYXNoKTsKKwkJCQliYXNlU2xhc2ggPSAhYmFzZVNsYXNoOworCQkJfSB3aGlsZSAoYmFzZVNsYXNoKTsKKwkJfQogCX0KIAogCUBUZXN0CiAJcHVibGljIHZvaWQgYWJzb2x1dGVSZW1vdGVVUkxBYnNvbHV0ZVRhcmdldFVSTCgpIHRocm93cyBFeGNlcHRpb24gewotCQlSZXBvc2l0b3J5IGNoaWxkID0KLQkJCUdpdC5jbG9uZVJlcG9zaXRvcnkoKS5zZXRVUkkoZ3JvdXBBRGIuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1N0cmluZygpKQotCQkJCS5zZXREaXJlY3RvcnkoY3JlYXRlVW5pcXVlVGVzdEdpdERpcih0cnVlKSkKLQkJCQkuc2V0QmFyZSh0cnVlKS5jYWxsKCkuZ2V0UmVwb3NpdG9yeSgpOwotCQlSZXBvc2l0b3J5IGRlc3QgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkKLQkJCS5zZXRVUkkoZGIuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1N0cmluZygpKS5zZXREaXJlY3RvcnkoY3JlYXRlVW5pcXVlVGVzdEdpdERpcih0cnVlKSkKLQkJCS5zZXRCYXJlKHRydWUpLmNhbGwoKS5nZXRSZXBvc2l0b3J5KCk7Ci0JCVN0cmluZyBhYnMgPSAiaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tIjsKLQkJU3RyaW5nIHJlcG9VcmwgPSAiaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYyI7Ci0JCWJvb2xlYW4gZmV0Y2hTbGFzaCA9IGZhbHNlOwotCQlib29sZWFuIGJhc2VTbGFzaCA9IGZhbHNlOwotCQlkbyB7CisJCXRyeSAoUmVwb3NpdG9yeSBjaGlsZCA9IGNsb25lUmVwb3NpdG9yeShncm91cEFEYiwgdHJ1ZSk7CisJCQkJUmVwb3NpdG9yeSBkZXN0ID0gY2xvbmVSZXBvc2l0b3J5KGRiLCB0cnVlKSkgeworCQkJU3RyaW5nIGFicyA9ICJodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20iOworCQkJU3RyaW5nIHJlcG9VcmwgPSAiaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYyI7CisJCQlib29sZWFuIGZldGNoU2xhc2ggPSBmYWxzZTsKKwkJCWJvb2xlYW4gYmFzZVNsYXNoID0gZmFsc2U7CiAJCQlkbyB7Ci0JCQkJU3RyaW5nIGZldGNoVXJsID0gZmV0Y2hTbGFzaCA/IGFicyArICIvIiA6IGFiczsKLQkJCQlTdHJpbmcgYmFzZVVybCA9IGJhc2VTbGFzaCA/IGFicyArICIvIiA6IGFiczsKKwkJCQlkbyB7CisJCQkJCVN0cmluZyBmZXRjaFVybCA9IGZldGNoU2xhc2ggPyBhYnMgKyAiLyIgOiBhYnM7CisJCQkJCVN0cmluZyBiYXNlVXJsID0gYmFzZVNsYXNoID8gYWJzICsgIi8iIDogYWJzOwogCi0JCQkJU3RyaW5nQnVpbGRlciB4bWxDb250ZW50ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJCQl4bWxDb250ZW50LmFwcGVuZCgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iKQotCQkJCQkuYXBwZW5kKCI8bWFuaWZlc3Q+IikKLQkJCQkJLmFwcGVuZCgiPHJlbW90ZSBuYW1lPVwib3JpZ2luXCIgZmV0Y2g9XCIiICsgZmV0Y2hVcmwgKyAiXCIgLz4iKQotCQkJCQkuYXBwZW5kKCI8ZGVmYXVsdCByZXZpc2lvbj1cIm1hc3RlclwiIHJlbW90ZT1cIm9yaWdpblwiIC8+IikKLQkJCQkJLmFwcGVuZCgiPHByb2plY3QgcGF0aD1cInNyY1wiIG5hbWU9XCJjaHJvbWl1bS9zcmNcIiAvPiIpCi0JCQkJCS5hcHBlbmQoIjwvbWFuaWZlc3Q+Iik7Ci0JCQkJUmVwb0NvbW1hbmQgY21kID0gbmV3IFJlcG9Db21tYW5kKGRlc3QpOworCQkJCQlTdHJpbmdCdWlsZGVyIHhtbENvbnRlbnQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQkJCQl4bWxDb250ZW50LmFwcGVuZCgKKwkJCQkJCQkiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iKQorCQkJCQkJCS5hcHBlbmQoIjxtYW5pZmVzdD4iKQorCQkJCQkJCS5hcHBlbmQoIjxyZW1vdGUgbmFtZT1cIm9yaWdpblwiIGZldGNoPVwiIgorCQkJCQkJCQkJKyBmZXRjaFVybCArICJcIiAvPiIpCisJCQkJCQkJLmFwcGVuZCgiPGRlZmF1bHQgcmV2aXNpb249XCJtYXN0ZXJcIiByZW1vdGU9XCJvcmlnaW5cIiAvPiIpCisJCQkJCQkJLmFwcGVuZCgiPHByb2plY3QgcGF0aD1cInNyY1wiIG5hbWU9XCJjaHJvbWl1bS9zcmNcIiAvPiIpCisJCQkJCQkJLmFwcGVuZCgiPC9tYW5pZmVzdD4iKTsKKwkJCQkJUmVwb0NvbW1hbmQgY21kID0gbmV3IFJlcG9Db21tYW5kKGRlc3QpOwogCi0JCQkJSW5kZXhlZFJlcG9zIHJlcG9zID0gbmV3IEluZGV4ZWRSZXBvcygpOwotCQkJCXJlcG9zLnB1dChyZXBvVXJsLCBjaGlsZCk7CisJCQkJCUluZGV4ZWRSZXBvcyByZXBvcyA9IG5ldyBJbmRleGVkUmVwb3MoKTsKKwkJCQkJcmVwb3MucHV0KHJlcG9VcmwsIGNoaWxkKTsKIAotCQkJCVJldkNvbW1pdCBjb21taXQgPSBjbWQKLQkJCQkJLnNldElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWxDb250ZW50LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKSkKLQkJCQkJLnNldFJlbW90ZVJlYWRlcihyZXBvcykKLQkJCQkJLnNldFVSSShiYXNlVXJsKQotCQkJCQkuc2V0VGFyZ2V0VVJJKGFicyArICIvc3VwZXJwcm9qZWN0IikKLQkJCQkJLnNldFJlY29yZFJlbW90ZUJyYW5jaCh0cnVlKQotCQkJCQkuc2V0UmVjb3JkU3VibW9kdWxlTGFiZWxzKHRydWUpCi0JCQkJCS5jYWxsKCk7CisJCQkJCVJldkNvbW1pdCBjb21taXQgPSBjbWQKKwkJCQkJCQkuc2V0SW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKAorCQkJCQkJCQkJeG1sQ29udGVudC50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpKSkKKwkJCQkJCQkuc2V0UmVtb3RlUmVhZGVyKHJlcG9zKS5zZXRVUkkoYmFzZVVybCkKKwkJCQkJCQkuc2V0VGFyZ2V0VVJJKGFicyArICIvc3VwZXJwcm9qZWN0IikKKwkJCQkJCQkuc2V0UmVjb3JkUmVtb3RlQnJhbmNoKHRydWUpCisJCQkJCQkJLnNldFJlY29yZFN1Ym1vZHVsZUxhYmVscyh0cnVlKS5jYWxsKCk7CiAKLQkJCQlTdHJpbmcgaWRTdHIgPSBjb21taXQuZ2V0SWQoKS5uYW1lKCkgKyAiOiIgKyAiLmdpdG1vZHVsZXMiOwotCQkJCU9iamVjdElkIG1vZElkID0gZGVzdC5yZXNvbHZlKGlkU3RyKTsKKwkJCQkJU3RyaW5nIGlkU3RyID0gY29tbWl0LmdldElkKCkubmFtZSgpICsgIjoiICsgIi5naXRtb2R1bGVzIjsKKwkJCQkJT2JqZWN0SWQgbW9kSWQgPSBkZXN0LnJlc29sdmUoaWRTdHIpOwogCi0JCQkJdHJ5IChPYmplY3RSZWFkZXIgcmVhZGVyID0gZGVzdC5uZXdPYmplY3RSZWFkZXIoKSkgewotCQkJCQlieXRlW10gYnl0ZXMgPSByZWFkZXIub3Blbihtb2RJZCkuZ2V0Q2FjaGVkQnl0ZXMoSW50ZWdlci5NQVhfVkFMVUUpOwotCQkJCQlDb25maWcgYmFzZSA9IG5ldyBDb25maWcoKTsKLQkJCQkJQmxvYkJhc2VkQ29uZmlnIGNmZyA9IG5ldyBCbG9iQmFzZWRDb25maWcoYmFzZSwgYnl0ZXMpOwotCQkJCQlTdHJpbmcgc3ViVXJsID0gY2ZnLmdldFN0cmluZygic3VibW9kdWxlIiwgInNyYyIsICJ1cmwiKTsKLQkJCQkJYXNzZXJ0RXF1YWxzKCIuLi9jaHJvbWl1bS9zcmMiLCBzdWJVcmwpOwotCQkJCX0KLQkJCQlmZXRjaFNsYXNoID0gIWZldGNoU2xhc2g7Ci0JCQl9IHdoaWxlIChmZXRjaFNsYXNoKTsKLQkJCWJhc2VTbGFzaCA9ICFiYXNlU2xhc2g7Ci0JCX0gd2hpbGUgKGJhc2VTbGFzaCk7Ci0JCWNoaWxkLmNsb3NlKCk7Ci0JCWRlc3QuY2xvc2UoKTsKKwkJCQkJdHJ5IChPYmplY3RSZWFkZXIgcmVhZGVyID0gZGVzdC5uZXdPYmplY3RSZWFkZXIoKSkgeworCQkJCQkJYnl0ZVtdIGJ5dGVzID0gcmVhZGVyLm9wZW4obW9kSWQpCisJCQkJCQkJCS5nZXRDYWNoZWRCeXRlcyhJbnRlZ2VyLk1BWF9WQUxVRSk7CisJCQkJCQlDb25maWcgYmFzZSA9IG5ldyBDb25maWcoKTsKKwkJCQkJCUJsb2JCYXNlZENvbmZpZyBjZmcgPSBuZXcgQmxvYkJhc2VkQ29uZmlnKGJhc2UsIGJ5dGVzKTsKKwkJCQkJCVN0cmluZyBzdWJVcmwgPSBjZmcuZ2V0U3RyaW5nKCJzdWJtb2R1bGUiLCAic3JjIiwKKwkJCQkJCQkJInVybCIpOworCQkJCQkJYXNzZXJ0RXF1YWxzKCIuLi9jaHJvbWl1bS9zcmMiLCBzdWJVcmwpOworCQkJCQl9CisJCQkJCWZldGNoU2xhc2ggPSAhZmV0Y2hTbGFzaDsKKwkJCQl9IHdoaWxlIChmZXRjaFNsYXNoKTsKKwkJCQliYXNlU2xhc2ggPSAhYmFzZVNsYXNoOworCQkJfSB3aGlsZSAoYmFzZVNsYXNoKTsKKwkJfQogCX0KIAogCUBUZXN0CkBAIC01MTMsMTEgKzQ3MiwxMiBAQAogCQkJLmNhbGwoKTsKIAkJRmlsZSBoZWxsbyA9IG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksICJmb28vaGVsbG8udHh0Iik7CiAJCWFzc2VydFRydWUoInN1Ym1vZHVsZSBzaG91bGQgYmUgY2hlY2tlZCBvdXQiLCBoZWxsby5leGlzdHMoKSk7Ci0JCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihoZWxsbykpOwotCQlTdHJpbmcgY29udGVudCA9IHJlYWRlci5yZWFkTGluZSgpOwotCQlyZWFkZXIuY2xvc2UoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdWJtb2R1bGUgY29udGVudCBzaG91bGQgYmUgYXMgZXhwZWN0ZWQiLAotCQkJCSJtYXN0ZXIgd29ybGQiLCBjb250ZW50KTsKKwkJdHJ5IChCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCisJCQkJbmV3IEZpbGVSZWFkZXIoaGVsbG8pKSkgeworCQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKKwkJCWFzc2VydEVxdWFscygic3VibW9kdWxlIGNvbnRlbnQgc2hvdWxkIGJlIGFzIGV4cGVjdGVkIiwKKwkJCQkJIm1hc3RlciB3b3JsZCIsIGNvbnRlbnQpOworCQl9CiAJfQogCiAJQFRlc3QKQEAgLTYwMywxOSArNTYzLDIxIEBACiAJCS8vIFRoZSBvcmlnaW5hbCBmaWxlIHNob3VsZCBleGlzdAogCQlGaWxlIGhlbGxvID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLCAiZm9vL2hlbGxvLnR4dCIpOwogCQlhc3NlcnRUcnVlKCJUaGUgb3JpZ2luYWwgZmlsZSBzaG91bGQgZXhpc3QiLCBoZWxsby5leGlzdHMoKSk7Ci0JCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihoZWxsbykpOwotCQlTdHJpbmcgY29udGVudCA9IHJlYWRlci5yZWFkTGluZSgpOwotCQlyZWFkZXIuY2xvc2UoKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgb3JpZ2luYWwgZmlsZSBzaG91bGQgaGF2ZSBleHBlY3RlZCBjb250ZW50IiwKLQkJCQkibWFzdGVyIHdvcmxkIiwgY29udGVudCk7CisJCXRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorCQkJCW5ldyBGaWxlUmVhZGVyKGhlbGxvKSkpIHsKKwkJCVN0cmluZyBjb250ZW50ID0gcmVhZGVyLnJlYWRMaW5lKCk7CisJCQlhc3NlcnRFcXVhbHMoIlRoZSBvcmlnaW5hbCBmaWxlIHNob3VsZCBoYXZlIGV4cGVjdGVkIGNvbnRlbnQiLAorCQkJCQkibWFzdGVyIHdvcmxkIiwgY29udGVudCk7CisJCX0KIAkJLy8gVGhlIGRlc3QgZmlsZSBzaG91bGQgYWxzbyBleGlzdAogCQloZWxsbyA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwgIkhlbGxvIik7CiAJCWFzc2VydFRydWUoIlRoZSBkZXN0aW5hdGlvbiBmaWxlIHNob3VsZCBleGlzdCIsIGhlbGxvLmV4aXN0cygpKTsKLQkJcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGhlbGxvKSk7Ci0JCWNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKLQkJcmVhZGVyLmNsb3NlKCk7Ci0JCWFzc2VydEVxdWFscygiVGhlIGRlc3RpbmF0aW9uIGZpbGUgc2hvdWxkIGhhdmUgZXhwZWN0ZWQgY29udGVudCIsCi0JCQkJIm1hc3RlciB3b3JsZCIsIGNvbnRlbnQpOworCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKKwkJCQluZXcgRmlsZVJlYWRlcihoZWxsbykpKSB7CisJCQlTdHJpbmcgY29udGVudCA9IHJlYWRlci5yZWFkTGluZSgpOworCQkJYXNzZXJ0RXF1YWxzKCJUaGUgZGVzdGluYXRpb24gZmlsZSBzaG91bGQgaGF2ZSBleHBlY3RlZCBjb250ZW50IiwKKwkJCQkJIm1hc3RlciB3b3JsZCIsIGNvbnRlbnQpOworCQl9CiAJfQogCiAJQFRlc3QKQEAgLTYzOCwyNCArNjAwLDI3IEBACiAJCQkJLnNldFVSSShyb290VXJpKS5jYWxsKCk7CiAJCS8vIENsb25lIGl0CiAJCUZpbGUgZGlyZWN0b3J5ID0gY3JlYXRlVGVtcERpcmVjdG9yeSgidGVzdEJhcmVSZXBvIik7Ci0JCVJlcG9zaXRvcnkgbG9jYWxEYiA9IEdpdC5jbG9uZVJlcG9zaXRvcnkoKS5zZXREaXJlY3RvcnkoZGlyZWN0b3J5KQorCQl0cnkgKFJlcG9zaXRvcnkgbG9jYWxEYiA9IEdpdC5jbG9uZVJlcG9zaXRvcnkoKS5zZXREaXJlY3RvcnkoZGlyZWN0b3J5KQogCQkJCS5zZXRVUkkocmVtb3RlRGIuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1N0cmluZygpKS5jYWxsKCkKLQkJCQkuZ2V0UmVwb3NpdG9yeSgpOwotCQkvLyBUaGUgLmdpdG1vZHVsZXMgZmlsZSBzaG91bGQgZXhpc3QKLQkJRmlsZSBnaXRtb2R1bGVzID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLCAiLmdpdG1vZHVsZXMiKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIC5naXRtb2R1bGVzIGZpbGUgc2hvdWxkIGV4aXN0IiwgZ2l0bW9kdWxlcy5leGlzdHMoKSk7Ci0JCS8vIFRoZSBmaXJzdCBsaW5lIG9mIC5naXRtb2R1bGVzIGZpbGUgc2hvdWxkIGJlIGV4cGVjdGVkCi0JCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihnaXRtb2R1bGVzKSk7Ci0JCVN0cmluZyBjb250ZW50ID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0JCXJlYWRlci5jbG9zZSgpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSBmaXJzdCBsaW5lIG9mIC5naXRtb2R1bGVzIGZpbGUgc2hvdWxkIGJlIGFzIGV4cGVjdGVkIiwKLQkJCQkiW3N1Ym1vZHVsZSBcImZvb1wiXSIsIGNvbnRlbnQpOwotCQkvLyBUaGUgZ2l0bGluayBzaG91bGQgYmUgdGhlIHNhbWUgYXMgcmVtb3RlIGhlYWQgc2hhMQotCQlTdHJpbmcgZ2l0bGluayA9IGxvY2FsRGIucmVzb2x2ZShDb25zdGFudHMuSEVBRCArICI6Zm9vIikubmFtZSgpOwotCQlsb2NhbERiLmNsb3NlKCk7Ci0JCVN0cmluZyByZW1vdGUgPSBkZWZhdWx0RGIucmVzb2x2ZShDb25zdGFudHMuSEVBRCkubmFtZSgpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSBnaXRsaW5rIHNob3VsZCBiZSB0aGUgc2FtZSBhcyByZW1vdGUgaGVhZCIsIHJlbW90ZSwKLQkJCQlnaXRsaW5rKTsKKwkJCQkuZ2V0UmVwb3NpdG9yeSgpKSB7CisJCQkvLyBUaGUgLmdpdG1vZHVsZXMgZmlsZSBzaG91bGQgZXhpc3QKKwkJCUZpbGUgZ2l0bW9kdWxlcyA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwgIi5naXRtb2R1bGVzIik7CisJCQlhc3NlcnRUcnVlKCJUaGUgLmdpdG1vZHVsZXMgZmlsZSBzaG91bGQgZXhpc3QiLAorCQkJCQlnaXRtb2R1bGVzLmV4aXN0cygpKTsKKwkJCS8vIFRoZSBmaXJzdCBsaW5lIG9mIC5naXRtb2R1bGVzIGZpbGUgc2hvdWxkIGJlIGV4cGVjdGVkCisJCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKKwkJCQkJbmV3IEZpbGVSZWFkZXIoZ2l0bW9kdWxlcykpKSB7CisJCQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKKwkJCQlhc3NlcnRFcXVhbHMoCisJCQkJCQkiVGhlIGZpcnN0IGxpbmUgb2YgLmdpdG1vZHVsZXMgZmlsZSBzaG91bGQgYmUgYXMgZXhwZWN0ZWQiLAorCQkJCQkJIltzdWJtb2R1bGUgXCJmb29cIl0iLCBjb250ZW50KTsKKwkJCX0KKwkJCS8vIFRoZSBnaXRsaW5rIHNob3VsZCBiZSB0aGUgc2FtZSBhcyByZW1vdGUgaGVhZCBzaGExCisJCQlTdHJpbmcgZ2l0bGluayA9IGxvY2FsRGIucmVzb2x2ZShDb25zdGFudHMuSEVBRCArICI6Zm9vIikubmFtZSgpOworCQkJU3RyaW5nIHJlbW90ZSA9IGRlZmF1bHREYi5yZXNvbHZlKENvbnN0YW50cy5IRUFEKS5uYW1lKCk7CisJCQlhc3NlcnRFcXVhbHMoIlRoZSBnaXRsaW5rIHNob3VsZCBiZSB0aGUgc2FtZSBhcyByZW1vdGUgaGVhZCIsCisJCQkJCXJlbW90ZSwgZ2l0bGluayk7CisJCX0KIAl9CiAKIAlAVGVzdApAQCAtNjc3LDExICs2NDIsMTIgQEAKIAkJCS5zZXRVUkkocm9vdFVyaSkKIAkJCS5jYWxsKCk7CiAJCUZpbGUgaGVsbG8gPSBuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLCAiZm9vL2hlbGxvLnR4dCIpOwotCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoaGVsbG8pKTsKLQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKLQkJcmVhZGVyLmNsb3NlKCk7Ci0JCWFzc2VydEVxdWFscygic3VibW9kdWxlIGNvbnRlbnQgc2hvdWxkIGJlIGFzIGV4cGVjdGVkIiwKLQkJCQkiYnJhbmNoIHdvcmxkIiwgY29udGVudCk7CisJCXRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorCQkJCW5ldyBGaWxlUmVhZGVyKGhlbGxvKSkpIHsKKwkJCVN0cmluZyBjb250ZW50ID0gcmVhZGVyLnJlYWRMaW5lKCk7CisJCQlhc3NlcnRFcXVhbHMoInN1Ym1vZHVsZSBjb250ZW50IHNob3VsZCBiZSBhcyBleHBlY3RlZCIsCisJCQkJCSJicmFuY2ggd29ybGQiLCBjb250ZW50KTsKKwkJfQogCX0KIAogCUBUZXN0CkBAIC03MDMsMTEgKzY2OSwxMiBAQAogCQkJLnNldFVSSShyb290VXJpKQogCQkJLmNhbGwoKTsKIAkJRmlsZSBoZWxsbyA9IG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksICJmb28vaGVsbG8udHh0Iik7Ci0JCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihoZWxsbykpOwotCQlTdHJpbmcgY29udGVudCA9IHJlYWRlci5yZWFkTGluZSgpOwotCQlyZWFkZXIuY2xvc2UoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdWJtb2R1bGUgY29udGVudCBzaG91bGQgYmUgYXMgZXhwZWN0ZWQiLAotCQkJCSJicmFuY2ggd29ybGQiLCBjb250ZW50KTsKKwkJdHJ5IChCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCisJCQkJbmV3IEZpbGVSZWFkZXIoaGVsbG8pKSkgeworCQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKKwkJCWFzc2VydEVxdWFscygic3VibW9kdWxlIGNvbnRlbnQgc2hvdWxkIGJlIGFzIGV4cGVjdGVkIiwKKwkJCQkJImJyYW5jaCB3b3JsZCIsIGNvbnRlbnQpOworCQl9CiAJfQogCiAJQFRlc3QKQEAgLTcyOSwxMSArNjk2LDEyIEBACiAJCQkuc2V0VVJJKHJvb3RVcmkpCiAJCQkuY2FsbCgpOwogCQlGaWxlIGhlbGxvID0gbmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgImZvby9oZWxsby50eHQiKTsKLQkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGhlbGxvKSk7Ci0JCVN0cmluZyBjb250ZW50ID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0JCXJlYWRlci5jbG9zZSgpOwotCQlhc3NlcnRFcXVhbHMoInN1Ym1vZHVsZSBjb250ZW50IHNob3VsZCBiZSBhcyBleHBlY3RlZCIsCi0JCQkJImJyYW5jaCB3b3JsZCIsIGNvbnRlbnQpOworCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKKwkJCQluZXcgRmlsZVJlYWRlcihoZWxsbykpKSB7CisJCQlTdHJpbmcgY29udGVudCA9IHJlYWRlci5yZWFkTGluZSgpOworCQkJYXNzZXJ0RXF1YWxzKCJzdWJtb2R1bGUgY29udGVudCBzaG91bGQgYmUgYXMgZXhwZWN0ZWQiLAorCQkJCQkiYnJhbmNoIHdvcmxkIiwgY29udGVudCk7CisJCX0KIAl9CiAKIAlAVGVzdApAQCAtNzU3LDE0ICs3MjUsMTQgQEAKIAkJCQkuc2V0VVJJKHJvb3RVcmkpLmNhbGwoKTsKIAkJLy8gQ2xvbmUgaXQKIAkJRmlsZSBkaXJlY3RvcnkgPSBjcmVhdGVUZW1wRGlyZWN0b3J5KCJ0ZXN0UmV2aXNpb25CYXJlIik7Ci0JCVJlcG9zaXRvcnkgbG9jYWxEYiA9IEdpdC5jbG9uZVJlcG9zaXRvcnkoKS5zZXREaXJlY3RvcnkoZGlyZWN0b3J5KQorCQl0cnkgKFJlcG9zaXRvcnkgbG9jYWxEYiA9IEdpdC5jbG9uZVJlcG9zaXRvcnkoKS5zZXREaXJlY3RvcnkoZGlyZWN0b3J5KQogCQkJCS5zZXRVUkkocmVtb3RlRGIuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1N0cmluZygpKS5jYWxsKCkKLQkJCQkuZ2V0UmVwb3NpdG9yeSgpOwotCQkvLyBUaGUgZ2l0bGluayBzaG91bGQgYmUgdGhlIHNhbWUgYXMgb2xkQ29tbWl0SWQKLQkJU3RyaW5nIGdpdGxpbmsgPSBsb2NhbERiLnJlc29sdmUoQ29uc3RhbnRzLkhFQUQgKyAiOmZvbyIpLm5hbWUoKTsKLQkJbG9jYWxEYi5jbG9zZSgpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSBnaXRsaW5rIGlzIHNhbWUgYXMgcmVtb3RlIGhlYWQiLCBvbGRDb21taXRJZC5uYW1lKCksCi0JCQkJZ2l0bGluayk7CisJCQkJLmdldFJlcG9zaXRvcnkoKSkgeworCQkJLy8gVGhlIGdpdGxpbmsgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIG9sZENvbW1pdElkCisJCQlTdHJpbmcgZ2l0bGluayA9IGxvY2FsRGIucmVzb2x2ZShDb25zdGFudHMuSEVBRCArICI6Zm9vIikubmFtZSgpOworCQkJYXNzZXJ0RXF1YWxzKCJUaGUgZ2l0bGluayBpcyBzYW1lIGFzIHJlbW90ZSBoZWFkIiwKKwkJCQkJb2xkQ29tbWl0SWQubmFtZSgpLCBnaXRsaW5rKTsKKwkJfQogCX0KIAogCUBUZXN0CkBAIC03OTAsMjIgKzc1OCwyNCBAQAogCQkJCS5zZXRVUkkocm9vdFVyaSkuY2FsbCgpOwogCQkvLyBDbG9uZSBpdAogCQlGaWxlIGRpcmVjdG9yeSA9IGNyZWF0ZVRlbXBEaXJlY3RvcnkoInRlc3RDb3B5RmlsZUJhcmUiKTsKLQkJUmVwb3NpdG9yeSBsb2NhbERiID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpLnNldERpcmVjdG9yeShkaXJlY3RvcnkpCisJCXRyeSAoUmVwb3NpdG9yeSBsb2NhbERiID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpLnNldERpcmVjdG9yeShkaXJlY3RvcnkpCiAJCQkJLnNldFVSSShyZW1vdGVEYi5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvU3RyaW5nKCkpLmNhbGwoKQotCQkJCS5nZXRSZXBvc2l0b3J5KCk7Ci0JCS8vIFRoZSBIZWxsbyBmaWxlIHNob3VsZCBleGlzdAotCQlGaWxlIGhlbGxvID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLCAiSGVsbG8iKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIEhlbGxvIGZpbGUgc2hvdWxkIGV4aXN0IiwgaGVsbG8uZXhpc3RzKCkpOwotCQkvLyBUaGUgZm9vL0hlbGxvIGZpbGUgc2hvdWxkIGJlIHNraXBwZWQuCi0JCUZpbGUgZm9vaGVsbG8gPSBuZXcgRmlsZShsb2NhbERiLmdldFdvcmtUcmVlKCksICJmb28vSGVsbG8iKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBmb28vSGVsbG8gZmlsZSBzaG91bGQgYmUgc2tpcHBlZCIsIGZvb2hlbGxvLmV4aXN0cygpKTsKLQkJbG9jYWxEYi5jbG9zZSgpOwotCQkvLyBUaGUgY29udGVudCBvZiBIZWxsbyBmaWxlIHNob3VsZCBiZSBleHBlY3RlZAotCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoaGVsbG8pKTsKLQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKLQkJcmVhZGVyLmNsb3NlKCk7Ci0JCWFzc2VydEVxdWFscygiVGhlIEhlbGxvIGZpbGUgc2hvdWxkIGhhdmUgZXhwZWN0ZWQgY29udGVudCIsCi0JCQkJImJyYW5jaCB3b3JsZCIsIGNvbnRlbnQpOworCQkJCS5nZXRSZXBvc2l0b3J5KCkpIHsKKwkJCS8vIFRoZSBIZWxsbyBmaWxlIHNob3VsZCBleGlzdAorCQkJRmlsZSBoZWxsbyA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwgIkhlbGxvIik7CisJCQlhc3NlcnRUcnVlKCJUaGUgSGVsbG8gZmlsZSBzaG91bGQgZXhpc3QiLCBoZWxsby5leGlzdHMoKSk7CisJCQkvLyBUaGUgZm9vL0hlbGxvIGZpbGUgc2hvdWxkIGJlIHNraXBwZWQuCisJCQlGaWxlIGZvb2hlbGxvID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLCAiZm9vL0hlbGxvIik7CisJCQlhc3NlcnRGYWxzZSgiVGhlIGZvby9IZWxsbyBmaWxlIHNob3VsZCBiZSBza2lwcGVkIiwKKwkJCQkJZm9vaGVsbG8uZXhpc3RzKCkpOworCQkJLy8gVGhlIGNvbnRlbnQgb2YgSGVsbG8gZmlsZSBzaG91bGQgYmUgZXhwZWN0ZWQKKwkJCXRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorCQkJCQluZXcgRmlsZVJlYWRlcihoZWxsbykpKSB7CisJCQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKKwkJCQlhc3NlcnRFcXVhbHMoIlRoZSBIZWxsbyBmaWxlIHNob3VsZCBoYXZlIGV4cGVjdGVkIGNvbnRlbnQiLAorCQkJCQkJImJyYW5jaCB3b3JsZCIsIGNvbnRlbnQpOworCQkJfQorCQl9CiAJfQogCiAJQFRlc3QKQEAgLTg0MSwzNiArODExLDM4IEBACiAJCQkJLnNldFVSSShyb290VXJpKS5jYWxsKCk7CiAJCS8vIENsb25lIGl0CiAJCUZpbGUgZGlyZWN0b3J5ID0gY3JlYXRlVGVtcERpcmVjdG9yeSgidGVzdFJlcGxhY2VNYW5pZmVzdEJhcmUiKTsKLQkJUmVwb3NpdG9yeSBsb2NhbERiID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpLnNldERpcmVjdG9yeShkaXJlY3RvcnkpCisJCUZpbGUgZG90bW9kdWxlczsKKwkJdHJ5IChSZXBvc2l0b3J5IGxvY2FsRGIgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkuc2V0RGlyZWN0b3J5KGRpcmVjdG9yeSkKIAkJCQkuc2V0VVJJKHJlbW90ZURiLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9TdHJpbmcoKSkuY2FsbCgpCi0JCQkJLmdldFJlcG9zaXRvcnkoKTsKLQkJLy8gVGhlIEhlbGxvIGZpbGUgc2hvdWxkIG5vdCBleGlzdAotCQlGaWxlIGhlbGxvID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLCAiSGVsbG8iKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBIZWxsbyBmaWxlIHNob3VsZG4ndCBleGlzdCIsIGhlbGxvLmV4aXN0cygpKTsKLQkJLy8gVGhlIEhlbGxvLnR4dCBmaWxlIHNob3VsZCBleGlzdAotCQlGaWxlIGhlbGxvdHh0ID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLCAiSGVsbG8udHh0Iik7Ci0JCWFzc2VydFRydWUoIlRoZSBIZWxsby50eHQgZmlsZSBzaG91bGQgZXhpc3QiLCBoZWxsb3R4dC5leGlzdHMoKSk7CisJCQkJLmdldFJlcG9zaXRvcnkoKSkgeworCQkJLy8gVGhlIEhlbGxvIGZpbGUgc2hvdWxkIG5vdCBleGlzdAorCQkJRmlsZSBoZWxsbyA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwgIkhlbGxvIik7CisJCQlhc3NlcnRGYWxzZSgiVGhlIEhlbGxvIGZpbGUgc2hvdWxkbid0IGV4aXN0IiwgaGVsbG8uZXhpc3RzKCkpOworCQkJLy8gVGhlIEhlbGxvLnR4dCBmaWxlIHNob3VsZCBleGlzdAorCQkJRmlsZSBoZWxsb3R4dCA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwgIkhlbGxvLnR4dCIpOworCQkJYXNzZXJ0VHJ1ZSgiVGhlIEhlbGxvLnR4dCBmaWxlIHNob3VsZCBleGlzdCIsIGhlbGxvdHh0LmV4aXN0cygpKTsKKwkJCWRvdG1vZHVsZXMgPSBuZXcgRmlsZShsb2NhbERiLmdldFdvcmtUcmVlKCksCisJCQkJCUNvbnN0YW50cy5ET1RfR0lUX01PRFVMRVMpOworCQl9CiAJCS8vIFRoZSAuZ2l0bW9kdWxlcyBmaWxlIHNob3VsZCBoYXZlICdzdWJtb2R1bGUgImJhciInIGFuZCBzaG91bGRuJ3QKIAkJLy8gaGF2ZQogCQkvLyAnc3VibW9kdWxlICJmb28iJyBsaW5lcy4KLQkJRmlsZSBkb3Rtb2R1bGVzID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLAotCQkJCUNvbnN0YW50cy5ET1RfR0lUX01PRFVMRVMpOwotCQlsb2NhbERiLmNsb3NlKCk7Ci0JCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihkb3Rtb2R1bGVzKSk7Ci0JCWJvb2xlYW4gZm9vID0gZmFsc2U7Ci0JCWJvb2xlYW4gYmFyID0gZmFsc2U7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQlTdHJpbmcgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOwotCQkJaWYgKGxpbmUgPT0gbnVsbCkKLQkJCQlicmVhazsKLQkJCWlmIChsaW5lLmNvbnRhaW5zKCJzdWJtb2R1bGUgXCJmb29cIiIpKQotCQkJCWZvbyA9IHRydWU7Ci0JCQlpZiAobGluZS5jb250YWlucygic3VibW9kdWxlIFwiYmFyXCIiKSkKLQkJCQliYXIgPSB0cnVlOworCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKKwkJCQluZXcgRmlsZVJlYWRlcihkb3Rtb2R1bGVzKSkpIHsKKwkJCWJvb2xlYW4gZm9vID0gZmFsc2U7CisJCQlib29sZWFuIGJhciA9IGZhbHNlOworCQkJd2hpbGUgKHRydWUpIHsKKwkJCQlTdHJpbmcgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOworCQkJCWlmIChsaW5lID09IG51bGwpCisJCQkJCWJyZWFrOworCQkJCWlmIChsaW5lLmNvbnRhaW5zKCJzdWJtb2R1bGUgXCJmb29cIiIpKQorCQkJCQlmb28gPSB0cnVlOworCQkJCWlmIChsaW5lLmNvbnRhaW5zKCJzdWJtb2R1bGUgXCJiYXJcIiIpKQorCQkJCQliYXIgPSB0cnVlOworCQkJfQorCQkJYXNzZXJ0VHJ1ZSgiVGhlIGJhciBzdWJtb2R1bGUgc2hvdWxkIGV4aXN0IiwgYmFyKTsKKwkJCWFzc2VydEZhbHNlKCJUaGUgZm9vIHN1Ym1vZHVsZSBzaG91bGRuJ3QgZXhpc3QiLCBmb28pOwogCQl9Ci0JCXJlYWRlci5jbG9zZSgpOwotCQlhc3NlcnRUcnVlKCJUaGUgYmFyIHN1Ym1vZHVsZSBzaG91bGQgZXhpc3QiLCBiYXIpOwotCQlhc3NlcnRGYWxzZSgiVGhlIGZvbyBzdWJtb2R1bGUgc2hvdWxkbid0IGV4aXN0IiwgZm9vKTsKIAl9CiAKIAlAVGVzdApAQCAtODk2LDM0ICs4NjgsMzcgQEAKIAkJCQkuc2V0VVJJKHJvb3RVcmkpLmNhbGwoKTsKIAkJLy8gQ2xvbmUgaXQKIAkJRmlsZSBkaXJlY3RvcnkgPSBjcmVhdGVUZW1wRGlyZWN0b3J5KCJ0ZXN0UmVtb3ZlT3ZlcmxhcHBpbmdCYXJlIik7Ci0JCVJlcG9zaXRvcnkgbG9jYWxEYiA9IEdpdC5jbG9uZVJlcG9zaXRvcnkoKS5zZXREaXJlY3RvcnkoZGlyZWN0b3J5KQorCQlGaWxlIGRvdG1vZHVsZXM7CisJCXRyeSAoUmVwb3NpdG9yeSBsb2NhbERiID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpLnNldERpcmVjdG9yeShkaXJlY3RvcnkpCiAJCQkJLnNldFVSSShyZW1vdGVEYi5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvU3RyaW5nKCkpLmNhbGwoKQotCQkJCS5nZXRSZXBvc2l0b3J5KCk7CisJCQkJLmdldFJlcG9zaXRvcnkoKSkgeworCQkJZG90bW9kdWxlcyA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwKKwkJCQlDb25zdGFudHMuRE9UX0dJVF9NT0RVTEVTKTsKKwkJfQorCiAJCS8vIFRoZSAuZ2l0bW9kdWxlcyBmaWxlIHNob3VsZCBoYXZlICdzdWJtb2R1bGUgImZvbyInIGFuZCBzaG91bGRuJ3QKIAkJLy8gaGF2ZQogCQkvLyAnc3VibW9kdWxlICJmb28vYmFyIicgbGluZXMuCi0JCUZpbGUgZG90bW9kdWxlcyA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwKLQkJCQlDb25zdGFudHMuRE9UX0dJVF9NT0RVTEVTKTsKLQkJbG9jYWxEYi5jbG9zZSgpOwotCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZG90bW9kdWxlcykpOwotCQlib29sZWFuIGZvbyA9IGZhbHNlOwotCQlib29sZWFuIGZvb2JhciA9IGZhbHNlOwotCQlib29sZWFuIGEgPSBmYWxzZTsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCVN0cmluZyBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQlpZiAobGluZSA9PSBudWxsKQotCQkJCWJyZWFrOwotCQkJaWYgKGxpbmUuY29udGFpbnMoInN1Ym1vZHVsZSBcImZvb1wiIikpCi0JCQkJZm9vID0gdHJ1ZTsKLQkJCWlmIChsaW5lLmNvbnRhaW5zKCJzdWJtb2R1bGUgXCJmb28vYmFyXCIiKSkKLQkJCQlmb29iYXIgPSB0cnVlOwotCQkJaWYgKGxpbmUuY29udGFpbnMoInN1Ym1vZHVsZSBcImFcIiIpKQotCQkJCWEgPSB0cnVlOworCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKKwkJCQluZXcgRmlsZVJlYWRlcihkb3Rtb2R1bGVzKSkpIHsKKwkJCWJvb2xlYW4gZm9vID0gZmFsc2U7CisJCQlib29sZWFuIGZvb2JhciA9IGZhbHNlOworCQkJYm9vbGVhbiBhID0gZmFsc2U7CisJCQl3aGlsZSAodHJ1ZSkgeworCQkJCVN0cmluZyBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7CisJCQkJaWYgKGxpbmUgPT0gbnVsbCkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKGxpbmUuY29udGFpbnMoInN1Ym1vZHVsZSBcImZvb1wiIikpCisJCQkJCWZvbyA9IHRydWU7CisJCQkJaWYgKGxpbmUuY29udGFpbnMoInN1Ym1vZHVsZSBcImZvby9iYXJcIiIpKQorCQkJCQlmb29iYXIgPSB0cnVlOworCQkJCWlmIChsaW5lLmNvbnRhaW5zKCJzdWJtb2R1bGUgXCJhXCIiKSkKKwkJCQkJYSA9IHRydWU7CisJCQl9CisJCQlhc3NlcnRUcnVlKCJUaGUgZm9vIHN1Ym1vZHVsZSBzaG91bGQgZXhpc3QiLCBmb28pOworCQkJYXNzZXJ0RmFsc2UoIlRoZSBmb28vYmFyIHN1Ym1vZHVsZSBzaG91bGRuJ3QgZXhpc3QiLCBmb29iYXIpOworCQkJYXNzZXJ0VHJ1ZSgiVGhlIGEgc3VibW9kdWxlIHNob3VsZCBleGlzdCIsIGEpOwogCQl9Ci0JCXJlYWRlci5jbG9zZSgpOwotCQlhc3NlcnRUcnVlKCJUaGUgZm9vIHN1Ym1vZHVsZSBzaG91bGQgZXhpc3QiLCBmb28pOwotCQlhc3NlcnRGYWxzZSgiVGhlIGZvby9iYXIgc3VibW9kdWxlIHNob3VsZG4ndCBleGlzdCIsIGZvb2Jhcik7Ci0JCWFzc2VydFRydWUoIlRoZSBhIHN1Ym1vZHVsZSBzaG91bGQgZXhpc3QiLCBhKTsKIAl9CiAKIAlAVGVzdApAQCAtOTU5LDExICs5MzQsMTIgQEAKIAkJCS5jYWxsKCk7CiAJCUZpbGUgaGVsbG8gPSBuZXcgRmlsZShsb2NhbERiLmdldFdvcmtUcmVlKCksICJmb28vaGVsbG8udHh0Iik7CiAJCWFzc2VydFRydWUoInN1Ym1vZHVsZSBzaG91bGQgYmUgY2hlY2tlZCBvdXQiLCBoZWxsby5leGlzdHMoKSk7Ci0JCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihoZWxsbykpOwotCQlTdHJpbmcgY29udGVudCA9IHJlYWRlci5yZWFkTGluZSgpOwotCQlyZWFkZXIuY2xvc2UoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdWJtb2R1bGUgY29udGVudCBzaG91bGQgYmUgYXMgZXhwZWN0ZWQiLAotCQkJCSJtYXN0ZXIgd29ybGQiLCBjb250ZW50KTsKKwkJdHJ5IChCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCisJCQkJbmV3IEZpbGVSZWFkZXIoaGVsbG8pKSkgeworCQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKKwkJCWFzc2VydEVxdWFscygic3VibW9kdWxlIGNvbnRlbnQgc2hvdWxkIGJlIGFzIGV4cGVjdGVkIiwKKwkJCQkJIm1hc3RlciB3b3JsZCIsIGNvbnRlbnQpOworCQl9CiAJfQogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFJlbW90ZUFsaWFzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0xMTY1LDExICsxMTQxLDEyIEBACiAJCQkuc2V0VVJJKHJvb3RVcmkpCiAJCQkuY2FsbCgpOwogCQlGaWxlIGhlbGxvID0gbmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgImZvby9oZWxsby50eHQiKTsKLQkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGhlbGxvKSk7Ci0JCVN0cmluZyBjb250ZW50ID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0JCXJlYWRlci5jbG9zZSgpOwotCQlhc3NlcnRFcXVhbHMoInN1Ym1vZHVsZSBjb250ZW50IHNob3VsZCBiZSBhcyBleHBlY3RlZCIsCi0JCQkJImJyYW5jaCB3b3JsZCIsIGNvbnRlbnQpOworCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKKwkJCQluZXcgRmlsZVJlYWRlcihoZWxsbykpKSB7CisJCQlTdHJpbmcgY29udGVudCA9IHJlYWRlci5yZWFkTGluZSgpOworCQkJYXNzZXJ0RXF1YWxzKCJzdWJtb2R1bGUgY29udGVudCBzaG91bGQgYmUgYXMgZXhwZWN0ZWQiLAorCQkJCQkiYnJhbmNoIHdvcmxkIiwgY29udGVudCk7CisJCX0KIAl9CiAKIAlAVGVzdApAQCAtMTE5MSwxMSArMTE2OCwxMiBAQAogCQkJLnNldFVSSShyb290VXJpKQogCQkJLmNhbGwoKTsKIAkJRmlsZSBoZWxsbyA9IG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksICJmb28vaGVsbG8udHh0Iik7Ci0JCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihoZWxsbykpOwotCQlTdHJpbmcgY29udGVudCA9IHJlYWRlci5yZWFkTGluZSgpOwotCQlyZWFkZXIuY2xvc2UoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdWJtb2R1bGUgY29udGVudCBzaG91bGQgYmUgYXMgZXhwZWN0ZWQiLAotCQkJCSJicmFuY2ggd29ybGQiLCBjb250ZW50KTsKKwkJdHJ5IChCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCisJCQkJbmV3IEZpbGVSZWFkZXIoaGVsbG8pKSkgeworCQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKKwkJCWFzc2VydEVxdWFscygic3VibW9kdWxlIGNvbnRlbnQgc2hvdWxkIGJlIGFzIGV4cGVjdGVkIiwKKwkJCQkJImJyYW5jaCB3b3JsZCIsIGNvbnRlbnQpOworCQl9CiAJfQogCiAJcHJpdmF0ZSB2b2lkIHJlc29sdmVSZWxhdGl2ZVVyaXMoKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaWdub3JlL0NHaXRJZ25vcmVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaWdub3JlL0NHaXRJZ25vcmVUZXN0LmphdmEKaW5kZXggM2IxMTYxNi4uMGM2ZWQwYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2lnbm9yZS9DR2l0SWdub3JlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pZ25vcmUvQ0dpdElnbm9yZVRlc3QuamF2YQpAQCAtMTQxLDcgKzE0MSw5IEBACiAJCS8vIERvIGEgdHJlZSB3YWxrIHRoYXQgZG9lcyBkZXNjZW5kIGludG8gaWdub3JlZCBkaXJlY3RvcmllcyBhbmQgcmV0dXJuCiAJCS8vIGEgbGlzdCBvZiBhbGwgaWdub3JlZCBmaWxlcwogCQl0cnkgKFRyZWVXYWxrIHdhbGsgPSBuZXcgVHJlZVdhbGsoZGIpKSB7Ci0JCQl3YWxrLmFkZFRyZWUobmV3IEZpbGVUcmVlSXRlcmF0b3IoZGIpKTsKKwkJCUZpbGVUcmVlSXRlcmF0b3IgaXRlciA9IG5ldyBGaWxlVHJlZUl0ZXJhdG9yKGRiKTsKKwkJCWl0ZXIuc2V0V2Fsa0lnbm9yZWREaXJlY3Rvcmllcyh0cnVlKTsKKwkJCXdhbGsuYWRkVHJlZShpdGVyKTsKIAkJCXdhbGsuc2V0UmVjdXJzaXZlKHRydWUpOwogCQkJd2hpbGUgKHdhbGsubmV4dCgpKSB7CiAJCQkJaWYgKHdhbGsuZ2V0VHJlZShXb3JraW5nVHJlZUl0ZXJhdG9yLmNsYXNzKS5pc0VudHJ5SWdub3JlZCgpKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaWdub3JlL0lnbm9yZU5vZGVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaWdub3JlL0lnbm9yZU5vZGVUZXN0LmphdmEKaW5kZXggY2NjNjRmYi4uNzhkOWE4MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2lnbm9yZS9JZ25vcmVOb2RlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pZ25vcmUvSWdub3JlTm9kZVRlc3QuamF2YQpAQCAtNDIsNyArNDIsNyBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaWdub3JlOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CkBAIC01Niw3ICs1Niw2IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pZ25vcmUuSWdub3JlTm9kZS5NYXRjaFJlc3VsdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LlJlcG9zaXRvcnlUZXN0Q2FzZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5GaWxlTW9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLkZpbGVUcmVlSXRlcmF0b3I7CkBAIC01NDYsMTkgKzU0NSw2IEBACiAJCWVuZFdhbGsoKTsKIAl9CiAKLQlAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEVtcHR5SWdub3JlTm9kZSgpIHsKLQkJLy8gUnVsZXMgYXJlIG5ldmVyIGVtcHR5OiBXb3JraW5nVHJlZUl0ZXJhdG9yIG9wdGltaXplcyBlbXB0eSBmaWxlcyBhd2F5Ci0JCS8vIFNvIHdlIGhhdmUgdG8gdGVzdCBpdCBtYW51YWxseSBpbiBjYXNlIHRoaXJkIHBhcnR5IGNsaWVudHMgdXNlCi0JCS8vIElnbm9yZU5vZGUgZGlyZWN0bHkuCi0JCUlnbm9yZU5vZGUgbm9kZSA9IG5ldyBJZ25vcmVOb2RlKCk7Ci0JCWFzc2VydEVxdWFscyhNYXRjaFJlc3VsdC5DSEVDS19QQVJFTlQsIG5vZGUuaXNJZ25vcmVkKCIiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoTWF0Y2hSZXN1bHQuQ0hFQ0tfUEFSRU5ULCBub2RlLmlzSWdub3JlZCgiIiwgZmFsc2UsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscyhNYXRjaFJlc3VsdC5DSEVDS19QQVJFTlRfTkVHQVRFX0ZJUlNUX01BVENILAotCQkJCW5vZGUuaXNJZ25vcmVkKCIiLCBmYWxzZSwgdHJ1ZSkpOwotCX0KLQogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdEVtcHR5SWdub3JlUnVsZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlJZ25vcmVOb2RlIG5vZGUgPSBuZXcgSWdub3JlTm9kZSgpOwpAQCAtNzQ2LDcgKzczMiw5IEBACiAKIAlwcml2YXRlIHZvaWQgYmVnaW5XYWxrKCkgewogCQl3YWxrID0gbmV3IFRyZWVXYWxrKGRiKTsKLQkJd2Fsay5hZGRUcmVlKG5ldyBGaWxlVHJlZUl0ZXJhdG9yKGRiKSk7CisJCUZpbGVUcmVlSXRlcmF0b3IgaXRlciA9IG5ldyBGaWxlVHJlZUl0ZXJhdG9yKGRiKTsKKwkJaXRlci5zZXRXYWxrSWdub3JlZERpcmVjdG9yaWVzKHRydWUpOworCQl3YWxrLmFkZFRyZWUoaXRlcik7CiAJfQogCiAJcHJpdmF0ZSB2b2lkIGVuZFdhbGsoKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtNzc5LDYgKzc2Nyw2IEBACiAJCWZvciAoU3RyaW5nIGxpbmUgOiBydWxlcykgewogCQkJZGF0YS5hcHBlbmQobGluZSArICJcbiIpOwogCQl9Ci0JCXJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGF0YS50b1N0cmluZygpLmdldEJ5dGVzKFVURl84KSk7CisJCXJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGF0YS50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW5kZXhkaWZmL0luZGV4RGlmZldpdGhTeW1saW5rVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2luZGV4ZGlmZi9JbmRleERpZmZXaXRoU3ltbGlua1Rlc3QuamF2YQppbmRleCBkNWQzODU3Li4yNmMxMWM3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW5kZXhkaWZmL0luZGV4RGlmZldpdGhTeW1saW5rVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbmRleGRpZmYvSW5kZXhEaWZmV2l0aFN5bWxpbmtUZXN0LmphdmEKQEAgLTQxLDcgKzQxLDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmluZGV4ZGlmZjsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwpAQCAtMTI4LDcgKzEyOCw3IEBACiAJCUZpbGUgcmVzdG9yZVNjcmlwdCA9IG5ldyBGaWxlKHRlc3REaXIsIG5hbWUgKyAiLnNoIik7CiAJCXRyeSAoT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbSgKIAkJCQluZXcgRmlsZU91dHB1dFN0cmVhbShyZXN0b3JlU2NyaXB0KSk7Ci0JCQkJV3JpdGVyIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0LCBVVEZfOCkpIHsKKwkJCQlXcml0ZXIgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXQsIENIQVJTRVQpKSB7CiAJCQl3cml0ZXIud3JpdGUoImVjaG8gYHdoaWNoIGdpdGAgMT4mMlxuIik7CiAJCQl3cml0ZXIud3JpdGUoImVjaG8gYGdpdCAtLXZlcnNpb25gIDE+JjJcbiIpOwogCQkJd3JpdGVyLndyaXRlKCJnaXQgaW5pdCAiICsgbmFtZSArICIgJiYgXFxcbiIpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9Db25jdXJyZW50UmVwYWNrVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9Db25jdXJyZW50UmVwYWNrVGVzdC5qYXZhCmluZGV4IDQ4MTNkMjguLjY0M2RhYTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQ29uY3VycmVudFJlcGFja1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0NvbmN1cnJlbnRSZXBhY2tUZXN0LmphdmEKQEAgLTIxMCwxNyArMjEwLDE3IEBACiAJCWNvbmZpZy5pbnN0YWxsKCk7CiAJfQogCi0JcHJpdmF0ZSBSZXZPYmplY3QgcGFyc2UoZmluYWwgQW55T2JqZWN0SWQgaWQpCisJcHJpdmF0ZSBSZXZPYmplY3QgcGFyc2UoQW55T2JqZWN0SWQgaWQpCiAJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQl0cnkgKFJldldhbGsgcncgPSBuZXcgUmV2V2FsayhkYikpIHsKIAkJCXJldHVybiBydy5wYXJzZUFueShpZCk7CiAJCX0KIAl9CiAKLQlwcml2YXRlIEZpbGVbXSBwYWNrKGZpbmFsIFJlcG9zaXRvcnkgc3JjLCBmaW5hbCBSZXZPYmplY3QuLi4gbGlzdCkKKwlwcml2YXRlIEZpbGVbXSBwYWNrKFJlcG9zaXRvcnkgc3JjLCBSZXZPYmplY3QuLi4gbGlzdCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRyeSAoUGFja1dyaXRlciBwdyA9IG5ldyBQYWNrV3JpdGVyKHNyYykpIHsKLQkJCWZvciAoZmluYWwgUmV2T2JqZWN0IG8gOiBsaXN0KSB7CisJCQlmb3IgKFJldk9iamVjdCBvIDogbGlzdCkgewogCQkJCXB3LmFkZE9iamVjdChvKTsKIAkJCX0KIApAQCAtMjMzLDcgKzIzMyw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlKGZpbmFsIEZpbGVbXSBmaWxlcywgZmluYWwgUGFja1dyaXRlciBwdykKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlKEZpbGVbXSBmaWxlcywgUGFja1dyaXRlciBwdykKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGxvbmcgYmVnaW4gPSBmaWxlc1swXS5nZXRQYXJlbnRGaWxlKCkubGFzdE1vZGlmaWVkKCk7CiAJCU51bGxQcm9ncmVzc01vbml0b3IgbSA9IE51bGxQcm9ncmVzc01vbml0b3IuSU5TVEFOQ0U7CkBAIC0yNTEsMTYgKzI1MSwxNiBAQAogCQl0b3VjaChiZWdpbiwgZmlsZXNbMF0uZ2V0UGFyZW50RmlsZSgpKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGRlbGV0ZShmaW5hbCBGaWxlW10gbGlzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGRlbGV0ZShGaWxlW10gbGlzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgbG9uZyBiZWdpbiA9IGxpc3RbMF0uZ2V0UGFyZW50RmlsZSgpLmxhc3RNb2RpZmllZCgpOwotCQlmb3IgKGZpbmFsIEZpbGUgZiA6IGxpc3QpIHsKKwkJZm9yIChGaWxlIGYgOiBsaXN0KSB7CiAJCQlGaWxlVXRpbHMuZGVsZXRlKGYpOwogCQkJYXNzZXJ0RmFsc2UoZiArICIgd2FzIHJlbW92ZWQiLCBmLmV4aXN0cygpKTsKIAkJfQogCQl0b3VjaChiZWdpbiwgbGlzdFswXS5nZXRQYXJlbnRGaWxlKCkpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgdG91Y2goZmluYWwgbG9uZyBiZWdpbiwgZmluYWwgRmlsZSBkaXIpIHsKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHRvdWNoKGxvbmcgYmVnaW4sIEZpbGUgZGlyKSB7CiAJCXdoaWxlIChiZWdpbiA+PSBkaXIubGFzdE1vZGlmaWVkKCkpIHsKIAkJCXRyeSB7CiAJCQkJVGhyZWFkLnNsZWVwKDI1KTsKQEAgLTI3MSwxMiArMjcxLDEyIEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIEZpbGUgZnVsbFBhY2tGaWxlTmFtZShmaW5hbCBPYmplY3RJZCBuYW1lLCBmaW5hbCBTdHJpbmcgc3VmZml4KSB7CisJcHJpdmF0ZSBGaWxlIGZ1bGxQYWNrRmlsZU5hbWUoT2JqZWN0SWQgbmFtZSwgU3RyaW5nIHN1ZmZpeCkgewogCQlmaW5hbCBGaWxlIHBhY2tkaXIgPSBkYi5nZXRPYmplY3REYXRhYmFzZSgpLmdldFBhY2tEaXJlY3RvcnkoKTsKIAkJcmV0dXJuIG5ldyBGaWxlKHBhY2tkaXIsICJwYWNrLSIgKyBuYW1lLm5hbWUoKSArIHN1ZmZpeCk7CiAJfQogCi0JcHJpdmF0ZSBSZXZPYmplY3Qgd3JpdGVCbG9iKGZpbmFsIFJlcG9zaXRvcnkgcmVwbywgZmluYWwgU3RyaW5nIGRhdGEpCisJcHJpdmF0ZSBSZXZPYmplY3Qgd3JpdGVCbG9iKFJlcG9zaXRvcnkgcmVwbywgU3RyaW5nIGRhdGEpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBieXRlW10gYnl0ZXMgPSBDb25zdGFudHMuZW5jb2RlKGRhdGEpOwogCQlmaW5hbCBPYmplY3RJZCBpZDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0ZpbGVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tGaWxlVGVzdC5qYXZhCmluZGV4IDkxYmQ1MjMuLjA0ZmNjZjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0ZpbGVUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrRmlsZVRlc3QuamF2YQpAQCAtMTQ2LDE1ICsxNDYsMTUgQEAKIAkJYXNzZXJ0RmFsc2UoImlzIG5vdCBsYXJnZSIsIG9sLmlzTGFyZ2UoKSk7CiAJCWFzc2VydFRydWUoInNhbWUgY29udGVudCIsIEFycmF5cy5lcXVhbHMoZGF0YSwgb2wuZ2V0Q2FjaGVkQnl0ZXMoKSkpOwogCi0JCU9iamVjdFN0cmVhbSBpbiA9IG9sLm9wZW5TdHJlYW0oKTsKLQkJYXNzZXJ0Tm90TnVsbCgiaGF2ZSBzdHJlYW0iLCBpbik7Ci0JCWFzc2VydEVxdWFscyh0eXBlLCBpbi5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoZGF0YS5sZW5ndGgsIGluLmdldFNpemUoKSk7Ci0JCWJ5dGVbXSBkYXRhMiA9IG5ldyBieXRlW2RhdGEubGVuZ3RoXTsKLQkJSU8ucmVhZEZ1bGx5KGluLCBkYXRhMiwgMCwgZGF0YS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKCJzYW1lIGNvbnRlbnQiLCBBcnJheXMuZXF1YWxzKGRhdGEyLCBkYXRhKSk7Ci0JCWFzc2VydEVxdWFscygic3RyZWFtIGF0IEVPRiIsIC0xLCBpbi5yZWFkKCkpOwotCQlpbi5jbG9zZSgpOworCQl0cnkgKE9iamVjdFN0cmVhbSBpbiA9IG9sLm9wZW5TdHJlYW0oKSkgeworCQkJYXNzZXJ0Tm90TnVsbCgiaGF2ZSBzdHJlYW0iLCBpbik7CisJCQlhc3NlcnRFcXVhbHModHlwZSwgaW4uZ2V0VHlwZSgpKTsKKwkJCWFzc2VydEVxdWFscyhkYXRhLmxlbmd0aCwgaW4uZ2V0U2l6ZSgpKTsKKwkJCWJ5dGVbXSBkYXRhMiA9IG5ldyBieXRlW2RhdGEubGVuZ3RoXTsKKwkJCUlPLnJlYWRGdWxseShpbiwgZGF0YTIsIDAsIGRhdGEubGVuZ3RoKTsKKwkJCWFzc2VydFRydWUoInNhbWUgY29udGVudCIsIEFycmF5cy5lcXVhbHMoZGF0YTIsIGRhdGEpKTsKKwkJCWFzc2VydEVxdWFscygic3RyZWFtIGF0IEVPRiIsIC0xLCBpbi5yZWFkKCkpOworCQl9CiAJfQogCiAJQFRlc3QKQEAgLTE4MCwxNSArMTgwLDE1IEBACiAJCQkJCS5nZXRNZXNzYWdlKCkpOwogCQl9CiAKLQkJT2JqZWN0U3RyZWFtIGluID0gb2wub3BlblN0cmVhbSgpOwotCQlhc3NlcnROb3ROdWxsKCJoYXZlIHN0cmVhbSIsIGluKTsKLQkJYXNzZXJ0RXF1YWxzKHR5cGUsIGluLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhkYXRhLmxlbmd0aCwgaW4uZ2V0U2l6ZSgpKTsKLQkJYnl0ZVtdIGRhdGEyID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGhdOwotCQlJTy5yZWFkRnVsbHkoaW4sIGRhdGEyLCAwLCBkYXRhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoInNhbWUgY29udGVudCIsIEFycmF5cy5lcXVhbHMoZGF0YTIsIGRhdGEpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdHJlYW0gYXQgRU9GIiwgLTEsIGluLnJlYWQoKSk7Ci0JCWluLmNsb3NlKCk7CisJCXRyeSAoT2JqZWN0U3RyZWFtIGluID0gb2wub3BlblN0cmVhbSgpKSB7CisJCQlhc3NlcnROb3ROdWxsKCJoYXZlIHN0cmVhbSIsIGluKTsKKwkJCWFzc2VydEVxdWFscyh0eXBlLCBpbi5nZXRUeXBlKCkpOworCQkJYXNzZXJ0RXF1YWxzKGRhdGEubGVuZ3RoLCBpbi5nZXRTaXplKCkpOworCQkJYnl0ZVtdIGRhdGEyID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGhdOworCQkJSU8ucmVhZEZ1bGx5KGluLCBkYXRhMiwgMCwgZGF0YS5sZW5ndGgpOworCQkJYXNzZXJ0VHJ1ZSgic2FtZSBjb250ZW50IiwgQXJyYXlzLmVxdWFscyhkYXRhMiwgZGF0YSkpOworCQkJYXNzZXJ0RXF1YWxzKCJzdHJlYW0gYXQgRU9GIiwgLTEsIGluLnJlYWQoKSk7CisJCX0KIAl9CiAKIAlAVGVzdApAQCAtMjM5LDE1ICsyMzksMTUgQEAKIAkJCWFzc2VydE5vdE51bGwob2wuZ2V0Q2FjaGVkQnl0ZXMoKSk7CiAJCQlhc3NlcnRBcnJheUVxdWFscyhkYXRhMywgb2wuZ2V0Q2FjaGVkQnl0ZXMoKSk7CiAKLQkJCU9iamVjdFN0cmVhbSBpbiA9IG9sLm9wZW5TdHJlYW0oKTsKLQkJCWFzc2VydE5vdE51bGwoImhhdmUgc3RyZWFtIiwgaW4pOwotCQkJYXNzZXJ0RXF1YWxzKENvbnN0YW50cy5PQkpfQkxPQiwgaW4uZ2V0VHlwZSgpKTsKLQkJCWFzc2VydEVxdWFscyhkYXRhMy5sZW5ndGgsIGluLmdldFNpemUoKSk7Ci0JCQlieXRlW10gYWN0ID0gbmV3IGJ5dGVbZGF0YTMubGVuZ3RoXTsKLQkJCUlPLnJlYWRGdWxseShpbiwgYWN0LCAwLCBkYXRhMy5sZW5ndGgpOwotCQkJYXNzZXJ0VHJ1ZSgic2FtZSBjb250ZW50IiwgQXJyYXlzLmVxdWFscyhhY3QsIGRhdGEzKSk7Ci0JCQlhc3NlcnRFcXVhbHMoInN0cmVhbSBhdCBFT0YiLCAtMSwgaW4ucmVhZCgpKTsKLQkJCWluLmNsb3NlKCk7CisJCQl0cnkgKE9iamVjdFN0cmVhbSBpbiA9IG9sLm9wZW5TdHJlYW0oKSkgeworCQkJCWFzc2VydE5vdE51bGwoImhhdmUgc3RyZWFtIiwgaW4pOworCQkJCWFzc2VydEVxdWFscyhDb25zdGFudHMuT0JKX0JMT0IsIGluLmdldFR5cGUoKSk7CisJCQkJYXNzZXJ0RXF1YWxzKGRhdGEzLmxlbmd0aCwgaW4uZ2V0U2l6ZSgpKTsKKwkJCQlieXRlW10gYWN0ID0gbmV3IGJ5dGVbZGF0YTMubGVuZ3RoXTsKKwkJCQlJTy5yZWFkRnVsbHkoaW4sIGFjdCwgMCwgZGF0YTMubGVuZ3RoKTsKKwkJCQlhc3NlcnRUcnVlKCJzYW1lIGNvbnRlbnQiLCBBcnJheXMuZXF1YWxzKGFjdCwgZGF0YTMpKTsKKwkJCQlhc3NlcnRFcXVhbHMoInN0cmVhbSBhdCBFT0YiLCAtMSwgaW4ucmVhZCgpKTsKKwkJCX0KIAkJfQogCX0KIApAQCAtMjgyLDIyICsyODIsMTYgQEAKIAkJCUZpbGUgcGFja05hbWUgPSBuZXcgRmlsZShkaXIsIGlkQS5uYW1lKCkgKyAiLnBhY2siKTsKIAkJCUZpbGUgaWR4TmFtZSA9IG5ldyBGaWxlKGRpciwgaWRBLm5hbWUoKSArICIuaWR4Iik7CiAKLQkJCUZpbGVPdXRwdXRTdHJlYW0gZiA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHBhY2tOYW1lKTsKLQkJCXRyeSB7CisJCQl0cnkgKEZpbGVPdXRwdXRTdHJlYW0gZiA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHBhY2tOYW1lKSkgewogCQkJCWYud3JpdGUocGFjay50b0J5dGVBcnJheSgpKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJZi5jbG9zZSgpOwogCQkJfQogCi0JCQlmID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oaWR4TmFtZSk7Ci0JCQl0cnkgeworCQkJdHJ5IChGaWxlT3V0cHV0U3RyZWFtIGYgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShpZHhOYW1lKSkgewogCQkJCUxpc3Q8UGFja2VkT2JqZWN0SW5mbz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwogCQkJCWxpc3QuYWRkKGEpOwogCQkJCWxpc3QuYWRkKGIpOwogCQkJCUNvbGxlY3Rpb25zLnNvcnQobGlzdCk7CiAJCQkJbmV3IFBhY2tJbmRleFdyaXRlclYxKGYpLndyaXRlKGxpc3QsIGZvb3Rlcik7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWYuY2xvc2UoKTsKIAkJCX0KIAogCQkJUGFja0ZpbGUgcGFja0ZpbGUgPSBuZXcgUGFja0ZpbGUocGFja05hbWUsIFBhY2tFeHQuSU5ERVguZ2V0Qml0KCkpOwpAQCAtMzIxLDE2ICszMTUsMTcgQEAKIAkJYXNzZXJ0VHJ1ZSgiaGFzIGJsb2IiLCB3Yy5oYXMoaWQpKTsKIAogCQlPYmplY3RMb2FkZXIgb2wgPSB3Yy5vcGVuKGlkKTsKLQkJT2JqZWN0U3RyZWFtIGluID0gb2wub3BlblN0cmVhbSgpOwotCQlhc3NlcnRUcnVlKGluIGluc3RhbmNlb2YgT2JqZWN0U3RyZWFtLlNtYWxsU3RyZWFtKTsKLQkJYXNzZXJ0RXF1YWxzKDMwMCwgaW4uYXZhaWxhYmxlKCkpOwotCQlpbi5jbG9zZSgpOworCQl0cnkgKE9iamVjdFN0cmVhbSBpbiA9IG9sLm9wZW5TdHJlYW0oKSkgeworCQkJYXNzZXJ0VHJ1ZShpbiBpbnN0YW5jZW9mIE9iamVjdFN0cmVhbS5TbWFsbFN0cmVhbSk7CisJCQlhc3NlcnRFcXVhbHMoMzAwLCBpbi5hdmFpbGFibGUoKSk7CisJCX0KIAogCQl3Yy5zZXRTdHJlYW1GaWxlVGhyZXNob2xkKDI5OSk7CiAJCW9sID0gd2Mub3BlbihpZCk7Ci0JCWluID0gb2wub3BlblN0cmVhbSgpOwotCQlhc3NlcnRUcnVlKGluIGluc3RhbmNlb2YgT2JqZWN0U3RyZWFtLkZpbHRlcik7Ci0JCWFzc2VydEVxdWFscygxLCBpbi5hdmFpbGFibGUoKSk7CisJCXRyeSAoT2JqZWN0U3RyZWFtIGluID0gb2wub3BlblN0cmVhbSgpKSB7CisJCQlhc3NlcnRUcnVlKGluIGluc3RhbmNlb2YgT2JqZWN0U3RyZWFtLkZpbHRlcik7CisJCQlhc3NlcnRFcXVhbHMoMSwgaW4uYXZhaWxhYmxlKCkpOworCQl9CiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGNsb25lKGludCBmaXJzdCwgYnl0ZVtdIGJhc2UpIHsKQEAgLTM3Miw3ICszNjcsNyBAQAogCQlwYWNrLndyaXRlKGJ1ZiwgMCwgbik7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBkZWZsYXRlKFRlbXBvcmFyeUJ1ZmZlci5IZWFwIHBhY2ssIGZpbmFsIGJ5dGVbXSBjb250ZW50KQorCXByaXZhdGUgc3RhdGljIHZvaWQgZGVmbGF0ZShUZW1wb3JhcnlCdWZmZXIuSGVhcCBwYWNrLCBieXRlW10gY29udGVudCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIERlZmxhdGVyIGRlZmxhdGVyID0gbmV3IERlZmxhdGVyKCk7CiAJCWZpbmFsIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxMjhdOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrV3JpdGVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrV3JpdGVyVGVzdC5qYXZhCmluZGV4IDM3OTQzMmQuLjA0YmVkMDkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja1dyaXRlclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tXcml0ZXJUZXN0LmphdmEKQEAgLTM2OCw3ICszNjgsNyBAQAogCQkJCU9iamVjdElkLmZyb21TdHJpbmcoIjkwMmQ1NDc2ZmEyNDliN2FiYzlkODRjNjExNTc3YTgxMzgxZjAzMjciKSwKIAkJCQlPYmplY3RJZC5mcm9tU3RyaW5nKCI2ZmY4N2M0NjY0OTgxZTQzOTc2MjU3OTFjOGVhM2JiYjVmMjI3OWEzIikgLAogCQkJCU9iamVjdElkLmZyb21TdHJpbmcoIjViNmU3YzY2YzI3NmU3NjEwZDRhNzNjNzBlYzFhMWY3YzEwMDMyNTkiKSB9OwotCQl0cnkgKGZpbmFsIFJldldhbGsgcGFyc2VyID0gbmV3IFJldldhbGsoZGIpKSB7CisJCXRyeSAoUmV2V2FsayBwYXJzZXIgPSBuZXcgUmV2V2FsayhkYikpIHsKIAkJCWZpbmFsIFJldk9iamVjdCBmb3JjZWRPcmRlclJldnNbXSA9IG5ldyBSZXZPYmplY3RbZm9yY2VkT3JkZXIubGVuZ3RoXTsKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgZm9yY2VkT3JkZXIubGVuZ3RoOyBpKyspCiAJCQkJZm9yY2VkT3JkZXJSZXZzW2ldID0gcGFyc2VyLnBhcnNlQW55KGZvcmNlZE9yZGVyW2ldKTsKQEAgLTUxNSwxMSArNTE1LDggQEAKIAogCQkvLyBWYWxpZGF0ZSB0aGF0IGFuIGluZGV4IHdyaXR0ZW4gYnkgUGFja1dyaXRlciBpcyB0aGUgc2FtZS4KIAkJZmluYWwgRmlsZSBpZHgyRmlsZSA9IG5ldyBGaWxlKGluZGV4RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArICIuMiIpOwotCQlmaW5hbCBGaWxlT3V0cHV0U3RyZWFtIGlzID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oaWR4MkZpbGUpOwotCQl0cnkgeworCQl0cnkgKEZpbGVPdXRwdXRTdHJlYW0gaXMgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShpZHgyRmlsZSkpIHsKIAkJCXdyaXRlci53cml0ZUluZGV4KGlzKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlzLmNsb3NlKCk7CiAJCX0KIAkJZmluYWwgUGFja0luZGV4IGlkeDIgPSBQYWNrSW5kZXgub3BlbihpZHgyRmlsZSk7CiAJCWFzc2VydFRydWUoaWR4MiBpbnN0YW5jZW9mIFBhY2tJbmRleFYyKTsKQEAgLTcxNSwxNCArNzEyLDE0IEBACiAJCQlTdHJpbmcgaWQgPSBwdy5jb21wdXRlTmFtZSgpLmdldE5hbWUoKTsKIAkJCUZpbGUgcGFja2RpciA9IHJlcG8uZ2V0T2JqZWN0RGF0YWJhc2UoKS5nZXRQYWNrRGlyZWN0b3J5KCk7CiAJCQlGaWxlIHBhY2tGaWxlID0gbmV3IEZpbGUocGFja2RpciwgInBhY2stIiArIGlkICsgIi5wYWNrIik7Ci0JCQlGaWxlT3V0cHV0U3RyZWFtIHBhY2tPUyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHBhY2tGaWxlKTsKLQkJCXB3LndyaXRlUGFjayhOdWxsUHJvZ3Jlc3NNb25pdG9yLklOU1RBTkNFLAotCQkJCQlOdWxsUHJvZ3Jlc3NNb25pdG9yLklOU1RBTkNFLCBwYWNrT1MpOwotCQkJcGFja09TLmNsb3NlKCk7CisJCQl0cnkgKEZpbGVPdXRwdXRTdHJlYW0gcGFja09TID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ocGFja0ZpbGUpKSB7CisJCQkJcHcud3JpdGVQYWNrKE51bGxQcm9ncmVzc01vbml0b3IuSU5TVEFOQ0UsCisJCQkJCQlOdWxsUHJvZ3Jlc3NNb25pdG9yLklOU1RBTkNFLCBwYWNrT1MpOworCQkJfQogCQkJRmlsZSBpZHhGaWxlID0gbmV3IEZpbGUocGFja2RpciwgInBhY2stIiArIGlkICsgIi5pZHgiKTsKLQkJCUZpbGVPdXRwdXRTdHJlYW0gaWR4T1MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShpZHhGaWxlKTsKLQkJCXB3LndyaXRlSW5kZXgoaWR4T1MpOwotCQkJaWR4T1MuY2xvc2UoKTsKKwkJCXRyeSAoRmlsZU91dHB1dFN0cmVhbSBpZHhPUyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGlkeEZpbGUpKSB7CisJCQkJcHcud3JpdGVJbmRleChpZHhPUyk7CisJCQl9CiAJCQlyZXR1cm4gUGFja0luZGV4Lm9wZW4oaWR4RmlsZSk7CiAJCX0KIAl9CkBAIC04MzgsNyArODM1LDcgQEAKIAkJdmVyaWZ5T3BlblBhY2sodGhpbik7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVZlcmlmeU9wZW5QYWNrKGZpbmFsIExpc3Q8UmV2T2JqZWN0PiBvYmplY3RTb3VyY2UpCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVZlcmlmeU9wZW5QYWNrKExpc3Q8UmV2T2JqZWN0PiBvYmplY3RTb3VyY2UpCiAJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlOdWxsUHJvZ3Jlc3NNb25pdG9yIG0gPSBOdWxsUHJvZ3Jlc3NNb25pdG9yLklOU1RBTkNFOwogCQl3cml0ZXIgPSBuZXcgUGFja1dyaXRlcihjb25maWcsIGRiLm5ld09iamVjdFJlYWRlcigpKTsKQEAgLTg0OSw3ICs4NDYsNyBAQAogCQl2ZXJpZnlPcGVuUGFjayhmYWxzZSk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeU9wZW5QYWNrKGZpbmFsIGJvb2xlYW4gdGhpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgdmVyaWZ5T3BlblBhY2soYm9vbGVhbiB0aGluKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBieXRlW10gcGFja0RhdGEgPSBvcy50b0J5dGVBcnJheSgpOwogCiAJCWlmICh0aGluKSB7CkBAIC04NzEsMTMgKzg2OCwxMyBAQAogCQlhc3NlcnROb3ROdWxsKCJoYXZlIFBhY2tGaWxlIGFmdGVyIHBhcnNpbmciLCBwYWNrKTsKIAl9CiAKLQlwcml2YXRlIFBhY2tQYXJzZXIgaW5kZXgoZmluYWwgYnl0ZVtdIHBhY2tEYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgUGFja1BhcnNlciBpbmRleChieXRlW10gcGFja0RhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmIChpbnNlcnRlciA9PSBudWxsKQogCQkJaW5zZXJ0ZXIgPSBkc3QubmV3T2JqZWN0SW5zZXJ0ZXIoKTsKIAkJcmV0dXJuIGluc2VydGVyLm5ld1BhY2tQYXJzZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHBhY2tEYXRhKSk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeU9iamVjdHNPcmRlcihmaW5hbCBPYmplY3RJZCBvYmplY3RzT3JkZXJbXSkgeworCXByaXZhdGUgdm9pZCB2ZXJpZnlPYmplY3RzT3JkZXIoT2JqZWN0SWQgb2JqZWN0c09yZGVyW10pIHsKIAkJZmluYWwgTGlzdDxQYWNrSW5kZXguTXV0YWJsZUVudHJ5PiBlbnRyaWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKIAkJZm9yIChNdXRhYmxlRW50cnkgbWUgOiBwYWNrKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZkRpcmVjdG9yeVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUmVmRGlyZWN0b3J5VGVzdC5qYXZhCmluZGV4IGZlZmNjZjMuLjVhMmJkOWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUmVmRGlyZWN0b3J5VGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUmVmRGlyZWN0b3J5VGVzdC5qYXZhCkBAIC0xMjcxLDcgKzEyNzEsNyBAQAogCQkJCQlAT3ZlcnJpZGUKIAkJCQkJcHVibGljIHZvaWQgb25SZWZzQ2hhbmdlZChSZWZzQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CiAJCQkJCQl0cnkgewotCQkJCQkJCXJlZkRiLmdldFJlZnMoInJlZiIpOworCQkJCQkJCXJlZkRiLmdldFJlZnNCeVByZWZpeCgicmVmIik7CiAJCQkJCQkJY2hhbmdlQ291bnQuaW5jcmVtZW50QW5kR2V0KCk7CiAJCQkJCQl9IGNhdGNoIChTdGFja092ZXJmbG93RXJyb3Igc29lKSB7CiAJCQkJCQkJZXJyb3Iuc2V0KHNvZSk7CkBAIC0xMjgwLDggKzEyODAsOCBAQAogCQkJCQkJfQogCQkJCQl9CiAJCQkJfSk7Ci0JCXJlZkRiLmdldFJlZnMoInJlZiIpOwotCQlyZWZEYi5nZXRSZWZzKCJyZWYiKTsKKwkJcmVmRGIuZ2V0UmVmc0J5UHJlZml4KCJyZWYiKTsKKwkJcmVmRGIuZ2V0UmVmc0J5UHJlZml4KCJyZWYiKTsKIAkJYXNzZXJ0TnVsbChlcnJvci5nZXQoKSk7CiAJCWFzc2VydE51bGwoZXhjZXB0aW9uLmdldCgpKTsKIAkJYXNzZXJ0RXF1YWxzKDEsIGNoYW5nZUNvdW50LmdldCgpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUmVmVXBkYXRlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZVcGRhdGVUZXN0LmphdmEKaW5kZXggZDhkNDVhOC4uZTFhZGVlZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZVcGRhdGVUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZVcGRhdGVUZXN0LmphdmEKQEAgLTQ1LDggKzQ1LDggQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5MT0NLX1NVRkZJWDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CkBAIC02Miw2ICs2Miw3IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkFueU9iamVjdElkOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKQEAgLTk0LDEzICs5NSwxMyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBSZWZVcGRhdGUgdXBkYXRlUmVmKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgUmVmVXBkYXRlIHVwZGF0ZVJlZihTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgUmVmVXBkYXRlIHJlZiA9IGRiLnVwZGF0ZVJlZihuYW1lKTsKIAkJcmVmLnNldE5ld09iamVjdElkKGRiLnJlc29sdmUoQ29uc3RhbnRzLkhFQUQpKTsKIAkJcmV0dXJuIHJlZjsKIAl9CiAKLQlwcml2YXRlIHZvaWQgZGVsZXRlKGZpbmFsIFJlZlVwZGF0ZSByZWYsIGZpbmFsIFJlc3VsdCBleHBlY3RlZCkKKwlwcml2YXRlIHZvaWQgZGVsZXRlKFJlZlVwZGF0ZSByZWYsIFJlc3VsdCBleHBlY3RlZCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWRlbGV0ZShyZWYsIGV4cGVjdGVkLCB0cnVlLCB0cnVlKTsKIAl9CkBAIC0xMTAsMTEgKzExMSwyMSBAQAogCQlkZWxldGUoZGIsIHJlZiwgZXhwZWN0ZWQsIGV4aXN0cywgcmVtb3ZlZCk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGRlbGV0ZShSZXBvc2l0b3J5IHJlcG8sIGZpbmFsIFJlZlVwZGF0ZSByZWYsIGZpbmFsIFJlc3VsdCBleHBlY3RlZCwKLQkJCWZpbmFsIGJvb2xlYW4gZXhpc3RzLCBmaW5hbCBib29sZWFuIHJlbW92ZWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyhleGlzdHMsIHJlcG8uZ2V0QWxsUmVmcygpLmNvbnRhaW5zS2V5KHJlZi5nZXROYW1lKCkpKTsKKwlwcml2YXRlIHZvaWQgZGVsZXRlKFJlcG9zaXRvcnkgcmVwbywgZmluYWwgUmVmVXBkYXRlIHJlZiwKKwkJCWZpbmFsIFJlc3VsdCBleHBlY3RlZCwgZmluYWwgYm9vbGVhbiBleGlzdHMsIGZpbmFsIGJvb2xlYW4gcmVtb3ZlZCkKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWFzc2VydEVxdWFscyhleGlzdHMsIGdldFJlZihyZXBvLCByZWYuZ2V0TmFtZSgpKS5pc1ByZXNlbnQoKSk7CiAJCWFzc2VydEVxdWFscyhleHBlY3RlZCwgcmVmLmRlbGV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCFyZW1vdmVkLCByZXBvLmdldEFsbFJlZnMoKS5jb250YWluc0tleShyZWYuZ2V0TmFtZSgpKSk7CisJCWFzc2VydEVxdWFscyghcmVtb3ZlZCwgZ2V0UmVmKHJlcG8sIHJlZi5nZXROYW1lKCkpLmlzUHJlc2VudCgpKTsKKwl9CisKKwlwcml2YXRlIE9wdGlvbmFsPFJlZj4gZ2V0UmVmKFJlcG9zaXRvcnkgcmVwbywgU3RyaW5nIG5hbWUpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQlyZXR1cm4gZ2V0UmVmKHJlcG8uZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKCksIG5hbWUpOworCX0KKworCXByaXZhdGUgT3B0aW9uYWw8UmVmPiBnZXRSZWYoTGlzdDxSZWY+IHJlZnMsIFN0cmluZyBuYW1lKSB7CisJCXJldHVybiByZWZzLnN0cmVhbSgpLmZpbHRlcihyIC0+IHIuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkuZmluZEFueSgpOwogCX0KIAogCUBUZXN0CkBAIC0xMjUsOCArMTM2LDcgQEAKIAkJcnUuc2V0TmV3T2JqZWN0SWQobmV3aWQpOwogCQlSZXN1bHQgdXBkYXRlID0gcnUudXBkYXRlKCk7CiAJCWFzc2VydEVxdWFscyhSZXN1bHQuTkVXLCB1cGRhdGUpOwotCQlmaW5hbCBSZWYgciA9IGRiLmdldEFsbFJlZnMoKS5nZXQobmV3UmVmKTsKLQkJYXNzZXJ0Tm90TnVsbChyKTsKKwkJZmluYWwgUmVmIHIgPSBnZXRSZWYoZGIsIG5ld1JlZikuZ2V0KCk7CiAJCWFzc2VydEVxdWFscyhuZXdSZWYsIHIuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0Tm90TnVsbChyLmdldE9iamVjdElkKCkpOwogCQlhc3NlcnROb3RTYW1lKG5ld2lkLCByLmdldE9iamVjdElkKCkpOwpAQCAtMjUzLDcgKzI2Myw3IEBACiAKIAkJT2JqZWN0SWQgYmxvYklkOwogCQl0cnkgKE9iamVjdEluc2VydGVyIGlucyA9IGJhcmVSZXBvLm5ld09iamVjdEluc2VydGVyKCkpIHsKLQkJCWJsb2JJZCA9IGlucy5pbnNlcnQoQ29uc3RhbnRzLk9CSl9CTE9CLCAiY29udGVudHMiLmdldEJ5dGVzKFVURl84KSk7CisJCQlibG9iSWQgPSBpbnMuaW5zZXJ0KENvbnN0YW50cy5PQkpfQkxPQiwgImNvbnRlbnRzIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCQlpbnMuZmx1c2goKTsKIAkJfQogCkBAIC0zNzgsMTAgKzM4OCwxMCBAQAogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UmVmS2V5U2FtZUFzTmFtZSgpIHsKKwkJQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKIAkJTWFwPFN0cmluZywgUmVmPiBhbGxSZWZzID0gZGIuZ2V0QWxsUmVmcygpOwogCQlmb3IgKEVudHJ5PFN0cmluZywgUmVmPiBlIDogYWxsUmVmcy5lbnRyeVNldCgpKSB7CiAJCQlhc3NlcnRFcXVhbHMoZS5nZXRLZXkoKSwgZS5nZXRWYWx1ZSgpLmdldE5hbWUoKSk7Ci0KIAkJfQogCX0KIApAQCAtNTIwLDggKzUzMCw4IEBACiAJICovCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UmVmc0NhY2hlQWZ0ZXJVcGRhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gRG8gbm90IHVzZSB0aGUgZGVmYWx0IHJlcG8gZm9yIHRoaXMgY2FzZS4KLQkJTWFwPFN0cmluZywgUmVmPiBhbGxSZWZzID0gZGIuZ2V0QWxsUmVmcygpOworCQkvLyBEbyBub3QgdXNlIHRoZSBkZWZhdWx0IHJlcG8gZm9yIHRoaXMgY2FzZS4KKwkJTGlzdDxSZWY+IGFsbFJlZnMgPSBkYi5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoKTsKIAkJT2JqZWN0SWQgb2xkVmFsdWUgPSBkYi5yZXNvbHZlKCJIRUFEIik7CiAJCU9iamVjdElkIG5ld1ZhbHVlID0gZGIucmVzb2x2ZSgiSEVBRF4iKTsKIAkJLy8gZmlyc3QgbWFrZSBIRUFEIHJlZmVyIHRvIGxvb3NlIHJlZgpAQCAtNTM3LDkgKzU0Nyw5IEBACiAJCXVwZGF0ZSA9IHVwZGF0ZVJlZi51cGRhdGUoKTsKIAkJYXNzZXJ0RXF1YWxzKFJlc3VsdC5GQVNUX0ZPUldBUkQsIHVwZGF0ZSk7CiAKLQkJYWxsUmVmcyA9IGRiLmdldEFsbFJlZnMoKTsKLQkJUmVmIG1hc3RlciA9IGFsbFJlZnMuZ2V0KCJyZWZzL2hlYWRzL21hc3RlciIpOwotCQlSZWYgaGVhZCA9IGFsbFJlZnMuZ2V0KCJIRUFEIik7CisJCWFsbFJlZnMgPSBkYi5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoKTsKKwkJUmVmIG1hc3RlciA9IGdldFJlZihhbGxSZWZzLCAicmVmcy9oZWFkcy9tYXN0ZXIiKS5nZXQoKTsKKwkJUmVmIGhlYWQgPSBnZXRSZWYoYWxsUmVmcywgIkhFQUQiKS5nZXQoKTsKIAkJYXNzZXJ0RXF1YWxzKCJyZWZzL2hlYWRzL21hc3RlciIsIG1hc3Rlci5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkhFQUQiLCBoZWFkLmdldE5hbWUoKSk7CiAJCWFzc2VydFRydWUoImlzIHN5bWJvbGljIHJlZmVyZW5jZSIsIGhlYWQuaXNTeW1ib2xpYygpKTsKQEAgLTU1Nyw4ICs1NjcsOCBAQAogCSAqLwogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFJlZnNDYWNoZUFmdGVyVXBkYXRlTG9vc2VPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIERvIG5vdCB1c2UgdGhlIGRlZmFsdCByZXBvIGZvciB0aGlzIGNhc2UuCi0JCU1hcDxTdHJpbmcsIFJlZj4gYWxsUmVmcyA9IGRiLmdldEFsbFJlZnMoKTsKKwkJLy8gRG8gbm90IHVzZSB0aGUgZGVmYXVsdCByZXBvIGZvciB0aGlzIGNhc2UuCisJCUxpc3Q8UmVmPiBhbGxSZWZzID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKCk7CiAJCU9iamVjdElkIG9sZFZhbHVlID0gZGIucmVzb2x2ZSgiSEVBRCIpOwogCQl3cml0ZVN5bXJlZihDb25zdGFudHMuSEVBRCwgInJlZnMvaGVhZHMvbmV3cmVmIik7CiAJCVJlZlVwZGF0ZSB1cGRhdGVSZWYgPSBkYi51cGRhdGVSZWYoQ29uc3RhbnRzLkhFQUQpOwpAQCAtNTY3LDkgKzU3Nyw5IEBACiAJCVJlc3VsdCB1cGRhdGUgPSB1cGRhdGVSZWYudXBkYXRlKCk7CiAJCWFzc2VydEVxdWFscyhSZXN1bHQuTkVXLCB1cGRhdGUpOwogCi0JCWFsbFJlZnMgPSBkYi5nZXRBbGxSZWZzKCk7Ci0JCVJlZiBoZWFkID0gYWxsUmVmcy5nZXQoIkhFQUQiKTsKLQkJUmVmIG5ld3JlZiA9IGFsbFJlZnMuZ2V0KCJyZWZzL2hlYWRzL25ld3JlZiIpOworCQlhbGxSZWZzID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKCk7CisJCVJlZiBoZWFkID0gZ2V0UmVmKGFsbFJlZnMsICJIRUFEIikuZ2V0KCk7CisJCVJlZiBuZXdyZWYgPSBnZXRSZWYoYWxsUmVmcywgInJlZnMvaGVhZHMvbmV3cmVmIikuZ2V0KCk7CiAJCWFzc2VydEVxdWFscygicmVmcy9oZWFkcy9uZXdyZWYiLCBuZXdyZWYuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJIRUFEIiwgaGVhZC5nZXROYW1lKCkpOwogCQlhc3NlcnRUcnVlKCJpcyBzeW1ib2xpYyByZWZlcmVuY2UiLCBoZWFkLmlzU3ltYm9saWMoKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1QwMDAzX0Jhc2ljVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9UMDAwM19CYXNpY1Rlc3QuamF2YQppbmRleCBkNzUwNWFmLi5lMTEzZGIxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1QwMDAzX0Jhc2ljVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvVDAwMDNfQmFzaWNUZXN0LmphdmEKQEAgLTQ3LDcgKzQ3LDcgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7CiAKIGltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLklTT184ODU5XzE7Ci1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CkBAIC0xMzcsMTAgKzEzNywxMCBAQAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdDAwMF9vcGVucmVwb19kZWZhdWx0X2dpdERpclNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCUZpbGUgcmVwbzFQYXJlbnQgPSBuZXcgRmlsZSh0cmFzaC5nZXRQYXJlbnRGaWxlKCksICJyMSIpOwotCQlSZXBvc2l0b3J5IHJlcG8xaW5pdGlhbCA9IG5ldyBGaWxlUmVwb3NpdG9yeShuZXcgRmlsZShyZXBvMVBhcmVudCwKLQkJCQlDb25zdGFudHMuRE9UX0dJVCkpOwotCQlyZXBvMWluaXRpYWwuY3JlYXRlKCk7Ci0JCXJlcG8xaW5pdGlhbC5jbG9zZSgpOworCQl0cnkgKFJlcG9zaXRvcnkgcmVwbzFpbml0aWFsID0gbmV3IEZpbGVSZXBvc2l0b3J5KAorCQkJCW5ldyBGaWxlKHJlcG8xUGFyZW50LCBDb25zdGFudHMuRE9UX0dJVCkpKSB7CisJCQlyZXBvMWluaXRpYWwuY3JlYXRlKCk7CisJCX0KIAogCQlGaWxlIHRoZURpciA9IG5ldyBGaWxlKHJlcG8xUGFyZW50LCBDb25zdGFudHMuRE9UX0dJVCk7CiAJCUZpbGVSZXBvc2l0b3J5IHIgPSAoRmlsZVJlcG9zaXRvcnkpIG5ldyBGaWxlUmVwb3NpdG9yeUJ1aWxkZXIoKQpAQCAtMTYyLDEwICsxNjIsMTAgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0MDAwX29wZW5yZXBvX2RlZmF1bHRfZ2l0RGlyQW5kV29ya1RyZWVTZXQoKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJRmlsZSByZXBvMVBhcmVudCA9IG5ldyBGaWxlKHRyYXNoLmdldFBhcmVudEZpbGUoKSwgInIxIik7Ci0JCVJlcG9zaXRvcnkgcmVwbzFpbml0aWFsID0gbmV3IEZpbGVSZXBvc2l0b3J5KG5ldyBGaWxlKHJlcG8xUGFyZW50LAotCQkJCUNvbnN0YW50cy5ET1RfR0lUKSk7Ci0JCXJlcG8xaW5pdGlhbC5jcmVhdGUoKTsKLQkJcmVwbzFpbml0aWFsLmNsb3NlKCk7CisJCXRyeSAoUmVwb3NpdG9yeSByZXBvMWluaXRpYWwgPSBuZXcgRmlsZVJlcG9zaXRvcnkoCisJCQkJbmV3IEZpbGUocmVwbzFQYXJlbnQsIENvbnN0YW50cy5ET1RfR0lUKSkpIHsKKwkJCXJlcG8xaW5pdGlhbC5jcmVhdGUoKTsKKwkJfQogCiAJCUZpbGUgdGhlRGlyID0gbmV3IEZpbGUocmVwbzFQYXJlbnQsIENvbnN0YW50cy5ET1RfR0lUKTsKIAkJRmlsZVJlcG9zaXRvcnkgciA9IChGaWxlUmVwb3NpdG9yeSkgbmV3IEZpbGVSZXBvc2l0b3J5QnVpbGRlcigpCkBAIC0xODcsMTAgKzE4NywxMCBAQAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdDAwMF9vcGVucmVwb19kZWZhdWx0X3dvcmtEaXJTZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlGaWxlIHJlcG8xUGFyZW50ID0gbmV3IEZpbGUodHJhc2guZ2V0UGFyZW50RmlsZSgpLCAicjEiKTsKLQkJUmVwb3NpdG9yeSByZXBvMWluaXRpYWwgPSBuZXcgRmlsZVJlcG9zaXRvcnkobmV3IEZpbGUocmVwbzFQYXJlbnQsCi0JCQkJQ29uc3RhbnRzLkRPVF9HSVQpKTsKLQkJcmVwbzFpbml0aWFsLmNyZWF0ZSgpOwotCQlyZXBvMWluaXRpYWwuY2xvc2UoKTsKKwkJdHJ5IChSZXBvc2l0b3J5IHJlcG8xaW5pdGlhbCA9IG5ldyBGaWxlUmVwb3NpdG9yeSgKKwkJCQluZXcgRmlsZShyZXBvMVBhcmVudCwgQ29uc3RhbnRzLkRPVF9HSVQpKSkgeworCQkJcmVwbzFpbml0aWFsLmNyZWF0ZSgpOworCQl9CiAKIAkJRmlsZSB0aGVEaXIgPSBuZXcgRmlsZShyZXBvMVBhcmVudCwgQ29uc3RhbnRzLkRPVF9HSVQpOwogCQlGaWxlUmVwb3NpdG9yeSByID0gKEZpbGVSZXBvc2l0b3J5KSBuZXcgRmlsZVJlcG9zaXRvcnlCdWlsZGVyKCkKQEAgLTIxMywxMyArMjEzLDEzIEBACiAJCUZpbGUgcmVwbzFQYXJlbnQgPSBuZXcgRmlsZSh0cmFzaC5nZXRQYXJlbnRGaWxlKCksICJyMSIpOwogCQlGaWxlIHdvcmtkaXIgPSBuZXcgRmlsZSh0cmFzaC5nZXRQYXJlbnRGaWxlKCksICJydyIpOwogCQlGaWxlVXRpbHMubWtkaXIod29ya2Rpcik7Ci0JCUZpbGVSZXBvc2l0b3J5IHJlcG8xaW5pdGlhbCA9IG5ldyBGaWxlUmVwb3NpdG9yeShuZXcgRmlsZShyZXBvMVBhcmVudCwKLQkJCQlDb25zdGFudHMuRE9UX0dJVCkpOwotCQlyZXBvMWluaXRpYWwuY3JlYXRlKCk7Ci0JCWZpbmFsIEZpbGVCYXNlZENvbmZpZyBjZmcgPSByZXBvMWluaXRpYWwuZ2V0Q29uZmlnKCk7Ci0JCWNmZy5zZXRTdHJpbmcoImNvcmUiLCBudWxsLCAid29ya3RyZWUiLCB3b3JrZGlyLmdldEFic29sdXRlUGF0aCgpKTsKLQkJY2ZnLnNhdmUoKTsKLQkJcmVwbzFpbml0aWFsLmNsb3NlKCk7CisJCXRyeSAoRmlsZVJlcG9zaXRvcnkgcmVwbzFpbml0aWFsID0gbmV3IEZpbGVSZXBvc2l0b3J5KAorCQkJCW5ldyBGaWxlKHJlcG8xUGFyZW50LCBDb25zdGFudHMuRE9UX0dJVCkpKSB7CisJCQlyZXBvMWluaXRpYWwuY3JlYXRlKCk7CisJCQlmaW5hbCBGaWxlQmFzZWRDb25maWcgY2ZnID0gcmVwbzFpbml0aWFsLmdldENvbmZpZygpOworCQkJY2ZnLnNldFN0cmluZygiY29yZSIsIG51bGwsICJ3b3JrdHJlZSIsIHdvcmtkaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworCQkJY2ZnLnNhdmUoKTsKKwkJfQogCiAJCUZpbGUgdGhlRGlyID0gbmV3IEZpbGUocmVwbzFQYXJlbnQsIENvbnN0YW50cy5ET1RfR0lUKTsKIAkJRmlsZVJlcG9zaXRvcnkgciA9IChGaWxlUmVwb3NpdG9yeSkgbmV3IEZpbGVSZXBvc2l0b3J5QnVpbGRlcigpCkBAIC0yNDIsMTMgKzI0MiwxMyBAQAogCQlGaWxlIHJlcG8xUGFyZW50ID0gbmV3IEZpbGUodHJhc2guZ2V0UGFyZW50RmlsZSgpLCAicjEiKTsKIAkJRmlsZSB3b3JrZGlyID0gbmV3IEZpbGUodHJhc2guZ2V0UGFyZW50RmlsZSgpLCAicnciKTsKIAkJRmlsZVV0aWxzLm1rZGlyKHdvcmtkaXIpOwotCQlGaWxlUmVwb3NpdG9yeSByZXBvMWluaXRpYWwgPSBuZXcgRmlsZVJlcG9zaXRvcnkobmV3IEZpbGUocmVwbzFQYXJlbnQsCi0JCQkJQ29uc3RhbnRzLkRPVF9HSVQpKTsKLQkJcmVwbzFpbml0aWFsLmNyZWF0ZSgpOwotCQlmaW5hbCBGaWxlQmFzZWRDb25maWcgY2ZnID0gcmVwbzFpbml0aWFsLmdldENvbmZpZygpOwotCQljZmcuc2V0U3RyaW5nKCJjb3JlIiwgbnVsbCwgIndvcmt0cmVlIiwgIi4uLy4uL3J3Iik7Ci0JCWNmZy5zYXZlKCk7Ci0JCXJlcG8xaW5pdGlhbC5jbG9zZSgpOworCQl0cnkgKEZpbGVSZXBvc2l0b3J5IHJlcG8xaW5pdGlhbCA9IG5ldyBGaWxlUmVwb3NpdG9yeSgKKwkJCQluZXcgRmlsZShyZXBvMVBhcmVudCwgQ29uc3RhbnRzLkRPVF9HSVQpKSkgeworCQkJcmVwbzFpbml0aWFsLmNyZWF0ZSgpOworCQkJZmluYWwgRmlsZUJhc2VkQ29uZmlnIGNmZyA9IHJlcG8xaW5pdGlhbC5nZXRDb25maWcoKTsKKwkJCWNmZy5zZXRTdHJpbmcoImNvcmUiLCBudWxsLCAid29ya3RyZWUiLCAiLi4vLi4vcnciKTsKKwkJCWNmZy5zYXZlKCk7CisJCX0KIAogCQlGaWxlIHRoZURpciA9IG5ldyBGaWxlKHJlcG8xUGFyZW50LCBDb25zdGFudHMuRE9UX0dJVCk7CiAJCUZpbGVSZXBvc2l0b3J5IHIgPSAoRmlsZVJlcG9zaXRvcnkpIG5ldyBGaWxlUmVwb3NpdG9yeUJ1aWxkZXIoKQpAQCAtMjczLDI2ICsyNzMsMjQgQEAKIAkJRmlsZSBpbmRleEZpbGUgPSBuZXcgRmlsZSh0cmFzaCwgImlkeCIpOwogCQlGaWxlIG9iakRpciA9IG5ldyBGaWxlKHRyYXNoLCAiLi4vb2JqIik7CiAJCUZpbGUgYWx0T2JqRGlyID0gZGIuZ2V0T2JqZWN0RGF0YWJhc2UoKS5nZXREaXJlY3RvcnkoKTsKLQkJUmVwb3NpdG9yeSByZXBvMWluaXRpYWwgPSBuZXcgRmlsZVJlcG9zaXRvcnkobmV3IEZpbGUocmVwbzFQYXJlbnQsCi0JCQkJQ29uc3RhbnRzLkRPVF9HSVQpKTsKLQkJcmVwbzFpbml0aWFsLmNyZWF0ZSgpOwotCQlyZXBvMWluaXRpYWwuY2xvc2UoKTsKKwkJdHJ5IChSZXBvc2l0b3J5IHJlcG8xaW5pdGlhbCA9IG5ldyBGaWxlUmVwb3NpdG9yeSgKKwkJCQluZXcgRmlsZShyZXBvMVBhcmVudCwgQ29uc3RhbnRzLkRPVF9HSVQpKSkgeworCQkJcmVwbzFpbml0aWFsLmNyZWF0ZSgpOworCQl9CiAKIAkJRmlsZSB0aGVEaXIgPSBuZXcgRmlsZShyZXBvMVBhcmVudCwgQ29uc3RhbnRzLkRPVF9HSVQpOwotCQlGaWxlUmVwb3NpdG9yeSByID0gKEZpbGVSZXBvc2l0b3J5KSBuZXcgRmlsZVJlcG9zaXRvcnlCdWlsZGVyKCkgLy8KKwkJdHJ5IChGaWxlUmVwb3NpdG9yeSByID0gKEZpbGVSZXBvc2l0b3J5KSBuZXcgRmlsZVJlcG9zaXRvcnlCdWlsZGVyKCkgLy8KIAkJCQkuc2V0R2l0RGlyKHRoZURpcikuc2V0T2JqZWN0RGlyZWN0b3J5KG9iakRpcikgLy8KIAkJCQkuYWRkQWx0ZXJuYXRlT2JqZWN0RGlyZWN0b3J5KGFsdE9iakRpcikgLy8KIAkJCQkuc2V0SW5kZXhGaWxlKGluZGV4RmlsZSkgLy8KLQkJCQkuYnVpbGQoKTsKLQkJYXNzZXJ0RXF1YWxzUGF0aCh0aGVEaXIsIHIuZ2V0RGlyZWN0b3J5KCkpOwotCQlhc3NlcnRFcXVhbHNQYXRoKHRoZURpci5nZXRQYXJlbnRGaWxlKCksIHIuZ2V0V29ya1RyZWUoKSk7Ci0JCWFzc2VydEVxdWFsc1BhdGgoaW5kZXhGaWxlLCByLmdldEluZGV4RmlsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzUGF0aChvYmpEaXIsIHIuZ2V0T2JqZWN0RGF0YWJhc2UoKS5nZXREaXJlY3RvcnkoKSk7Ci0JCWFzc2VydE5vdE51bGwoci5vcGVuKE9iamVjdElkCi0JCQkJLmZyb21TdHJpbmcoIjZkYjljMmViZjc1NTkwZWVmOTczMDgxNzM2NzMwYTllYTE2OWEwYzQiKSkpOwotCQkvLyBNdXN0IGNsb3NlIG9yIHRoZSBkZWZhdWx0IHJlcG8gcGFjayBmaWxlcyBjcmVhdGVkIGJ5IHRoaXMgdGVzdCBnZXRzCi0JCS8vIGxvY2tlZCB2aWEgdGhlIGFsdGVybmF0ZSBvYmplY3QgZGlyZWN0b3JpZXMgb24gV2luZG93cy4KLQkJci5jbG9zZSgpOworCQkJCS5idWlsZCgpKSB7CisJCQlhc3NlcnRFcXVhbHNQYXRoKHRoZURpciwgci5nZXREaXJlY3RvcnkoKSk7CisJCQlhc3NlcnRFcXVhbHNQYXRoKHRoZURpci5nZXRQYXJlbnRGaWxlKCksIHIuZ2V0V29ya1RyZWUoKSk7CisJCQlhc3NlcnRFcXVhbHNQYXRoKGluZGV4RmlsZSwgci5nZXRJbmRleEZpbGUoKSk7CisJCQlhc3NlcnRFcXVhbHNQYXRoKG9iakRpciwgci5nZXRPYmplY3REYXRhYmFzZSgpLmdldERpcmVjdG9yeSgpKTsKKwkJCWFzc2VydE5vdE51bGwoci5vcGVuKE9iamVjdElkCisJCQkJCS5mcm9tU3RyaW5nKCI2ZGI5YzJlYmY3NTU5MGVlZjk3MzA4MTczNjczMGE5ZWExNjlhMGM0IikpKTsKKwkJfQogCX0KIAogCXByb3RlY3RlZCB2b2lkIGFzc2VydEVxdWFsc1BhdGgoRmlsZSBleHBlY3RlZCwgRmlsZSBhY3R1YWwpCkBAIC0zMDcsNyArMzA1LDcgQEAKIAkJLy8gb2JqZWN0IChhcyBpdCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgcGFjaykuCiAJCS8vCiAJCWZpbmFsIFJlcG9zaXRvcnkgbmV3ZGIgPSBjcmVhdGVCYXJlUmVwb3NpdG9yeSgpOwotCQl0cnkgKGZpbmFsIE9iamVjdEluc2VydGVyIG9pID0gbmV3ZGIubmV3T2JqZWN0SW5zZXJ0ZXIoKSkgeworCQl0cnkgKE9iamVjdEluc2VydGVyIG9pID0gbmV3ZGIubmV3T2JqZWN0SW5zZXJ0ZXIoKSkgewogCQkJZmluYWwgT2JqZWN0SWQgdHJlZUlkID0gb2kuaW5zZXJ0KG5ldyBUcmVlRm9ybWF0dGVyKCkpOwogCQkJYXNzZXJ0RXF1YWxzKCI0YjgyNWRjNjQyY2I2ZWI5YTA2MGU1NGJmOGQ2OTI4OGZiZWU0OTA0IiwKIAkJCQkJdHJlZUlkLm5hbWUoKSk7CkBAIC0zNzUsNyArMzczLDcgQEAKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdDAwN19PcGVuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdHJ5IChmaW5hbCBGaWxlUmVwb3NpdG9yeSBkYjIgPSBuZXcgRmlsZVJlcG9zaXRvcnkoZGIuZ2V0RGlyZWN0b3J5KCkpKSB7CisJCXRyeSAoRmlsZVJlcG9zaXRvcnkgZGIyID0gbmV3IEZpbGVSZXBvc2l0b3J5KGRiLmdldERpcmVjdG9yeSgpKSkgewogCQkJYXNzZXJ0RXF1YWxzKGRiLmdldERpcmVjdG9yeSgpLCBkYjIuZ2V0RGlyZWN0b3J5KCkpOwogCQkJYXNzZXJ0RXF1YWxzKGRiLmdldE9iamVjdERhdGFiYXNlKCkuZ2V0RGlyZWN0b3J5KCksIGRiMgogCQkJCQkuZ2V0T2JqZWN0RGF0YWJhc2UoKS5nZXREaXJlY3RvcnkoKSk7CkBAIC00MTcsMTQgKzQxNSwxMSBAQAogCQkvLyBWZXJpZnkgdGhlIGNvbW1pdCB3ZSBqdXN0IHdyb3RlIGlzIGluIHRoZSBjb3JyZWN0IGZvcm1hdC4KIAkJT2JqZWN0RGF0YWJhc2Ugb2RiID0gZGIuZ2V0T2JqZWN0RGF0YWJhc2UoKTsKIAkJYXNzZXJ0VHJ1ZSgiaXMgT2JqZWN0RGlyZWN0b3J5Iiwgb2RiIGluc3RhbmNlb2YgT2JqZWN0RGlyZWN0b3J5KTsKLQkJZmluYWwgWElucHV0U3RyZWFtIHhpcyA9IG5ldyBYSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbSgKLQkJCQkoKE9iamVjdERpcmVjdG9yeSkgb2RiKS5maWxlRm9yKGNtdGlkKSkpOwotCQl0cnkgeworCQl0cnkgKFhJbnB1dFN0cmVhbSB4aXMgPSBuZXcgWElucHV0U3RyZWFtKAorCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0oKChPYmplY3REaXJlY3RvcnkpIG9kYikuZmlsZUZvcihjbXRpZCkpKSkgewogCQkJYXNzZXJ0RXF1YWxzKDB4NzgsIHhpcy5yZWFkVUludDgoKSk7CiAJCQlhc3NlcnRFcXVhbHMoMHg5YywgeGlzLnJlYWRVSW50OCgpKTsKIAkJCWFzc2VydEVxdWFscygwLCAweDc4OWMgJSAzMSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl4aXMuY2xvc2UoKTsKIAkJfQogCiAJCS8vIFZlcmlmeSB3ZSBjYW4gcmVhZCBpdC4KQEAgLTUyMiw3ICs1MTcsNyBAQAogCQkJCTQyOTQ5NjcyOTUwMDBMLCA2MCkpOwogCQljb21taXQuc2V0Q29tbWl0dGVyKG5ldyBQZXJzb25JZGVudCgiSm9lIEhhY2tlciIsICJqb2UyQGV4YW1wbGUuY29tIiwKIAkJCQk0Mjk0OTY3Mjk1MDAwTCwgNjApKTsKLQkJY29tbWl0LnNldEVuY29kaW5nKFVURl84KTsKKwkJY29tbWl0LnNldEVuY29kaW5nKENIQVJTRVQpOwogCQljb21taXQuc2V0TWVzc2FnZSgiXHUwMGRjYmVyZ2Vla3MiKTsKIAkJT2JqZWN0SWQgY2lkID0gaW5zZXJ0Q29tbWl0KGNvbW1pdCk7CiAJCWFzc2VydEVxdWFscygiNDY4MDkwODExMjc3ODcxOGYzN2U2ODZjYmViY2M5MTI3MzBiMzE1NCIsIGNpZC5uYW1lKCkpOwpAQCAtNTYyLDcgKzU1Nyw3IEBACiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0MDI2X0NyZWF0ZUNvbW1pdE11bHRpcGxlcGFyZW50cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIE9iamVjdElkIHRyZWVJZDsKLQkJdHJ5IChmaW5hbCBPYmplY3RJbnNlcnRlciBvaSA9IGRiLm5ld09iamVjdEluc2VydGVyKCkpIHsKKwkJdHJ5IChPYmplY3RJbnNlcnRlciBvaSA9IGRiLm5ld09iamVjdEluc2VydGVyKCkpIHsKIAkJCWZpbmFsIE9iamVjdElkIGJsb2JJZCA9IG9pLmluc2VydChDb25zdGFudHMuT0JKX0JMT0IsCiAJCQkJCSJhbmQgdGhpcyBpcyB0aGUgZGF0YSBpbiBtZVxuIi5nZXRCeXRlcyhDb25zdGFudHMuQ0hBUlNFVAogCQkJCQkJCS5uYW1lKCkpKTsKQEAgLTc1Miw3ICs3NDcsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBPYmplY3RJZCBpbnNlcnRDb21taXQoZmluYWwgQ29tbWl0QnVpbGRlciBidWlsZGVyKQorCXByaXZhdGUgT2JqZWN0SWQgaW5zZXJ0Q29tbWl0KENvbW1pdEJ1aWxkZXIgYnVpbGRlcikKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CiAJCXRyeSAoT2JqZWN0SW5zZXJ0ZXIgb2kgPSBkYi5uZXdPYmplY3RJbnNlcnRlcigpKSB7CiAJCQlPYmplY3RJZCBpZCA9IG9pLmluc2VydChidWlsZGVyKTsKQEAgLTc2OSw3ICs3NjQsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBPYmplY3RJZCBpbnNlcnRUYWcoZmluYWwgVGFnQnVpbGRlciB0YWcpIHRocm93cyBJT0V4Y2VwdGlvbiwKKwlwcml2YXRlIE9iamVjdElkIGluc2VydFRhZyhUYWdCdWlsZGVyIHRhZykgdGhyb3dzIElPRXhjZXB0aW9uLAogCQkJVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CiAJCXRyeSAoT2JqZWN0SW5zZXJ0ZXIgb2kgPSBkYi5uZXdPYmplY3RJbnNlcnRlcigpKSB7CiAJCQlPYmplY3RJZCBpZCA9IG9pLmluc2VydCh0YWcpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9VbnBhY2tlZE9iamVjdFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvVW5wYWNrZWRPYmplY3RUZXN0LmphdmEKaW5kZXggYzVhYjc2Ni4uOThmZjA0ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9VbnBhY2tlZE9iamVjdFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1VucGFja2VkT2JqZWN0VGVzdC5qYXZhCkBAIC0xMzAsMTUgKzEzMCwxNSBAQAogCQlhc3NlcnRGYWxzZSgiaXMgbm90IGxhcmdlIiwgb2wuaXNMYXJnZSgpKTsKIAkJYXNzZXJ0VHJ1ZSgic2FtZSBjb250ZW50IiwgQXJyYXlzLmVxdWFscyhkYXRhLCBvbC5nZXRDYWNoZWRCeXRlcygpKSk7CiAKLQkJT2JqZWN0U3RyZWFtIGluID0gb2wub3BlblN0cmVhbSgpOwotCQlhc3NlcnROb3ROdWxsKCJoYXZlIHN0cmVhbSIsIGluKTsKLQkJYXNzZXJ0RXF1YWxzKHR5cGUsIGluLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhkYXRhLmxlbmd0aCwgaW4uZ2V0U2l6ZSgpKTsKLQkJYnl0ZVtdIGRhdGEyID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGhdOwotCQlJTy5yZWFkRnVsbHkoaW4sIGRhdGEyLCAwLCBkYXRhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoInNhbWUgY29udGVudCIsIEFycmF5cy5lcXVhbHMoZGF0YTIsIGRhdGEpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdHJlYW0gYXQgRU9GIiwgLTEsIGluLnJlYWQoKSk7Ci0JCWluLmNsb3NlKCk7CisJCXRyeSAoT2JqZWN0U3RyZWFtIGluID0gb2wub3BlblN0cmVhbSgpKSB7CisJCQlhc3NlcnROb3ROdWxsKCJoYXZlIHN0cmVhbSIsIGluKTsKKwkJCWFzc2VydEVxdWFscyh0eXBlLCBpbi5nZXRUeXBlKCkpOworCQkJYXNzZXJ0RXF1YWxzKGRhdGEubGVuZ3RoLCBpbi5nZXRTaXplKCkpOworCQkJYnl0ZVtdIGRhdGEyID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGhdOworCQkJSU8ucmVhZEZ1bGx5KGluLCBkYXRhMiwgMCwgZGF0YS5sZW5ndGgpOworCQkJYXNzZXJ0VHJ1ZSgic2FtZSBjb250ZW50IiwgQXJyYXlzLmVxdWFscyhkYXRhMiwgZGF0YSkpOworCQkJYXNzZXJ0RXF1YWxzKCJzdHJlYW0gYXQgRU9GIiwgLTEsIGluLnJlYWQoKSk7CisJCX0KIAl9CiAKIAlAVGVzdApAQCAtMTUwLDExICsxNTAsOCBAQAogCiAJCU9iamVjdExvYWRlciBvbDsKIAkJewotCQkJRmlsZUlucHV0U3RyZWFtIGZzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoKGlkKSk7Ci0JCQl0cnkgeworCQkJdHJ5IChGaWxlSW5wdXRTdHJlYW0gZnMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGgoaWQpKSkgewogCQkJCW9sID0gVW5wYWNrZWRPYmplY3Qub3BlbihmcywgcGF0aChpZCksIGlkLCB3Yyk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWZzLmNsb3NlKCk7CiAJCQl9CiAJCX0KIApAQCAtMTcxLDE1ICsxNjgsMTUgQEAKIAkJCQkJLmdldE1lc3NhZ2UoKSk7CiAJCX0KIAotCQlPYmplY3RTdHJlYW0gaW4gPSBvbC5vcGVuU3RyZWFtKCk7Ci0JCWFzc2VydE5vdE51bGwoImhhdmUgc3RyZWFtIiwgaW4pOwotCQlhc3NlcnRFcXVhbHModHlwZSwgaW4uZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGRhdGEubGVuZ3RoLCBpbi5nZXRTaXplKCkpOwotCQlieXRlW10gZGF0YTIgPSBuZXcgYnl0ZVtkYXRhLmxlbmd0aF07Ci0JCUlPLnJlYWRGdWxseShpbiwgZGF0YTIsIDAsIGRhdGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZSgic2FtZSBjb250ZW50IiwgQXJyYXlzLmVxdWFscyhkYXRhMiwgZGF0YSkpOwotCQlhc3NlcnRFcXVhbHMoInN0cmVhbSBhdCBFT0YiLCAtMSwgaW4ucmVhZCgpKTsKLQkJaW4uY2xvc2UoKTsKKwkJdHJ5IChPYmplY3RTdHJlYW0gaW4gPSBvbC5vcGVuU3RyZWFtKCkpIHsKKwkJCWFzc2VydE5vdE51bGwoImhhdmUgc3RyZWFtIiwgaW4pOworCQkJYXNzZXJ0RXF1YWxzKHR5cGUsIGluLmdldFR5cGUoKSk7CisJCQlhc3NlcnRFcXVhbHMoZGF0YS5sZW5ndGgsIGluLmdldFNpemUoKSk7CisJCQlieXRlW10gZGF0YTIgPSBuZXcgYnl0ZVtkYXRhLmxlbmd0aF07CisJCQlJTy5yZWFkRnVsbHkoaW4sIGRhdGEyLCAwLCBkYXRhLmxlbmd0aCk7CisJCQlhc3NlcnRUcnVlKCJzYW1lIGNvbnRlbnQiLCBBcnJheXMuZXF1YWxzKGRhdGEyLCBkYXRhKSk7CisJCQlhc3NlcnRFcXVhbHMoInN0cmVhbSBhdCBFT0YiLCAtMSwgaW4ucmVhZCgpKTsKKwkJfQogCX0KIAogCUBUZXN0CkBAIC0zMTYsMjMgKzMxMywxMyBAQAogCQl3cml0ZShpZCwgZ3opOwogCiAJCU9iamVjdExvYWRlciBvbDsKLQkJewotCQkJRmlsZUlucHV0U3RyZWFtIGZzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoKGlkKSk7Ci0JCQl0cnkgewotCQkJCW9sID0gVW5wYWNrZWRPYmplY3Qub3BlbihmcywgcGF0aChpZCksIGlkLCB3Yyk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWZzLmNsb3NlKCk7Ci0JCQl9CisJCXRyeSAoRmlsZUlucHV0U3RyZWFtIGZzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoKGlkKSkpIHsKKwkJCW9sID0gVW5wYWNrZWRPYmplY3Qub3BlbihmcywgcGF0aChpZCksIGlkLCB3Yyk7CiAJCX0KIAotCQl0cnkgewotCQkJYnl0ZVtdIHRtcCA9IG5ldyBieXRlW2RhdGEubGVuZ3RoXTsKLQkJCUlucHV0U3RyZWFtIGluID0gb2wub3BlblN0cmVhbSgpOwotCQkJdHJ5IHsKLQkJCQlJTy5yZWFkRnVsbHkoaW4sIHRtcCwgMCwgdG1wLmxlbmd0aCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWluLmNsb3NlKCk7Ci0JCQl9CisJCWJ5dGVbXSB0bXAgPSBuZXcgYnl0ZVtkYXRhLmxlbmd0aF07CisJCXRyeSAoSW5wdXRTdHJlYW0gaW4gPSBvbC5vcGVuU3RyZWFtKCkpIHsKKwkJCUlPLnJlYWRGdWxseShpbiwgdG1wLCAwLCB0bXAubGVuZ3RoKTsKIAkJCWZhaWwoIkRpZCBub3QgdGhyb3cgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiIpOwogCQl9IGNhdGNoIChDb3JydXB0T2JqZWN0RXhjZXB0aW9uIGNvZSkgewogCQkJYXNzZXJ0RXF1YWxzKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLm9iamVjdElzQ29ycnVwdCwKQEAgLTM1NCwxNiArMzQxLDEyIEBACiAJCXdyaXRlKGlkLCB0cik7CiAKIAkJT2JqZWN0TG9hZGVyIG9sOwotCQl7Ci0JCQlGaWxlSW5wdXRTdHJlYW0gZnMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGgoaWQpKTsKLQkJCXRyeSB7Ci0JCQkJb2wgPSBVbnBhY2tlZE9iamVjdC5vcGVuKGZzLCBwYXRoKGlkKSwgaWQsIHdjKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJZnMuY2xvc2UoKTsKLQkJCX0KKwkJdHJ5IChGaWxlSW5wdXRTdHJlYW0gZnMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGgoaWQpKSkgeworCQkJb2wgPSBVbnBhY2tlZE9iamVjdC5vcGVuKGZzLCBwYXRoKGlkKSwgaWQsIHdjKTsKIAkJfQogCiAJCWJ5dGVbXSB0bXAgPSBuZXcgYnl0ZVtkYXRhLmxlbmd0aF07CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIFdlIGFyZSB0ZXN0aW5nIHRoYXQgdGhlIGNsb3NlKCkgbWV0aG9kIHRocm93cwogCQlJbnB1dFN0cmVhbSBpbiA9IG9sLm9wZW5TdHJlYW0oKTsKIAkJSU8ucmVhZEZ1bGx5KGluLCB0bXAsIDAsIHRtcC5sZW5ndGgpOwogCQl0cnkgewpAQCAtMzg5LDE2ICszNzIsMTIgQEAKIAkJd3JpdGUoaWQsIHRyKTsKIAogCQlPYmplY3RMb2FkZXIgb2w7Ci0JCXsKLQkJCUZpbGVJbnB1dFN0cmVhbSBmcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aChpZCkpOwotCQkJdHJ5IHsKLQkJCQlvbCA9IFVucGFja2VkT2JqZWN0Lm9wZW4oZnMsIHBhdGgoaWQpLCBpZCwgd2MpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlmcy5jbG9zZSgpOwotCQkJfQorCQl0cnkgKEZpbGVJbnB1dFN0cmVhbSBmcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aChpZCkpKSB7CisJCQlvbCA9IFVucGFja2VkT2JqZWN0Lm9wZW4oZnMsIHBhdGgoaWQpLCBpZCwgd2MpOwogCQl9CiAKIAkJYnl0ZVtdIHRtcCA9IG5ldyBieXRlW2RhdGEubGVuZ3RoXTsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gV2UgYXJlIHRlc3RpbmcgdGhhdCB0aGUgY2xvc2UoKSBtZXRob2QgdGhyb3dzCiAJCUlucHV0U3RyZWFtIGluID0gb2wub3BlblN0cmVhbSgpOwogCQlJTy5yZWFkRnVsbHkoaW4sIHRtcCwgMCwgdG1wLmxlbmd0aCk7CiAJCXRyeSB7CkBAIC00MjYsMTQgKzQwNSwxNSBAQAogCQlhc3NlcnRGYWxzZSgiaXMgbm90IGxhcmdlIiwgb2wuaXNMYXJnZSgpKTsKIAkJYXNzZXJ0VHJ1ZSgic2FtZSBjb250ZW50IiwgQXJyYXlzLmVxdWFscyhkYXRhLCBvbC5nZXRDYWNoZWRCeXRlcygpKSk7CiAKLQkJT2JqZWN0U3RyZWFtIGluID0gb2wub3BlblN0cmVhbSgpOwotCQlhc3NlcnROb3ROdWxsKCJoYXZlIHN0cmVhbSIsIGluKTsKLQkJYXNzZXJ0RXF1YWxzKHR5cGUsIGluLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhkYXRhLmxlbmd0aCwgaW4uZ2V0U2l6ZSgpKTsKLQkJYnl0ZVtdIGRhdGEyID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGhdOwotCQlJTy5yZWFkRnVsbHkoaW4sIGRhdGEyLCAwLCBkYXRhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoInNhbWUgY29udGVudCIsIEFycmF5cy5lcXVhbHMoZGF0YSwgb2wuZ2V0Q2FjaGVkQnl0ZXMoKSkpOwotCQlpbi5jbG9zZSgpOworCQl0cnkgKE9iamVjdFN0cmVhbSBpbiA9IG9sLm9wZW5TdHJlYW0oKSkgeworCQkJYXNzZXJ0Tm90TnVsbCgiaGF2ZSBzdHJlYW0iLCBpbik7CisJCQlhc3NlcnRFcXVhbHModHlwZSwgaW4uZ2V0VHlwZSgpKTsKKwkJCWFzc2VydEVxdWFscyhkYXRhLmxlbmd0aCwgaW4uZ2V0U2l6ZSgpKTsKKwkJCWJ5dGVbXSBkYXRhMiA9IG5ldyBieXRlW2RhdGEubGVuZ3RoXTsKKwkJCUlPLnJlYWRGdWxseShpbiwgZGF0YTIsIDAsIGRhdGEubGVuZ3RoKTsKKwkJCWFzc2VydFRydWUoInNhbWUgY29udGVudCIsCisJCQkJCUFycmF5cy5lcXVhbHMoZGF0YSwgb2wuZ2V0Q2FjaGVkQnl0ZXMoKSkpOworCQl9CiAJfQogCiAJQFRlc3QKQEAgLTQ0NCwxMyArNDI0LDggQEAKIAkJd3JpdGUoaWQsIGNvbXByZXNzUGFja0Zvcm1hdCh0eXBlLCBkYXRhKSk7CiAKIAkJT2JqZWN0TG9hZGVyIG9sOwotCQl7Ci0JCQlGaWxlSW5wdXRTdHJlYW0gZnMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGgoaWQpKTsKLQkJCXRyeSB7Ci0JCQkJb2wgPSBVbnBhY2tlZE9iamVjdC5vcGVuKGZzLCBwYXRoKGlkKSwgaWQsIHdjKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJZnMuY2xvc2UoKTsKLQkJCX0KKwkJdHJ5IChGaWxlSW5wdXRTdHJlYW0gZnMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGgoaWQpKSkgeworCQkJb2wgPSBVbnBhY2tlZE9iamVjdC5vcGVuKGZzLCBwYXRoKGlkKSwgaWQsIHdjKTsKIAkJfQogCiAJCWFzc2VydE5vdE51bGwoImNyZWF0ZWQgbG9hZGVyIiwgb2wpOwpAQCAtNDY2LDE1ICs0NDEsMTUgQEAKIAkJCQkJLmdldE1lc3NhZ2UoKSk7CiAJCX0KIAotCQlPYmplY3RTdHJlYW0gaW4gPSBvbC5vcGVuU3RyZWFtKCk7Ci0JCWFzc2VydE5vdE51bGwoImhhdmUgc3RyZWFtIiwgaW4pOwotCQlhc3NlcnRFcXVhbHModHlwZSwgaW4uZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGRhdGEubGVuZ3RoLCBpbi5nZXRTaXplKCkpOwotCQlieXRlW10gZGF0YTIgPSBuZXcgYnl0ZVtkYXRhLmxlbmd0aF07Ci0JCUlPLnJlYWRGdWxseShpbiwgZGF0YTIsIDAsIGRhdGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZSgic2FtZSBjb250ZW50IiwgQXJyYXlzLmVxdWFscyhkYXRhMiwgZGF0YSkpOwotCQlhc3NlcnRFcXVhbHMoInN0cmVhbSBhdCBFT0YiLCAtMSwgaW4ucmVhZCgpKTsKLQkJaW4uY2xvc2UoKTsKKwkJdHJ5IChPYmplY3RTdHJlYW0gaW4gPSBvbC5vcGVuU3RyZWFtKCkpIHsKKwkJCWFzc2VydE5vdE51bGwoImhhdmUgc3RyZWFtIiwgaW4pOworCQkJYXNzZXJ0RXF1YWxzKHR5cGUsIGluLmdldFR5cGUoKSk7CisJCQlhc3NlcnRFcXVhbHMoZGF0YS5sZW5ndGgsIGluLmdldFNpemUoKSk7CisJCQlieXRlW10gZGF0YTIgPSBuZXcgYnl0ZVtkYXRhLmxlbmd0aF07CisJCQlJTy5yZWFkRnVsbHkoaW4sIGRhdGEyLCAwLCBkYXRhLmxlbmd0aCk7CisJCQlhc3NlcnRUcnVlKCJzYW1lIGNvbnRlbnQiLCBBcnJheXMuZXF1YWxzKGRhdGEyLCBkYXRhKSk7CisJCQlhc3NlcnRFcXVhbHMoInN0cmVhbSBhdCBFT0YiLCAtMSwgaW4ucmVhZCgpKTsKKwkJfQogCX0KIAogCUBUZXN0CkBAIC01NzMsMTEgKzU0OCw4IEBACiAJcHJpdmF0ZSB2b2lkIHdyaXRlKE9iamVjdElkIGlkLCBieXRlW10gZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJRmlsZSBwYXRoID0gcGF0aChpZCk7CiAJCUZpbGVVdGlscy5ta2RpcnMocGF0aC5nZXRQYXJlbnRGaWxlKCkpOwotCQlGaWxlT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHBhdGgpOwotCQl0cnkgeworCQl0cnkgKEZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ocGF0aCkpIHsKIAkJCW91dC53cml0ZShkYXRhKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW91dC5jbG9zZSgpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1dpbmRvd0NhY2hlR2V0VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9XaW5kb3dDYWNoZUdldFRlc3QuamF2YQppbmRleCBjYzM0ODM4Li44MmFkMjhlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1dpbmRvd0NhY2hlR2V0VGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvV2luZG93Q2FjaGVHZXRUZXN0LmphdmEKQEAgLTc0LDExICs3NCwxMCBAQAogCQlzdXBlci5zZXRVcCgpOwogCiAJCXRvTG9hZCA9IG5ldyBBcnJheUxpc3Q8PigpOwotCQlmaW5hbCBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoCisJCXRyeSAoQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKAogCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0oSkdpdFRlc3RVdGlsCiAJCQkJCQkuZ2V0VGVzdFJlc291cmNlRmlsZSgiYWxsX3BhY2tlZF9vYmplY3RzLnR4dCIpKSwKLQkJCQlDb25zdGFudHMuQ0hBUlNFVCkpOwotCQl0cnkgeworCQkJCUNvbnN0YW50cy5DSEFSU0VUKSkpIHsKIAkJCVN0cmluZyBsaW5lOwogCQkJd2hpbGUgKChsaW5lID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgewogCQkJCWZpbmFsIFN0cmluZ1tdIHBhcnRzID0gbGluZS5zcGxpdCgiIHsxLH0iKTsKQEAgLTkwLDggKzg5LDYgQEAKIAkJCQkvLyBwYXJ0c1s0XSBpcyB0aGUgb2Zmc2V0IGluIHRoZSBwYWNrCiAJCQkJdG9Mb2FkLmFkZChvKTsKIAkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWJyLmNsb3NlKCk7CiAJCX0KIAkJYXNzZXJ0RXF1YWxzKDk2LCB0b0xvYWQuc2l6ZSgpKTsKIAl9CkBAIC0xMjcsNyArMTI0LDcgQEAKIAkJY2hlY2tMaW1pdHMoY2ZnKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrTGltaXRzKGZpbmFsIFdpbmRvd0NhY2hlQ29uZmlnIGNmZykgeworCXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tMaW1pdHMoV2luZG93Q2FjaGVDb25maWcgY2ZnKSB7CiAJCWZpbmFsIFdpbmRvd0NhY2hlIGNhY2hlID0gV2luZG93Q2FjaGUuZ2V0SW5zdGFuY2UoKTsKIAkJYXNzZXJ0VHJ1ZShjYWNoZS5nZXRPcGVuRmlsZXMoKSA8PSBjZmcuZ2V0UGFja2VkR2l0T3BlbkZpbGVzKCkpOwogCQlhc3NlcnRUcnVlKGNhY2hlLmdldE9wZW5CeXRlcygpIDw9IGNmZy5nZXRQYWNrZWRHaXRMaW1pdCgpKTsKQEAgLTEzNiw3ICsxMzMsNyBAQAogCX0KIAogCXByaXZhdGUgdm9pZCBkb0NhY2hlVGVzdHMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmb3IgKGZpbmFsIFRlc3RPYmplY3QgbyA6IHRvTG9hZCkgeworCQlmb3IgKFRlc3RPYmplY3QgbyA6IHRvTG9hZCkgewogCQkJZmluYWwgT2JqZWN0TG9hZGVyIG9yID0gZGIub3BlbihvLmlkLCBvLnR5cGUpOwogCQkJYXNzZXJ0Tm90TnVsbChvcik7CiAJCQlhc3NlcnRFcXVhbHMoby50eXBlLCBvci5nZXRUeXBlKCkpOwpAQCAtMTQ4LDcgKzE0NSw3IEBACiAKIAkJaW50IHR5cGU7CiAKLQkJdm9pZCBzZXRUeXBlKGZpbmFsIFN0cmluZyB0eXBlU3RyKSB0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiB7CisJCXZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZVN0cikgdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24gewogCQkJZmluYWwgYnl0ZVtdIHR5cGVSYXcgPSBDb25zdGFudHMuZW5jb2RlKHR5cGVTdHIgKyAiICIpOwogCQkJZmluYWwgTXV0YWJsZUludGVnZXIgcHRyID0gbmV3IE11dGFibGVJbnRlZ2VyKCk7CiAJCQl0eXBlID0gQ29uc3RhbnRzLmRlY29kZVR5cGVTdHJpbmcoaWQsIHR5cGVSYXcsIChieXRlKSAnICcsIHB0cik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1hJbnB1dFN0cmVhbS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9YSW5wdXRTdHJlYW0uamF2YQppbmRleCA0NmY5ZWUzLi45MTA5OTljIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1hJbnB1dFN0cmVhbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvWElucHV0U3RyZWFtLmphdmEKQEAgLTUzLDcgKzUzLDcgQEAKIGNsYXNzIFhJbnB1dFN0cmVhbSBleHRlbmRzIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gewogCXByaXZhdGUgZmluYWwgYnl0ZVtdIGludGJ1ZiA9IG5ldyBieXRlWzhdOwogCi0JWElucHV0U3RyZWFtKGZpbmFsIElucHV0U3RyZWFtIHMpIHsKKwlYSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gcykgewogCQlzdXBlcihzKTsKIAl9CiAKQEAgLTYzLDcgKzYzLDcgQEAKIAkJcmV0dXJuIGI7CiAJfQogCi0Jc3luY2hyb25pemVkIHZvaWQgcmVhZEZ1bGx5KGZpbmFsIGJ5dGVbXSBiLCBpbnQgbywgaW50IGxlbikKKwlzeW5jaHJvbml6ZWQgdm9pZCByZWFkRnVsbHkoYnl0ZVtdIGIsIGludCBvLCBpbnQgbGVuKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaW50IHI7CiAJCXdoaWxlIChsZW4gPiAwICYmIChyID0gcmVhZChiLCBvLCBsZW4pKSA+IDApIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3JlZnRyZWUvUmVmVHJlZURhdGFiYXNlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcmVmdHJlZS9SZWZUcmVlRGF0YWJhc2VUZXN0LmphdmEKaW5kZXggMTY4NGFmYS4uYWU1MmFkNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcmVmdHJlZS9SZWZUcmVlRGF0YWJhc2VUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcmVmdHJlZS9SZWZUcmVlRGF0YWJhc2VUZXN0LmphdmEKQEAgLTYzMSw3ICs2MzEsNyBAQAogCQkJCW5hbWUpOwogCX0KIAotCXByaXZhdGUgdm9pZCBzeW1yZWYoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBkc3QpCisJcHJpdmF0ZSB2b2lkIHN5bXJlZihTdHJpbmcgbmFtZSwgU3RyaW5nIGRzdCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWNvbW1pdChuZXcgRnVuY3Rpb24oKSB7CiAJCQlAT3ZlcnJpZGUKQEAgLTY0OCw3ICs2NDgsNyBAQAogCQl9KTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgdXBkYXRlKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBPYmplY3RJZCBpZCkKKwlwcml2YXRlIHZvaWQgdXBkYXRlKFN0cmluZyBuYW1lLCBPYmplY3RJZCBpZCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWNvbW1pdChuZXcgRnVuY3Rpb24oKSB7CiAJCQlAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9UZXN0UmVwb3NpdG9yeVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9UZXN0UmVwb3NpdG9yeVRlc3QuamF2YQppbmRleCBiNzAyN2YzLi45NjU4OTllIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvanVuaXQvVGVzdFJlcG9zaXRvcnlUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L1Rlc3RSZXBvc2l0b3J5VGVzdC5qYXZhCkBAIC00Myw3ICs0Myw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5qdW5pdDsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RFcXVhbHM7CkBAIC00MTgsNiArNDE4LDYgQEAKIAkJUmV2T2JqZWN0IG9iaiA9IHRyLmdldChydy5wYXJzZVRyZWUodHJlZWlzaCksIHBhdGgpOwogCQlhc3NlcnRTYW1lKFJldkJsb2IuY2xhc3MsIG9iai5nZXRDbGFzcygpKTsKIAkJT2JqZWN0TG9hZGVyIGxvYWRlciA9IHJ3LmdldE9iamVjdFJlYWRlcigpLm9wZW4ob2JqKTsKLQkJcmV0dXJuIG5ldyBTdHJpbmcobG9hZGVyLmdldENhY2hlZEJ5dGVzKCksIFVURl84KTsKKwkJcmV0dXJuIG5ldyBTdHJpbmcobG9hZGVyLmdldENhY2hlZEJ5dGVzKCksIENIQVJTRVQpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQnJhbmNoQ29uZmlnVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9CcmFuY2hDb25maWdUZXN0LmphdmEKaW5kZXggODdiYjA4Mi4uMWVjZGYyMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9CcmFuY2hDb25maWdUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9CcmFuY2hDb25maWdUZXN0LmphdmEKQEAgLTE2MCw3ICsxNjAsNyBAQAogCQlhc3NlcnRUcnVlKG5ldyBCcmFuY2hDb25maWcoYywgInRydWUiKS5pc1JlYmFzZSgpKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBDb25maWcgcGFyc2UoZmluYWwgU3RyaW5nIGNvbnRlbnQpIHsKKwlwcml2YXRlIHN0YXRpYyBDb25maWcgcGFyc2UoU3RyaW5nIGNvbnRlbnQpIHsKIAkJZmluYWwgQ29uZmlnIGMgPSBuZXcgQ29uZmlnKG51bGwpOwogCQl0cnkgewogCQkJYy5mcm9tVGV4dChjb250ZW50KTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25maWdUZXN0LmphdmEKaW5kZXggNzg2MjAwNS4uYzRjNGRhOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25maWdUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25maWdUZXN0LmphdmEKQEAgLTkxNCwxMiArOTE0LDEyIEBACiAJCWFzc2VydEVxdWFscyhleHAsIGMuZ2V0TG9uZygicyIsIG51bGwsICJhIiwgMEwpKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBDb25maWcgcGFyc2UoZmluYWwgU3RyaW5nIGNvbnRlbnQpCisJcHJpdmF0ZSBzdGF0aWMgQ29uZmlnIHBhcnNlKFN0cmluZyBjb250ZW50KQogCQkJdGhyb3dzIENvbmZpZ0ludmFsaWRFeGNlcHRpb24gewogCQlyZXR1cm4gcGFyc2UoY29udGVudCwgbnVsbCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgQ29uZmlnIHBhcnNlKGZpbmFsIFN0cmluZyBjb250ZW50LCBDb25maWcgYmFzZUNvbmZpZykKKwlwcml2YXRlIHN0YXRpYyBDb25maWcgcGFyc2UoU3RyaW5nIGNvbnRlbnQsIENvbmZpZyBiYXNlQ29uZmlnKQogCQkJdGhyb3dzIENvbmZpZ0ludmFsaWRFeGNlcHRpb24gewogCQlmaW5hbCBDb25maWcgYyA9IG5ldyBDb25maWcoYmFzZUNvbmZpZyk7CiAJCWMuZnJvbVRleHQoY29udGVudCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0RpckNhY2hlQ2hlY2tvdXRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0RpckNhY2hlQ2hlY2tvdXRUZXN0LmphdmEKaW5kZXggMDQxMjI0Mi4uZWI4NzgyNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9EaXJDYWNoZUNoZWNrb3V0VGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvRGlyQ2FjaGVDaGVja291dFRlc3QuamF2YQpAQCAtNzgsOCArNzgsMTAgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LlRlc3RSZXBvc2l0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuVGVzdFJlcG9zaXRvcnkuQnJhbmNoQnVpbGRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuQWJzdHJhY3RUcmVlSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5GaWxlVHJlZUl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuVHJlZVdhbGs7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5Xb3JraW5nVHJlZUl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GUzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRmlsZVV0aWxzOwogaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bWU7CkBAIC0xOTA0LDYgKzE5MDYsMTE3IEBACiAJCWFzc2VydFVwZGF0ZWQobG9uZ0ZpbGVOYW1lKTsKIAl9CiAKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RJZ25vcmVkRGlyZWN0b3J5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXdyaXRlVHJhc2hGaWxlKCIuZ2l0aWdub3JlIiwgInNyYy9pZ25vcmVkIik7CisJCXdyaXRlVHJhc2hGaWxlKCJzcmMvaWdub3JlZC9zdWIvZm9vLnR4dCIsICIxIik7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpKSB7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oIi4iKS5jYWxsKCk7CisJCQlSZXZDb21taXQgY29tbWl0ID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZGluZyAuZ2l0aWdub3JlIikKKwkJCQkJLmNhbGwoKTsKKwkJCXdyaXRlVHJhc2hGaWxlKCJmb28udHh0IiwgIjIiKTsKKwkJCXdyaXRlVHJhc2hGaWxlKCJ6enoudHh0IiwgIjMiKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiZm9vLnR4dCIpLmNhbGwoKTsKKwkJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJhZGQgZmlsZSIpLmNhbGwoKTsKKwkJCWFzc2VydEVxdWFscygiU2hvdWxkIG5vdCBoYXZlIGVudGVyZWQgaWdub3JlZCBkaXJlY3RvcnkiLCAxLAorCQkJCQlyZXNldEhhcmRBbmRDb3VudChjb21taXQpKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdElnbm9yZWREaXJlY3RvcnlXaXRoVHJhY2tlZENvbnRlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJd3JpdGVUcmFzaEZpbGUoInNyYy9pZ25vcmVkL3N1Yi9mb28udHh0IiwgIjEiKTsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYikpIHsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiLiIpLmNhbGwoKTsKKwkJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJhZGRpbmcgZm9vLnR4dCIpLmNhbGwoKTsKKwkJCXdyaXRlVHJhc2hGaWxlKCIuZ2l0aWdub3JlIiwgInNyYy9pZ25vcmVkIik7CisJCQl3cml0ZVRyYXNoRmlsZSgic3JjL2lnbm9yZWQvc3ViL2Zvby50eHQiLCAiMiIpOworCQkJd3JpdGVUcmFzaEZpbGUoInNyYy9pZ25vcmVkL290aGVyL2Jhci50eHQiLCAiMyIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQkJUmV2Q29tbWl0IGNvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJhZGRpbmcgLmdpdGlnbm9yZSIpCisJCQkJCS5jYWxsKCk7CisJCQl3cml0ZVRyYXNoRmlsZSgiZm9vLnR4dCIsICIyIik7CisJCQl3cml0ZVRyYXNoRmlsZSgienp6LnR4dCIsICIzIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImZvby50eHQiKS5jYWxsKCk7CisJCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiYWRkIGZpbGUiKS5jYWxsKCk7CisJCQlGaWxlIGZpbGUgPSB3cml0ZVRyYXNoRmlsZSgic3JjL2lnbm9yZWQvc3ViL2Zvby50eHQiLCAiMyIpOworCQkJYXNzZXJ0RXF1YWxzKCJTaG91bGQgaGF2ZSBlbnRlcmVkIGlnbm9yZWQgZGlyZWN0b3J5IiwgMywKKwkJCQkJcmVzZXRIYXJkQW5kQ291bnQoY29tbWl0KSk7CisJCQljaGVja0ZpbGUoZmlsZSwgIjIiKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFJlc2V0V2l0aENoYW5nZUluR2l0aWdub3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXdyaXRlVHJhc2hGaWxlKCIuZ2l0aWdub3JlIiwgInNyYy9pZ25vcmVkIik7CisJCXdyaXRlVHJhc2hGaWxlKCJzcmMvaWdub3JlZC9zdWIvZm9vLnR4dCIsICIxIik7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpKSB7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oIi4iKS5jYWxsKCk7CisJCQlSZXZDb21taXQgaW5pdGlhbCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJpbml0aWFsIikuY2FsbCgpOworCQkJd3JpdGVUcmFzaEZpbGUoInNyYy9uZXdpZ25vcmVkL2Zvby50eHQiLCAiMiIpOworCQkJd3JpdGVUcmFzaEZpbGUoInNyYy8uZ2l0aWdub3JlIiwgIm5ld2lnbm9yZWQiKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiLiIpLmNhbGwoKTsKKwkJCVJldkNvbW1pdCBjb21taXQgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgibmV3aWdub3JlZCIpLmNhbGwoKTsKKwkJCWFzc2VydEVxdWFscygiU2hvdWxkIG5vdCBoYXZlIGVudGVyZWQgc3JjL25ld2lnbm9yZWQgZGlyZWN0b3J5IiwgMSwKKwkJCQkJcmVzZXRIYXJkQW5kQ291bnQoaW5pdGlhbCkpOworCQkJYXNzZXJ0RXF1YWxzKCJTaG91bGQgaGF2ZSBlbnRlcmVkIHNyYy9uZXdpZ25vcmVkIGRpcmVjdG9yeSIsIDIsCisJCQkJCXJlc2V0SGFyZEFuZENvdW50KGNvbW1pdCkpOworCQkJZGVsZXRlVHJhc2hGaWxlKCJzcmMvLmdpdGlnbm9yZSIpOworCQkJZ2l0LnJtKCkuYWRkRmlsZXBhdHRlcm4oInNyYy8uZ2l0aWdub3JlIikuY2FsbCgpOworCQkJUmV2Q29tbWl0IHRvcCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJVbmlnbm9yZSBuZXdpZ25vcmUiKQorCQkJCQkuY2FsbCgpOworCQkJYXNzZXJ0RXF1YWxzKCJTaG91bGQgaGF2ZSBlbnRlcmVkIHNyYy9uZXdpZ25vcmVkIGRpcmVjdG9yeSIsIDIsCisJCQkJCXJlc2V0SGFyZEFuZENvdW50KGluaXRpYWwpKTsKKwkJCWFzc2VydEVxdWFscygiU2hvdWxkIGhhdmUgZW50ZXJlZCBzcmMvbmV3aWdub3JlZCBkaXJlY3RvcnkiLCAyLAorCQkJCQlyZXNldEhhcmRBbmRDb3VudChjb21taXQpKTsKKwkJCWFzc2VydEVxdWFscygiU2hvdWxkIG5vdCBoYXZlIGVudGVyZWQgc3JjL25ld2lnbm9yZWQgZGlyZWN0b3J5IiwgMSwKKwkJCQkJcmVzZXRIYXJkQW5kQ291bnQodG9wKSk7CisKKwkJfQorCX0KKworCXByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3RGaWxlVHJlZUl0ZXJhdG9yIGV4dGVuZHMgRmlsZVRyZWVJdGVyYXRvciB7CisKKwkJLy8gRm9yIGFzc2VydGlvbnMgb25seQorCQlwcml2YXRlIGZpbmFsIGludFtdIGNvdW50OworCisJCXB1YmxpYyBUZXN0RmlsZVRyZWVJdGVyYXRvcihSZXBvc2l0b3J5IHJlcG8sIGludFtdIGNvdW50KSB7CisJCQlzdXBlcihyZXBvKTsKKwkJCXRoaXMuY291bnQgPSBjb3VudDsKKwkJfQorCisJCXByb3RlY3RlZCBUZXN0RmlsZVRyZWVJdGVyYXRvcihmaW5hbCBXb3JraW5nVHJlZUl0ZXJhdG9yIHAsCisJCQkJZmluYWwgRmlsZSByb290LCBGUyBmcywgRmlsZU1vZGVTdHJhdGVneSBmaWxlTW9kZVN0cmF0ZWd5LAorCQkJCWludFtdIGNvdW50KSB7CisJCQlzdXBlcihwLCByb290LCBmcywgZmlsZU1vZGVTdHJhdGVneSk7CisJCQl0aGlzLmNvdW50ID0gY291bnQ7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGVudGVyU3VidHJlZSgpIHsKKwkJCWNvdW50WzBdICs9IDE7CisJCQlyZXR1cm4gbmV3IFRlc3RGaWxlVHJlZUl0ZXJhdG9yKHRoaXMsCisJCQkJCSgoRmlsZUVudHJ5KSBjdXJyZW50KCkpLmdldEZpbGUoKSwgZnMsIGZpbGVNb2RlU3RyYXRlZ3ksCisJCQkJCWNvdW50KTsKKwkJfQorCX0KKworCXByaXZhdGUgaW50IHJlc2V0SGFyZEFuZENvdW50KFJldkNvbW1pdCBjb21taXQpIHRocm93cyBFeGNlcHRpb24geworCQlpbnRbXSBjYWxsQ291bnQgPSB7IDAgfTsKKwkJRGlyQ2FjaGUgY2FjaGUgPSBkYi5sb2NrRGlyQ2FjaGUoKTsKKwkJRmlsZVRyZWVJdGVyYXRvciB3b3JraW5nVHJlZUl0ZXJhdG9yID0gbmV3IFRlc3RGaWxlVHJlZUl0ZXJhdG9yKGRiLAorCQkJCWNhbGxDb3VudCk7CisJCXRyeSB7CisJCQlEaXJDYWNoZUNoZWNrb3V0IGNoZWNrb3V0ID0gbmV3IERpckNhY2hlQ2hlY2tvdXQoZGIsIG51bGwsIGNhY2hlLAorCQkJCQljb21taXQuZ2V0VHJlZSgpLmdldElkKCksIHdvcmtpbmdUcmVlSXRlcmF0b3IpOworCQkJY2hlY2tvdXQuc2V0RmFpbE9uQ29uZmxpY3QoZmFsc2UpOworCQkJY2hlY2tvdXQuY2hlY2tvdXQoKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWNhY2hlLnVubG9jaygpOworCQl9CisJCXJldHVybiBjYWxsQ291bnRbMF07CisJfQorCiAJcHVibGljIHZvaWQgYXNzZXJ0V29ya0RpcihNYXA8U3RyaW5nLCBTdHJpbmc+IGkpCiAJCQl0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiwKIAkJCUlPRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvSW5kZXhEaWZmVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9JbmRleERpZmZUZXN0LmphdmEKaW5kZXggMmNiOGY4Ni4uNTgwYjA4YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9JbmRleERpZmZUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9JbmRleERpZmZUZXN0LmphdmEKQEAgLTQ3MCw3ICs0NzAsOCBAQAogCX0KIAogCS8qKgotCSAqIFRlc3QgdGhhdCBpZ25vcmVkIGZvbGRlcnMgYXJlbid0IGxpc3RlZCBhcyB1bnRyYWNrZWQKKwkgKiBUZXN0IHRoYXQgaWdub3JlZCBmb2xkZXJzIGFyZW4ndCBsaXN0ZWQgYXMgdW50cmFja2VkLCBidXQgYXJlIGxpc3RlZCBhcworCSAqIGlnbm9yZWQuCiAJICoKIAkgKiBAdGhyb3dzIEV4Y2VwdGlvbgogCSAqLwpAQCAtNDk5LDYgKzUwMCw4IEBACiAJCQlkaWZmLmRpZmYoKTsKIAkJCWFzc2VydEVxdWFscyhuZXcgSGFzaFNldDw+KEFycmF5cy5hc0xpc3QoInNyYyIpKSwKIAkJCQkJZGlmZi5nZXRVbnRyYWNrZWRGb2xkZXJzKCkpOworCQkJYXNzZXJ0RXF1YWxzKG5ldyBIYXNoU2V0PD4oQXJyYXlzLmFzTGlzdCgic3IiLCAidGFyZ2V0IikpLAorCQkJCQlkaWZmLmdldElnbm9yZWROb3RJbkluZGV4KCkpOwogCiAJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oInNyYyIpLmNhbGwoKTsKIAkJCXdyaXRlVHJhc2hGaWxlKCJzci9jb20vWDEuamF2YSIsICIiKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0Q2hlY2tlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0Q2hlY2tlclRlc3QuamF2YQppbmRleCBmMWM2MmQ0Li5iOGU4YTEyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdENoZWNrZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RDaGVja2VyVGVzdC5qYXZhCkBAIC00NSw3ICs0NSw3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubGliOwogCiBpbXBvcnQgc3RhdGljIGphdmEubGFuZy5JbnRlZ2VyLnZhbHVlT2Y7Ci1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuSkdpdFRlc3RVdGlsLmNvbmNhdDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSkVDVF9JRF9MRU5HVEg7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpfQkFEOwpAQCAtMTQ1NCw3ICsxNDU0LDcgQEAKIAkJU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJZW50cnkoYiwgIjEwMDY0NCBBIik7CiAJCWVudHJ5KGIsICIxMDA2NDQgYSIpOwotCQlieXRlW10gZGF0YSA9IGIudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCk7CisJCWJ5dGVbXSBkYXRhID0gYi50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpOwogCQljaGVja2VyLnNldFNhZmVGb3JXaW5kb3dzKHRydWUpOwogCQlhc3NlcnRDb3JydXB0KCJkdXBsaWNhdGUgZW50cnkgbmFtZXMiLCBPQkpfVFJFRSwgZGF0YSk7CiAJCWFzc2VydFNraXBMaXN0QWNjZXB0cyhPQkpfVFJFRSwgZGF0YSk7CkBAIC0xNDY4LDcgKzE0NjgsNyBAQAogCQlTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQllbnRyeShiLCAiMTAwNjQ0IEEiKTsKIAkJZW50cnkoYiwgIjEwMDY0NCBhIik7Ci0JCWJ5dGVbXSBkYXRhID0gYi50b1N0cmluZygpLmdldEJ5dGVzKFVURl84KTsKKwkJYnl0ZVtdIGRhdGEgPSBiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCk7CiAJCWNoZWNrZXIuc2V0U2FmZUZvck1hY09TKHRydWUpOwogCQlhc3NlcnRDb3JydXB0KCJkdXBsaWNhdGUgZW50cnkgbmFtZXMiLCBPQkpfVFJFRSwgZGF0YSk7CiAJCWFzc2VydFNraXBMaXN0QWNjZXB0cyhPQkpfVFJFRSwgZGF0YSk7CkBAIC0xNDgyLDcgKzE0ODIsNyBAQAogCQlTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQllbnRyeShiLCAiMTAwNjQ0IFx1MDA2NVx1MDMwMSIpOwogCQllbnRyeShiLCAiMTAwNjQ0IFx1MDBlOSIpOwotCQlieXRlW10gZGF0YSA9IGIudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCk7CisJCWJ5dGVbXSBkYXRhID0gYi50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpOwogCQljaGVja2VyLnNldFNhZmVGb3JNYWNPUyh0cnVlKTsKIAkJYXNzZXJ0Q29ycnVwdCgiZHVwbGljYXRlIGVudHJ5IG5hbWVzIiwgT0JKX1RSRUUsIGRhdGEpOwogCQlhc3NlcnRTa2lwTGlzdEFjY2VwdHMoT0JKX1RSRUUsIGRhdGEpOwpAQCAtMTQ5Niw3ICsxNDk2LDcgQEAKIAkJU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJZW50cnkoYiwgIjEwMDY0NCBBIik7CiAJCWNoZWNrZXIuc2V0U2FmZUZvck1hY09TKHRydWUpOwotCQljaGVja2VyLmNoZWNrVHJlZShiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJY2hlY2tlci5jaGVja1RyZWUoYi50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpKTsKIAl9CiAKIAlAVGVzdApAQCAtMTYwNyw3ICsxNjA3LDcgQEAKIAkJY2hlY2tlci5jaGVja1RyZWUoZW5jb2RlQVNDSUkoYi50b1N0cmluZygpKSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBlbnRyeShTdHJpbmdCdWlsZGVyIGIsIGZpbmFsIFN0cmluZyBtb2RlTmFtZSkgeworCXByaXZhdGUgc3RhdGljIHZvaWQgZW50cnkoU3RyaW5nQnVpbGRlciBiLCBTdHJpbmcgbW9kZU5hbWUpIHsKIAkJYi5hcHBlbmQobW9kZU5hbWUpOwogCQliLmFwcGVuZCgnXDAnKTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBPQkpFQ1RfSURfTEVOR1RIOyBpKyspCkBAIC0xNjQ3LDcgKzE2NDcsNyBAQAogCQljaGVja2VyLnNldFNraXBMaXN0KG51bGwpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIE9iamVjdElkU2V0IHNldChmaW5hbCBPYmplY3RJZC4uLiBpZHMpIHsKKwlwcml2YXRlIHN0YXRpYyBPYmplY3RJZFNldCBzZXQoT2JqZWN0SWQuLi4gaWRzKSB7CiAJCXJldHVybiBuZXcgT2JqZWN0SWRTZXQoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKEFueU9iamVjdElkIG9iamVjdElkKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1JhY3lHaXRUZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SYWN5R2l0VGVzdHMuamF2YQppbmRleCA5MjM2YjRlLi44ZDljY2FiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1JhY3lHaXRUZXN0cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvUmFjeUdpdFRlc3RzLmphdmEKQEAgLTE3NiwxMiArMTc2LDkgQEAKIAogCXByaXZhdGUgRmlsZSBhZGRUb1dvcmtEaXIoU3RyaW5nIHBhdGgsIFN0cmluZyBjb250ZW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlGaWxlIGYgPSBuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLCBwYXRoKTsKLQkJRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmKTsKLQkJdHJ5IHsKKwkJdHJ5IChGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYpKSB7CiAJCQlmb3Mud3JpdGUoY29udGVudC5nZXRCeXRlcyhDb25zdGFudHMuQ0hBUkFDVEVSX0VOQ09ESU5HKSk7CiAJCQlyZXR1cm4gZjsKLQkJfSBmaW5hbGx5IHsKLQkJCWZvcy5jbG9zZSgpOwogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1JlZlRlc3QuamF2YQppbmRleCA3ZmIzMzA5Li4yNDgxZTY0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1JlZlRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1JlZlRlc3QuamF2YQpAQCAtNTcsNiArNTcsNyBAQAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwogCkBAIC0yNTMsMTEgKzI1NCwxMSBAQAogCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewogCQlSZWYgcmVmID0gZGIuZXhhY3RSZWYoInJlZnMvaGVhZHMvbWFzdGVyIik7CiAJCWFzc2VydEVxdWFscyhTdG9yYWdlLlBBQ0tFRCwgcmVmLmdldFN0b3JhZ2UoKSk7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShuZXcgRmlsZShkYi5nZXREaXJlY3RvcnkoKSwKLQkJCQkicmVmcy9oZWFkcy9tYXN0ZXIiKSk7Ci0JCW9zLndyaXRlKHJlZi5nZXRPYmplY3RJZCgpLm5hbWUoKS5nZXRCeXRlcygpKTsKLQkJb3Mud3JpdGUoJ1xuJyk7Ci0JCW9zLmNsb3NlKCk7CisJCXRyeSAoRmlsZU91dHB1dFN0cmVhbSBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKAorCQkJCW5ldyBGaWxlKGRiLmdldERpcmVjdG9yeSgpLCAicmVmcy9oZWFkcy9tYXN0ZXIiKSkpIHsKKwkJCW9zLndyaXRlKHJlZi5nZXRPYmplY3RJZCgpLm5hbWUoKS5nZXRCeXRlcygpKTsKKwkJCW9zLndyaXRlKCdcbicpOworCQl9CiAKIAkJcmVmID0gZGIuZXhhY3RSZWYoInJlZnMvaGVhZHMvbWFzdGVyIik7CiAJCWFzc2VydEVxdWFscyhTdG9yYWdlLkxPT1NFLCByZWYuZ2V0U3RvcmFnZSgpKTsKQEAgLTMwNSw0ICszMDYsMjYgQEAKIAkJYXNzZXJ0U2FtZShkc3QuZ2V0UGVlbGVkT2JqZWN0SWQoKSwgcmVmLmdldFBlZWxlZE9iamVjdElkKCkpOwogCQlhc3NlcnRFcXVhbHMoZHN0LmlzUGVlbGVkKCksIHJlZi5pc1BlZWxlZCgpKTsKIAl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrQ29udGFpbnNSZWYoTGlzdDxSZWY+IGhheXN0YWNrLCBSZWYgbmVlZGxlKSB7CisJCWZvciAoUmVmIHJlZiA6IGhheXN0YWNrKSB7CisJCQlpZiAocmVmLmdldE5hbWUoKS5lcXVhbHMobmVlZGxlLmdldE5hbWUoKSkgJiYKKwkJCQkJcmVmLmdldE9iamVjdElkKCkuZXF1YWxzKG5lZWRsZS5nZXRPYmplY3RJZCgpKSkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQlmYWlsKCJsaXN0ICIgKyBoYXlzdGFjayArICIgZG9lcyBub3QgY29udGFpbiByZWYgIiArIG5lZWRsZSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVmc0J5UHJlZml4KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJTGlzdDxSZWY+IHJlZnMgPSBkYi5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnNCeVByZWZpeCgicmVmcy9oZWFkcy9nIik7CisJCWFzc2VydEVxdWFscygyLCByZWZzLnNpemUoKSk7CisJCWNoZWNrQ29udGFpbnNSZWYocmVmcywgZGIuZXhhY3RSZWYoInJlZnMvaGVhZHMvZyIpKTsKKwkJY2hlY2tDb250YWluc1JlZihyZWZzLCBkYi5leGFjdFJlZigicmVmcy9oZWFkcy9naXRsaW5rIikpOworCisJCXJlZnMgPSBkYi5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnNCeVByZWZpeCgicmVmcy9oZWFkcy9wcmVmaXgvIik7CisJCWFzc2VydEVxdWFscygxLCByZWZzLnNpemUoKSk7CisJCWNoZWNrQ29udGFpbnNSZWYocmVmcywgZGIuZXhhY3RSZWYoInJlZnMvaGVhZHMvcHJlZml4L2EiKSk7CisJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZXBvc2l0b3J5Q2FjaGVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1JlcG9zaXRvcnlDYWNoZVRlc3QuamF2YQppbmRleCAxMTA3YzJjLi41OGIwMDVjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1JlcG9zaXRvcnlDYWNoZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1JlcG9zaXRvcnlDYWNoZVRlc3QuamF2YQpAQCAtOTQsMjQgKzk0LDI1IEBACiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RGaWxlS2V5T3BlbkV4aXN0aW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJUmVwb3NpdG9yeSByOworCQl0cnkgKFJlcG9zaXRvcnkgciA9IG5ldyBGaWxlS2V5KGRiLmdldERpcmVjdG9yeSgpLCBkYi5nZXRGUygpKQorCQkJCS5vcGVuKHRydWUpKSB7CisJCQlhc3NlcnROb3ROdWxsKHIpOworCQkJYXNzZXJ0RXF1YWxzRmlsZShkYi5nZXREaXJlY3RvcnkoKSwgci5nZXREaXJlY3RvcnkoKSk7CisJCX0KIAotCQlyID0gbmV3IEZpbGVLZXkoZGIuZ2V0RGlyZWN0b3J5KCksIGRiLmdldEZTKCkpLm9wZW4odHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwocik7Ci0JCWFzc2VydEVxdWFsc0ZpbGUoZGIuZ2V0RGlyZWN0b3J5KCksIHIuZ2V0RGlyZWN0b3J5KCkpOwotCQlyLmNsb3NlKCk7Ci0KLQkJciA9IG5ldyBGaWxlS2V5KGRiLmdldERpcmVjdG9yeSgpLCBkYi5nZXRGUygpKS5vcGVuKGZhbHNlKTsKLQkJYXNzZXJ0Tm90TnVsbChyKTsKLQkJYXNzZXJ0RXF1YWxzRmlsZShkYi5nZXREaXJlY3RvcnkoKSwgci5nZXREaXJlY3RvcnkoKSk7Ci0JCXIuY2xvc2UoKTsKKwkJdHJ5IChSZXBvc2l0b3J5IHIgPSBuZXcgRmlsZUtleShkYi5nZXREaXJlY3RvcnkoKSwgZGIuZ2V0RlMoKSkKKwkJCQkub3BlbihmYWxzZSkpIHsKKwkJCWFzc2VydE5vdE51bGwocik7CisJCQlhc3NlcnRFcXVhbHNGaWxlKGRiLmdldERpcmVjdG9yeSgpLCByLmdldERpcmVjdG9yeSgpKTsKKwkJfQogCX0KIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdEZpbGVLZXlPcGVuTmV3KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZmluYWwgUmVwb3NpdG9yeSBuID0gY3JlYXRlUmVwb3NpdG9yeSh0cnVlLCBmYWxzZSk7Ci0JCWZpbmFsIEZpbGUgZ2l0ZGlyID0gbi5nZXREaXJlY3RvcnkoKTsKLQkJbi5jbG9zZSgpOworCQlGaWxlIGdpdGRpcjsKKwkJdHJ5IChSZXBvc2l0b3J5IG4gPSBjcmVhdGVSZXBvc2l0b3J5KHRydWUsIGZhbHNlKSkgeworCQkJZ2l0ZGlyID0gbi5nZXREaXJlY3RvcnkoKTsKKwkJfQogCQlyZWN1cnNpdmVEZWxldGUoZ2l0ZGlyKTsKIAkJYXNzZXJ0RmFsc2UoZ2l0ZGlyLmV4aXN0cygpKTsKIApAQCAtMTQzLDYgKzE0NCw3IEBACiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0Q2FjaGVPcGVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIEZpbGVLZXkgbG9jID0gRmlsZUtleS5leGFjdChkYi5nZXREaXJlY3RvcnkoKSwgZGIuZ2V0RlMoKSk7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIFdlIGFyZSB0ZXN0aW5nIHRoZSBjbG9zZSgpIG1ldGhvZAogCQlmaW5hbCBSZXBvc2l0b3J5IGQyID0gUmVwb3NpdG9yeUNhY2hlLm9wZW4obG9jKTsKIAkJYXNzZXJ0Tm90U2FtZShkYiwgZDIpOwogCQlhc3NlcnRTYW1lKGQyLCBSZXBvc2l0b3J5Q2FjaGUub3BlbihGaWxlS2V5LmV4YWN0KGxvYy5nZXRGaWxlKCksIGRiLmdldEZTKCkpKSk7CkBAIC0xNzYsNiArMTc4LDcgQEAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RSZXBvc2l0b3J5VXNhZ2VDb3VudCgpIHRocm93cyBFeGNlcHRpb24gewogCQlGaWxlS2V5IGxvYyA9IEZpbGVLZXkuZXhhY3QoZGIuZ2V0RGlyZWN0b3J5KCksIGRiLmdldEZTKCkpOworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBXZSBhcmUgdGVzdGluZyB0aGUgY2xvc2UoKSBtZXRob2QKIAkJUmVwb3NpdG9yeSBkMiA9IFJlcG9zaXRvcnlDYWNoZS5vcGVuKGxvYyk7CiAJCWFzc2VydEVxdWFscygxLCBkMi51c2VDbnQuZ2V0KCkpOwogCQlSZXBvc2l0b3J5Q2FjaGUub3BlbihGaWxlS2V5LmV4YWN0KGxvYy5nZXRGaWxlKCksIGRiLmdldEZTKCkpKTsKQEAgLTE4OSw2ICsxOTIsNyBAQAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFJlcG9zaXRvcnlVc2FnZUNvdW50V2l0aFJlZ2lzdGVyZWRSZXBvc2l0b3J5KCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIFdlIGFyZSB0ZXN0aW5nIHRoZSBjbG9zZSgpIG1ldGhvZAogCQlSZXBvc2l0b3J5IHJlcG8gPSBjcmVhdGVSZXBvc2l0b3J5KGZhbHNlLCBmYWxzZSk7CiAJCWFzc2VydEVxdWFscygxLCByZXBvLnVzZUNudC5nZXQoKSk7CiAJCVJlcG9zaXRvcnlDYWNoZS5yZWdpc3RlcihyZXBvKTsKQEAgLTIwMCw2ICsyMDQsNyBAQAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFJlcG9zaXRvcnlOb3RVbnJlZ2lzdGVyaW5nV2hlbkNsb3NpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJRmlsZUtleSBsb2MgPSBGaWxlS2V5LmV4YWN0KGRiLmdldERpcmVjdG9yeSgpLCBkYi5nZXRGUygpKTsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gV2UgYXJlIHRlc3RpbmcgdGhlIGNsb3NlKCkgbWV0aG9kCiAJCVJlcG9zaXRvcnkgZDIgPSBSZXBvc2l0b3J5Q2FjaGUub3Blbihsb2MpOwogCQlhc3NlcnRFcXVhbHMoMSwgZDIudXNlQ250LmdldCgpKTsKIAkJYXNzZXJ0VGhhdChSZXBvc2l0b3J5Q2FjaGUuZ2V0UmVnaXN0ZXJlZEtleXMoKSwKQEAgLTIxNCw2ICsyMTksNyBAQAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFJlcG9zaXRvcnlVbnJlZ2lzdGVyaW5nV2hlbkV4cGlyZWRBbmRVc2FnZUNvdW50TmVnYXRpdmUoKQogCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIFdlIGFyZSB0ZXN0aW5nIHRoZSBjbG9zZSgpIG1ldGhvZAogCQlSZXBvc2l0b3J5IHJlcG9BID0gY3JlYXRlQmFyZVJlcG9zaXRvcnkoKTsKIAkJUmVwb3NpdG9yeUNhY2hlLnJlZ2lzdGVyKHJlcG9BKTsKIApAQCAtMjM0LDcgKzI0MCw5IEBACiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RSZXBvc2l0b3J5VW5yZWdpc3RlcmluZ1doZW5FeHBpcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIFdlIGFyZSB0ZXN0aW5nIHRoZSBjbG9zZSgpIG1ldGhvZAogCQlSZXBvc2l0b3J5IHJlcG9BID0gY3JlYXRlUmVwb3NpdG9yeSh0cnVlLCBmYWxzZSk7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIFdlIGFyZSB0ZXN0aW5nIHRoZSBjbG9zZSgpIG1ldGhvZAogCQlSZXBvc2l0b3J5IHJlcG9CID0gY3JlYXRlUmVwb3NpdG9yeSh0cnVlLCBmYWxzZSk7CiAJCVJlcG9zaXRvcnkgcmVwb0MgPSBjcmVhdGVCYXJlUmVwb3NpdG9yeSgpOwogCQlSZXBvc2l0b3J5Q2FjaGUucmVnaXN0ZXIocmVwb0EpOwpAQCAtMjY4LDYgKzI3Niw3IEBACiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RSZWNvbmZpZ3VyZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBXZSBhcmUgdGVzdGluZyB0aGUgY2xvc2UoKSBtZXRob2QKIAkJUmVwb3NpdG9yeSByZXBvID0gY3JlYXRlUmVwb3NpdG9yeShmYWxzZSwgZmFsc2UpOwogCQlSZXBvc2l0b3J5Q2FjaGUucmVnaXN0ZXIocmVwbyk7CiAJCWFzc2VydFRydWUoUmVwb3NpdG9yeUNhY2hlLmlzQ2FjaGVkKHJlcG8pKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVwb3NpdG9yeVJlc29sdmVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1JlcG9zaXRvcnlSZXNvbHZlVGVzdC5qYXZhCmluZGV4IDFkMmE0ZTkuLjA1Yjc4ZWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVwb3NpdG9yeVJlc29sdmVUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZXBvc2l0b3J5UmVzb2x2ZVRlc3QuamF2YQpAQCAtMzI0LDYgKzMyNCw4IEBACiAJCWFzc2VydEZhbHNlKFJlcG9zaXRvcnkuaXNWYWxpZFJlZk5hbWUoIngvYVxcYiIpKTsKIAkJYXNzZXJ0RmFsc2UoUmVwb3NpdG9yeS5pc1ZhbGlkUmVmTmFtZSgieC9hXHUwMDAwIikpOwogCisJCWRiLnJlc29sdmUoIngvYUAiKTsKKwogCQlhc3NlcnRVbnBhcnNlYWJsZSgiLiIpOwogCQlhc3NlcnRVbnBhcnNlYWJsZSgieEB7MyIpOwogCQlhc3NlcnRVbnBhcnNlYWJsZSgieFtiIik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1NxdWFzaENvbW1pdE1zZ1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvU3F1YXNoQ29tbWl0TXNnVGVzdC5qYXZhCmluZGV4IDNiY2Q3ODcuLjIwM2MwMGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvU3F1YXNoQ29tbWl0TXNnVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvU3F1YXNoQ29tbWl0TXNnVGVzdC5qYXZhCkBAIC02NiwxMiArNjYsOSBAQAogCQlkYi53cml0ZVNxdWFzaENvbW1pdE1zZyhudWxsKTsKIAkJYXNzZXJ0RXF1YWxzKGRiLnJlYWRTcXVhc2hDb21taXRNc2coKSwgbnVsbCk7CiAJCWFzc2VydEZhbHNlKG5ldyBGaWxlKGRiLmdldERpcmVjdG9yeSgpLCBDb25zdGFudHMuU1FVQVNIX01TRykuZXhpc3RzKCkpOwotCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG5ldyBGaWxlKGRiLmdldERpcmVjdG9yeSgpLAotCQkJCUNvbnN0YW50cy5TUVVBU0hfTVNHKSk7Ci0JCXRyeSB7CisJCXRyeSAoRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSgKKwkJCQluZXcgRmlsZShkYi5nZXREaXJlY3RvcnkoKSwgQ29uc3RhbnRzLlNRVUFTSF9NU0cpKSkgewogCQkJZm9zLndyaXRlKHNxdWFzaE1zZy5nZXRCeXRlcyhDb25zdGFudHMuQ0hBUkFDVEVSX0VOQ09ESU5HKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlmb3MuY2xvc2UoKTsKIAkJfQogCQlhc3NlcnRFcXVhbHMoZGIucmVhZFNxdWFzaENvbW1pdE1zZygpLCBzcXVhc2hNc2cpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvVmFsaWRSZWZOYW1lVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9WYWxpZFJlZk5hbWVUZXN0LmphdmEKaW5kZXggZDQzMWE4OS4uODdlOTAxZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9WYWxpZFJlZk5hbWVUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9WYWxpZFJlZk5hbWVUZXN0LmphdmEKQEAgLTUxLDcgKzUxLDcgQEAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogcHVibGljIGNsYXNzIFZhbGlkUmVmTmFtZVRlc3QgewotCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0VmFsaWQoZmluYWwgYm9vbGVhbiBleHAsIGZpbmFsIFN0cmluZyBuYW1lKSB7CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRWYWxpZChib29sZWFuIGV4cCwgU3RyaW5nIG5hbWUpIHsKIAkJU3lzdGVtUmVhZGVyIGluc3RhbmNlID0gU3lzdGVtUmVhZGVyLmdldEluc3RhbmNlKCk7CiAJCXRyeSB7CiAJCQlzZXRVbml4U3lzdGVtUmVhZGVyKCk7CkBAIC04MSw3ICs4MSw3IEBACiAJCX0pOwogCX0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0SW52YWxpZE9uV2luZG93cyhmaW5hbCBTdHJpbmcgbmFtZSkgeworCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0SW52YWxpZE9uV2luZG93cyhTdHJpbmcgbmFtZSkgewogCQlTeXN0ZW1SZWFkZXIgaW5zdGFuY2UgPSBTeXN0ZW1SZWFkZXIuZ2V0SW5zdGFuY2UoKTsKIAkJdHJ5IHsKIAkJCXNldFVuaXhTeXN0ZW1SZWFkZXIoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9DaGVycnlQaWNrVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL0NoZXJyeVBpY2tUZXN0LmphdmEKaW5kZXggNDk0OGIzNy4uMTlmNmRjYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL0NoZXJyeVBpY2tUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL0NoZXJyeVBpY2tUZXN0LmphdmEKQEAgLTE4Myw3ICsxODMsNyBAQAogCQlhc3NlcnRGYWxzZSh0dy5uZXh0KCkpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0Q29ycmVjdElkKGZpbmFsIERpckNhY2hlIHRyZWVULCBmaW5hbCBUcmVlV2FsayB0dykgeworCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0Q29ycmVjdElkKERpckNhY2hlIHRyZWVULCBUcmVlV2FsayB0dykgewogCQlhc3NlcnRFcXVhbHModHJlZVQuZ2V0RW50cnkodHcuZ2V0UGF0aFN0cmluZygpKS5nZXRPYmplY3RJZCgpLCB0dwogCQkJCS5nZXRPYmplY3RJZCgwKSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1JlY3Vyc2l2ZU1lcmdlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9Dcmlzc0Nyb3NzTWVyZ2VUZXN0LmphdmEKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1JlY3Vyc2l2ZU1lcmdlclRlc3QuamF2YQpyZW5hbWUgdG8gb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL0NyaXNzQ3Jvc3NNZXJnZVRlc3QuamF2YQppbmRleCAxOTAyMjRhLi5hYWEwOGE5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvUmVjdXJzaXZlTWVyZ2VyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9Dcmlzc0Nyb3NzTWVyZ2VUZXN0LmphdmEKQEAgLTgzLDcgKzgzLDcgQEAKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKIEBSdW5XaXRoKFRoZW9yaWVzLmNsYXNzKQotcHVibGljIGNsYXNzIFJlY3Vyc2l2ZU1lcmdlclRlc3QgZXh0ZW5kcyBSZXBvc2l0b3J5VGVzdENhc2UgeworcHVibGljIGNsYXNzIENyaXNzQ3Jvc3NNZXJnZVRlc3QgZXh0ZW5kcyBSZXBvc2l0b3J5VGVzdENhc2UgewogCXN0YXRpYyBpbnQgY291bnRlciA9IDA7CiAKIAlARGF0YVBvaW50cwpAQCAtNzgzLDcgKzc4Myw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgc2V0SW5kZXgoZmluYWwgT2JqZWN0SWQgaWQsIFN0cmluZyBwYXRoKQorCXByaXZhdGUgdm9pZCBzZXRJbmRleChPYmplY3RJZCBpZCwgU3RyaW5nIHBhdGgpCiAJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlEaXJDYWNoZSBsb2NrZWREaXJjYWNoZTsKIAkJRGlyQ2FjaGVFZGl0b3IgZGNlZGl0OwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1Jlc29sdmVNZXJnZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvTWVyZ2VyVGVzdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIG9yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9SZXNvbHZlTWVyZ2VyVGVzdC5qYXZhCnJlbmFtZSB0byBvcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvTWVyZ2VyVGVzdC5qYXZhCmluZGV4IDkzMjJhNDcuLjU4MDkzYTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9SZXNvbHZlTWVyZ2VyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9NZXJnZXJUZXN0LmphdmEKQEAgLTQyLDcgKzQyLDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpfQkxPQjsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CkBAIC05MSwxOSArOTEsMTcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRlM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZpbGVVdGlsczsKIGltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwotaW1wb3J0IG9yZy5qdW5pdC5leHBlcmltZW50YWwudGhlb3JpZXMuRGF0YVBvaW50OworaW1wb3J0IG9yZy5qdW5pdC5leHBlcmltZW50YWwudGhlb3JpZXMuRGF0YVBvaW50czsKIGltcG9ydCBvcmcuanVuaXQuZXhwZXJpbWVudGFsLnRoZW9yaWVzLlRoZW9yaWVzOwogaW1wb3J0IG9yZy5qdW5pdC5leHBlcmltZW50YWwudGhlb3JpZXMuVGhlb3J5OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIAogQFJ1bldpdGgoVGhlb3JpZXMuY2xhc3MpCi1wdWJsaWMgY2xhc3MgUmVzb2x2ZU1lcmdlclRlc3QgZXh0ZW5kcyBSZXBvc2l0b3J5VGVzdENhc2UgeworcHVibGljIGNsYXNzIE1lcmdlclRlc3QgZXh0ZW5kcyBSZXBvc2l0b3J5VGVzdENhc2UgewogCi0JQERhdGFQb2ludAotCXB1YmxpYyBzdGF0aWMgTWVyZ2VTdHJhdGVneSByZXNvbHZlID0gTWVyZ2VTdHJhdGVneS5SRVNPTFZFOwotCi0JQERhdGFQb2ludAotCXB1YmxpYyBzdGF0aWMgTWVyZ2VTdHJhdGVneSByZWN1cnNpdmUgPSBNZXJnZVN0cmF0ZWd5LlJFQ1VSU0lWRTsKKwlARGF0YVBvaW50cworCXB1YmxpYyBzdGF0aWMgTWVyZ2VTdHJhdGVneVtdIHN0cmF0ZWdpZXNVbmRlclRlc3QgPSBuZXcgTWVyZ2VTdHJhdGVneVtdIHsKKwkJCU1lcmdlU3RyYXRlZ3kuUkVDVVJTSVZFLCBNZXJnZVN0cmF0ZWd5LlJFU09MVkUgfTsKIAogCUBUaGVvcnkKIAlwdWJsaWMgdm9pZCBmYWlsaW5nRGVsZXRlT2ZEaXJlY3RvcnlXaXRoVW50cmFja2VkQ29udGVudCgKQEAgLTc1Niw3ICs3NTQsNyBAQAogCQl9CiAJCWJpbmFyeVs1MF0gPSAnXDAnOwogCi0JCXdyaXRlVHJhc2hGaWxlKCJmaWxlIiwgbmV3IFN0cmluZyhiaW5hcnksIFVURl84KSk7CisJCXdyaXRlVHJhc2hGaWxlKCJmaWxlIiwgbmV3IFN0cmluZyhiaW5hcnksIENIQVJTRVQpKTsKIAkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmaWxlIikuY2FsbCgpOwogCQlSZXZDb21taXQgZmlyc3QgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiYWRkZWQgZmlsZSIpLmNhbGwoKTsKIApAQCAtNzY0LDcgKzc2Miw3IEBACiAJCWludCBpZHggPSBMSU5FTEVOICogMTIwMCArIDE7CiAJCWJ5dGUgc2F2ZSA9IGJpbmFyeVtpZHhdOwogCQliaW5hcnlbaWR4XSA9ICdAJzsKLQkJd3JpdGVUcmFzaEZpbGUoImZpbGUiLCBuZXcgU3RyaW5nKGJpbmFyeSwgVVRGXzgpKTsKKwkJd3JpdGVUcmFzaEZpbGUoImZpbGUiLCBuZXcgU3RyaW5nKGJpbmFyeSwgQ0hBUlNFVCkpOwogCiAJCWJpbmFyeVtpZHhdID0gc2F2ZTsKIAkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmaWxlIikuY2FsbCgpOwpAQCAtNzczLDcgKzc3MSw3IEBACiAKIAkJZ2l0LmNoZWNrb3V0KCkuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLnNldFN0YXJ0UG9pbnQoZmlyc3QpLnNldE5hbWUoInNpZGUiKS5jYWxsKCk7CiAJCWJpbmFyeVtMSU5FTEVOICogMTUwMCArIDFdID0gJyEnOwotCQl3cml0ZVRyYXNoRmlsZSgiZmlsZSIsIG5ldyBTdHJpbmcoYmluYXJ5LCBVVEZfOCkpOworCQl3cml0ZVRyYXNoRmlsZSgiZmlsZSIsIG5ldyBTdHJpbmcoYmluYXJ5LCBDSEFSU0VUKSk7CiAJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiZmlsZSIpLmNhbGwoKTsKIAkJUmV2Q29tbWl0IHNpZGVDb21taXQgPSBnaXQuY29tbWl0KCkuc2V0QWxsKHRydWUpCiAJCQkuc2V0TWVzc2FnZSgibW9kaWZpZWQgZmlsZSBsIDE1MDAiKS5jYWxsKCk7CkBAIC05MzUsNyArOTMzLDcgQEAKIAkJCW1lcmdlci5nZXRNZXJnZVJlc3VsdHMoKS5nZXQoImZpbGUiKTsKIAkJCXRyeSAoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSkgewogCQkJCWZtdC5mb3JtYXRNZXJnZShvdXQsIG1lcmdlci5nZXRNZXJnZVJlc3VsdHMoKS5nZXQoImZpbGUiKSwKLQkJCQkJCSJCQVNFIiwgIk9VUlMiLCAiVEhFSVJTIiwgVVRGXzgubmFtZSgpKTsKKwkJCQkJCSJCQVNFIiwgIk9VUlMiLCAiVEhFSVJTIiwgQ0hBUlNFVC5uYW1lKCkpOwogCQkJCVN0cmluZyBleHBlY3RlZCA9ICI8PDw8PDw8IE9VUlNcbiIKIAkJCQkJCSsgIjFtYXN0ZXJcbiIKIAkJCQkJCSsgIj09PT09PT1cbiIKQEAgLTk0Myw3ICs5NDEsNyBAQAogCQkJCQkJKyAiPj4+Pj4+PiBUSEVJUlNcbiIKIAkJCQkJCSsgIjJcbiIKIAkJCQkJCSsgIjMiOwotCQkJCWFzc2VydEVxdWFscyhleHBlY3RlZCwgbmV3IFN0cmluZyhvdXQudG9CeXRlQXJyYXkoKSwgVVRGXzgpKTsKKwkJCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIG5ldyBTdHJpbmcob3V0LnRvQnl0ZUFycmF5KCksIENIQVJTRVQpKTsKIAkJCX0KIAkJfQogCX0KQEAgLTEwMzMsMTkgKzEwMzEsMjEgQEAKIAkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZGVkIGMudHh0IikuY2FsbCgpOwogCiAJCS8vIEdldCBhIGhhbmRsZSB0byB0aGUgdGhlIGZpbGUgc28gb24gd2luZG93cyBpdCBjYW4ndCBiZSBkZWxldGVkLgotCQlGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLAotCQkJCSJiLnR4dCIpKTsKLQkJTWVyZ2VSZXN1bHQgbWVyZ2VSZXMgPSBnaXQubWVyZ2UoKS5zZXRTdHJhdGVneShzdHJhdGVneSkKLQkJCQkuaW5jbHVkZShtYXN0ZXJDb21taXQpLmNhbGwoKTsKLQkJaWYgKG1lcmdlUmVzLmdldE1lcmdlU3RhdHVzKCkuZXF1YWxzKE1lcmdlU3RhdHVzLkZBSUxFRCkpIHsKLQkJCS8vIHByb2JhYmx5IHdpbmRvd3MKLQkJCWFzc2VydEVxdWFscygxLCBtZXJnZVJlcy5nZXRGYWlsaW5nUGF0aHMoKS5zaXplKCkpOwotCQkJYXNzZXJ0RXF1YWxzKE1lcmdlRmFpbHVyZVJlYXNvbi5DT1VMRF9OT1RfREVMRVRFLCBtZXJnZVJlcwotCQkJCQkuZ2V0RmFpbGluZ1BhdGhzKCkuZ2V0KCJiLnR4dCIpKTsKKwkJdHJ5IChGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbSgKKwkJCQluZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLCAiYi50eHQiKSkpIHsKKwkJCU1lcmdlUmVzdWx0IG1lcmdlUmVzID0gZ2l0Lm1lcmdlKCkuc2V0U3RyYXRlZ3koc3RyYXRlZ3kpCisJCQkJCS5pbmNsdWRlKG1hc3RlckNvbW1pdCkuY2FsbCgpOworCQkJaWYgKG1lcmdlUmVzLmdldE1lcmdlU3RhdHVzKCkuZXF1YWxzKE1lcmdlU3RhdHVzLkZBSUxFRCkpIHsKKwkJCQkvLyBwcm9iYWJseSB3aW5kb3dzCisJCQkJYXNzZXJ0RXF1YWxzKDEsIG1lcmdlUmVzLmdldEZhaWxpbmdQYXRocygpLnNpemUoKSk7CisJCQkJYXNzZXJ0RXF1YWxzKE1lcmdlRmFpbHVyZVJlYXNvbi5DT1VMRF9OT1RfREVMRVRFLAorCQkJCQkJbWVyZ2VSZXMuZ2V0RmFpbGluZ1BhdGhzKCkuZ2V0KCJiLnR4dCIpKTsKKwkJCX0KKwkJCWFzc2VydEVxdWFscygKKwkJCQkJIlthLnR4dCwgbW9kZToxMDA2NDQsIGNvbnRlbnQ6bWFzdGVyXSIKKwkJCQkJCQkrICJbYy50eHQsIG1vZGU6MTAwNjQ0LCBjb250ZW50OnNpZGVdIiwKKwkJCQkJaW5kZXhTdGF0ZShDT05URU5UKSk7CiAJCX0KLQkJYXNzZXJ0RXF1YWxzKCJbYS50eHQsIG1vZGU6MTAwNjQ0LCBjb250ZW50Om1hc3Rlcl0iCi0JCQkJKyAiW2MudHh0LCBtb2RlOjEwMDY0NCwgY29udGVudDpzaWRlXSIsIGluZGV4U3RhdGUoQ09OVEVOVCkpOwotCQlmaXMuY2xvc2UoKTsKIAl9CiAKIAlAVGhlb3J5CkBAIC0xMzI4LDYgKzEzMjgsNiBAQAogCQlpZiAob2JqID09IG51bGwpIHsKIAkJCXJldHVybiBudWxsOwogCQl9Ci0JCXJldHVybiBuZXcgU3RyaW5nKHJ3LmdldE9iamVjdFJlYWRlcigpLm9wZW4ob2JqLCBPQkpfQkxPQikuZ2V0Qnl0ZXMoKSwgVVRGXzgpOworCQlyZXR1cm4gbmV3IFN0cmluZyhydy5nZXRPYmplY3RSZWFkZXIoKS5vcGVuKG9iaiwgT0JKX0JMT0IpLmdldEJ5dGVzKCksIENIQVJTRVQpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9TaW1wbGVNZXJnZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9TaW1wbGVNZXJnZVRlc3QuamF2YQppbmRleCA5NTE1NjhlLi5kZDJjMmU4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvU2ltcGxlTWVyZ2VUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1NpbXBsZU1lcmdlVGVzdC5qYXZhCkBAIC00MDMsNyArNDAzLDcgQEAKIAkJYXNzZXJ0RmFsc2UobWVyZ2UpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0Q29ycmVjdElkKGZpbmFsIERpckNhY2hlIHRyZWVULCBmaW5hbCBUcmVlV2FsayB0dykgeworCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0Q29ycmVjdElkKERpckNhY2hlIHRyZWVULCBUcmVlV2FsayB0dykgewogCQlhc3NlcnRFcXVhbHModHJlZVQuZ2V0RW50cnkodHcuZ2V0UGF0aFN0cmluZygpKS5nZXRPYmplY3RJZCgpLCB0dwogCQkJCS5nZXRPYmplY3RJZCgwKSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0VkaXRMaXN0VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0VkaXRMaXN0VGVzdC5qYXZhCmluZGV4IDYwMjdhZmYuLjZjMTA3ZjkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9FZGl0TGlzdFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvRWRpdExpc3RUZXN0LmphdmEKQEAgLTg5LDcgKzg5LDcgQEAKIAkJYXNzZXJ0RXF1YWxzKG5ldyBFZGl0KDIzIC0gMSwgMjUgLSAxLCAyMiAtIDEsIDI4IC0gMSksIGUuZ2V0KDIpKTsKIAl9CiAKLQlwcml2YXRlIFBhdGNoIHBhcnNlVGVzdFBhdGNoRmlsZShmaW5hbCBTdHJpbmcgcGF0Y2hGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgUGF0Y2ggcGFyc2VUZXN0UGF0Y2hGaWxlKFN0cmluZyBwYXRjaEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRyeSAoSW5wdXRTdHJlYW0gaW4gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0ocGF0Y2hGaWxlKSkgewogCQkJaWYgKGluID09IG51bGwpIHsKIAkJCQlmYWlsKCJObyAiICsgcGF0Y2hGaWxlICsgIiB0ZXN0IHZlY3RvciIpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0ZpbGVIZWFkZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvRmlsZUhlYWRlclRlc3QuamF2YQppbmRleCA3YjRlMDE0Li4yNGZiZGExIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvRmlsZUhlYWRlclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvRmlsZUhlYWRlclRlc3QuamF2YQpAQCAtNDMzLDMwICs0MzMsMzAgQEAKIAkJYXNzZXJ0VHJ1ZShPYmplY3RJZC5mcm9tU3RyaW5nKG5pZCkuc3RhcnRzV2l0aChmaC5nZXROZXdJZCgpKSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRQYXJzZShmaW5hbCBGaWxlSGVhZGVyIGZoKSB7CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRQYXJzZShGaWxlSGVhZGVyIGZoKSB7CiAJCWludCBwdHIgPSBmaC5wYXJzZUdpdEZpbGVOYW1lKDAsIGZoLmJ1Zi5sZW5ndGgpOwogCQlhc3NlcnRUcnVlKHB0ciA+IDApOwogCQlwdHIgPSBmaC5wYXJzZUdpdEhlYWRlcnMocHRyLCBmaC5idWYubGVuZ3RoKTsKIAkJYXNzZXJ0VHJ1ZShwdHIgPiAwKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBGaWxlSGVhZGVyIGRhdGEoZmluYWwgU3RyaW5nIGluKSB7CisJcHJpdmF0ZSBzdGF0aWMgRmlsZUhlYWRlciBkYXRhKFN0cmluZyBpbikgewogCQlyZXR1cm4gbmV3IEZpbGVIZWFkZXIoQ29uc3RhbnRzLmVuY29kZUFTQ0lJKGluKSwgMCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZUhlYWRlciBoZWFkZXIoZmluYWwgU3RyaW5nIHBhdGgpIHsKKwlwcml2YXRlIHN0YXRpYyBGaWxlSGVhZGVyIGhlYWRlcihTdHJpbmcgcGF0aCkgewogCQlyZXR1cm4gZGF0YShnaXRMaW5lKHBhdGgpICsgIi0tLSAiICsgcGF0aCArICJcbiIpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnaXRMaW5lKGZpbmFsIFN0cmluZyBwYXRoKSB7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdpdExpbmUoU3RyaW5nIHBhdGgpIHsKIAkJcmV0dXJuICJhLyIgKyBwYXRoICsgIiBiLyIgKyBwYXRoICsgIlxuIjsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBGaWxlSGVhZGVyIGRxSGVhZGVyKGZpbmFsIFN0cmluZyBwYXRoKSB7CisJcHJpdmF0ZSBzdGF0aWMgRmlsZUhlYWRlciBkcUhlYWRlcihTdHJpbmcgcGF0aCkgewogCQlyZXR1cm4gZGF0YShkcUdpdExpbmUocGF0aCkgKyAiLS0tICIgKyBwYXRoICsgIlxuIik7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRxR2l0TGluZShmaW5hbCBTdHJpbmcgcGF0aCkgeworCXByaXZhdGUgc3RhdGljIFN0cmluZyBkcUdpdExpbmUoU3RyaW5nIHBhdGgpIHsKIAkJcmV0dXJuICJcImEvIiArIHBhdGggKyAiXCIgXCJiLyIgKyBwYXRoICsgIlwiXG4iOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9HZXRUZXh0VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0dldFRleHRUZXN0LmphdmEKaW5kZXggNjUzNzVjNy4uN2I1ODY4YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0dldFRleHRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0dldFRleHRUZXN0LmphdmEKQEAgLTQ0LDcgKzQ0LDcgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5wYXRjaDsKIAogaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuSVNPXzg4NTlfMTsKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwpAQCAtODMsNyArODMsNyBAQAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdEdldFRleHRfQ29udmVydCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIENoYXJzZXQgY3NPbGQgPSBJU09fODg1OV8xOwotCQlmaW5hbCBDaGFyc2V0IGNzTmV3ID0gVVRGXzg7CisJCWZpbmFsIENoYXJzZXQgY3NOZXcgPSBDSEFSU0VUOwogCQlmaW5hbCBQYXRjaCBwID0gcGFyc2VUZXN0UGF0Y2hGaWxlKCk7CiAJCWFzc2VydFRydWUocC5nZXRFcnJvcnMoKS5pc0VtcHR5KCkpOwogCQlhc3NlcnRFcXVhbHMoMSwgcC5nZXRGaWxlcygpLnNpemUoKSk7CkBAIC0xMDMsNyArMTAzLDcgQEAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RHZXRUZXh0X0RpZmZDYygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIENoYXJzZXQgY3NPbGQgPSBJU09fODg1OV8xOwotCQlmaW5hbCBDaGFyc2V0IGNzTmV3ID0gVVRGXzg7CisJCWZpbmFsIENoYXJzZXQgY3NOZXcgPSBDSEFSU0VUOwogCQlmaW5hbCBQYXRjaCBwID0gcGFyc2VUZXN0UGF0Y2hGaWxlKCk7CiAJCWFzc2VydFRydWUocC5nZXRFcnJvcnMoKS5pc0VtcHR5KCkpOwogCQlhc3NlcnRFcXVhbHMoMSwgcC5nZXRGaWxlcygpLnNpemUoKSk7CkBAIC0xMzQsNyArMTM0LDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgU3RyaW5nIHJlYWRUZXN0UGF0Y2hGaWxlKGZpbmFsIENoYXJzZXQgY3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSBTdHJpbmcgcmVhZFRlc3RQYXRjaEZpbGUoQ2hhcnNldCBjcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nIHBhdGNoRmlsZSA9IEpHaXRUZXN0VXRpbC5nZXROYW1lKCkgKyAiLnBhdGNoIjsKIAkJdHJ5IChJbnB1dFN0cmVhbSBpbiA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShwYXRjaEZpbGUpKSB7CiAJCQlpZiAoaW4gPT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL1BhdGNoQ2NFcnJvclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9QYXRjaENjRXJyb3JUZXN0LmphdmEKaW5kZXggZTRiNDMxNy4uNjk4OTM0MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL1BhdGNoQ2NFcnJvclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvUGF0Y2hDY0Vycm9yVGVzdC5qYXZhCkBAIC05NiwxNyArOTYsMTQgQEAKIAogCXByaXZhdGUgUGF0Y2ggcGFyc2VUZXN0UGF0Y2hGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nIHBhdGNoRmlsZSA9IEpHaXRUZXN0VXRpbC5nZXROYW1lKCkgKyAiLnBhdGNoIjsKLQkJZmluYWwgSW5wdXRTdHJlYW0gaW4gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0ocGF0Y2hGaWxlKTsKLQkJaWYgKGluID09IG51bGwpIHsKLQkJCWZhaWwoIk5vICIgKyBwYXRjaEZpbGUgKyAiIHRlc3QgdmVjdG9yIik7Ci0JCQlyZXR1cm4gbnVsbDsgLy8gTmV2ZXIgaGFwcGVucwotCQl9Ci0JCXRyeSB7CisJCXRyeSAoSW5wdXRTdHJlYW0gaW4gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0ocGF0Y2hGaWxlKSkgeworCQkJaWYgKGluID09IG51bGwpIHsKKwkJCQlmYWlsKCJObyAiICsgcGF0Y2hGaWxlICsgIiB0ZXN0IHZlY3RvciIpOworCQkJCXJldHVybiBudWxsOyAvLyBOZXZlciBoYXBwZW5zCisJCQl9CiAJCQlmaW5hbCBQYXRjaCBwID0gbmV3IFBhdGNoKCk7CiAJCQlwLnBhcnNlKGluKTsKIAkJCXJldHVybiBwOwotCQl9IGZpbmFsbHkgewotCQkJaW4uY2xvc2UoKTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL1BhdGNoQ2NUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvUGF0Y2hDY1Rlc3QuamF2YQppbmRleCA4Mzc0MTRiLi40YTI2ZDUwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvUGF0Y2hDY1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvUGF0Y2hDY1Rlc3QuamF2YQpAQCAtMTk5LDE3ICsxOTksMTQgQEAKIAogCXByaXZhdGUgUGF0Y2ggcGFyc2VUZXN0UGF0Y2hGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nIHBhdGNoRmlsZSA9IEpHaXRUZXN0VXRpbC5nZXROYW1lKCkgKyAiLnBhdGNoIjsKLQkJZmluYWwgSW5wdXRTdHJlYW0gaW4gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0ocGF0Y2hGaWxlKTsKLQkJaWYgKGluID09IG51bGwpIHsKLQkJCWZhaWwoIk5vICIgKyBwYXRjaEZpbGUgKyAiIHRlc3QgdmVjdG9yIik7Ci0JCQlyZXR1cm4gbnVsbDsgLy8gTmV2ZXIgaGFwcGVucwotCQl9Ci0JCXRyeSB7CisJCXRyeSAoSW5wdXRTdHJlYW0gaW4gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0ocGF0Y2hGaWxlKSkgeworCQkJaWYgKGluID09IG51bGwpIHsKKwkJCQlmYWlsKCJObyAiICsgcGF0Y2hGaWxlICsgIiB0ZXN0IHZlY3RvciIpOworCQkJCXJldHVybiBudWxsOyAvLyBOZXZlciBoYXBwZW5zCisJCQl9CiAJCQlmaW5hbCBQYXRjaCBwID0gbmV3IFBhdGNoKCk7CiAJCQlwLnBhcnNlKGluKTsKIAkJCXJldHVybiBwOwotCQl9IGZpbmFsbHkgewotCQkJaW4uY2xvc2UoKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9QYXRjaEVycm9yVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL1BhdGNoRXJyb3JUZXN0LmphdmEKaW5kZXggNTJlMzg3NC4uM2JkZjg1MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL1BhdGNoRXJyb3JUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL1BhdGNoRXJyb3JUZXN0LmphdmEKQEAgLTE3NywxNyArMTc3LDE0IEBACiAKIAlwcml2YXRlIFBhdGNoIHBhcnNlVGVzdFBhdGNoRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZyBwYXRjaEZpbGUgPSBKR2l0VGVzdFV0aWwuZ2V0TmFtZSgpICsgIi5wYXRjaCI7Ci0JCWZpbmFsIElucHV0U3RyZWFtIGluID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGNoRmlsZSk7Ci0JCWlmIChpbiA9PSBudWxsKSB7Ci0JCQlmYWlsKCJObyAiICsgcGF0Y2hGaWxlICsgIiB0ZXN0IHZlY3RvciIpOwotCQkJcmV0dXJuIG51bGw7IC8vIE5ldmVyIGhhcHBlbnMKLQkJfQotCQl0cnkgeworCQl0cnkgKElucHV0U3RyZWFtIGluID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGNoRmlsZSkpIHsKKwkJCWlmIChpbiA9PSBudWxsKSB7CisJCQkJZmFpbCgiTm8gIiArIHBhdGNoRmlsZSArICIgdGVzdCB2ZWN0b3IiKTsKKwkJCQlyZXR1cm4gbnVsbDsgLy8gTmV2ZXIgaGFwcGVucworCQkJfQogCQkJZmluYWwgUGF0Y2ggcCA9IG5ldyBQYXRjaCgpOwogCQkJcC5wYXJzZShpbik7CiAJCQlyZXR1cm4gcDsKLQkJfSBmaW5hbGx5IHsKLQkJCWluLmNsb3NlKCk7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvUGF0Y2hUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvUGF0Y2hUZXN0LmphdmEKaW5kZXggOWY1N2FiOS4uNmEwOWE0OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL1BhdGNoVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9QYXRjaFRlc3QuamF2YQpAQCAtMzU3LDE3ICszNTcsMTQgQEAKIAogCXByaXZhdGUgUGF0Y2ggcGFyc2VUZXN0UGF0Y2hGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nIHBhdGNoRmlsZSA9IEpHaXRUZXN0VXRpbC5nZXROYW1lKCkgKyAiLnBhdGNoIjsKLQkJZmluYWwgSW5wdXRTdHJlYW0gaW4gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0ocGF0Y2hGaWxlKTsKLQkJaWYgKGluID09IG51bGwpIHsKLQkJCWZhaWwoIk5vICIgKyBwYXRjaEZpbGUgKyAiIHRlc3QgdmVjdG9yIik7Ci0JCQlyZXR1cm4gbnVsbDsgLy8gTmV2ZXIgaGFwcGVucwotCQl9Ci0JCXRyeSB7CisJCXRyeSAoSW5wdXRTdHJlYW0gaW4gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0ocGF0Y2hGaWxlKSkgeworCQkJaWYgKGluID09IG51bGwpIHsKKwkJCQlmYWlsKCJObyAiICsgcGF0Y2hGaWxlICsgIiB0ZXN0IHZlY3RvciIpOworCQkJCXJldHVybiBudWxsOyAvLyBOZXZlciBoYXBwZW5zCisJCQl9CiAJCQlmaW5hbCBQYXRjaCBwID0gbmV3IFBhdGNoKCk7CiAJCQlwLnBhcnNlKGluKTsKIAkJCXJldHVybiBwOwotCQl9IGZpbmFsbHkgewotCQkJaW4uY2xvc2UoKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0Zvb3RlckxpbmVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9Gb290ZXJMaW5lVGVzdC5qYXZhCmluZGV4IDg3Yzg1NDcuLmFkODMyN2YgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0Zvb3RlckxpbmVUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRm9vdGVyTGluZVRlc3QuamF2YQpAQCAtMzUzLDcgKzM1Myw3IEBACiAJCWFzc2VydEZhbHNlKCJub3QgQ0MiLCBsaW5lLm1hdGNoZXMoRm9vdGVyS2V5LkNDKSk7CiAJfQogCi0JcHJpdmF0ZSBSZXZDb21taXQgcGFyc2UoZmluYWwgU3RyaW5nIG1zZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIFJldkNvbW1pdCBwYXJzZShTdHJpbmcgbXNnKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAJCWJ1Zi5hcHBlbmQoInRyZWUgIiArIE9iamVjdElkLnplcm9JZCgpLm5hbWUoKSArICJcbiIpOwogCQlidWYuYXBwZW5kKCJhdXRob3IgQS4gVS4gVGhvciA8YUBleGFtcGxlLmNvbT4gMSArMDAwMFxuIik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZDb21taXRQYXJzZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldkNvbW1pdFBhcnNlVGVzdC5qYXZhCmluZGV4IDg4ZjI0MGIuLmNmZWZhYzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldkNvbW1pdFBhcnNlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldkNvbW1pdFBhcnNlVGVzdC5qYXZhCkBAIC00NCw3ICs0NCw3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQucmV2d2FsazsKIAogaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuSVNPXzg4NTlfMTsKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwpAQCAtMTE0LDcgKzExNCw3IEBACiAJCWFzc2VydE51bGwoYy5nZXRUcmVlKCkpOwogCQlhc3NlcnROdWxsKGMucGFyZW50cyk7CiAKLQkJYy5wYXJzZUNhbm9uaWNhbChydywgYm9keS50b1N0cmluZygpLmdldEJ5dGVzKFVURl84KSk7CisJCWMucGFyc2VDYW5vbmljYWwocncsIGJvZHkudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWFzc2VydE5vdE51bGwoYy5nZXRUcmVlKCkpOwogCQlhc3NlcnRFcXVhbHModHJlZUlkLCBjLmdldFRyZWUoKS5nZXRJZCgpKTsKIAkJYXNzZXJ0U2FtZShydy5sb29rdXBUcmVlKHRyZWVJZCksIGMuZ2V0VHJlZSgpKTsKQEAgLTEzOCw3ICsxMzgsNyBAQAogCQlhc3NlcnRFcXVhbHMoVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCIgKyBjb21taXR0ZXJUaW1lWm9uZSksIGNDb21taXR0ZXIuZ2V0VGltZVpvbmUoKSk7CiAJfQogCi0JcHJpdmF0ZSBSZXZDb21taXQgY3JlYXRlKGZpbmFsIFN0cmluZyBtc2cpIHRocm93cyBFeGNlcHRpb24geworCXByaXZhdGUgUmV2Q29tbWl0IGNyZWF0ZShTdHJpbmcgbXNnKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJYi5hcHBlbmQoInRyZWUgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIik7CiAJCWIuYXBwZW5kKCJhdXRob3IgQSBVLiBUaG9yIDxhX3VfdGhvckBleGFtcGxlLmNvbT4gMTIxODEyMzM4NyArMDcwMFxuIik7CkBAIC0xNDgsNyArMTQ4LDcgQEAKIAogCQlmaW5hbCBSZXZDb21taXQgYzsKIAkJYyA9IG5ldyBSZXZDb21taXQoaWQoIjk0NzMwOTVjNGNiMmYxMmFlZmUxZGI4YTM1NWZlM2ZhZmJhNDJmNjciKSk7Ci0JCWMucGFyc2VDYW5vbmljYWwobmV3IFJldldhbGsoZGIpLCBiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYy5wYXJzZUNhbm9uaWNhbChuZXcgUmV2V2FsayhkYiksIGIudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCXJldHVybiBjOwogCX0KIApAQCAtMTYxLDcgKzE2MSw3IEBACiAKIAkJZmluYWwgUmV2Q29tbWl0IGM7CiAJCWMgPSBuZXcgUmV2Q29tbWl0KGlkKCI5NDczMDk1YzRjYjJmMTJhZWZlMWRiOGEzNTVmZTNmYWZiYTQyZjY3IikpOwotCQljLnBhcnNlQ2Fub25pY2FsKG5ldyBSZXZXYWxrKGRiKSwgYi50b1N0cmluZygpLmdldEJ5dGVzKFVURl84KSk7CisJCWMucGFyc2VDYW5vbmljYWwobmV3IFJldldhbGsoZGIpLCBiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCiAJCWFzc2VydEVxdWFscygiIiwgYy5nZXRGdWxsTWVzc2FnZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCIiLCBjLmdldFNob3J0TWVzc2FnZSgpKTsKQEAgLTE3Niw3ICsxNzYsNyBAQAogCiAJCWZpbmFsIFJldkNvbW1pdCBjOwogCQljID0gbmV3IFJldkNvbW1pdChpZCgiOTQ3MzA5NWM0Y2IyZjEyYWVmZTFkYjhhMzU1ZmUzZmFmYmE0MmY2NyIpKTsKLQkJYy5wYXJzZUNhbm9uaWNhbChuZXcgUmV2V2FsayhkYiksIGIudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpOworCQljLnBhcnNlQ2Fub25pY2FsKG5ldyBSZXZXYWxrKGRiKSwgYi50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpKTsKIAogCQlhc3NlcnRFcXVhbHMobmV3IFBlcnNvbklkZW50KCIiLCAiYV91X3Rob3JAZXhhbXBsZS5jb20iLCAxMjE4MTIzMzg3MDAwbCwgNyksIGMuZ2V0QXV0aG9ySWRlbnQoKSk7CiAJCWFzc2VydEVxdWFscyhuZXcgUGVyc29uSWRlbnQoIiIsICIiLCAxMjE4MTIzMzkwMDAwbCwgLTUpLCBjLmdldENvbW1pdHRlcklkZW50KCkpOwpAQCAtMTg1LDEzICsxODUsMTMgQEAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RQYXJzZV9pbXBsaWNpdF9VVEY4X2VuY29kZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCWIud3JpdGUoInRyZWUgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJhdXRob3IgRlx1MDBmNnIgZmF0dGFyZSA8YV91X3Rob3JAZXhhbXBsZS5jb20+IDEyMTgxMjMzODcgKzA3MDBcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiY29tbWl0dGVyIEMgTy4gTWl0ZXIgPGNAZXhhbXBsZS5jb20+IDEyMTgxMjMzOTAgLTA1MDBcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlNtXHUwMGY2cmdcdTAwZTVzYm9yZFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXHUzMDRkXHUzMDhjXHUzMDQ0XG4iLmdldEJ5dGVzKFVURl84KSk7CisJCWIud3JpdGUoInRyZWUgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoImF1dGhvciBGXHUwMGY2ciBmYXR0YXJlIDxhX3VfdGhvckBleGFtcGxlLmNvbT4gMTIxODEyMzM4NyArMDcwMFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoImNvbW1pdHRlciBDIE8uIE1pdGVyIDxjQGV4YW1wbGUuY29tPiAxMjE4MTIzMzkwIC0wNTAwXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiU21cdTAwZjZyZ1x1MDBlNXNib3JkXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXHUzMDRkXHUzMDhjXHUzMDQ0XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJZmluYWwgUmV2Q29tbWl0IGM7CiAJCWMgPSBuZXcgUmV2Q29tbWl0KGlkKCI5NDczMDk1YzRjYjJmMTJhZWZlMWRiOGEzNTVmZTNmYWZiYTQyZjY3IikpOyAvLyBib2d1cyBpZAogCQljLnBhcnNlQ2Fub25pY2FsKG5ldyBSZXZXYWxrKGRiKSwgYi50b0J5dGVBcnJheSgpKTsKQEAgLTIwNSwxMyArMjA1LDEzIEBACiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VfaW1wbGljaXRfbWl4ZWRfZW5jb2RlZCgpIHRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJYi53cml0ZSgidHJlZSA5Nzg4NjY5YWQ5MThiNmZjY2U2NGFmODg4MmZjOWE4MWNiNmFiYTY3XG4iLmdldEJ5dGVzKFVURl84KSk7CisJCWIud3JpdGUoInRyZWUgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWIud3JpdGUoImF1dGhvciBGXHUwMGY2ciBmYXR0YXJlIDxhX3VfdGhvckBleGFtcGxlLmNvbT4gMTIxODEyMzM4NyArMDcwMFxuIi5nZXRCeXRlcyhJU09fODg1OV8xKSk7Ci0JCWIud3JpdGUoImNvbW1pdHRlciBDIE8uIE1pdGVyIDxjQGV4YW1wbGUuY29tPiAxMjE4MTIzMzkwIC0wNTAwXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJTbVx1MDBmNnJnXHUwMGU1c2JvcmRcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlx1MzA0ZFx1MzA4Y1x1MzA0NFxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQliLndyaXRlKCJjb21taXR0ZXIgQyBPLiBNaXRlciA8Y0BleGFtcGxlLmNvbT4gMTIxODEyMzM5MCAtMDUwMFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlNtXHUwMGY2cmdcdTAwZTVzYm9yZFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlx1MzA0ZFx1MzA4Y1x1MzA0NFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWZpbmFsIFJldkNvbW1pdCBjOwogCQljID0gbmV3IFJldkNvbW1pdChpZCgiOTQ3MzA5NWM0Y2IyZjEyYWVmZTFkYjhhMzU1ZmUzZmFmYmE0MmY2NyIpKTsgLy8gYm9ndXMgaWQKIAkJYy5wYXJzZUNhbm9uaWNhbChuZXcgUmV2V2FsayhkYiksIGIudG9CeXRlQXJyYXkoKSk7CkBAIC0yNjAsMTQgKzI2MCwxNCBAQAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFBhcnNlX2V4cGxpY2l0X2JhZF9lbmNvZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQliLndyaXRlKCJ0cmVlIDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYi53cml0ZSgidHJlZSA5Nzg4NjY5YWQ5MThiNmZjY2U2NGFmODg4MmZjOWE4MWNiNmFiYTY3XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJYi53cml0ZSgiYXV0aG9yIEZcdTAwZjZyIGZhdHRhcmUgPGFfdV90aG9yQGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iLmdldEJ5dGVzKElTT184ODU5XzEpKTsKLQkJYi53cml0ZSgiY29tbWl0dGVyIEMgTy4gTWl0ZXIgPGNAZXhhbXBsZS5jb20+IDEyMTgxMjMzOTAgLTA1MDBcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiZW5jb2RpbmcgRVVDLUpQXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcdTMwNGRcdTMwOGNcdTMwNDRcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIkhpXG4iLmdldEJ5dGVzKFVURl84KSk7CisJCWIud3JpdGUoImNvbW1pdHRlciBDIE8uIE1pdGVyIDxjQGV4YW1wbGUuY29tPiAxMjE4MTIzMzkwIC0wNTAwXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiZW5jb2RpbmcgRVVDLUpQXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXHUzMDRkXHUzMDhjXHUzMDQ0XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiSGlcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlmaW5hbCBSZXZDb21taXQgYzsKIAkJYyA9IG5ldyBSZXZDb21taXQoaWQoIjk0NzMwOTVjNGNiMmYxMmFlZmUxZGI4YTM1NWZlM2ZhZmJhNDJmNjciKSk7IC8vIGJvZ3VzIGlkCiAJCWMucGFyc2VDYW5vbmljYWwobmV3IFJldldhbGsoZGIpLCBiLnRvQnl0ZUFycmF5KCkpOwpAQCAtMjkxLDE0ICsyOTEsMTQgQEAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RQYXJzZV9leHBsaWNpdF9iYWRfZW5jb2RlZDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCWIud3JpdGUoInRyZWUgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJhdXRob3IgRlx1MDBmNnIgZmF0dGFyZSA8YV91X3Rob3JAZXhhbXBsZS5jb20+IDEyMTgxMjMzODcgKzA3MDBcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiY29tbWl0dGVyIEMgTy4gTWl0ZXIgPGNAZXhhbXBsZS5jb20+IDEyMTgxMjMzOTAgLTA1MDBcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiZW5jb2RpbmcgSVNPLTg4NTktMVxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXHUzMDRkXHUzMDhjXHUzMDQ0XG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJIaVxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQliLndyaXRlKCJ0cmVlIDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJhdXRob3IgRlx1MDBmNnIgZmF0dGFyZSA8YV91X3Rob3JAZXhhbXBsZS5jb20+IDEyMTgxMjMzODcgKzA3MDBcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJjb21taXR0ZXIgQyBPLiBNaXRlciA8Y0BleGFtcGxlLmNvbT4gMTIxODEyMzM5MCAtMDUwMFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoImVuY29kaW5nIElTTy04ODU5LTFcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcdTMwNGRcdTMwOGNcdTMwNDRcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJIaVxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWZpbmFsIFJldkNvbW1pdCBjOwogCQljID0gbmV3IFJldkNvbW1pdChpZCgiOTQ3MzA5NWM0Y2IyZjEyYWVmZTFkYjhhMzU1ZmUzZmFmYmE0MmY2NyIpKTsgLy8gYm9ndXMgaWQKIAkJYy5wYXJzZUNhbm9uaWNhbChuZXcgUmV2V2FsayhkYiksIGIudG9CeXRlQXJyYXkoKSk7CkBAIC0zMTMsMTMgKzMxMywxMyBAQAogCXB1YmxpYyB2b2lkIHRlc3RQYXJzZV9pbmNvcnJlY3RVdGY4TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewogCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKIAkJYi53cml0ZSgidHJlZSA5Nzg4NjY5YWQ5MThiNmZjY2U2NGFmODg4MmZjOWE4MWNiNmFiYTY3XG4iCi0JCQkJLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoImF1dGhvciBhdSA8YUBleGFtcGxlLmNvbT4gMTIxODEyMzM4NyArMDcwMFxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQkJCS5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoImF1dGhvciBhdSA8YUBleGFtcGxlLmNvbT4gMTIxODEyMzM4NyArMDcwMFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWIud3JpdGUoImNvbW1pdHRlciBjbyA8Y0BleGFtcGxlLmNvbT4gMTIxODEyMzM5MCAtMDUwMFxuIgotCQkJCS5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJlbmNvZGluZyAndXRmOCdcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlNtXHUwMGY2cmdcdTAwZTVzYm9yZFxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQkJCS5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoImVuY29kaW5nICd1dGY4J1xuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlNtXHUwMGY2cmdcdTAwZTVzYm9yZFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAKIAkJUmV2Q29tbWl0IGMgPSBuZXcgUmV2Q29tbWl0KAogCQkJCWlkKCI5NDczMDk1YzRjYjJmMTJhZWZlMWRiOGEzNTVmZTNmYWZiYTQyZjY3IikpOwpAQCAtMzM4LDEyICszMzgsMTIgQEAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RQYXJzZV9pbGxlZ2FsRW5jb2RpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCWIud3JpdGUoInRyZWUgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJhdXRob3IgYXUgPGFAZXhhbXBsZS5jb20+IDEyMTgxMjMzODcgKzA3MDBcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiY29tbWl0dGVyIGNvIDxjQGV4YW1wbGUuY29tPiAxMjE4MTIzMzkwIC0wNTAwXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoImVuY29kaW5nIHV0Zi04bG9nb3V0cHV0ZW5jb2Rpbmc9Z2JrXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJtZXNzYWdlXG4iLmdldEJ5dGVzKFVURl84KSk7CisJCWIud3JpdGUoInRyZWUgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoImF1dGhvciBhdSA8YUBleGFtcGxlLmNvbT4gMTIxODEyMzM4NyArMDcwMFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoImNvbW1pdHRlciBjbyA8Y0BleGFtcGxlLmNvbT4gMTIxODEyMzM5MCAtMDUwMFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoImVuY29kaW5nIHV0Zi04bG9nb3V0cHV0ZW5jb2Rpbmc9Z2JrXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgibWVzc2FnZVxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAKIAkJUmV2Q29tbWl0IGMgPSBuZXcgUmV2Q29tbWl0KAogCQkJCWlkKCI5NDczMDk1YzRjYjJmMTJhZWZlMWRiOGEzNTVmZTNmYWZiYTQyZjY3IikpOwpAQCAtMzY1LDEyICszNjUsMTIgQEAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RQYXJzZV91bnN1cHBvcnRlZEVuY29kaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBiID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQliLndyaXRlKCJ0cmVlIDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiYXV0aG9yIGF1IDxhQGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoImNvbW1pdHRlciBjbyA8Y0BleGFtcGxlLmNvbT4gMTIxODEyMzM5MCAtMDUwMFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJlbmNvZGluZyBpdF9JVC5VVEY4XG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJtZXNzYWdlXG4iLmdldEJ5dGVzKFVURl84KSk7CisJCWIud3JpdGUoInRyZWUgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoImF1dGhvciBhdSA8YUBleGFtcGxlLmNvbT4gMTIxODEyMzM4NyArMDcwMFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoImNvbW1pdHRlciBjbyA8Y0BleGFtcGxlLmNvbT4gMTIxODEyMzM5MCAtMDUwMFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoImVuY29kaW5nIGl0X0lULlVURjhcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJtZXNzYWdlXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKIAogCQlSZXZDb21taXQgYyA9IG5ldyBSZXZDb21taXQoCiAJCQkJaWQoIjk0NzMwOTVjNGNiMmYxMmFlZmUxZGI4YTM1NWZlM2ZhZmJhNDJmNjciKSk7CkBAIC00ODMsNyArNDgzLDcgQEAKIAkJYXNzZXJ0RXF1YWxzKHNob3J0TXNnLCBjLmdldFNob3J0TWVzc2FnZSgpKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBPYmplY3RJZCBpZChmaW5hbCBTdHJpbmcgc3RyKSB7CisJcHJpdmF0ZSBzdGF0aWMgT2JqZWN0SWQgaWQoU3RyaW5nIHN0cikgewogCQlyZXR1cm4gT2JqZWN0SWQuZnJvbVN0cmluZyhzdHIpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1Jldk9iamVjdFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1Jldk9iamVjdFRlc3QuamF2YQppbmRleCAxMjJhMzk3Li44ZTM4OWFlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZPYmplY3RUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2T2JqZWN0VGVzdC5qYXZhCkBAIC03Niw3ICs3Niw3IEBACiAKIAkJZmluYWwgUmV2Q29tbWl0IGEyOwogCQlmaW5hbCBSZXZDb21taXQgYjI7Ci0JCXRyeSAoZmluYWwgUmV2V2FsayBydzIgPSBuZXcgUmV2V2FsayhkYikpIHsKKwkJdHJ5IChSZXZXYWxrIHJ3MiA9IG5ldyBSZXZXYWxrKGRiKSkgewogCQkJYTIgPSBydzIucGFyc2VDb21taXQoYTEpOwogCQkJYjIgPSBydzIucGFyc2VDb21taXQoYjEpOwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZUYWdQYXJzZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldlRhZ1BhcnNlVGVzdC5qYXZhCmluZGV4IDM4YmQzNzEuLmUxMWNlZjcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldlRhZ1BhcnNlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldlRhZ1BhcnNlVGVzdC5qYXZhCkBAIC00NCw3ICs0NCw3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQucmV2d2FsazsKIAogaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuSVNPXzg4NTlfMTsKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwpAQCAtODIsNyArODIsNyBAQAogCQl0ZXN0T25lVHlwZShDb25zdGFudHMuT0JKX1RBRyk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHRlc3RPbmVUeXBlKGZpbmFsIGludCB0eXBlQ29kZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIHRlc3RPbmVUeXBlKGludCB0eXBlQ29kZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIE9iamVjdElkIGlkID0gaWQoIjk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjciKTsKIAkJZmluYWwgU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJYi5hcHBlbmQoIm9iamVjdCAiICsgaWQubmFtZSgpICsgIlxuIik7CkBAIC05OCw3ICs5OCw3IEBACiAJCWFzc2VydE51bGwoYy5nZXRPYmplY3QoKSk7CiAJCWFzc2VydE51bGwoYy5nZXRUYWdOYW1lKCkpOwogCi0JCWMucGFyc2VDYW5vbmljYWwocncsIGIudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpOworCQljLnBhcnNlQ2Fub25pY2FsKHJ3LCBiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlhc3NlcnROb3ROdWxsKGMuZ2V0T2JqZWN0KCkpOwogCQlhc3NlcnRFcXVhbHMoaWQsIGMuZ2V0T2JqZWN0KCkuZ2V0SWQoKSk7CiAJCWFzc2VydFNhbWUocncubG9va3VwQW55KGlkLCB0eXBlQ29kZSksIGMuZ2V0T2JqZWN0KCkpOwpAQCAtMTQxLDcgKzE0MSw3IEBACiAJCWFzc2VydE51bGwoYy5nZXRPYmplY3QoKSk7CiAJCWFzc2VydE51bGwoYy5nZXRUYWdOYW1lKCkpOwogCi0JCWMucGFyc2VDYW5vbmljYWwocncsIGJvZHkudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpOworCQljLnBhcnNlQ2Fub25pY2FsKHJ3LCBib2R5LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlhc3NlcnROb3ROdWxsKGMuZ2V0T2JqZWN0KCkpOwogCQlhc3NlcnRFcXVhbHModHJlZUlkLCBjLmdldE9iamVjdCgpLmdldElkKCkpOwogCQlhc3NlcnRTYW1lKHJ3Lmxvb2t1cFRyZWUodHJlZUlkKSwgYy5nZXRPYmplY3QoKSk7CkBAIC0xODksNyArMTg5LDcgQEAKIAkJYXNzZXJ0TnVsbChjLmdldE9iamVjdCgpKTsKIAkJYXNzZXJ0TnVsbChjLmdldFRhZ05hbWUoKSk7CiAKLQkJYy5wYXJzZUNhbm9uaWNhbChydywgYm9keS50b1N0cmluZygpLmdldEJ5dGVzKFVURl84KSk7CisJCWMucGFyc2VDYW5vbmljYWwocncsIGJvZHkudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWFzc2VydE5vdE51bGwoYy5nZXRPYmplY3QoKSk7CiAJCWFzc2VydEVxdWFscyh0cmVlSWQsIGMuZ2V0T2JqZWN0KCkuZ2V0SWQoKSk7CiAJCWFzc2VydFNhbWUocncubG9va3VwVHJlZSh0cmVlSWQpLCBjLmdldE9iamVjdCgpKTsKQEAgLTIwMiw3ICsyMDIsNyBAQAogCQlhc3NlcnROdWxsKGMuZ2V0VGFnZ2VySWRlbnQoKSk7CiAJfQogCi0JcHJpdmF0ZSBSZXZUYWcgY3JlYXRlKGZpbmFsIFN0cmluZyBtc2cpIHRocm93cyBFeGNlcHRpb24geworCXByaXZhdGUgUmV2VGFnIGNyZWF0ZShTdHJpbmcgbXNnKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJYi5hcHBlbmQoIm9iamVjdCA5Nzg4NjY5YWQ5MThiNmZjY2U2NGFmODg4MmZjOWE4MWNiNmFiYTY3XG4iKTsKIAkJYi5hcHBlbmQoInR5cGUgdHJlZVxuIik7CkBAIC0yMTMsNyArMjEzLDcgQEAKIAogCQlmaW5hbCBSZXZUYWcgYzsKIAkJYyA9IG5ldyBSZXZUYWcoaWQoIjk0NzMwOTVjNGNiMmYxMmFlZmUxZGI4YTM1NWZlM2ZhZmJhNDJmNjciKSk7Ci0JCWMucGFyc2VDYW5vbmljYWwobmV3IFJldldhbGsoZGIpLCBiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYy5wYXJzZUNhbm9uaWNhbChuZXcgUmV2V2FsayhkYiksIGIudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCXJldHVybiBjOwogCX0KIApAQCAtMjIxLDE3ICsyMjEsMTcgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VfaW1wbGljaXRfVVRGOF9lbmNvZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogCQliLndyaXRlKCJvYmplY3QgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIgotCQkJCS5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJ0eXBlIHRyZWVcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgidGFnIHYxLjIuMy40LjVcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCQkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJ0eXBlIHRyZWVcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJ0YWcgdjEuMi4zLjQuNVxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAKIAkJYgogCQkJCS53cml0ZSgidGFnZ2VyIEZcdTAwZjZyIGZhdHRhcmUgPGFfdV90aG9yQGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iCi0JCQkJCQkuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlNtXHUwMGY2cmdcdTAwZTVzYm9yZFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXHUzMDRkXHUzMDhjXHUzMDQ0XG4iLmdldEJ5dGVzKFVURl84KSk7CisJCQkJCQkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJTbVx1MDBmNnJnXHUwMGU1c2JvcmRcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcdTMwNGRcdTMwOGNcdTMwNDRcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlmaW5hbCBSZXZUYWcgYzsKIAkJYyA9IG5ldyBSZXZUYWcoaWQoIjk0NzMwOTVjNGNiMmYxMmFlZmUxZGI4YTM1NWZlM2ZhZmJhNDJmNjciKSk7CiAJCWMucGFyc2VDYW5vbmljYWwobmV3IFJldldhbGsoZGIpLCBiLnRvQnl0ZUFycmF5KCkpOwpAQCAtMjQ2LDE1ICsyNDYsMTUgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VfaW1wbGljaXRfbWl4ZWRfZW5jb2RlZCgpIHRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKIAkJYi53cml0ZSgib2JqZWN0IDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIKLQkJCQkuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgidHlwZSB0cmVlXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoInRhZyB2MS4yLjMuNC41XG4iLmdldEJ5dGVzKFVURl84KSk7CisJCQkJLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgidHlwZSB0cmVlXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgidGFnIHYxLjIuMy40LjVcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQliLndyaXRlKCJ0YWdnZXIgRlx1MDBmNnIgZmF0dGFyZSA8YV91X3Rob3JAZXhhbXBsZS5jb20+IDEyMTgxMjMzODcgKzA3MDBcbiIKIAkJCQkuZ2V0Qnl0ZXMoSVNPXzg4NTlfMSkpOwotCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiU21cdTAwZjZyZ1x1MDBlNXNib3JkXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcdTMwNGRcdTMwOGNcdTMwNDRcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiU21cdTAwZjZyZ1x1MDBlNXNib3JkXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXHUzMDRkXHUzMDhjXHUzMDQ0XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJZmluYWwgUmV2VGFnIGM7CiAJCWMgPSBuZXcgUmV2VGFnKGlkKCI5NDczMDk1YzRjYjJmMTJhZWZlMWRiOGEzNTVmZTNmYWZiYTQyZjY3IikpOwogCQljLnBhcnNlQ2Fub25pY2FsKG5ldyBSZXZXYWxrKGRiKSwgYi50b0J5dGVBcnJheSgpKTsKQEAgLTMwNywxNyArMzA3LDE3IEBACiAJcHVibGljIHZvaWQgdGVzdFBhcnNlX2V4cGxpY2l0X2JhZF9lbmNvZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogCQliLndyaXRlKCJvYmplY3QgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIgotCQkJCS5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJ0eXBlIHRyZWVcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgidGFnIHYxLjIuMy40LjVcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCQkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJ0eXBlIHRyZWVcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJ0YWcgdjEuMi4zLjQuNVxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWIKIAkJCQkud3JpdGUoInRhZ2dlciBGXHUwMGY2ciBmYXR0YXJlIDxhX3VfdGhvckBleGFtcGxlLmNvbT4gMTIxODEyMzM4NyArMDcwMFxuIgogCQkJCQkJLmdldEJ5dGVzKElTT184ODU5XzEpKTsKLQkJYi53cml0ZSgiZW5jb2RpbmcgRVVDLUpQXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcdTMwNGRcdTMwOGNcdTMwNDRcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIkhpXG4iLmdldEJ5dGVzKFVURl84KSk7CisJCWIud3JpdGUoImVuY29kaW5nIEVVQy1KUFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlx1MzA0ZFx1MzA4Y1x1MzA0NFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIkhpXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJZmluYWwgUmV2VGFnIGM7CiAJCWMgPSBuZXcgUmV2VGFnKGlkKCI5NDczMDk1YzRjYjJmMTJhZWZlMWRiOGEzNTVmZTNmYWZiYTQyZjY3IikpOwogCQljLnBhcnNlQ2Fub25pY2FsKG5ldyBSZXZXYWxrKGRiKSwgYi50b0J5dGVBcnJheSgpKTsKQEAgLTM0MiwxNyArMzQyLDE3IEBACiAJcHVibGljIHZvaWQgdGVzdFBhcnNlX2V4cGxpY2l0X2JhZF9lbmNvZGVkMigpIHRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKIAkJYi53cml0ZSgib2JqZWN0IDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIKLQkJCQkuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgidHlwZSB0cmVlXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoInRhZyB2MS4yLjMuNC41XG4iLmdldEJ5dGVzKFVURl84KSk7CisJCQkJLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgidHlwZSB0cmVlXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgidGFnIHYxLjIuMy40LjVcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQliCiAJCQkJLndyaXRlKCJ0YWdnZXIgRlx1MDBmNnIgZmF0dGFyZSA8YV91X3Rob3JAZXhhbXBsZS5jb20+IDEyMTgxMjMzODcgKzA3MDBcbiIKLQkJCQkJCS5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJlbmNvZGluZyBJU08tODg1OS0xXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcdTMwNGRcdTMwOGNcdTMwNDRcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIkhpXG4iLmdldEJ5dGVzKFVURl84KSk7CisJCQkJCQkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJlbmNvZGluZyBJU08tODg1OS0xXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXHUzMDRkXHUzMDhjXHUzMDQ0XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiSGlcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlmaW5hbCBSZXZUYWcgYzsKIAkJYyA9IG5ldyBSZXZUYWcoaWQoIjk0NzMwOTVjNGNiMmYxMmFlZmUxZGI4YTM1NWZlM2ZhZmJhNDJmNjciKSk7CiAJCWMucGFyc2VDYW5vbmljYWwobmV3IFJldldhbGsoZGIpLCBiLnRvQnl0ZUFycmF5KCkpOwpAQCAtMzY1LDEzICszNjUsMTMgQEAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RQYXJzZV9pbGxlZ2FsRW5jb2RpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCWIud3JpdGUoIm9iamVjdCA5Nzg4NjY5YWQ5MThiNmZjY2U2NGFmODg4MmZjOWE4MWNiNmFiYTY3XG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoInR5cGUgdHJlZVxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJ0YWcgdjEuMFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJ0YWdnZXIgdCA8dEBleGFtcGxlLmNvbT4gMTIxODEyMzM4NyArMDcwMFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJlbmNvZGluZyB1dGYtOGxvZ291dHB1dGVuY29kaW5nPWdia1xuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgibWVzc2FnZVxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQliLndyaXRlKCJvYmplY3QgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoInR5cGUgdHJlZVxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoInRhZyB2MS4wXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgidGFnZ2VyIHQgPHRAZXhhbXBsZS5jb20+IDEyMTgxMjMzODcgKzA3MDBcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJlbmNvZGluZyB1dGYtOGxvZ291dHB1dGVuY29kaW5nPWdia1xuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIm1lc3NhZ2VcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCiAJCVJldlRhZyB0ID0gbmV3IFJldlRhZyhpZCgiOTQ3MzA5NWM0Y2IyZjEyYWVmZTFkYjhhMzU1ZmUzZmFmYmE0MmY2NyIpKTsKIAkJdC5wYXJzZUNhbm9uaWNhbChuZXcgUmV2V2FsayhkYiksIGIudG9CeXRlQXJyYXkoKSk7CkBAIC0zODQsMTMgKzM4NCwxMyBAQAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFBhcnNlX3Vuc3VwcG9ydGVkRW5jb2RpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCWIud3JpdGUoIm9iamVjdCA5Nzg4NjY5YWQ5MThiNmZjY2U2NGFmODg4MmZjOWE4MWNiNmFiYTY3XG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoInR5cGUgdHJlZVxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJ0YWcgdjEuMFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJ0YWdnZXIgdCA8dEBleGFtcGxlLmNvbT4gMTIxODEyMzM4NyArMDcwMFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJlbmNvZGluZyBpdF9JVC5VVEY4XG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJtZXNzYWdlXG4iLmdldEJ5dGVzKFVURl84KSk7CisJCWIud3JpdGUoIm9iamVjdCA5Nzg4NjY5YWQ5MThiNmZjY2U2NGFmODg4MmZjOWE4MWNiNmFiYTY3XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgidHlwZSB0cmVlXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgidGFnIHYxLjBcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJ0YWdnZXIgdCA8dEBleGFtcGxlLmNvbT4gMTIxODEyMzM4NyArMDcwMFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoImVuY29kaW5nIGl0X0lULlVURjhcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJtZXNzYWdlXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKIAogCQlSZXZUYWcgdCA9IG5ldyBSZXZUYWcoaWQoIjk0NzMwOTVjNGNiMmYxMmFlZmUxZGI4YTM1NWZlM2ZhZmJhNDJmNjciKSk7CiAJCXQucGFyc2VDYW5vbmljYWwobmV3IFJldldhbGsoZGIpLCBiLnRvQnl0ZUFycmF5KCkpOwpAQCAtNDgwLDcgKzQ4MCw3IEBACiAJCWFzc2VydEVxdWFscyhzcmMuZ2V0TWVzc2FnZSgpLCBwLmdldEZ1bGxNZXNzYWdlKCkpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIE9iamVjdElkIGlkKGZpbmFsIFN0cmluZyBzdHIpIHsKKwlwcml2YXRlIHN0YXRpYyBPYmplY3RJZCBpZChTdHJpbmcgc3RyKSB7CiAJCXJldHVybiBPYmplY3RJZC5mcm9tU3RyaW5nKHN0cik7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsa0ZvbGxvd0ZpbHRlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGtGb2xsb3dGaWx0ZXJUZXN0LmphdmEKaW5kZXggYWIyNzA1Yy4uNzAwNTAyNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsa0ZvbGxvd0ZpbHRlclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrRm9sbG93RmlsdGVyVGVzdC5qYXZhCkBAIC03NSw3ICs3NSw3IEBACiAJCWRpZmZDb2xsZWN0b3IgPSBuZXcgRGlmZkNvbGxlY3RvcigpOwogCX0KIAotCXByb3RlY3RlZCBGb2xsb3dGaWx0ZXIgZm9sbG93KGZpbmFsIFN0cmluZyBmb2xsb3dQYXRoKSB7CisJcHJvdGVjdGVkIEZvbGxvd0ZpbHRlciBmb2xsb3coU3RyaW5nIGZvbGxvd1BhdGgpIHsKIAkJRm9sbG93RmlsdGVyIGZvbGxvd0ZpbHRlciA9CiAJCQlGb2xsb3dGaWx0ZXIuY3JlYXRlKGZvbGxvd1BhdGgsIG5ldyBDb25maWcoKS5nZXQoRGlmZkNvbmZpZy5LRVkpKTsKIAkJZm9sbG93RmlsdGVyLnNldFJlbmFtZUNhbGxiYWNrKGRpZmZDb2xsZWN0b3IpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsa1BhdGhGaWx0ZXIxVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsa1BhdGhGaWx0ZXIxVGVzdC5qYXZhCmluZGV4IDZlYzUyOWMuLmI1NWE0NWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGtQYXRoRmlsdGVyMVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrUGF0aEZpbHRlcjFUZXN0LmphdmEKQEAgLTU0LDcgKzU0LDcgQEAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogcHVibGljIGNsYXNzIFJldldhbGtQYXRoRmlsdGVyMVRlc3QgZXh0ZW5kcyBSZXZXYWxrVGVzdENhc2UgewotCXByb3RlY3RlZCB2b2lkIGZpbHRlcihmaW5hbCBTdHJpbmcgcGF0aCkgeworCXByb3RlY3RlZCB2b2lkIGZpbHRlcihTdHJpbmcgcGF0aCkgewogCQlydy5zZXRUcmVlRmlsdGVyKEFuZFRyZWVGaWx0ZXIuY3JlYXRlKFBhdGhGaWx0ZXJHcm91cAogCQkJCS5jcmVhdGVGcm9tU3RyaW5ncyhDb2xsZWN0aW9ucy5zaW5nbGV0b24ocGF0aCkpLAogCQkJCVRyZWVGaWx0ZXIuQU5ZX0RJRkYpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGtQYXRoRmlsdGVyNjAxMlRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGtQYXRoRmlsdGVyNjAxMlRlc3QuamF2YQppbmRleCA2MzFlMzk1Li5jZWY1NTIxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrUGF0aEZpbHRlcjYwMTJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsa1BhdGhGaWx0ZXI2MDEyVGVzdC5qYXZhCkBAIC0xMDIsMTcgKzEwMiwxNyBAQAogCQl9CiAJfQogCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2soZmluYWwgUmV2Q29tbWl0Li4uIG9yZGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgdm9pZCBjaGVjayhSZXZDb21taXQuLi4gb3JkZXIpIHRocm93cyBFeGNlcHRpb24gewogCQltYXJrU3RhcnQoaSk7CiAJCWZpbmFsIFN0cmluZ0J1aWxkZXIgYWN0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJZm9yIChmaW5hbCBSZXZDb21taXQgeiA6IHJ3KSB7CisJCWZvciAoUmV2Q29tbWl0IHogOiBydykgewogCQkJZmluYWwgU3RyaW5nIG5hbWUgPSBieU5hbWUuZ2V0KHopOwogCQkJYXNzZXJ0Tm90TnVsbChuYW1lKTsKIAkJCWFjdC5hcHBlbmQobmFtZSk7CiAJCQlhY3QuYXBwZW5kKCcgJyk7CiAJCX0KIAkJZmluYWwgU3RyaW5nQnVpbGRlciBleHAgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlmb3IgKGZpbmFsIFJldkNvbW1pdCB6IDogb3JkZXIpIHsKKwkJZm9yIChSZXZDb21taXQgeiA6IG9yZGVyKSB7CiAJCQlmaW5hbCBTdHJpbmcgbmFtZSA9IGJ5TmFtZS5nZXQoeik7CiAJCQlhc3NlcnROb3ROdWxsKG5hbWUpOwogCQkJZXhwLmFwcGVuZChuYW1lKTsKQEAgLTEyMSw3ICsxMjEsNyBAQAogCQlhc3NlcnRFcXVhbHMoZXhwLnRvU3RyaW5nKCksIGFjdC50b1N0cmluZygpKTsKIAl9CiAKLQlwcm90ZWN0ZWQgdm9pZCBmaWx0ZXIoZmluYWwgU3RyaW5nIHBhdGgpIHsKKwlwcm90ZWN0ZWQgdm9pZCBmaWx0ZXIoU3RyaW5nIHBhdGgpIHsKIAkJcncuc2V0VHJlZUZpbHRlcihBbmRUcmVlRmlsdGVyLmNyZWF0ZShQYXRoRmlsdGVyR3JvdXAKIAkJCQkuY3JlYXRlRnJvbVN0cmluZ3MoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHBhdGgpKSwKIAkJCQlUcmVlRmlsdGVyLkFOWV9ESUZGKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrVGVzdENhc2UuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGtUZXN0Q2FzZS5qYXZhCmluZGV4IGYxMmNjMDguLjU0NDM5ODIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGtUZXN0Q2FzZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGtUZXN0Q2FzZS5qYXZhCkBAIC03NCwzOCArNzQsMzggQEAKIAkJcmV0dXJuIHV0aWwuZ2V0RGF0ZSgpOwogCX0KIAotCXByb3RlY3RlZCB2b2lkIHRpY2soZmluYWwgaW50IHNlY0RlbHRhKSB7CisJcHJvdGVjdGVkIHZvaWQgdGljayhpbnQgc2VjRGVsdGEpIHsKIAkJdXRpbC50aWNrKHNlY0RlbHRhKTsKIAl9CiAKLQlwcm90ZWN0ZWQgUmV2QmxvYiBibG9iKGZpbmFsIFN0cmluZyBjb250ZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgUmV2QmxvYiBibG9iKFN0cmluZyBjb250ZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcmV0dXJuIHV0aWwuYmxvYihjb250ZW50KTsKIAl9CiAKLQlwcm90ZWN0ZWQgRGlyQ2FjaGVFbnRyeSBmaWxlKGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBSZXZCbG9iIGJsb2IpCisJcHJvdGVjdGVkIERpckNhY2hlRW50cnkgZmlsZShTdHJpbmcgcGF0aCwgUmV2QmxvYiBibG9iKQogCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXJldHVybiB1dGlsLmZpbGUocGF0aCwgYmxvYik7CiAJfQogCi0JcHJvdGVjdGVkIFJldlRyZWUgdHJlZShmaW5hbCBEaXJDYWNoZUVudHJ5Li4uIGVudHJpZXMpIHRocm93cyBFeGNlcHRpb24geworCXByb3RlY3RlZCBSZXZUcmVlIHRyZWUoRGlyQ2FjaGVFbnRyeS4uLiBlbnRyaWVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcmV0dXJuIHV0aWwudHJlZShlbnRyaWVzKTsKIAl9CiAKLQlwcm90ZWN0ZWQgUmV2T2JqZWN0IGdldChmaW5hbCBSZXZUcmVlIHRyZWUsIGZpbmFsIFN0cmluZyBwYXRoKQorCXByb3RlY3RlZCBSZXZPYmplY3QgZ2V0KFJldlRyZWUgdHJlZSwgU3RyaW5nIHBhdGgpCiAJCQl0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcmV0dXJuIHV0aWwuZ2V0KHRyZWUsIHBhdGgpOwogCX0KIAotCXByb3RlY3RlZCBSZXZDb21taXQgY29tbWl0KGZpbmFsIFJldkNvbW1pdC4uLiBwYXJlbnRzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgUmV2Q29tbWl0IGNvbW1pdChSZXZDb21taXQuLi4gcGFyZW50cykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXJldHVybiB1dGlsLmNvbW1pdChwYXJlbnRzKTsKIAl9CiAKLQlwcm90ZWN0ZWQgUmV2Q29tbWl0IGNvbW1pdChmaW5hbCBSZXZUcmVlIHRyZWUsIGZpbmFsIFJldkNvbW1pdC4uLiBwYXJlbnRzKQorCXByb3RlY3RlZCBSZXZDb21taXQgY29tbWl0KFJldlRyZWUgdHJlZSwgUmV2Q29tbWl0Li4uIHBhcmVudHMpCiAJCQl0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcmV0dXJuIHV0aWwuY29tbWl0KHRyZWUsIHBhcmVudHMpOwogCX0KIAotCXByb3RlY3RlZCBSZXZDb21taXQgY29tbWl0KGZpbmFsIGludCBzZWNEZWx0YSwgZmluYWwgUmV2Q29tbWl0Li4uIHBhcmVudHMpCisJcHJvdGVjdGVkIFJldkNvbW1pdCBjb21taXQoaW50IHNlY0RlbHRhLCBSZXZDb21taXQuLi4gcGFyZW50cykKIAkJCXRocm93cyBFeGNlcHRpb24gewogCQlyZXR1cm4gdXRpbC5jb21taXQoc2VjRGVsdGEsIHBhcmVudHMpOwogCX0KQEAgLTExNSw3ICsxMTUsNyBAQAogCQlyZXR1cm4gdXRpbC5jb21taXQoc2VjRGVsdGEsIHRyZWUsIHBhcmVudHMpOwogCX0KIAotCXByb3RlY3RlZCBSZXZUYWcgdGFnKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBSZXZPYmplY3QgZHN0KQorCXByb3RlY3RlZCBSZXZUYWcgdGFnKFN0cmluZyBuYW1lLCBSZXZPYmplY3QgZHN0KQogCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXJldHVybiB1dGlsLnRhZyhuYW1lLCBkc3QpOwogCX0KQEAgLTEyNSwxOSArMTI1LDE5IEBACiAJCXJldHVybiB1dGlsLmNvbW1pdCgpOwogCX0KIAotCXByb3RlY3RlZCA8VCBleHRlbmRzIFJldk9iamVjdD4gVCBwYXJzZUJvZHkoZmluYWwgVCB0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBSZXZPYmplY3Q+IFQgcGFyc2VCb2R5KFQgdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXJldHVybiB1dGlsLnBhcnNlQm9keSh0KTsKIAl9CiAKLQlwcm90ZWN0ZWQgdm9pZCBtYXJrU3RhcnQoZmluYWwgUmV2Q29tbWl0IGNvbW1pdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJvdGVjdGVkIHZvaWQgbWFya1N0YXJ0KFJldkNvbW1pdCBjb21taXQpIHRocm93cyBFeGNlcHRpb24gewogCQlydy5tYXJrU3RhcnQoY29tbWl0KTsKIAl9CiAKLQlwcm90ZWN0ZWQgdm9pZCBtYXJrVW5pbnRlcmVzdGluZyhmaW5hbCBSZXZDb21taXQgY29tbWl0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgdm9pZCBtYXJrVW5pbnRlcmVzdGluZyhSZXZDb21taXQgY29tbWl0KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcncubWFya1VuaW50ZXJlc3RpbmcoY29tbWl0KTsKIAl9CiAKLQlwcm90ZWN0ZWQgdm9pZCBhc3NlcnRDb21taXQoZmluYWwgUmV2Q29tbWl0IGV4cCwgZmluYWwgUmV2Q29tbWl0IGFjdCkgeworCXByb3RlY3RlZCB2b2lkIGFzc2VydENvbW1pdChSZXZDb21taXQgZXhwLCBSZXZDb21taXQgYWN0KSB7CiAJCWFzc2VydFNhbWUoZXhwLCBhY3QpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGtVdGlsc1JlYWNoYWJsZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGtVdGlsc1JlYWNoYWJsZVRlc3QuamF2YQppbmRleCAxMGJlYTBhLi5hMjZhZTEwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrVXRpbHNSZWFjaGFibGVUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsa1V0aWxzUmVhY2hhYmxlVGVzdC5qYXZhCkBAIC0xMDksNyArMTA5LDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgUmVmIGJyYW5jaChmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgUmV2Q29tbWl0IGRzdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSBSZWYgYnJhbmNoKFN0cmluZyBuYW1lLCBSZXZDb21taXQgZHN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcmV0dXJuIEdpdC53cmFwKGRiKS5icmFuY2hDcmVhdGUoKS5zZXROYW1lKG5hbWUpCiAJCQkJLnNldFN0YXJ0UG9pbnQoZHN0Lm5hbWUoKSkuY2FsbCgpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdG9yYWdlL2ZpbGUvRmlsZUJhc2VkQ29uZmlnVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3N0b3JhZ2UvZmlsZS9GaWxlQmFzZWRDb25maWdUZXN0LmphdmEKaW5kZXggN2YwZDYwMi4uMGRlYTVjZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3N0b3JhZ2UvZmlsZS9GaWxlQmFzZWRDb25maWdUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3N0b3JhZ2UvZmlsZS9GaWxlQmFzZWRDb25maWdUZXN0LmphdmEKQEAgLTQyLDcgKzQyLDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRmlsZVV0aWxzLnBhdGhUb1N0cmluZzsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRBcnJheUVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CkBAIC0xMDUsNyArMTA1LDcgQEAKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFVURjh3aXRob3V0Qk9NKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb25maWdJbnZhbGlkRXhjZXB0aW9uIHsKLQkJZmluYWwgRmlsZSBmaWxlID0gY3JlYXRlRmlsZShDT05URU5UMS5nZXRCeXRlcyhVVEZfOCkpOworCQlmaW5hbCBGaWxlIGZpbGUgPSBjcmVhdGVGaWxlKENPTlRFTlQxLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJZmluYWwgRmlsZUJhc2VkQ29uZmlnIGNvbmZpZyA9IG5ldyBGaWxlQmFzZWRDb25maWcoZmlsZSwgRlMuREVURUNURUQpOwogCQljb25maWcubG9hZCgpOwogCQlhc3NlcnRFcXVhbHMoQUxJQ0UsIGNvbmZpZy5nZXRTdHJpbmcoVVNFUiwgbnVsbCwgTkFNRSkpOwpAQCAtMTIxLDcgKzEyMSw3IEBACiAJCWJvczEud3JpdGUoMHhFRik7CiAJCWJvczEud3JpdGUoMHhCQik7CiAJCWJvczEud3JpdGUoMHhCRik7Ci0JCWJvczEud3JpdGUoQ09OVEVOVDEuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYm9zMS53cml0ZShDT05URU5UMS5nZXRCeXRlcyhDSEFSU0VUKSk7CiAKIAkJZmluYWwgRmlsZSBmaWxlID0gY3JlYXRlRmlsZShib3MxLnRvQnl0ZUFycmF5KCkpOwogCQlmaW5hbCBGaWxlQmFzZWRDb25maWcgY29uZmlnID0gbmV3IEZpbGVCYXNlZENvbmZpZyhmaWxlLCBGUy5ERVRFQ1RFRCk7CkBAIC0xMzUsNyArMTM1LDcgQEAKIAkJYm9zMi53cml0ZSgweEVGKTsKIAkJYm9zMi53cml0ZSgweEJCKTsKIAkJYm9zMi53cml0ZSgweEJGKTsKLQkJYm9zMi53cml0ZShDT05URU5UMi5nZXRCeXRlcyhVVEZfOCkpOworCQlib3MyLndyaXRlKENPTlRFTlQyLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJYXNzZXJ0QXJyYXlFcXVhbHMoYm9zMi50b0J5dGVBcnJheSgpLCBJTy5yZWFkRnVsbHkoZmlsZSkpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3N1Ym1vZHVsZS9TdWJtb2R1bGVBZGRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvc3VibW9kdWxlL1N1Ym1vZHVsZUFkZFRlc3QuamF2YQppbmRleCBmNDJkZDAyLi4xYTY3ZTQxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvc3VibW9kdWxlL1N1Ym1vZHVsZUFkZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvc3VibW9kdWxlL1N1Ym1vZHVsZUFkZFRlc3QuamF2YQpAQCAtMTI5LDEwICsxMjksMTEgQEAKIAkJCWNvbW1hbmQuc2V0UGF0aChwYXRoKTsKIAkJCVN0cmluZyB1cmkgPSBkYi5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvU3RyaW5nKCk7CiAJCQljb21tYW5kLnNldFVSSSh1cmkpOwotCQkJUmVwb3NpdG9yeSByZXBvID0gY29tbWFuZC5jYWxsKCk7Ci0JCQlhc3NlcnROb3ROdWxsKHJlcG8pOwotCQkJT2JqZWN0SWQgc3ViQ29tbWl0ID0gcmVwby5yZXNvbHZlKENvbnN0YW50cy5IRUFEKTsKLQkJCXJlcG8uY2xvc2UoKTsKKwkJCU9iamVjdElkIHN1YkNvbW1pdDsKKwkJCXRyeSAoUmVwb3NpdG9yeSByZXBvID0gY29tbWFuZC5jYWxsKCkpIHsKKwkJCQlhc3NlcnROb3ROdWxsKHJlcG8pOworCQkJCXN1YkNvbW1pdCA9IHJlcG8ucmVzb2x2ZShDb25zdGFudHMuSEVBRCk7CisJCQl9CiAKIAkJCVN1Ym1vZHVsZVdhbGsgZ2VuZXJhdG9yID0gU3VibW9kdWxlV2Fsay5mb3JJbmRleChkYik7CiAJCQlhc3NlcnRUcnVlKGdlbmVyYXRvci5uZXh0KCkpOwpAQCAtMTQxLDEwICsxNDIsMTAgQEAKIAkJCWFzc2VydEVxdWFscyh1cmksIGdlbmVyYXRvci5nZXRNb2R1bGVzVXJsKCkpOwogCQkJYXNzZXJ0RXF1YWxzKHBhdGgsIGdlbmVyYXRvci5nZXRNb2R1bGVzUGF0aCgpKTsKIAkJCWFzc2VydEVxdWFscyh1cmksIGdlbmVyYXRvci5nZXRDb25maWdVcmwoKSk7Ci0JCQlSZXBvc2l0b3J5IHN1Yk1vZFJlcG8gPSBnZW5lcmF0b3IuZ2V0UmVwb3NpdG9yeSgpOwotCQkJYXNzZXJ0Tm90TnVsbChzdWJNb2RSZXBvKTsKLQkJCWFzc2VydEVxdWFscyhzdWJDb21taXQsIGNvbW1pdCk7Ci0JCQlzdWJNb2RSZXBvLmNsb3NlKCk7CisJCQl0cnkgKFJlcG9zaXRvcnkgc3ViTW9kUmVwbyA9IGdlbmVyYXRvci5nZXRSZXBvc2l0b3J5KCkpIHsKKwkJCQlhc3NlcnROb3ROdWxsKHN1Yk1vZFJlcG8pOworCQkJCWFzc2VydEVxdWFscyhzdWJDb21taXQsIGNvbW1pdCk7CisJCQl9CiAKIAkJCVN0YXR1cyBzdGF0dXMgPSBHaXQud3JhcChkYikuc3RhdHVzKCkuY2FsbCgpOwogCQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0QWRkZWQoKS5jb250YWlucyhDb25zdGFudHMuRE9UX0dJVF9NT0RVTEVTKSk7CkBAIC0yMDksMTYgKzIxMCwxNCBAQAogCQkJCWZ1bGxVcmkgPSBmdWxsVXJpLnJlcGxhY2UoJ1xcJywgJy8nKTsKIAkJCX0KIAkJCWFzc2VydEVxdWFscyhmdWxsVXJpLCBnZW5lcmF0b3IuZ2V0Q29uZmlnVXJsKCkpOwotCQkJUmVwb3NpdG9yeSBzdWJNb2RSZXBvID0gZ2VuZXJhdG9yLmdldFJlcG9zaXRvcnkoKTsKLQkJCWFzc2VydE5vdE51bGwoc3ViTW9kUmVwbyk7Ci0JCQlhc3NlcnRFcXVhbHMoCi0JCQkJCWZ1bGxVcmksCi0JCQkJCXN1Yk1vZFJlcG8KLQkJCQkJCQkuZ2V0Q29uZmlnKCkKLQkJCQkJCQkuZ2V0U3RyaW5nKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfUkVNT1RFX1NFQ1RJT04sCi0JCQkJCQkJCQlDb25zdGFudHMuREVGQVVMVF9SRU1PVEVfTkFNRSwKLQkJCQkJCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1VSTCkpOwotCQkJc3ViTW9kUmVwby5jbG9zZSgpOworCQkJdHJ5IChSZXBvc2l0b3J5IHN1Yk1vZFJlcG8gPSBnZW5lcmF0b3IuZ2V0UmVwb3NpdG9yeSgpKSB7CisJCQkJYXNzZXJ0Tm90TnVsbChzdWJNb2RSZXBvKTsKKwkJCQlhc3NlcnRFcXVhbHMoZnVsbFVyaSwKKwkJCQkJCXN1Yk1vZFJlcG8uZ2V0Q29uZmlnKCkuZ2V0U3RyaW5nKAorCQkJCQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX1JFTU9URV9TRUNUSU9OLAorCQkJCQkJCQlDb25zdGFudHMuREVGQVVMVF9SRU1PVEVfTkFNRSwKKwkJCQkJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfVVJMKSk7CisJCQl9CiAJCQlhc3NlcnRFcXVhbHMoY29tbWl0LCByZXBvLnJlc29sdmUoQ29uc3RhbnRzLkhFQUQpKTsKIAogCQkJU3RhdHVzIHN0YXR1cyA9IEdpdC53cmFwKGRiKS5zdGF0dXMoKS5jYWxsKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvc3VibW9kdWxlL1N1Ym1vZHVsZVN5bmNUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvc3VibW9kdWxlL1N1Ym1vZHVsZVN5bmNUZXN0LmphdmEKaW5kZXggMTNkYjQ0YS4uNmYzYjUyZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3N1Ym1vZHVsZS9TdWJtb2R1bGVTeW5jVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdWJtb2R1bGUvU3VibW9kdWxlU3luY1Rlc3QuamF2YQpAQCAtMTM1LDEyICsxMzUsMTQgQEAKIAkJZ2VuZXJhdG9yID0gU3VibW9kdWxlV2Fsay5mb3JJbmRleChkYik7CiAJCWFzc2VydFRydWUoZ2VuZXJhdG9yLm5leHQoKSk7CiAJCWFzc2VydEVxdWFscyh1cmwsIGdlbmVyYXRvci5nZXRDb25maWdVcmwoKSk7Ci0JCVJlcG9zaXRvcnkgc3ViTW9kUmVwb3NpdG9yeSA9IGdlbmVyYXRvci5nZXRSZXBvc2l0b3J5KCk7Ci0JCVN0b3JlZENvbmZpZyBzdWJtb2R1bGVDb25maWcgPSBzdWJNb2RSZXBvc2l0b3J5LmdldENvbmZpZygpOwotCQlzdWJNb2RSZXBvc2l0b3J5LmNsb3NlKCk7Ci0JCWFzc2VydEVxdWFscyh1cmwsIHN1Ym1vZHVsZUNvbmZpZy5nZXRTdHJpbmcoCi0JCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19SRU1PVEVfU0VDVElPTiwKLQkJCQlDb25zdGFudHMuREVGQVVMVF9SRU1PVEVfTkFNRSwgQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfVVJMKSk7CisJCXRyeSAoUmVwb3NpdG9yeSBzdWJNb2RSZXBvc2l0b3J5ID0gZ2VuZXJhdG9yLmdldFJlcG9zaXRvcnkoKSkgeworCQkJU3RvcmVkQ29uZmlnIHN1Ym1vZHVsZUNvbmZpZyA9IHN1Yk1vZFJlcG9zaXRvcnkuZ2V0Q29uZmlnKCk7CisJCQlhc3NlcnRFcXVhbHModXJsLAorCQkJCQlzdWJtb2R1bGVDb25maWcuZ2V0U3RyaW5nKAorCQkJCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfUkVNT1RFX1NFQ1RJT04sCisJCQkJCQkJQ29uc3RhbnRzLkRFRkFVTFRfUkVNT1RFX05BTUUsCisJCQkJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfVVJMKSk7CisJCX0KIAl9CiAKIAlAVGVzdApAQCAtMjA4LDExICsyMTAsMTMgQEAKIAkJZ2VuZXJhdG9yID0gU3VibW9kdWxlV2Fsay5mb3JJbmRleChkYik7CiAJCWFzc2VydFRydWUoZ2VuZXJhdG9yLm5leHQoKSk7CiAJCWFzc2VydEVxdWFscygiZ2l0Oi8vc2VydmVyL3N1Yi5naXQiLCBnZW5lcmF0b3IuZ2V0Q29uZmlnVXJsKCkpOwotCQlSZXBvc2l0b3J5IHN1Yk1vZFJlcG9zaXRvcnkxID0gZ2VuZXJhdG9yLmdldFJlcG9zaXRvcnkoKTsKLQkJU3RvcmVkQ29uZmlnIHN1Ym1vZHVsZUNvbmZpZyA9IHN1Yk1vZFJlcG9zaXRvcnkxLmdldENvbmZpZygpOwotCQlzdWJNb2RSZXBvc2l0b3J5MS5jbG9zZSgpOwotCQlhc3NlcnRFcXVhbHMoImdpdDovL3NlcnZlci9zdWIuZ2l0Iiwgc3VibW9kdWxlQ29uZmlnLmdldFN0cmluZygKLQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX1JFTU9URV9TRUNUSU9OLAotCQkJCUNvbnN0YW50cy5ERUZBVUxUX1JFTU9URV9OQU1FLCBDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9VUkwpKTsKKwkJdHJ5IChSZXBvc2l0b3J5IHN1Yk1vZFJlcG9zaXRvcnkxID0gZ2VuZXJhdG9yLmdldFJlcG9zaXRvcnkoKSkgeworCQkJU3RvcmVkQ29uZmlnIHN1Ym1vZHVsZUNvbmZpZyA9IHN1Yk1vZFJlcG9zaXRvcnkxLmdldENvbmZpZygpOworCQkJYXNzZXJ0RXF1YWxzKCJnaXQ6Ly9zZXJ2ZXIvc3ViLmdpdCIsCisJCQkJCXN1Ym1vZHVsZUNvbmZpZy5nZXRTdHJpbmcoCisJCQkJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19SRU1PVEVfU0VDVElPTiwKKwkJCQkJCQlDb25zdGFudHMuREVGQVVMVF9SRU1PVEVfTkFNRSwKKwkJCQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9VUkwpKTsKKwkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdWJtb2R1bGUvU3VibW9kdWxlVXBkYXRlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3N1Ym1vZHVsZS9TdWJtb2R1bGVVcGRhdGVUZXN0LmphdmEKaW5kZXggNzA2NGY2MC4uYmJjZTQxMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3N1Ym1vZHVsZS9TdWJtb2R1bGVVcGRhdGVUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3N1Ym1vZHVsZS9TdWJtb2R1bGVVcGRhdGVUZXN0LmphdmEKQEAgLTEyMSwxMCArMTIxLDEwIEBACiAKIAkJU3VibW9kdWxlV2FsayBnZW5lcmF0b3IgPSBTdWJtb2R1bGVXYWxrLmZvckluZGV4KGRiKTsKIAkJYXNzZXJ0VHJ1ZShnZW5lcmF0b3IubmV4dCgpKTsKLQkJUmVwb3NpdG9yeSBzdWJSZXBvID0gZ2VuZXJhdG9yLmdldFJlcG9zaXRvcnkoKTsKLQkJYXNzZXJ0Tm90TnVsbChzdWJSZXBvKTsKLQkJYXNzZXJ0RXF1YWxzKGNvbW1pdCwgc3ViUmVwby5yZXNvbHZlKENvbnN0YW50cy5IRUFEKSk7Ci0JCXN1YlJlcG8uY2xvc2UoKTsKKwkJdHJ5IChSZXBvc2l0b3J5IHN1YlJlcG8gPSBnZW5lcmF0b3IuZ2V0UmVwb3NpdG9yeSgpKSB7CisJCQlhc3NlcnROb3ROdWxsKHN1YlJlcG8pOworCQkJYXNzZXJ0RXF1YWxzKGNvbW1pdCwgc3ViUmVwby5yZXNvbHZlKENvbnN0YW50cy5IRUFEKSk7CisJCX0KIAl9CiAKIAlAVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CdW5kbGVXcml0ZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0J1bmRsZVdyaXRlclRlc3QuamF2YQppbmRleCA2NThiOTcxLi5kMzBhYzg0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0J1bmRsZVdyaXRlclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0J1bmRsZVdyaXRlclRlc3QuamF2YQpAQCAtNDUsNyArNDUsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0OwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpfQkxPQjsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKQEAgLTE5OSw3ICsxOTksNyBAQAogCQkJUmVmIHJlZiA9IHJlcG8uZXhhY3RSZWYocmVmTmFtZSk7CiAJCQlhc3NlcnROb3ROdWxsKHJlZik7CiAJCQlhc3NlcnRFcXVhbHMoaWQsIHJlZi5nZXRPYmplY3RJZCgpKTsKLQkJCWFzc2VydEVxdWFscyhkYXRhLCBuZXcgU3RyaW5nKHJlcG8ub3BlbihpZCwgT0JKX0JMT0IpLmdldEJ5dGVzKCksIFVURl84KSk7CisJCQlhc3NlcnRFcXVhbHMoZGF0YSwgbmV3IFN0cmluZyhyZXBvLm9wZW4oaWQsIE9CSl9CTE9CKS5nZXRCeXRlcygpLCBDSEFSU0VUKSk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvTmV0UkNUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L05ldFJDVGVzdC5qYXZhCmluZGV4IDJmZWE4YTkuLjRlNWQ1NmEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvTmV0UkNUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9OZXRSQ1Rlc3QuamF2YQpAQCAtNDIsNiArNDIsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0OwogCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwogCkBAIC03MywxMSArNzQsMTEgQEAKIAkJY29uZmlnRmlsZSA9IG5ldyBGaWxlKGhvbWUsICIubmV0cmMiKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgY29uZmlnKGZpbmFsIFN0cmluZyBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmaW5hbCBPdXRwdXRTdHJlYW1Xcml0ZXIgZncgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKAotCQkJCW5ldyBGaWxlT3V0cHV0U3RyZWFtKGNvbmZpZ0ZpbGUpLCAiVVRGLTgiKTsKLQkJZncud3JpdGUoZGF0YSk7Ci0JCWZ3LmNsb3NlKCk7CisJcHJpdmF0ZSB2b2lkIGNvbmZpZyhTdHJpbmcgZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdHJ5IChPdXRwdXRTdHJlYW1Xcml0ZXIgZncgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKAorCQkJCW5ldyBGaWxlT3V0cHV0U3RyZWFtKGNvbmZpZ0ZpbGUpLCBDSEFSU0VUKSkgeworCQkJZncud3JpdGUoZGF0YSk7CisJCX0KIAl9CiAKIAlAVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9PcGVuU3NoQ29uZmlnVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9PcGVuU3NoQ29uZmlnVGVzdC5qYXZhCmluZGV4IGQ2MDQ3NTEuLmFiZjgwZWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvT3BlblNzaENvbmZpZ1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L09wZW5Tc2hDb25maWdUZXN0LmphdmEKQEAgLTQzLDYgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRBcnJheUVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CkBAIC04OSwxMSArOTAsMTEgQEAKIAkJb3NjID0gbmV3IE9wZW5Tc2hDb25maWcoaG9tZSwgY29uZmlnRmlsZSk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZyhmaW5hbCBTdHJpbmcgZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgY29uZmlnKFN0cmluZyBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlsb25nIGxhc3RNdGltZSA9IGNvbmZpZ0ZpbGUubGFzdE1vZGlmaWVkKCk7CiAJCWRvIHsKIAkJCXRyeSAoZmluYWwgT3V0cHV0U3RyZWFtV3JpdGVyIGZ3ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcigKLQkJCQkJbmV3IEZpbGVPdXRwdXRTdHJlYW0oY29uZmlnRmlsZSksICJVVEYtOCIpKSB7CisJCQkJCW5ldyBGaWxlT3V0cHV0U3RyZWFtKGNvbmZpZ0ZpbGUpLCBDSEFSU0VUKSkgewogCQkJCWZ3LndyaXRlKGRhdGEpOwogCQkJfQogCQl9IHdoaWxlIChsYXN0TXRpbWUgPT0gY29uZmlnRmlsZS5sYXN0TW9kaWZpZWQoKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tQYXJzZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tQYXJzZXJUZXN0LmphdmEKaW5kZXggNWQ5YmRiZC4uYjZkMDYxMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrUGFyc2VyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja1BhcnNlclRlc3QuamF2YQpAQCAtOTMsOCArOTMsNyBAQAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdDEoKSB0aHJvd3MgIElPRXhjZXB0aW9uIHsKIAkJRmlsZSBwYWNrRmlsZSA9IEpHaXRUZXN0VXRpbC5nZXRUZXN0UmVzb3VyY2VGaWxlKCJwYWNrLTM0YmU5MDMyYWMyODJiMTFmYTliYWJkYzJiMmE5M2NhOTk2YzljMmYucGFjayIpOwotCQlmaW5hbCBJbnB1dFN0cmVhbSBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGFja0ZpbGUpOwotCQl0cnkgeworCQl0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYWNrRmlsZSkpIHsKIAkJCU9iamVjdERpcmVjdG9yeVBhY2tQYXJzZXIgcCA9IChPYmplY3REaXJlY3RvcnlQYWNrUGFyc2VyKSBpbmRleChpcyk7CiAJCQlwLnBhcnNlKE51bGxQcm9ncmVzc01vbml0b3IuSU5TVEFOQ0UpOwogCQkJUGFja0ZpbGUgZmlsZSA9IHAuZ2V0UGFja0ZpbGUoKTsKQEAgLTEwNyw4ICsxMDYsNiBAQAogCQkJYXNzZXJ0VHJ1ZShmaWxlLmhhc09iamVjdChPYmplY3RJZC5mcm9tU3RyaW5nKCI5MDJkNTQ3NmZhMjQ5YjdhYmM5ZDg0YzYxMTU3N2E4MTM4MWYwMzI3IikpKTsKIAkJCWFzc2VydFRydWUoZmlsZS5oYXNPYmplY3QoT2JqZWN0SWQuZnJvbVN0cmluZygiYWFiZjJmZmFlYzliNDk3ZjA5NTAzNTJiM2U1ODJkNzMwMzVjMjAzNSIpKSk7CiAJCQlhc3NlcnRUcnVlKGZpbGUuaGFzT2JqZWN0KE9iamVjdElkLmZyb21TdHJpbmcoImM1OTc1OWYxNDNmYjFmZTIxYzE5Nzk4MWRmNzVhN2VlMDAyOTA3OTkiKSkpOwotCQl9IGZpbmFsbHkgewotCQkJaXMuY2xvc2UoKTsKIAkJfQogCX0KIApAQCAtMTIxLDggKzExOCw3IEBACiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0MigpIHRocm93cyAgSU9FeGNlcHRpb24gewogCQlGaWxlIHBhY2tGaWxlID0gSkdpdFRlc3RVdGlsLmdldFRlc3RSZXNvdXJjZUZpbGUoInBhY2stZGYyOTgyZjI4NGJiYWJiNmJkYjU5ZWUzZmNjNmViMDk4M2UyMDM3MS5wYWNrIik7Ci0JCWZpbmFsIElucHV0U3RyZWFtIGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYWNrRmlsZSk7Ci0JCXRyeSB7CisJCXRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBhY2tGaWxlKSkgewogCQkJT2JqZWN0RGlyZWN0b3J5UGFja1BhcnNlciBwID0gKE9iamVjdERpcmVjdG9yeVBhY2tQYXJzZXIpIGluZGV4KGlzKTsKIAkJCXAucGFyc2UoTnVsbFByb2dyZXNzTW9uaXRvci5JTlNUQU5DRSk7CiAJCQlQYWNrRmlsZSBmaWxlID0gcC5nZXRQYWNrRmlsZSgpOwpAQCAtMTQwLDggKzEzNiw2IEBACiAJCQlhc3NlcnRUcnVlKGZpbGUuaGFzT2JqZWN0KE9iamVjdElkLmZyb21TdHJpbmcoIjIwYThhZGU3NzYzOTQ5MWVhMGJkNjY3YmY5NWRlOGFiZjNhNDM0YzgiKSkpOwogCQkJYXNzZXJ0VHJ1ZShmaWxlLmhhc09iamVjdChPYmplY3RJZC5mcm9tU3RyaW5nKCIyNjc1MTg4ZmQ4Njk3OGQ1YmM0ZDcyMTE2OThiMjExOGFlM2JmNjU4IikpKTsKIAkJCS8vIGFuZCBsb3RzIG1vcmUuLi4KLQkJfSBmaW5hbGx5IHsKLQkJCWlzLmNsb3NlKCk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja2V0TGluZUluVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrZXRMaW5lSW5UZXN0LmphdmEKaW5kZXggMTNmYzY4ZC4uOGIxZDg2MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrZXRMaW5lSW5UZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrZXRMaW5lSW5UZXN0LmphdmEKQEAgLTExNiwxNyArMTE2LDYgQEAKIAl9CiAKIAlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RSZWFkU3RyaW5nX0xlbjAwMDEoKSB7Ci0JCWluaXQoIjAwMDEiKTsKLQkJdHJ5IHsKLQkJCWluLnJlYWRTdHJpbmcoKTsKLQkJCWZhaWwoImluY29ycmVjdGx5IGFjY2VwdGVkIGludmFsaWQgcGFja2V0IGhlYWRlciIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkludmFsaWQgcGFja2V0IGxpbmUgaGVhZGVyOiAwMDAxIiwgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UmVhZFN0cmluZ19MZW4wMDAyKCkgewogCQlpbml0KCIwMDAyIik7CiAJCXRyeSB7CkBAIC0xNjQsNiArMTUzLDEzIEBACiAJCWFzc2VydEVPRigpOwogCX0KIAorCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFJlYWRTdHJpbmdfRGVsaW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpbml0KCIwMDAxIik7CisJCWFzc2VydFNhbWUoUGFja2V0TGluZUluLkRFTElNLCBpbi5yZWFkU3RyaW5nKCkpOworCQlhc3NlcnRFT0YoKTsKKwl9CisKIAkvLyByZWFkU3RyaW5nTm9MRgogCiAJQFRlc3QKQEAgLTMzMCw3ICszMjYsNyBAQAogCiAJLy8gdGVzdCBzdXBwb3J0CiAKLQlwcml2YXRlIHZvaWQgaW5pdChmaW5hbCBTdHJpbmcgbXNnKSB7CisJcHJpdmF0ZSB2b2lkIGluaXQoU3RyaW5nIG1zZykgewogCQlyYXdJbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShDb25zdGFudHMuZW5jb2RlQVNDSUkobXNnKSk7CiAJCWluID0gbmV3IFBhY2tldExpbmVJbihyYXdJbik7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrZXRMaW5lT3V0VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrZXRMaW5lT3V0VGVzdC5qYXZhCmluZGV4IGVjYTU0NzUuLjM5MWE3MDEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja2V0TGluZU91dFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tldExpbmVPdXRUZXN0LmphdmEKQEAgLTExMyw2ICsxMTMsMTIgQEAKIAkJYXNzZXJ0RXF1YWxzKDEsIGZsdXNoQ250WzBdKTsKIAl9CiAKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RXcml0ZURlbGltKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJb3V0LndyaXRlRGVsaW0oKTsKKwkJYXNzZXJ0QnVmZmVyKCIwMDAxIik7CisJfQorCiAJLy8gd3JpdGVQYWNrZXQKIAogCUBUZXN0CkBAIC0xNjcsNyArMTczLDcgQEAKIAkJYXNzZXJ0RXF1YWxzKDEsIGZsdXNoQ250WzBdKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgYXNzZXJ0QnVmZmVyKGZpbmFsIFN0cmluZyBleHApIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIGFzc2VydEJ1ZmZlcihTdHJpbmcgZXhwKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlhc3NlcnRFcXVhbHMoZXhwLCBuZXcgU3RyaW5nKHJhd091dC50b0J5dGVBcnJheSgpLAogCQkJCUNvbnN0YW50cy5DSEFSQUNURVJfRU5DT0RJTkcpKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hDb25uZWN0aW9uVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoQ29ubmVjdGlvblRlc3QuamF2YQppbmRleCBjMTZjMWIyLi42MzQ3OGY2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hDb25uZWN0aW9uVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaENvbm5lY3Rpb25UZXN0LmphdmEKQEAgLTUxLDEyICs1MSwxNiBAQAogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5UcmFuc3BvcnRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmcy5EZnNSZXBvc2l0b3J5RGVzY3JpcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmcy5Jbk1lbW9yeVJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5UZXN0UmVwb3NpdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuTnVsbFByb2dyZXNzTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKQEAgLTc2LDYgKzgwLDcgQEAKIAlwcml2YXRlIE9iamVjdCBjdHggPSBuZXcgT2JqZWN0KCk7CiAJcHJpdmF0ZSBJbk1lbW9yeVJlcG9zaXRvcnkgc2VydmVyOwogCXByaXZhdGUgSW5NZW1vcnlSZXBvc2l0b3J5IGNsaWVudDsKKwlwcml2YXRlIExpc3Q8U3RyaW5nPiBwcm9jZXNzZWRSZWZzOwogCXByaXZhdGUgT2JqZWN0SWQgb2JqMTsKIAlwcml2YXRlIE9iamVjdElkIG9iajI7CiAJcHJpdmF0ZSBPYmplY3RJZCBvYmozOwpAQCAtODUsNiArOTAsNyBAQAogCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXNlcnZlciA9IG5ld1JlcG8oInNlcnZlciIpOwogCQljbGllbnQgPSBuZXdSZXBvKCJjbGllbnQiKTsKKwkJcHJvY2Vzc2VkUmVmcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCQl0ZXN0UHJvdG9jb2wgPSBuZXcgVGVzdFByb3RvY29sPD4oCiAJCQkJbnVsbCwKIAkJCQluZXcgUmVjZWl2ZVBhY2tGYWN0b3J5PE9iamVjdD4oKSB7CkBAIC05Miw3ICs5OCwxOCBAQAogCQkJCQlwdWJsaWMgUmVjZWl2ZVBhY2sgY3JlYXRlKE9iamVjdCByZXEsIFJlcG9zaXRvcnkgZGIpCiAJCQkJCQkJdGhyb3dzIFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uLAogCQkJCQkJCVNlcnZpY2VOb3RBdXRob3JpemVkRXhjZXB0aW9uIHsKLQkJCQkJCXJldHVybiBuZXcgUmVjZWl2ZVBhY2soZGIpOworCQkJCQkJUmVjZWl2ZVBhY2sgcnAgPSBuZXcgUmVjZWl2ZVBhY2soZGIpOworCQkJCQkJcnAuc2V0UHJlUmVjZWl2ZUhvb2soCisJCQkJCQkJCW5ldyBQcmVSZWNlaXZlSG9vaygpIHsKKwkJCQkJCQkJCUBPdmVycmlkZQorCQkJCQkJCQkJcHVibGljIHZvaWQgb25QcmVSZWNlaXZlKFJlY2VpdmVQYWNrIHJlY2VpdmVQYWNrLAorCQkJCQkJCQkJCQlDb2xsZWN0aW9uPFJlY2VpdmVDb21tYW5kPiBjbWRzKSB7CisJCQkJCQkJCQkJZm9yIChSZWNlaXZlQ29tbWFuZCBjbWQgOiBjbWRzKSB7CisJCQkJCQkJCQkJCXByb2Nlc3NlZFJlZnMuYWRkKGNtZC5nZXRSZWZOYW1lKCkpOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKwkJCQkJCQkJfSk7CisJCQkJCQlyZXR1cm4gcnA7CiAJCQkJCX0KIAkJCQl9KTsKIAkJdXJpID0gdGVzdFByb3RvY29sLnJlZ2lzdGVyKGN0eCwgc2VydmVyKTsKQEAgLTE5Niw0ICsyMTMsNDUgQEAKIAkJCX0KIAkJfQogCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY29tbWFuZE9yZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVRlc3RSZXBvc2l0b3J5PD8+IHRyID0gbmV3IFRlc3RSZXBvc2l0b3J5PD4oY2xpZW50KTsKKwkJTGlzdDxSZW1vdGVSZWZVcGRhdGU+IHVwZGF0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJLy8gQXJiaXRyYXJ5IG5vbi1zb3J0ZWQgb3JkZXIuCisJCWZvciAoaW50IGkgPSA5OyBpID49IDA7IGktLSkgeworCQkJU3RyaW5nIG5hbWUgPSAicmVmcy9oZWFkcy9iIiArIGk7CisJCQl0ci5icmFuY2gobmFtZSkuY29tbWl0KCkuY3JlYXRlKCk7CisJCQlSZW1vdGVSZWZVcGRhdGUgcnJ1ID0gbmV3IFJlbW90ZVJlZlVwZGF0ZShjbGllbnQsIG5hbWUsIG5hbWUsIGZhbHNlLCBudWxsLAorCQkJCQlPYmplY3RJZC56ZXJvSWQoKSk7CisJCQl1cGRhdGVzLmFkZChycnUpOworCQl9CisKKwkJUHVzaFJlc3VsdCByZXN1bHQ7CisJCXRyeSAoVHJhbnNwb3J0IHRuID0gdGVzdFByb3RvY29sLm9wZW4odXJpLCBjbGllbnQsICJzZXJ2ZXIiKSkgeworCQkJcmVzdWx0ID0gdG4ucHVzaChOdWxsUHJvZ3Jlc3NNb25pdG9yLklOU1RBTkNFLCB1cGRhdGVzKTsKKwkJfQorCisJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHJlbW90ZVVwZGF0ZSA6IHJlc3VsdC5nZXRSZW1vdGVVcGRhdGVzKCkpIHsKKwkJCWFzc2VydEVxdWFscygKKwkJCQkJInVwZGF0ZSBzaG91bGQgc3VjY2VlZCBvbiAiICsgcmVtb3RlVXBkYXRlLmdldFJlbW90ZU5hbWUoKSwKKwkJCQkJUmVtb3RlUmVmVXBkYXRlLlN0YXR1cy5PSywgcmVtb3RlVXBkYXRlLmdldFN0YXR1cygpKTsKKwkJfQorCisJCUxpc3Q8U3RyaW5nPiBleHBlY3RlZCA9IHJlbW90ZVJlZk5hbWVzKHVwZGF0ZXMpOworCQlhc3NlcnRFcXVhbHMoCisJCQkJInJlZiBuYW1lcyBwcm9jZXNzZWQgYnkgUmVjZWl2ZVBhY2sgc2hvdWxkIG1hdGNoIGlucHV0IHJlZiBuYW1lcyBpbiBvcmRlciIsCisJCQkJZXhwZWN0ZWQsIHByb2Nlc3NlZFJlZnMpOworCQlhc3NlcnRFcXVhbHMoCisJCQkJInJlbW90ZSByZWYgbmFtZXMgc2hvdWxkIG1hdGNoIGlucHV0IHJlZiBuYW1lcyBpbiBvcmRlciIsCisJCQkJZXhwZWN0ZWQsIHJlbW90ZVJlZk5hbWVzKHJlc3VsdC5nZXRSZW1vdGVVcGRhdGVzKCkpKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gcmVtb3RlUmVmTmFtZXMoQ29sbGVjdGlvbjxSZW1vdGVSZWZVcGRhdGU+IHVwZGF0ZXMpIHsKKwkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSB1IDogdXBkYXRlcykgeworCQkJcmVzdWx0LmFkZCh1LmdldFJlbW90ZU5hbWUoKSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hQcm9jZXNzVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoUHJvY2Vzc1Rlc3QuamF2YQppbmRleCAxMDRhNjljLi42MTFjZDBjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hQcm9jZXNzVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaFByb2Nlc3NUZXN0LmphdmEKQEAgLTQyMiw3ICs0MjIsNyBAQAogCQkJUHVzaENvbm5lY3Rpb24gewogCQlNb2NrUHVzaENvbm5lY3Rpb24oKSB7CiAJCQlmaW5hbCBNYXA8U3RyaW5nLCBSZWY+IHJlZnNNYXAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0JCQlmb3IgKGZpbmFsIFJlZiByIDogYWR2ZXJ0aXNlZFJlZnMpCisJCQlmb3IgKFJlZiByIDogYWR2ZXJ0aXNlZFJlZnMpCiAJCQkJcmVmc01hcC5wdXQoci5nZXROYW1lKCksIHIpOwogCQkJYXZhaWxhYmxlKHJlZnNNYXApOwogCQl9CkBAIC00NDMsNyArNDQzLDcgQEAKIAkJcHVibGljIHZvaWQgcHVzaChQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKIAkJCQlNYXA8U3RyaW5nLCBSZW1vdGVSZWZVcGRhdGU+IHJlZnNUb1VwZGF0ZSkKIAkJCQl0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKLQkJCWZvciAoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHJydSA6IHJlZnNUb1VwZGF0ZS52YWx1ZXMoKSkgeworCQkJZm9yIChSZW1vdGVSZWZVcGRhdGUgcnJ1IDogcmVmc1RvVXBkYXRlLnZhbHVlcygpKSB7CiAJCQkJYXNzZXJ0RXF1YWxzKFN0YXR1cy5OT1RfQVRURU1QVEVELCBycnUuZ2V0U3RhdHVzKCkpOwogCQkJCXJydS5zZXRTdGF0dXMoY29ubmVjdGlvblVwZGF0ZVN0YXR1cyk7CiAJCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlY2VpdmVQYWNrQWR2ZXJ0aXNlUmVmc0hvb2tUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlY2VpdmVQYWNrQWR2ZXJ0aXNlUmVmc0hvb2tUZXN0LmphdmEKaW5kZXggOGVmODdjYi4uYjc3MDQyMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWNlaXZlUGFja0FkdmVydGlzZVJlZnNIb29rVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVjZWl2ZVBhY2tBZHZlcnRpc2VSZWZzSG9va1Rlc3QuamF2YQpAQCAtMTM2LDcgKzEzNiw3IEBACiAJCXRyeSAoVHJhbnNwb3J0TG9jYWwgdCA9IG5ldyBUcmFuc3BvcnRMb2NhbChzcmMsIHVyaU9mKGRzdCksCiAJCQkJZHN0LmdldERpcmVjdG9yeSgpKSB7CiAJCQlAT3ZlcnJpZGUKLQkJCVJlY2VpdmVQYWNrIGNyZWF0ZVJlY2VpdmVQYWNrKGZpbmFsIFJlcG9zaXRvcnkgZGIpIHsKKwkJCVJlY2VpdmVQYWNrIGNyZWF0ZVJlY2VpdmVQYWNrKFJlcG9zaXRvcnkgZGIpIHsKIAkJCQlkYi5jbG9zZSgpOwogCQkJCWRzdC5pbmNyZW1lbnRPcGVuKCk7CiAKQEAgLTE5OSw2ICsxOTksMjMgQEAKIAkJYXNzZXJ0RmFsc2UoaGF2ZXMuZ2V0KCkuY29udGFpbnMoUCkpOwogCX0KIAorCXByaXZhdGUgVHJhbnNwb3J0TG9jYWwgbmV3VHJhbnNwb3J0TG9jYWxXaXRoU3RyaWN0VmFsaWRhdGlvbigpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIG5ldyBUcmFuc3BvcnRMb2NhbChzcmMsIHVyaU9mKGRzdCksIGRzdC5nZXREaXJlY3RvcnkoKSkgeworCQkJQE92ZXJyaWRlCisJCQlSZWNlaXZlUGFjayBjcmVhdGVSZWNlaXZlUGFjayhSZXBvc2l0b3J5IGRiKSB7CisJCQkJZGIuY2xvc2UoKTsKKwkJCQlkc3QuaW5jcmVtZW50T3BlbigpOworCisJCQkJZmluYWwgUmVjZWl2ZVBhY2sgcnAgPSBzdXBlci5jcmVhdGVSZWNlaXZlUGFjayhkc3QpOworCQkJCXJwLnNldENoZWNrUmVjZWl2ZWRPYmplY3RzKHRydWUpOworCQkJCXJwLnNldENoZWNrUmVmZXJlbmNlZE9iamVjdHNBcmVSZWFjaGFibGUodHJ1ZSk7CisJCQkJcnAuc2V0QWR2ZXJ0aXNlUmVmc0hvb2sobmV3IEhpZGVQcml2YXRlSG9vaygpKTsKKwkJCQlyZXR1cm4gcnA7CisJCQl9CisJCX07CisJfQorCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0U3VjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewogCQkvLyBNYW51YWxseSBmb3JjZSBhIGRlbHRhIG9mIGFuIG9iamVjdCBzbyB3ZSByZXVzZSBpdCBsYXRlci4KQEAgLTIzMCwxOSArMjQ3LDcgQEAKIAogCQkvLyBQdXNoIHRoaXMgbmV3IGNvbnRlbnQgdG8gdGhlIHJlbW90ZSwgZG9pbmcgc3RyaWN0IHZhbGlkYXRpb24uCiAJCS8vCi0JCVRyYW5zcG9ydExvY2FsIHQgPSBuZXcgVHJhbnNwb3J0TG9jYWwoc3JjLCB1cmlPZihkc3QpLCBkc3QuZ2V0RGlyZWN0b3J5KCkpIHsKLQkJCUBPdmVycmlkZQotCQkJUmVjZWl2ZVBhY2sgY3JlYXRlUmVjZWl2ZVBhY2soZmluYWwgUmVwb3NpdG9yeSBkYikgewotCQkJCWRiLmNsb3NlKCk7Ci0JCQkJZHN0LmluY3JlbWVudE9wZW4oKTsKLQotCQkJCWZpbmFsIFJlY2VpdmVQYWNrIHJwID0gc3VwZXIuY3JlYXRlUmVjZWl2ZVBhY2soZHN0KTsKLQkJCQlycC5zZXRDaGVja1JlY2VpdmVkT2JqZWN0cyh0cnVlKTsKLQkJCQlycC5zZXRDaGVja1JlZmVyZW5jZWRPYmplY3RzQXJlUmVhY2hhYmxlKHRydWUpOwotCQkJCXJwLnNldEFkdmVydGlzZVJlZnNIb29rKG5ldyBIaWRlUHJpdmF0ZUhvb2soKSk7Ci0JCQkJcmV0dXJuIHJwOwotCQkJfQotCQl9OworCQlQdXNoUmVzdWx0IHI7CiAJCVJlbW90ZVJlZlVwZGF0ZSB1ID0gbmV3IFJlbW90ZVJlZlVwZGF0ZSggLy8KIAkJCQlzcmMsIC8vCiAJCQkJUl9NQVNURVIsIC8vIHNyYyBuYW1lCkBAIC0yNTEsMTIgKzI1Niw5IEBACiAJCQkJbnVsbCwgLy8gbG9jYWwgdHJhY2tpbmcgYnJhbmNoCiAJCQkJbnVsbCAvLyBleHBlY3RlZCBpZAogCQkpOwotCQlQdXNoUmVzdWx0IHI7Ci0JCXRyeSB7CisJCXRyeSAoVHJhbnNwb3J0TG9jYWwgdCA9IG5ld1RyYW5zcG9ydExvY2FsV2l0aFN0cmljdFZhbGlkYXRpb24oKSkgewogCQkJdC5zZXRQdXNoVGhpbih0cnVlKTsKIAkJCXIgPSB0LnB1c2goUE0sIENvbGxlY3Rpb25zLnNpbmdsZXRvbih1KSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0LmNsb3NlKCk7CiAJCX0KIAogCQlhc3NlcnROb3ROdWxsKCJoYXZlIHJlc3VsdCIsIHIpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZW1vdGVDb25maWdUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlbW90ZUNvbmZpZ1Rlc3QuamF2YQppbmRleCBhMGNmMGQyLi45YWFiZDcxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlbW90ZUNvbmZpZ1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlbW90ZUNvbmZpZ1Rlc3QuamF2YQpAQCAtNjcsMTIgKzY3LDEyIEBACiAJCWNvbmZpZyA9IG5ldyBDb25maWcoKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgcmVhZENvbmZpZyhmaW5hbCBTdHJpbmcgZGF0KSB0aHJvd3MgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIHJlYWRDb25maWcoU3RyaW5nIGRhdCkgdGhyb3dzIENvbmZpZ0ludmFsaWRFeGNlcHRpb24gewogCQljb25maWcgPSBuZXcgQ29uZmlnKCk7CiAJCWNvbmZpZy5mcm9tVGV4dChkYXQpOwogCX0KIAotCXByaXZhdGUgdm9pZCBjaGVja0NvbmZpZyhmaW5hbCBTdHJpbmcgZXhwKSB7CisJcHJpdmF0ZSB2b2lkIGNoZWNrQ29uZmlnKFN0cmluZyBleHApIHsKIAkJYXNzZXJ0RXF1YWxzKGV4cCwgY29uZmlnLnRvVGV4dCgpKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU2lkZUJhbmRPdXRwdXRTdHJlYW1UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NpZGVCYW5kT3V0cHV0U3RyZWFtVGVzdC5qYXZhCmluZGV4IDQ1NzE2MTkuLjRkM2UxNjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU2lkZUJhbmRPdXRwdXRTdHJlYW1UZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9TaWRlQmFuZE91dHB1dFN0cmVhbVRlc3QuamF2YQpAQCAtMjU5LDcgKzI1OSw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgYXNzZXJ0QnVmZmVyKGZpbmFsIFN0cmluZyBleHApIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIGFzc2VydEJ1ZmZlcihTdHJpbmcgZXhwKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlhc3NlcnRFcXVhbHMoZXhwLCBuZXcgU3RyaW5nKHJhd091dC50b0J5dGVBcnJheSgpLAogCQkJCUNvbnN0YW50cy5DSEFSQUNURVJfRU5DT0RJTkcpKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0VGVzdC5qYXZhCmluZGV4IGQ0YzQ3ZDMuLmMyMzk5MjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0VGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0VGVzdC5qYXZhCkBAIC0xNDIsNyArMTQyLDcgQEAKIAkJYXNzZXJ0RXF1YWxzKDEyLCByZXN1bHQuc2l6ZSgpKTsKIAkJYm9vbGVhbiBmb3VuZEEgPSBmYWxzZTsKIAkJYm9vbGVhbiBmb3VuZEIgPSBmYWxzZTsKLQkJZm9yIChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgcnJ1IDogcmVzdWx0KSB7CisJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHJydSA6IHJlc3VsdCkgewogCQkJaWYgKCJyZWZzL2hlYWRzL2EiLmVxdWFscyhycnUuZ2V0U3JjUmVmKCkpCiAJCQkJCSYmICJyZWZzL2hlYWRzL3Rlc3QvYSIuZXF1YWxzKHJydS5nZXRSZW1vdGVOYW1lKCkpKQogCQkJCWZvdW5kQSA9IHRydWU7CkBAIC0xNzQsNyArMTc0LDcgQEAKIAkJYXNzZXJ0RXF1YWxzKDIsIHJlc3VsdC5zaXplKCkpOwogCQlib29sZWFuIGZvdW5kQSA9IGZhbHNlOwogCQlib29sZWFuIGZvdW5kQyA9IGZhbHNlOwotCQlmb3IgKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSBycnUgOiByZXN1bHQpIHsKKwkJZm9yIChSZW1vdGVSZWZVcGRhdGUgcnJ1IDogcmVzdWx0KSB7CiAJCQlpZiAoInJlZnMvaGVhZHMvYSIuZXF1YWxzKHJydS5nZXRTcmNSZWYoKSkKIAkJCQkJJiYgInJlZnMvaGVhZHMvYiIuZXF1YWxzKHJydS5nZXRSZW1vdGVOYW1lKCkpKQogCQkJCWZvdW5kQSA9IHRydWU7CkBAIC0yMzMsNyArMjMzLDcgQEAKIAkJYXNzZXJ0RXF1YWxzKDIsIHJlc3VsdC5zaXplKCkpOwogCQlib29sZWFuIGZvdW5kQSA9IGZhbHNlOwogCQlib29sZWFuIGZvdW5kQyA9IGZhbHNlOwotCQlmb3IgKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSBycnUgOiByZXN1bHQpIHsKKwkJZm9yIChSZW1vdGVSZWZVcGRhdGUgcnJ1IDogcmVzdWx0KSB7CiAJCQlpZiAoInJlZnMvaGVhZHMvYSIuZXF1YWxzKHJydS5nZXRTcmNSZWYoKSkKIAkJCQkJJiYgInJlZnMvaGVhZHMvYiIuZXF1YWxzKHJydS5nZXRSZW1vdGVOYW1lKCkpKSB7CiAJCQkJZm91bmRBID0gdHJ1ZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVXBsb2FkUGFja1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVXBsb2FkUGFja1Rlc3QuamF2YQppbmRleCBhODEyN2FiLi5lZjA4M2RhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VwbG9hZFBhY2tUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VcGxvYWRQYWNrVGVzdC5qYXZhCkBAIC0xLDIyICsxLDQxIEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0OwogCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5oYXNJdGVtczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMudGhlSW5zdGFuY2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuUGFja1Byb3RvY29sRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlRyYW5zcG9ydEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZGZzLkRmc0dhcmJhZ2VDb2xsZWN0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmcy5EZnNSZXBvc2l0b3J5RGVzY3JpcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmcy5Jbk1lbW9yeVJlcG9zaXRvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5UZXN0UmVwb3NpdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5OdWxsUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5TZXRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlRleHRQcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkJsb2I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2VHJlZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2VGFnOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlVwbG9hZFBhY2suUmVxdWVzdFBvbGljeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlci5TZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlci5TZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlci5VcGxvYWRQYWNrRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW8uTnVsbE91dHB1dFN0cmVhbTsKIGltcG9ydCBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnM7CiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CkBAIC0xNzAsNCArMTg5LDg5OSBAQAogCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG5ldyBSZWZTcGVjKGJsb2IubmFtZSgpKSkpOwogCQl9CiAJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RmV0Y2hXaXRoQmxvYk5vbmVGaWx0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSW5NZW1vcnlSZXBvc2l0b3J5IHNlcnZlcjIgPSBuZXdSZXBvKCJzZXJ2ZXIyIik7CisJCVRlc3RSZXBvc2l0b3J5PEluTWVtb3J5UmVwb3NpdG9yeT4gcmVtb3RlMiA9CisJCQkJbmV3IFRlc3RSZXBvc2l0b3J5PD4oc2VydmVyMik7CisJCVJldkJsb2IgYmxvYjEgPSByZW1vdGUyLmJsb2IoImZvb2JhciIpOworCQlSZXZCbG9iIGJsb2IyID0gcmVtb3RlMi5ibG9iKCJmb29iYSIpOworCQlSZXZUcmVlIHRyZWUgPSByZW1vdGUyLnRyZWUocmVtb3RlMi5maWxlKCIxIiwgYmxvYjEpLAorCQkJCXJlbW90ZTIuZmlsZSgiMiIsIGJsb2IyKSk7CisJCVJldkNvbW1pdCBjb21taXQgPSByZW1vdGUyLmNvbW1pdCh0cmVlKTsKKwkJcmVtb3RlMi51cGRhdGUoIm1hc3RlciIsIGNvbW1pdCk7CisKKwkJc2VydmVyMi5nZXRDb25maWcoKS5zZXRCb29sZWFuKCJ1cGxvYWRwYWNrIiwgbnVsbCwgImFsbG93ZmlsdGVyIiwgdHJ1ZSk7CisKKwkJdGVzdFByb3RvY29sID0gbmV3IFRlc3RQcm90b2NvbDw+KAorCQkJCW5ldyBVcGxvYWRQYWNrRmFjdG9yeTxPYmplY3Q+KCkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIFVwbG9hZFBhY2sgY3JlYXRlKE9iamVjdCByZXEsIFJlcG9zaXRvcnkgZGIpCisJCQkJCQkJdGhyb3dzIFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uLAorCQkJCQkJCVNlcnZpY2VOb3RBdXRob3JpemVkRXhjZXB0aW9uIHsKKwkJCQkJCVVwbG9hZFBhY2sgdXAgPSBuZXcgVXBsb2FkUGFjayhkYik7CisJCQkJCQlyZXR1cm4gdXA7CisJCQkJCX0KKwkJCQl9LCBudWxsKTsKKwkJdXJpID0gdGVzdFByb3RvY29sLnJlZ2lzdGVyKGN0eCwgc2VydmVyMik7CisKKwkJdHJ5IChUcmFuc3BvcnQgdG4gPSB0ZXN0UHJvdG9jb2wub3Blbih1cmksIGNsaWVudCwgInNlcnZlcjIiKSkgeworCQkJdG4uc2V0RmlsdGVyQmxvYkxpbWl0KDApOworCQkJdG4uZmV0Y2goTnVsbFByb2dyZXNzTW9uaXRvci5JTlNUQU5DRSwKKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChuZXcgUmVmU3BlYyhjb21taXQubmFtZSgpKSkpOworCQkJYXNzZXJ0VHJ1ZShjbGllbnQuaGFzT2JqZWN0KHRyZWUudG9PYmplY3RJZCgpKSk7CisJCQlhc3NlcnRGYWxzZShjbGllbnQuaGFzT2JqZWN0KGJsb2IxLnRvT2JqZWN0SWQoKSkpOworCQkJYXNzZXJ0RmFsc2UoY2xpZW50Lmhhc09iamVjdChibG9iMi50b09iamVjdElkKCkpKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEZldGNoV2l0aEJsb2JMaW1pdEZpbHRlcigpIHRocm93cyBFeGNlcHRpb24geworCQlJbk1lbW9yeVJlcG9zaXRvcnkgc2VydmVyMiA9IG5ld1JlcG8oInNlcnZlcjIiKTsKKwkJVGVzdFJlcG9zaXRvcnk8SW5NZW1vcnlSZXBvc2l0b3J5PiByZW1vdGUyID0KKwkJCQluZXcgVGVzdFJlcG9zaXRvcnk8PihzZXJ2ZXIyKTsKKwkJUmV2QmxvYiBsb25nQmxvYiA9IHJlbW90ZTIuYmxvYigiZm9vYmFyIik7CisJCVJldkJsb2Igc2hvcnRCbG9iID0gcmVtb3RlMi5ibG9iKCJmb29iYSIpOworCQlSZXZUcmVlIHRyZWUgPSByZW1vdGUyLnRyZWUocmVtb3RlMi5maWxlKCIxIiwgbG9uZ0Jsb2IpLAorCQkJCXJlbW90ZTIuZmlsZSgiMiIsIHNob3J0QmxvYikpOworCQlSZXZDb21taXQgY29tbWl0ID0gcmVtb3RlMi5jb21taXQodHJlZSk7CisJCXJlbW90ZTIudXBkYXRlKCJtYXN0ZXIiLCBjb21taXQpOworCisJCXNlcnZlcjIuZ2V0Q29uZmlnKCkuc2V0Qm9vbGVhbigidXBsb2FkcGFjayIsIG51bGwsICJhbGxvd2ZpbHRlciIsIHRydWUpOworCisJCXRlc3RQcm90b2NvbCA9IG5ldyBUZXN0UHJvdG9jb2w8PigKKwkJCQluZXcgVXBsb2FkUGFja0ZhY3Rvcnk8T2JqZWN0PigpIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyBVcGxvYWRQYWNrIGNyZWF0ZShPYmplY3QgcmVxLCBSZXBvc2l0b3J5IGRiKQorCQkJCQkJCXRocm93cyBTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbiwKKwkJCQkJCQlTZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbiB7CisJCQkJCQlVcGxvYWRQYWNrIHVwID0gbmV3IFVwbG9hZFBhY2soZGIpOworCQkJCQkJcmV0dXJuIHVwOworCQkJCQl9CisJCQkJfSwgbnVsbCk7CisJCXVyaSA9IHRlc3RQcm90b2NvbC5yZWdpc3RlcihjdHgsIHNlcnZlcjIpOworCisJCXRyeSAoVHJhbnNwb3J0IHRuID0gdGVzdFByb3RvY29sLm9wZW4odXJpLCBjbGllbnQsICJzZXJ2ZXIyIikpIHsKKwkJCXRuLnNldEZpbHRlckJsb2JMaW1pdCg1KTsKKwkJCXRuLmZldGNoKE51bGxQcm9ncmVzc01vbml0b3IuSU5TVEFOQ0UsCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobmV3IFJlZlNwZWMoY29tbWl0Lm5hbWUoKSkpKTsKKwkJCWFzc2VydEZhbHNlKGNsaWVudC5oYXNPYmplY3QobG9uZ0Jsb2IudG9PYmplY3RJZCgpKSk7CisJCQlhc3NlcnRUcnVlKGNsaWVudC5oYXNPYmplY3Qoc2hvcnRCbG9iLnRvT2JqZWN0SWQoKSkpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RmV0Y2hXaXRoQmxvYkxpbWl0RmlsdGVyQW5kQml0bWFwcygpIHRocm93cyBFeGNlcHRpb24geworCQlJbk1lbW9yeVJlcG9zaXRvcnkgc2VydmVyMiA9IG5ld1JlcG8oInNlcnZlcjIiKTsKKwkJVGVzdFJlcG9zaXRvcnk8SW5NZW1vcnlSZXBvc2l0b3J5PiByZW1vdGUyID0KKwkJCQluZXcgVGVzdFJlcG9zaXRvcnk8PihzZXJ2ZXIyKTsKKwkJUmV2QmxvYiBsb25nQmxvYiA9IHJlbW90ZTIuYmxvYigiZm9vYmFyIik7CisJCVJldkJsb2Igc2hvcnRCbG9iID0gcmVtb3RlMi5ibG9iKCJmb29iYSIpOworCQlSZXZUcmVlIHRyZWUgPSByZW1vdGUyLnRyZWUocmVtb3RlMi5maWxlKCIxIiwgbG9uZ0Jsb2IpLAorCQkJCXJlbW90ZTIuZmlsZSgiMiIsIHNob3J0QmxvYikpOworCQlSZXZDb21taXQgY29tbWl0ID0gcmVtb3RlMi5jb21taXQodHJlZSk7CisJCXJlbW90ZTIudXBkYXRlKCJtYXN0ZXIiLCBjb21taXQpOworCisJCXNlcnZlcjIuZ2V0Q29uZmlnKCkuc2V0Qm9vbGVhbigidXBsb2FkcGFjayIsIG51bGwsICJhbGxvd2ZpbHRlciIsIHRydWUpOworCisJCS8vIGdlbmVyYXRlIGJpdG1hcHMKKwkJbmV3IERmc0dhcmJhZ2VDb2xsZWN0b3Ioc2VydmVyMikucGFjayhudWxsKTsKKwkJc2VydmVyMi5zY2FuRm9yUmVwb0NoYW5nZXMoKTsKKworCQl0ZXN0UHJvdG9jb2wgPSBuZXcgVGVzdFByb3RvY29sPD4oCisJCQkJbmV3IFVwbG9hZFBhY2tGYWN0b3J5PE9iamVjdD4oKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgVXBsb2FkUGFjayBjcmVhdGUoT2JqZWN0IHJlcSwgUmVwb3NpdG9yeSBkYikKKwkJCQkJCQl0aHJvd3MgU2VydmljZU5vdEVuYWJsZWRFeGNlcHRpb24sCisJCQkJCQkJU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb24geworCQkJCQkJVXBsb2FkUGFjayB1cCA9IG5ldyBVcGxvYWRQYWNrKGRiKTsKKwkJCQkJCXJldHVybiB1cDsKKwkJCQkJfQorCQkJCX0sIG51bGwpOworCQl1cmkgPSB0ZXN0UHJvdG9jb2wucmVnaXN0ZXIoY3R4LCBzZXJ2ZXIyKTsKKworCQl0cnkgKFRyYW5zcG9ydCB0biA9IHRlc3RQcm90b2NvbC5vcGVuKHVyaSwgY2xpZW50LCAic2VydmVyMiIpKSB7CisJCQl0bi5zZXRGaWx0ZXJCbG9iTGltaXQoNSk7CisJCQl0bi5mZXRjaChOdWxsUHJvZ3Jlc3NNb25pdG9yLklOU1RBTkNFLAorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG5ldyBSZWZTcGVjKGNvbW1pdC5uYW1lKCkpKSk7CisJCQlhc3NlcnRGYWxzZShjbGllbnQuaGFzT2JqZWN0KGxvbmdCbG9iLnRvT2JqZWN0SWQoKSkpOworCQkJYXNzZXJ0VHJ1ZShjbGllbnQuaGFzT2JqZWN0KHNob3J0QmxvYi50b09iamVjdElkKCkpKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEZldGNoV2l0aE5vblN1cHBvcnRpbmdTZXJ2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSW5NZW1vcnlSZXBvc2l0b3J5IHNlcnZlcjIgPSBuZXdSZXBvKCJzZXJ2ZXIyIik7CisJCVRlc3RSZXBvc2l0b3J5PEluTWVtb3J5UmVwb3NpdG9yeT4gcmVtb3RlMiA9CisJCQkJbmV3IFRlc3RSZXBvc2l0b3J5PD4oc2VydmVyMik7CisJCVJldkJsb2IgYmxvYiA9IHJlbW90ZTIuYmxvYigiZm9vIik7CisJCVJldlRyZWUgdHJlZSA9IHJlbW90ZTIudHJlZShyZW1vdGUyLmZpbGUoIjEiLCBibG9iKSk7CisJCVJldkNvbW1pdCBjb21taXQgPSByZW1vdGUyLmNvbW1pdCh0cmVlKTsKKwkJcmVtb3RlMi51cGRhdGUoIm1hc3RlciIsIGNvbW1pdCk7CisKKwkJc2VydmVyMi5nZXRDb25maWcoKS5zZXRCb29sZWFuKCJ1cGxvYWRwYWNrIiwgbnVsbCwgImFsbG93ZmlsdGVyIiwgZmFsc2UpOworCisJCXRlc3RQcm90b2NvbCA9IG5ldyBUZXN0UHJvdG9jb2w8PigKKwkJCQluZXcgVXBsb2FkUGFja0ZhY3Rvcnk8T2JqZWN0PigpIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyBVcGxvYWRQYWNrIGNyZWF0ZShPYmplY3QgcmVxLCBSZXBvc2l0b3J5IGRiKQorCQkJCQkJCXRocm93cyBTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbiwKKwkJCQkJCQlTZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbiB7CisJCQkJCQlVcGxvYWRQYWNrIHVwID0gbmV3IFVwbG9hZFBhY2soZGIpOworCQkJCQkJcmV0dXJuIHVwOworCQkJCQl9CisJCQkJfSwgbnVsbCk7CisJCXVyaSA9IHRlc3RQcm90b2NvbC5yZWdpc3RlcihjdHgsIHNlcnZlcjIpOworCisJCXRyeSAoVHJhbnNwb3J0IHRuID0gdGVzdFByb3RvY29sLm9wZW4odXJpLCBjbGllbnQsICJzZXJ2ZXIyIikpIHsKKwkJCXRuLnNldEZpbHRlckJsb2JMaW1pdCgwKTsKKworCQkJdGhyb3duLmV4cGVjdChUcmFuc3BvcnRFeGNlcHRpb24uY2xhc3MpOworCQkJdGhyb3duLmV4cGVjdE1lc3NhZ2UoImZpbHRlciByZXF1aXJlcyBzZXJ2ZXIgdG8gYWR2ZXJ0aXNlIHRoYXQgY2FwYWJpbGl0eSIpOworCisJCQl0bi5mZXRjaChOdWxsUHJvZ3Jlc3NNb25pdG9yLklOU1RBTkNFLAorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG5ldyBSZWZTcGVjKGNvbW1pdC5uYW1lKCkpKSk7CisJCX0KKwl9CisKKwkvKgorCSAqIEludm9rZXMgVXBsb2FkUGFjayB3aXRoIHByb3RvY29sIHYyIGFuZCBzZW5kcyBpdCB0aGUgZ2l2ZW4gbGluZXMsCisJICogYW5kIHJldHVybnMgVXBsb2FkUGFjaydzIG91dHB1dCBzdHJlYW0uCisJICovCisJcHJpdmF0ZSBCeXRlQXJyYXlJbnB1dFN0cmVhbSB1cGxvYWRQYWNrVjJTZXR1cChSZXF1ZXN0UG9saWN5IHJlcXVlc3RQb2xpY3ksCisJCQlSZWZGaWx0ZXIgcmVmRmlsdGVyLCBTdHJpbmcuLi4gaW5wdXRMaW5lcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHNlbmQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCVBhY2tldExpbmVPdXQgcGNrT3V0ID0gbmV3IFBhY2tldExpbmVPdXQoc2VuZCk7CisJCWZvciAoU3RyaW5nIGxpbmUgOiBpbnB1dExpbmVzKSB7CisJCQlpZiAobGluZSA9PSBQYWNrZXRMaW5lSW4uRU5EKSB7CisJCQkJcGNrT3V0LmVuZCgpOworCQkJfSBlbHNlIGlmIChsaW5lID09IFBhY2tldExpbmVJbi5ERUxJTSkgeworCQkJCXBja091dC53cml0ZURlbGltKCk7CisJCQl9IGVsc2UgeworCQkJCXBja091dC53cml0ZVN0cmluZyhsaW5lKTsKKwkJCX0KKwkJfQorCisJCXNlcnZlci5nZXRDb25maWcoKS5zZXRTdHJpbmcoInByb3RvY29sIiwgbnVsbCwgInZlcnNpb24iLCAiMiIpOworCQlVcGxvYWRQYWNrIHVwID0gbmV3IFVwbG9hZFBhY2soc2VydmVyKTsKKwkJaWYgKHJlcXVlc3RQb2xpY3kgIT0gbnVsbCkKKwkJCXVwLnNldFJlcXVlc3RQb2xpY3kocmVxdWVzdFBvbGljeSk7CisJCWlmIChyZWZGaWx0ZXIgIT0gbnVsbCkKKwkJCXVwLnNldFJlZkZpbHRlcihyZWZGaWx0ZXIpOworCQl1cC5zZXRFeHRyYVBhcmFtZXRlcnMoU2V0cy5vZigidmVyc2lvbj0yIikpOworCisJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSByZWN2ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCQl1cC51cGxvYWQobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNlbmQudG9CeXRlQXJyYXkoKSksIHJlY3YsIG51bGwpOworCisJCXJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmVjdi50b0J5dGVBcnJheSgpKTsKKwl9CisKKwkvKgorCSAqIEludm9rZXMgVXBsb2FkUGFjayB3aXRoIHByb3RvY29sIHYyIGFuZCBzZW5kcyBpdCB0aGUgZ2l2ZW4gbGluZXMuCisJICogUmV0dXJucyBVcGxvYWRQYWNrJ3Mgb3V0cHV0IHN0cmVhbSwgbm90IGluY2x1ZGluZyB0aGUgY2FwYWJpbGl0eQorCSAqIGFkdmVydGlzZW1lbnQgYnkgdGhlIHNlcnZlci4KKwkgKi8KKwlwcml2YXRlIEJ5dGVBcnJheUlucHV0U3RyZWFtIHVwbG9hZFBhY2tWMihSZXF1ZXN0UG9saWN5IHJlcXVlc3RQb2xpY3ksCisJCQlSZWZGaWx0ZXIgcmVmRmlsdGVyLCBTdHJpbmcuLi4gaW5wdXRMaW5lcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPQorCQkJdXBsb2FkUGFja1YyU2V0dXAocmVxdWVzdFBvbGljeSwgcmVmRmlsdGVyLCBpbnB1dExpbmVzKTsKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKworCQkvLyBkcmFpbiBjYXBhYmlsaXRpZXMKKwkJd2hpbGUgKHBja0luLnJlYWRTdHJpbmcoKSAhPSBQYWNrZXRMaW5lSW4uRU5EKSB7CisJCQkvLyBkbyBub3RoaW5nCisJCX0KKwkJcmV0dXJuIHJlY3ZTdHJlYW07CisJfQorCisJcHJpdmF0ZSBCeXRlQXJyYXlJbnB1dFN0cmVhbSB1cGxvYWRQYWNrVjIoU3RyaW5nLi4uIGlucHV0TGluZXMpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdXBsb2FkUGFja1YyKG51bGwsIG51bGwsIGlucHV0TGluZXMpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyQ2FwYWJpbGl0aWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPQorCQkJdXBsb2FkUGFja1YyU2V0dXAobnVsbCwgbnVsbCwgUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJ2ZXJzaW9uIDIiKSk7CisJCWFzc2VydFRoYXQoCisJCQlBcnJheXMuYXNMaXN0KHBja0luLnJlYWRTdHJpbmcoKSwgcGNrSW4ucmVhZFN0cmluZygpKSwKKwkJCS8vIFRPRE8oam9uYXRoYW50YW5teSkgVGhpcyBjaGVjayBpcyB3cml0dGVuIHRoaXMgd2F5CisJCQkvLyB0byBtYWtlIGl0IHNpbXBsZSB0byBzZWUgdGhhdCB3ZSBleHBlY3QgdGhpcyBsaXN0IG9mCisJCQkvLyBjYXBhYmlsaXRpZXMsIGJ1dCBwcm9iYWJseSBzaG91bGQgYmUgbG9vc2VuZWQgdG8KKwkJCS8vIGFsbG93IGFkZGl0aW9uYWwgY29tbWFuZHMgdG8gYmUgYWRkZWQgdG8gdGhlIGxpc3QsCisJCQkvLyBhbmQgYWRkaXRpb25hbCBjYXBhYmlsaXRpZXMgdG8gYmUgYWRkZWQgdG8gZXhpc3RpbmcKKwkJCS8vIGNvbW1hbmRzIHdpdGhvdXQgcmVxdWlyaW5nIHRlc3QgY2hhbmdlcy4KKwkJCWhhc0l0ZW1zKCJscy1yZWZzIiwgImZldGNoPXNoYWxsb3ciKSk7CisJCWFzc2VydFRydWUocGNrSW4ucmVhZFN0cmluZygpID09IFBhY2tldExpbmVJbi5FTkQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyQ2FwYWJpbGl0aWVzQWxsb3dGaWx0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2VydmVyLmdldENvbmZpZygpLnNldEJvb2xlYW4oInVwbG9hZHBhY2siLCBudWxsLCAiYWxsb3dmaWx0ZXIiLCB0cnVlKTsKKwkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gcmVjdlN0cmVhbSA9CisJCQl1cGxvYWRQYWNrVjJTZXR1cChudWxsLCBudWxsLCBQYWNrZXRMaW5lSW4uRU5EKTsKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoInZlcnNpb24gMiIpKTsKKwkJYXNzZXJ0VGhhdCgKKwkJCUFycmF5cy5hc0xpc3QocGNrSW4ucmVhZFN0cmluZygpLCBwY2tJbi5yZWFkU3RyaW5nKCkpLAorCQkJLy8gVE9ETyhqb25hdGhhbnRhbm15KSBUaGlzIGNoZWNrIG92ZXJzcGVjaWZpZXMgdGhlCisJCQkvLyBvcmRlciBvZiB0aGUgY2FwYWJpbGl0aWVzIG9mICJmZXRjaCIuCisJCQloYXNJdGVtcygibHMtcmVmcyIsICJmZXRjaD1maWx0ZXIgc2hhbGxvdyIpKTsKKwkJYXNzZXJ0VHJ1ZShwY2tJbi5yZWFkU3RyaW5nKCkgPT0gUGFja2V0TGluZUluLkVORCk7CisJfQorCisJQFRlc3QKKwlAU3VwcHJlc3NXYXJuaW5ncygiYm94aW5nIikKKwlwdWJsaWMgdm9pZCB0ZXN0VjJFbXB0eVJlcXVlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gcmVjdlN0cmVhbSA9IHVwbG9hZFBhY2tWMihQYWNrZXRMaW5lSW4uRU5EKTsKKwkJLy8gVmVyaWZ5IHRoYXQgdGhlcmUgaXMgbm90aGluZyBtb3JlIGFmdGVyIHRoZSBjYXBhYmlsaXR5CisJCS8vIGFkdmVydGlzZW1lbnQuCisJCWFzc2VydFRoYXQocmVjdlN0cmVhbS5hdmFpbGFibGUoKSwgaXMoMCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyTHNSZWZzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCB0aXAgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgibWVzc2FnZSIpLmNyZWF0ZSgpOworCQlyZW1vdGUudXBkYXRlKCJtYXN0ZXIiLCB0aXApOworCQlzZXJ2ZXIudXBkYXRlUmVmKCJIRUFEIikubGluaygicmVmcy9oZWFkcy9tYXN0ZXIiKTsKKwkJUmV2VGFnIHRhZyA9IHJlbW90ZS50YWcoInRhZyIsIHRpcCk7CisJCXJlbW90ZS51cGRhdGUoInJlZnMvdGFncy90YWciLCB0YWcpOworCisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoImNvbW1hbmQ9bHMtcmVmc1xuIiwgUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKHRpcC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIiBIRUFEIikpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXModGlwLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiIHJlZnMvaGVhZHMvbWFzdGVyIikpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXModGFnLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiIHJlZnMvdGFncy90YWciKSk7CisJCWFzc2VydFRydWUocGNrSW4ucmVhZFN0cmluZygpID09IFBhY2tldExpbmVJbi5FTkQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyTHNSZWZzU3ltcmVmcygpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgdGlwID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIm1lc3NhZ2UiKS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgibWFzdGVyIiwgdGlwKTsKKwkJc2VydmVyLnVwZGF0ZVJlZigiSEVBRCIpLmxpbmsoInJlZnMvaGVhZHMvbWFzdGVyIik7CisJCVJldlRhZyB0YWcgPSByZW1vdGUudGFnKCJ0YWciLCB0aXApOworCQlyZW1vdGUudXBkYXRlKCJyZWZzL3RhZ3MvdGFnIiwgdGFnKTsKKworCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKCJjb21tYW5kPWxzLXJlZnNcbiIsIFBhY2tldExpbmVJbi5ERUxJTSwgInN5bXJlZnMiLCBQYWNrZXRMaW5lSW4uRU5EKTsKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXModGlwLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiIEhFQUQgc3ltcmVmLXRhcmdldDpyZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKHRpcC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIiByZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKHRhZy50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIiByZWZzL3RhZ3MvdGFnIikpOworCQlhc3NlcnRUcnVlKHBja0luLnJlYWRTdHJpbmcoKSA9PSBQYWNrZXRMaW5lSW4uRU5EKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkxzUmVmc1BlZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmV2Q29tbWl0IHRpcCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJtZXNzYWdlIikuY3JlYXRlKCk7CisJCXJlbW90ZS51cGRhdGUoIm1hc3RlciIsIHRpcCk7CisJCXNlcnZlci51cGRhdGVSZWYoIkhFQUQiKS5saW5rKCJyZWZzL2hlYWRzL21hc3RlciIpOworCQlSZXZUYWcgdGFnID0gcmVtb3RlLnRhZygidGFnIiwgdGlwKTsKKwkJcmVtb3RlLnVwZGF0ZSgicmVmcy90YWdzL3RhZyIsIHRhZyk7CisKKwkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gcmVjdlN0cmVhbSA9IHVwbG9hZFBhY2tWMigiY29tbWFuZD1scy1yZWZzXG4iLCBQYWNrZXRMaW5lSW4uREVMSU0sICJwZWVsIiwgUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKHRpcC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIiBIRUFEIikpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXModGlwLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiIHJlZnMvaGVhZHMvbWFzdGVyIikpOworCQlhc3NlcnRUaGF0KAorCQkJcGNrSW4ucmVhZFN0cmluZygpLAorCQkJaXModGFnLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiIHJlZnMvdGFncy90YWcgcGVlbGVkOiIKKwkJCQkrIHRpcC50b09iamVjdElkKCkuZ2V0TmFtZSgpKSk7CisJCWFzc2VydFRydWUocGNrSW4ucmVhZFN0cmluZygpID09IFBhY2tldExpbmVJbi5FTkQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyTHNSZWZzTXVsdGlwbGVDb21tYW5kcygpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgdGlwID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIm1lc3NhZ2UiKS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgibWFzdGVyIiwgdGlwKTsKKwkJc2VydmVyLnVwZGF0ZVJlZigiSEVBRCIpLmxpbmsoInJlZnMvaGVhZHMvbWFzdGVyIik7CisJCVJldlRhZyB0YWcgPSByZW1vdGUudGFnKCJ0YWciLCB0aXApOworCQlyZW1vdGUudXBkYXRlKCJyZWZzL3RhZ3MvdGFnIiwgdGFnKTsKKworCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9bHMtcmVmc1xuIiwgUGFja2V0TGluZUluLkRFTElNLCAic3ltcmVmcyIsICJwZWVsIiwgUGFja2V0TGluZUluLkVORCwKKwkJCSJjb21tYW5kPWxzLXJlZnNcbiIsIFBhY2tldExpbmVJbi5ERUxJTSwgUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKHRpcC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIiBIRUFEIHN5bXJlZi10YXJnZXQ6cmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcyh0aXAudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICIgcmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJCWFzc2VydFRoYXQoCisJCQlwY2tJbi5yZWFkU3RyaW5nKCksCisJCQlpcyh0YWcudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICIgcmVmcy90YWdzL3RhZyBwZWVsZWQ6IgorCQkJCSsgdGlwLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkpKTsKKwkJYXNzZXJ0VHJ1ZShwY2tJbi5yZWFkU3RyaW5nKCkgPT0gUGFja2V0TGluZUluLkVORCk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcyh0aXAudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICIgSEVBRCIpKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKHRpcC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIiByZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKHRhZy50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIiByZWZzL3RhZ3MvdGFnIikpOworCQlhc3NlcnRUcnVlKHBja0luLnJlYWRTdHJpbmcoKSA9PSBQYWNrZXRMaW5lSW4uRU5EKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkxzUmVmc1JlZlByZWZpeCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgdGlwID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIm1lc3NhZ2UiKS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgibWFzdGVyIiwgdGlwKTsKKwkJcmVtb3RlLnVwZGF0ZSgib3RoZXIiLCB0aXApOworCQlyZW1vdGUudXBkYXRlKCJ5ZXRBbm90aGVyIiwgdGlwKTsKKworCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9bHMtcmVmc1xuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJyZWYtcHJlZml4IHJlZnMvaGVhZHMvbWFzdGUiLAorCQkJInJlZi1wcmVmaXggcmVmcy9oZWFkcy9vdGhlciIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXModGlwLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiIHJlZnMvaGVhZHMvbWFzdGVyIikpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXModGlwLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiIHJlZnMvaGVhZHMvb3RoZXIiKSk7CisJCWFzc2VydFRydWUocGNrSW4ucmVhZFN0cmluZygpID09IFBhY2tldExpbmVJbi5FTkQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyTHNSZWZzUmVmUHJlZml4Tm9TbGFzaCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgdGlwID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIm1lc3NhZ2UiKS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgibWFzdGVyIiwgdGlwKTsKKwkJcmVtb3RlLnVwZGF0ZSgib3RoZXIiLCB0aXApOworCisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoCisJCQkiY29tbWFuZD1scy1yZWZzXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJInJlZi1wcmVmaXggcmVmcy9oZWFkcy9tYXN0ZSIsCisJCQkicmVmLXByZWZpeCByIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCQlQYWNrZXRMaW5lSW4gcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKHJlY3ZTdHJlYW0pOworCisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcyh0aXAudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICIgcmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcyh0aXAudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICIgcmVmcy9oZWFkcy9vdGhlciIpKTsKKwkJYXNzZXJ0VHJ1ZShwY2tJbi5yZWFkU3RyaW5nKCkgPT0gUGFja2V0TGluZUluLkVORCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJMc1JlZnNVbnJlY29nbml6ZWRBcmd1bWVudCgpIHRocm93cyBFeGNlcHRpb24geworCQl0aHJvd24uZXhwZWN0KFBhY2tQcm90b2NvbEV4Y2VwdGlvbi5jbGFzcyk7CisJCXRocm93bi5leHBlY3RNZXNzYWdlKCJ1bmV4cGVjdGVkIGludmFsaWQtYXJndW1lbnQiKTsKKwkJdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9bHMtcmVmc1xuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJpbnZhbGlkLWFyZ3VtZW50XG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJfQorCisJLyoKKwkgKiBQYXJzZSBtdWx0aXBsZXhlZCBwYWNrZmlsZSBvdXRwdXQgZnJvbSB1cGxvYWQtcGFjayB1c2luZyBwcm90b2NvbCBWMgorCSAqIGludG8gdGhlIGNsaWVudCByZXBvc2l0b3J5LgorCSAqLworCXByaXZhdGUgUmVjZWl2ZWRQYWNrU3RhdGlzdGljcyBwYXJzZVBhY2soQnl0ZUFycmF5SW5wdXRTdHJlYW0gcmVjdlN0cmVhbSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiBwYXJzZVBhY2socmVjdlN0cmVhbSwgTnVsbFByb2dyZXNzTW9uaXRvci5JTlNUQU5DRSk7CisJfQorCisJcHJpdmF0ZSBSZWNlaXZlZFBhY2tTdGF0aXN0aWNzIHBhcnNlUGFjayhCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtLCBQcm9ncmVzc01vbml0b3IgcG0pCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU2lkZUJhbmRJbnB1dFN0cmVhbSBzYiA9IG5ldyBTaWRlQmFuZElucHV0U3RyZWFtKAorCQkJCXJlY3ZTdHJlYW0sIHBtLAorCQkJCW5ldyBTdHJpbmdXcml0ZXIoKSwgTnVsbE91dHB1dFN0cmVhbS5JTlNUQU5DRSk7CisJCVBhY2tQYXJzZXIgcHAgPSBjbGllbnQubmV3T2JqZWN0SW5zZXJ0ZXIoKS5uZXdQYWNrUGFyc2VyKHNiKTsKKwkJcHAucGFyc2UoTnVsbFByb2dyZXNzTW9uaXRvci5JTlNUQU5DRSk7CisJCXJldHVybiBwcC5nZXRSZWNlaXZlZFBhY2tTdGF0aXN0aWNzKCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJGZXRjaFJlcXVlc3RQb2xpY3lBZHZlcnRpc2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCBhZHZlcnRpemVkID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIngiKS5jcmVhdGUoKTsKKwkJUmV2Q29tbWl0IHVuYWR2ZXJ0aXplZCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ5IikuY3JlYXRlKCk7CisJCXJlbW90ZS51cGRhdGUoImJyYW5jaDEiLCBhZHZlcnRpemVkKTsKKworCQkvLyBUaGlzIHdvcmtzCisJCXVwbG9hZFBhY2tWMigKKwkJCVJlcXVlc3RQb2xpY3kuQURWRVJUSVNFRCwKKwkJCW51bGwsCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyBhZHZlcnRpemVkLm5hbWUoKSArICJcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKworCQkvLyBUaGlzIGRvZXNuJ3QKKwkJdGhyb3duLmV4cGVjdChUcmFuc3BvcnRFeGNlcHRpb24uY2xhc3MpOworCQl0aHJvd24uZXhwZWN0TWVzc2FnZShNYXRjaGVycy5jb250YWluc1N0cmluZygKKwkJCQkJIndhbnQgIiArIHVuYWR2ZXJ0aXplZC5uYW1lKCkgKyAiIG5vdCB2YWxpZCIpKTsKKwkJdXBsb2FkUGFja1YyKAorCQkJUmVxdWVzdFBvbGljeS5BRFZFUlRJU0VELAorCQkJbnVsbCwKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIHVuYWR2ZXJ0aXplZC5uYW1lKCkgKyAiXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJGZXRjaFJlcXVlc3RQb2xpY3lSZWFjaGFibGVDb21taXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmV2Q29tbWl0IHJlYWNoYWJsZSA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ4IikuY3JlYXRlKCk7CisJCVJldkNvbW1pdCBhZHZlcnRpemVkID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIngiKS5wYXJlbnQocmVhY2hhYmxlKS5jcmVhdGUoKTsKKwkJUmV2Q29tbWl0IHVucmVhY2hhYmxlID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInkiKS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgiYnJhbmNoMSIsIGFkdmVydGl6ZWQpOworCisJCS8vIFRoaXMgd29ya3MKKwkJdXBsb2FkUGFja1YyKAorCQkJUmVxdWVzdFBvbGljeS5SRUFDSEFCTEVfQ09NTUlULAorCQkJbnVsbCwKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIHJlYWNoYWJsZS5uYW1lKCkgKyAiXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisKKwkJLy8gVGhpcyBkb2Vzbid0CisJCXRocm93bi5leHBlY3QoVHJhbnNwb3J0RXhjZXB0aW9uLmNsYXNzKTsKKwkJdGhyb3duLmV4cGVjdE1lc3NhZ2UoTWF0Y2hlcnMuY29udGFpbnNTdHJpbmcoCisJCQkJCSJ3YW50ICIgKyB1bnJlYWNoYWJsZS5uYW1lKCkgKyAiIG5vdCB2YWxpZCIpKTsKKwkJdXBsb2FkUGFja1YyKAorCQkJUmVxdWVzdFBvbGljeS5SRUFDSEFCTEVfQ09NTUlULAorCQkJbnVsbCwKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIHVucmVhY2hhYmxlLm5hbWUoKSArICJcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkZldGNoUmVxdWVzdFBvbGljeVRpcCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgcGFyZW50T2ZUaXAgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieCIpLmNyZWF0ZSgpOworCQlSZXZDb21taXQgdGlwID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInkiKS5wYXJlbnQocGFyZW50T2ZUaXApLmNyZWF0ZSgpOworCQlyZW1vdGUudXBkYXRlKCJzZWNyZXQiLCB0aXApOworCisJCS8vIFRoaXMgd29ya3MKKwkJdXBsb2FkUGFja1YyKAorCQkJUmVxdWVzdFBvbGljeS5USVAsCisJCQluZXcgUmVqZWN0QWxsUmVmRmlsdGVyKCksCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyB0aXAubmFtZSgpICsgIlxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCisJCS8vIFRoaXMgZG9lc24ndAorCQl0aHJvd24uZXhwZWN0KFRyYW5zcG9ydEV4Y2VwdGlvbi5jbGFzcyk7CisJCXRocm93bi5leHBlY3RNZXNzYWdlKE1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nKAorCQkJCQkid2FudCAiICsgcGFyZW50T2ZUaXAubmFtZSgpICsgIiBub3QgdmFsaWQiKSk7CisJCXVwbG9hZFBhY2tWMigKKwkJCVJlcXVlc3RQb2xpY3kuVElQLAorCQkJbmV3IFJlamVjdEFsbFJlZkZpbHRlcigpLAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgcGFyZW50T2ZUaXAubmFtZSgpICsgIlxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyRmV0Y2hSZXF1ZXN0UG9saWN5UmVhY2hhYmxlQ29tbWl0VGlwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCBwYXJlbnRPZlRpcCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ4IikuY3JlYXRlKCk7CisJCVJldkNvbW1pdCB0aXAgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieSIpLnBhcmVudChwYXJlbnRPZlRpcCkuY3JlYXRlKCk7CisJCVJldkNvbW1pdCB1bnJlYWNoYWJsZSA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ5IikuY3JlYXRlKCk7CisJCXJlbW90ZS51cGRhdGUoInNlY3JldCIsIHRpcCk7CisKKwkJLy8gVGhpcyB3b3JrcworCQl1cGxvYWRQYWNrVjIoCisJCQlSZXF1ZXN0UG9saWN5LlJFQUNIQUJMRV9DT01NSVRfVElQLAorCQkJbmV3IFJlamVjdEFsbFJlZkZpbHRlcigpLAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgcGFyZW50T2ZUaXAubmFtZSgpICsgIlxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCisJCS8vIFRoaXMgZG9lc24ndAorCQl0aHJvd24uZXhwZWN0KFRyYW5zcG9ydEV4Y2VwdGlvbi5jbGFzcyk7CisJCXRocm93bi5leHBlY3RNZXNzYWdlKE1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nKAorCQkJCQkid2FudCAiICsgdW5yZWFjaGFibGUubmFtZSgpICsgIiBub3QgdmFsaWQiKSk7CisJCXVwbG9hZFBhY2tWMigKKwkJCVJlcXVlc3RQb2xpY3kuUkVBQ0hBQkxFX0NPTU1JVF9USVAsCisJCQluZXcgUmVqZWN0QWxsUmVmRmlsdGVyKCksCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyB1bnJlYWNoYWJsZS5uYW1lKCkgKyAiXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJGZXRjaFJlcXVlc3RQb2xpY3lBbnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmV2Q29tbWl0IHVucmVhY2hhYmxlID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInkiKS5jcmVhdGUoKTsKKworCQkvLyBFeGVyY2lzZSB0byBtYWtlIHN1cmUgdGhhdCBldmVuIHVucmVhY2hhYmxlIGNvbW1pdHMgY2FuIGJlIGZldGNoZWQKKwkJdXBsb2FkUGFja1YyKAorCQkJUmVxdWVzdFBvbGljeS5BTlksCisJCQludWxsLAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgdW5yZWFjaGFibGUubmFtZSgpICsgIlxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyRmV0Y2hTZXJ2ZXJEb2VzTm90U3RvcE5lZ290aWF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCBmb29QYXJlbnQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieCIpLmNyZWF0ZSgpOworCQlSZXZDb21taXQgZm9vQ2hpbGQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieCIpLnBhcmVudChmb29QYXJlbnQpLmNyZWF0ZSgpOworCQlSZXZDb21taXQgYmFyUGFyZW50ID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInkiKS5jcmVhdGUoKTsKKwkJUmV2Q29tbWl0IGJhckNoaWxkID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInkiKS5wYXJlbnQoYmFyUGFyZW50KS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgiYnJhbmNoMSIsIGZvb0NoaWxkKTsKKwkJcmVtb3RlLnVwZGF0ZSgiYnJhbmNoMiIsIGJhckNoaWxkKTsKKworCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgZm9vQ2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkid2FudCAiICsgYmFyQ2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiaGF2ZSAiICsgZm9vUGFyZW50LnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJhY2tub3dsZWRnbWVudHMiKSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygiQUNLICIgKyBmb29QYXJlbnQudG9PYmplY3RJZCgpLmdldE5hbWUoKSkpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgdGhlSW5zdGFuY2UoUGFja2V0TGluZUluLkVORCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyRmV0Y2hTZXJ2ZXJTdG9wc05lZ290aWF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCBmb29QYXJlbnQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieCIpLmNyZWF0ZSgpOworCQlSZXZDb21taXQgZm9vQ2hpbGQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieCIpLnBhcmVudChmb29QYXJlbnQpLmNyZWF0ZSgpOworCQlSZXZDb21taXQgYmFyUGFyZW50ID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInkiKS5jcmVhdGUoKTsKKwkJUmV2Q29tbWl0IGJhckNoaWxkID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInkiKS5wYXJlbnQoYmFyUGFyZW50KS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgiYnJhbmNoMSIsIGZvb0NoaWxkKTsKKwkJcmVtb3RlLnVwZGF0ZSgiYnJhbmNoMiIsIGJhckNoaWxkKTsKKworCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgZm9vQ2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkid2FudCAiICsgYmFyQ2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiaGF2ZSAiICsgZm9vUGFyZW50LnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJImhhdmUgIiArIGJhclBhcmVudC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCQlQYWNrZXRMaW5lSW4gcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKHJlY3ZTdHJlYW0pOworCisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygiYWNrbm93bGVkZ21lbnRzIikpOworCQlhc3NlcnRUaGF0KAorCQkJQXJyYXlzLmFzTGlzdChwY2tJbi5yZWFkU3RyaW5nKCksIHBja0luLnJlYWRTdHJpbmcoKSksCisJCQloYXNJdGVtcygKKwkJCQkiQUNLICIgKyBmb29QYXJlbnQudG9PYmplY3RJZCgpLmdldE5hbWUoKSwKKwkJCQkiQUNLICIgKyBiYXJQYXJlbnQudG9PYmplY3RJZCgpLmdldE5hbWUoKSkpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoInJlYWR5IikpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgdGhlSW5zdGFuY2UoUGFja2V0TGluZUluLkRFTElNKSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygicGFja2ZpbGUiKSk7CisJCXBhcnNlUGFjayhyZWN2U3RyZWFtKTsKKwkJYXNzZXJ0RmFsc2UoY2xpZW50Lmhhc09iamVjdChmb29QYXJlbnQudG9PYmplY3RJZCgpKSk7CisJCWFzc2VydFRydWUoY2xpZW50Lmhhc09iamVjdChmb29DaGlsZC50b09iamVjdElkKCkpKTsKKwkJYXNzZXJ0RmFsc2UoY2xpZW50Lmhhc09iamVjdChiYXJQYXJlbnQudG9PYmplY3RJZCgpKSk7CisJCWFzc2VydFRydWUoY2xpZW50Lmhhc09iamVjdChiYXJDaGlsZC50b09iamVjdElkKCkpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkZldGNoQ2xpZW50U3RvcHNOZWdvdGlhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgZm9vUGFyZW50ID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIngiKS5jcmVhdGUoKTsKKwkJUmV2Q29tbWl0IGZvb0NoaWxkID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIngiKS5wYXJlbnQoZm9vUGFyZW50KS5jcmVhdGUoKTsKKwkJUmV2Q29tbWl0IGJhclBhcmVudCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ5IikuY3JlYXRlKCk7CisJCVJldkNvbW1pdCBiYXJDaGlsZCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ5IikucGFyZW50KGJhclBhcmVudCkuY3JlYXRlKCk7CisJCXJlbW90ZS51cGRhdGUoImJyYW5jaDEiLCBmb29DaGlsZCk7CisJCXJlbW90ZS51cGRhdGUoImJyYW5jaDIiLCBiYXJDaGlsZCk7CisKKwkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gcmVjdlN0cmVhbSA9IHVwbG9hZFBhY2tWMigKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIGZvb0NoaWxkLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJIndhbnQgIiArIGJhckNoaWxkLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJImhhdmUgIiArIGZvb1BhcmVudC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCSJkb25lXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJwYWNrZmlsZSIpKTsKKwkJcGFyc2VQYWNrKHJlY3ZTdHJlYW0pOworCQlhc3NlcnRGYWxzZShjbGllbnQuaGFzT2JqZWN0KGZvb1BhcmVudC50b09iamVjdElkKCkpKTsKKwkJYXNzZXJ0VHJ1ZShjbGllbnQuaGFzT2JqZWN0KGZvb0NoaWxkLnRvT2JqZWN0SWQoKSkpOworCQlhc3NlcnRUcnVlKGNsaWVudC5oYXNPYmplY3QoYmFyUGFyZW50LnRvT2JqZWN0SWQoKSkpOworCQlhc3NlcnRUcnVlKGNsaWVudC5oYXNPYmplY3QoYmFyQ2hpbGQudG9PYmplY3RJZCgpKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJGZXRjaFRoaW5QYWNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBjb21tb25JbkJsb2IgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiOworCisJCVJldkJsb2IgcGFyZW50QmxvYiA9IHJlbW90ZS5ibG9iKGNvbW1vbkluQmxvYiArICJhIik7CisJCVJldkNvbW1pdCBwYXJlbnQgPSByZW1vdGUuY29tbWl0KHJlbW90ZS50cmVlKHJlbW90ZS5maWxlKCJmb28iLCBwYXJlbnRCbG9iKSkpOworCQlSZXZCbG9iIGNoaWxkQmxvYiA9IHJlbW90ZS5ibG9iKGNvbW1vbkluQmxvYiArICJiIik7CisJCVJldkNvbW1pdCBjaGlsZCA9IHJlbW90ZS5jb21taXQocmVtb3RlLnRyZWUocmVtb3RlLmZpbGUoImZvbyIsIGNoaWxkQmxvYikpLCBwYXJlbnQpOworCQlyZW1vdGUudXBkYXRlKCJicmFuY2gxIiwgY2hpbGQpOworCisJCS8vIFByZXRlbmQgdGhhdCB3ZSBoYXZlIHBhcmVudCB0byBnZXQgYSB0aGluIHBhY2sgYmFzZWQgb24gaXQuCisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyBjaGlsZC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCSJoYXZlICIgKyBwYXJlbnQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkidGhpbi1wYWNrXG4iLAorCQkJImRvbmVcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoInBhY2tmaWxlIikpOworCisJCS8vIFZlcmlmeSB0aGF0IHdlIHJlY2VpdmVkIGEgdGhpbiBwYWNrIGJ5IHRyeWluZyB0byBhcHBseSBpdAorCQkvLyBhZ2FpbnN0IHRoZSBjbGllbnQgcmVwbywgd2hpY2ggZG9lcyBub3QgaGF2ZSBwYXJlbnQuCisJCXRocm93bi5leHBlY3QoSU9FeGNlcHRpb24uY2xhc3MpOworCQl0aHJvd24uZXhwZWN0TWVzc2FnZSgicGFjayBoYXMgdW5yZXNvbHZlZCBkZWx0YXMiKTsKKwkJcGFyc2VQYWNrKHJlY3ZTdHJlYW0pOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyRmV0Y2hOb1Byb2dyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCBjb21taXQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieCIpLmNyZWF0ZSgpOworCQlyZW1vdGUudXBkYXRlKCJicmFuY2gxIiwgY29tbWl0KTsKKworCQkvLyBXaXRob3V0IG5vLXByb2dyZXNzLCBwcm9ncmVzcyBpcyByZXBvcnRlZC4KKwkJU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgY29tbWl0LnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJImRvbmVcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJwYWNrZmlsZSIpKTsKKwkJcGFyc2VQYWNrKHJlY3ZTdHJlYW0sIG5ldyBUZXh0UHJvZ3Jlc3NNb25pdG9yKHN3KSk7CisJCWFzc2VydEZhbHNlKHN3LnRvU3RyaW5nKCkuaXNFbXB0eSgpKTsKKworCQkvLyBXaXRoIG5vLXByb2dyZXNzLCBwcm9ncmVzcyBpcyBub3QgcmVwb3J0ZWQuCisJCXN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworCQlyZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgY29tbWl0LnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJIm5vLXByb2dyZXNzXG4iLAorCQkJImRvbmVcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwkJcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKHJlY3ZTdHJlYW0pOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoInBhY2tmaWxlIikpOworCQlwYXJzZVBhY2socmVjdlN0cmVhbSwgbmV3IFRleHRQcm9ncmVzc01vbml0b3Ioc3cpKTsKKwkJYXNzZXJ0VHJ1ZShzdy50b1N0cmluZygpLmlzRW1wdHkoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJGZXRjaEluY2x1ZGVUYWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmV2Q29tbWl0IGNvbW1pdCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ4IikuY3JlYXRlKCk7CisJCVJldlRhZyB0YWcgPSByZW1vdGUudGFnKCJ0YWciLCBjb21taXQpOworCQlyZW1vdGUudXBkYXRlKCJicmFuY2gxIiwgY29tbWl0KTsKKwkJcmVtb3RlLnVwZGF0ZSgicmVmcy90YWdzL3RhZyIsIHRhZyk7CisKKwkJLy8gV2l0aG91dCBpbmNsdWRlLXRhZy4KKwkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gcmVjdlN0cmVhbSA9IHVwbG9hZFBhY2tWMigKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIGNvbW1pdC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCSJkb25lXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygicGFja2ZpbGUiKSk7CisJCXBhcnNlUGFjayhyZWN2U3RyZWFtKTsKKwkJYXNzZXJ0RmFsc2UoY2xpZW50Lmhhc09iamVjdCh0YWcudG9PYmplY3RJZCgpKSk7CisKKwkJLy8gV2l0aCB0YWcuCisJCXJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyBjb21taXQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiaW5jbHVkZS10YWdcbiIsCisJCQkiZG9uZVxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCQlwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygicGFja2ZpbGUiKSk7CisJCXBhcnNlUGFjayhyZWN2U3RyZWFtKTsKKwkJYXNzZXJ0VHJ1ZShjbGllbnQuaGFzT2JqZWN0KHRhZy50b09iamVjdElkKCkpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkZldGNoT2ZzRGVsdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGNvbW1vbkluQmxvYiA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiI7CisKKwkJUmV2QmxvYiBwYXJlbnRCbG9iID0gcmVtb3RlLmJsb2IoY29tbW9uSW5CbG9iICsgImEiKTsKKwkJUmV2Q29tbWl0IHBhcmVudCA9IHJlbW90ZS5jb21taXQocmVtb3RlLnRyZWUocmVtb3RlLmZpbGUoImZvbyIsIHBhcmVudEJsb2IpKSk7CisJCVJldkJsb2IgY2hpbGRCbG9iID0gcmVtb3RlLmJsb2IoY29tbW9uSW5CbG9iICsgImIiKTsKKwkJUmV2Q29tbWl0IGNoaWxkID0gcmVtb3RlLmNvbW1pdChyZW1vdGUudHJlZShyZW1vdGUuZmlsZSgiZm9vIiwgY2hpbGRCbG9iKSksIHBhcmVudCk7CisJCXJlbW90ZS51cGRhdGUoImJyYW5jaDEiLCBjaGlsZCk7CisKKwkJLy8gV2l0aG91dCBvZnMtZGVsdGEuCisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyBjaGlsZC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCSJkb25lXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygicGFja2ZpbGUiKSk7CisJCVJlY2VpdmVkUGFja1N0YXRpc3RpY3Mgc3RhdHMgPSBwYXJzZVBhY2socmVjdlN0cmVhbSk7CisJCWFzc2VydFRydWUoc3RhdHMuZ2V0TnVtT2ZzRGVsdGEoKSA9PSAwKTsKKworCQkvLyBXaXRoIG9mcy1kZWx0YS4KKwkJcmVjdlN0cmVhbSA9IHVwbG9hZFBhY2tWMigKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIGNoaWxkLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJIm9mcy1kZWx0YVxuIiwKKwkJCSJkb25lXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJCXBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJwYWNrZmlsZSIpKTsKKwkJc3RhdHMgPSBwYXJzZVBhY2socmVjdlN0cmVhbSk7CisJCWFzc2VydFRydWUoc3RhdHMuZ2V0TnVtT2ZzRGVsdGEoKSAhPSAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkZldGNoU2hhbGxvdygpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgY29tbW9uUGFyZW50ID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInBhcmVudCIpLmNyZWF0ZSgpOworCQlSZXZDb21taXQgZm9vQ2hpbGQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieCIpLnBhcmVudChjb21tb25QYXJlbnQpLmNyZWF0ZSgpOworCQlSZXZDb21taXQgYmFyQ2hpbGQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieSIpLnBhcmVudChjb21tb25QYXJlbnQpLmNyZWF0ZSgpOworCQlyZW1vdGUudXBkYXRlKCJicmFuY2gxIiwgYmFyQ2hpbGQpOworCisJCS8vIFdpdGhvdXQgc2hhbGxvdywgdGhlIHNlcnZlciB0aGlua3MgdGhhdCB3ZSBoYXZlCisJCS8vIGNvbW1vblBhcmVudCwgc28gaXQgZG9lc24ndCBzZW5kIGl0LgorCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgYmFyQ2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiaGF2ZSAiICsgZm9vQ2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiZG9uZVxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCQlQYWNrZXRMaW5lSW4gcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKHJlY3ZTdHJlYW0pOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoInBhY2tmaWxlIikpOworCQlwYXJzZVBhY2socmVjdlN0cmVhbSk7CisJCWFzc2VydFRydWUoY2xpZW50Lmhhc09iamVjdChiYXJDaGlsZC50b09iamVjdElkKCkpKTsKKwkJYXNzZXJ0RmFsc2UoY2xpZW50Lmhhc09iamVjdChjb21tb25QYXJlbnQudG9PYmplY3RJZCgpKSk7CisKKwkJLy8gV2l0aCBzaGFsbG93LCB0aGUgc2VydmVyIGtub3dzIHRoYXQgd2UgZG9uJ3QgaGF2ZQorCQkvLyBjb21tb25QYXJlbnQsIHNvIGl0IHNlbmRzIGl0LgorCQlyZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgYmFyQ2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiaGF2ZSAiICsgZm9vQ2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkic2hhbGxvdyAiICsgZm9vQ2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiZG9uZVxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCQlwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygicGFja2ZpbGUiKSk7CisJCXBhcnNlUGFjayhyZWN2U3RyZWFtKTsKKwkJYXNzZXJ0VHJ1ZShjbGllbnQuaGFzT2JqZWN0KGNvbW1vblBhcmVudC50b09iamVjdElkKCkpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkZldGNoRGVlcGVuQW5kRG9uZSgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgcGFyZW50ID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInBhcmVudCIpLmNyZWF0ZSgpOworCQlSZXZDb21taXQgY2hpbGQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieCIpLnBhcmVudChwYXJlbnQpLmNyZWF0ZSgpOworCQlyZW1vdGUudXBkYXRlKCJicmFuY2gxIiwgY2hpbGQpOworCisJCS8vICJkZWVwZW4gMSIgc2VuZHMgb25seSB0aGUgY2hpbGQuCisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyBjaGlsZC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCSJkZWVwZW4gMVxuIiwKKwkJCSJkb25lXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygic2hhbGxvdy1pbmZvIikpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoInNoYWxsb3cgIiArIGNoaWxkLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkpKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIHRoZUluc3RhbmNlKFBhY2tldExpbmVJbi5ERUxJTSkpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoInBhY2tmaWxlIikpOworCQlwYXJzZVBhY2socmVjdlN0cmVhbSk7CisJCWFzc2VydFRydWUoY2xpZW50Lmhhc09iamVjdChjaGlsZC50b09iamVjdElkKCkpKTsKKwkJYXNzZXJ0RmFsc2UoY2xpZW50Lmhhc09iamVjdChwYXJlbnQudG9PYmplY3RJZCgpKSk7CisKKwkJLy8gV2l0aG91dCB0aGF0LCB0aGUgcGFyZW50IGlzIHNlbnQgdG9vLgorCQlyZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgY2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiZG9uZVxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCQlwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygicGFja2ZpbGUiKSk7CisJCXBhcnNlUGFjayhyZWN2U3RyZWFtKTsKKwkJYXNzZXJ0VHJ1ZShjbGllbnQuaGFzT2JqZWN0KHBhcmVudC50b09iamVjdElkKCkpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkZldGNoRGVlcGVuV2l0aG91dERvbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmV2Q29tbWl0IHBhcmVudCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJwYXJlbnQiKS5jcmVhdGUoKTsKKwkJUmV2Q29tbWl0IGNoaWxkID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIngiKS5wYXJlbnQocGFyZW50KS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgiYnJhbmNoMSIsIGNoaWxkKTsKKworCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgY2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiZGVlcGVuIDFcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKworCQkvLyBWZXJpZnkgdGhhdCBvbmx5IHRoZSBjb3JyZWN0IHNlY3Rpb24gaXMgc2VudC4gInNoYWxsb3ctaW5mbyIKKwkJLy8gaXMgbm90IHNlbnQgYmVjYXVzZSwgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uLCBpdCBpcworCQkvLyBzZW50IG9ubHkgaWYgYSBwYWNrZmlsZSBpcyBzZW50LgorCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoImFja25vd2xlZGdtZW50cyIpKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJOQUsiKSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCB0aGVJbnN0YW5jZShQYWNrZXRMaW5lSW4uRU5EKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJGZXRjaFVucmVjb2duaXplZEFyZ3VtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRocm93bi5leHBlY3QoUGFja1Byb3RvY29sRXhjZXB0aW9uLmNsYXNzKTsKKwkJdGhyb3duLmV4cGVjdE1lc3NhZ2UoInVuZXhwZWN0ZWQgaW52YWxpZC1hcmd1bWVudCIpOworCQl1cGxvYWRQYWNrVjIoCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJpbnZhbGlkLWFyZ3VtZW50XG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJGZXRjaEZpbHRlcigpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZCbG9iIGJpZyA9IHJlbW90ZS5ibG9iKCJmb29iYXIiKTsKKwkJUmV2QmxvYiBzbWFsbCA9IHJlbW90ZS5ibG9iKCJmb29iYSIpOworCQlSZXZUcmVlIHRyZWUgPSByZW1vdGUudHJlZShyZW1vdGUuZmlsZSgiMSIsIGJpZyksCisJCQkJcmVtb3RlLmZpbGUoIjIiLCBzbWFsbCkpOworCQlSZXZDb21taXQgY29tbWl0ID0gcmVtb3RlLmNvbW1pdCh0cmVlKTsKKwkJcmVtb3RlLnVwZGF0ZSgibWFzdGVyIiwgY29tbWl0KTsKKworCQlzZXJ2ZXIuZ2V0Q29uZmlnKCkuc2V0Qm9vbGVhbigidXBsb2FkcGFjayIsIG51bGwsICJhbGxvd2ZpbHRlciIsIHRydWUpOworCisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyBjb21taXQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiZmlsdGVyIGJsb2I6bGltaXQ9NVxuIiwKKwkJCSJkb25lXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygicGFja2ZpbGUiKSk7CisJCXBhcnNlUGFjayhyZWN2U3RyZWFtKTsKKworCQlhc3NlcnRGYWxzZShjbGllbnQuaGFzT2JqZWN0KGJpZy50b09iamVjdElkKCkpKTsKKwkJYXNzZXJ0VHJ1ZShjbGllbnQuaGFzT2JqZWN0KHNtYWxsLnRvT2JqZWN0SWQoKSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyRmV0Y2hGaWx0ZXJXaGVuTm90QWxsb3dlZCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgY29tbWl0ID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIjAiKS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgibWFzdGVyIiwgY29tbWl0KTsKKworCQlzZXJ2ZXIuZ2V0Q29uZmlnKCkuc2V0Qm9vbGVhbigidXBsb2FkcGFjayIsIG51bGwsICJhbGxvd2ZpbHRlciIsIGZhbHNlKTsKKworCQl0aHJvd24uZXhwZWN0KFBhY2tQcm90b2NvbEV4Y2VwdGlvbi5jbGFzcyk7CisJCXRocm93bi5leHBlY3RNZXNzYWdlKCJ1bmV4cGVjdGVkIGZpbHRlciBibG9iOmxpbWl0PTUiKTsKKwkJdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgY29tbWl0LnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJImZpbHRlciBibG9iOmxpbWl0PTVcbiIsCisJCQkiZG9uZVxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCX0KKworCXByaXZhdGUgc3RhdGljIGNsYXNzIFJlamVjdEFsbFJlZkZpbHRlciBpbXBsZW1lbnRzIFJlZkZpbHRlciB7CisJCUBPdmVycmlkZQorCQlwdWJsaWMgTWFwPFN0cmluZywgUmVmPiBmaWx0ZXIoTWFwPFN0cmluZywgUmVmPiByZWZzKSB7CisJCQlyZXR1cm4gbmV3IEhhc2hNYXA8PigpOworCQl9CisJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrRW5jcnlwdGlvblRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvV2Fsa0VuY3J5cHRpb25UZXN0LmphdmEKaW5kZXggY2IwNGY4My4uMzNlMjUyOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrRW5jcnlwdGlvblRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1dhbGtFbmNyeXB0aW9uVGVzdC5qYXZhCkBAIC00Myw3ICs0Myw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuV2Fsa0VuY3J5cHRpb25UZXN0LlV0aWwuY3J5cHRvQ2lwaGVyTGlzdFBCRTsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuV2Fsa0VuY3J5cHRpb25UZXN0LlV0aWwuY3J5cHRvQ2lwaGVyTGlzdFRyYW5zOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5XYWxrRW5jcnlwdGlvblRlc3QuVXRpbC5mb2xkZXJEZWxldGU7CkBAIC0zNjAsNyArMzYwLDcgQEAKIAkJICogQHRocm93cyBFeGNlcHRpb24KIAkJICovCiAJCXN0YXRpYyBTdHJpbmcgdGV4dFJlYWQoRmlsZSBmaWxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCXJldHVybiBuZXcgU3RyaW5nKEZpbGVzLnJlYWRBbGxCeXRlcyhmaWxlLnRvUGF0aCgpKSwgVVRGXzgpOworCQkJcmV0dXJuIG5ldyBTdHJpbmcoRmlsZXMucmVhZEFsbEJ5dGVzKGZpbGUudG9QYXRoKCkpLCBDSEFSU0VUKTsKIAkJfQogCiAJCS8qKgpAQCAtMzcxLDcgKzM3MSw3IEBACiAJCSAqIEB0aHJvd3MgRXhjZXB0aW9uCiAJCSAqLwogCQlzdGF0aWMgdm9pZCB0ZXh0V3JpdGUoRmlsZSBmaWxlLCBTdHJpbmcgdGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQlGaWxlcy53cml0ZShmaWxlLnRvUGF0aCgpLCB0ZXh0LmdldEJ5dGVzKFVURl84KSk7CisJCQlGaWxlcy53cml0ZShmaWxlLnRvUGF0aCgpLCB0ZXh0LmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJfQogCiAJCXN0YXRpYyB2b2lkIHZlcmlmeUZpbGVDb250ZW50KEZpbGUgZmlsZU9uZSwgRmlsZSBmaWxlVHdvKQpAQCAtNDE5LDEyICs0MTksOSBAQAogCQkJCVVSTENvbm5lY3Rpb24gYyA9IHVybC5vcGVuQ29ubmVjdGlvbigpOwogCQkJCWMuc2V0Q29ubmVjdFRpbWVvdXQoNTAwKTsKIAkJCQljLnNldFJlYWRUaW1lb3V0KDUwMCk7Ci0JCQkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAotCQkJCQkJbmV3IElucHV0U3RyZWFtUmVhZGVyKGMuZ2V0SW5wdXRTdHJlYW0oKSkpOwotCQkJCXRyeSB7CisJCQkJdHJ5IChCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCisJCQkJCQluZXcgSW5wdXRTdHJlYW1SZWFkZXIoYy5nZXRJbnB1dFN0cmVhbSgpKSkpIHsKIAkJCQkJcmV0dXJuIHJlYWRlci5yZWFkTGluZSgpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXJlYWRlci5jbG9zZSgpOwogCQkJCX0KIAkJCX0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIHwgU29ja2V0VGltZW91dEV4Y2VwdGlvbiBlKSB7CiAJCQkJcmV0dXJuICJDYW4ndCByZWFjaCBodHRwOi8vY2hlY2tpcC5hbWF6b25hd3MuY29tIHRvIgpAQCAtNjU0LDkgKzY1MSw5IEBACiAJCQlQcm9wZXJ0aWVzIHByb3BzID0gUHJvcHMuZGlzY292ZXIoKTsKIAkJCXByb3BzLnB1dChBbWF6b25TMy5LZXlzLlBBU1NXT1JELCBKR0lUX1BBU1MpOwogCQkJcHJvcHMucHV0KEFtYXpvblMzLktleXMuQ1JZUFRPX0FMRywgYWxnb3JpdGhtKTsKLQkJCVByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihKR0lUX0NPTkZfRklMRSk7Ci0JCQlwcm9wcy5zdG9yZSh3cml0ZXIsICJKR0lUIFMzIGNvbm5lY3Rpb24gY29uZmlndXJhdGlvbiBmaWxlLiIpOwotCQkJd3JpdGVyLmNsb3NlKCk7CisJCQl0cnkgKFByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihKR0lUX0NPTkZfRklMRSkpIHsKKwkJCQlwcm9wcy5zdG9yZSh3cml0ZXIsICJKR0lUIFMzIGNvbm5lY3Rpb24gY29uZmlndXJhdGlvbiBmaWxlLiIpOworCQkJfQogCQl9CiAKIAkJLyoqCkBAIC02NjgsOSArNjY1LDkgQEAKIAkJc3RhdGljIHZvaWQgY29uZmlnQ3JlYXRlKFByb3BlcnRpZXMgc291cmNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCVByb3BlcnRpZXMgdGFyZ2V0ID0gUHJvcHMuZGlzY292ZXIoKTsKIAkJCXRhcmdldC5wdXRBbGwoc291cmNlKTsKLQkJCVByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihKR0lUX0NPTkZfRklMRSk7Ci0JCQl0YXJnZXQuc3RvcmUod3JpdGVyLCAiSkdJVCBTMyBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb24gZmlsZS4iKTsKLQkJCXdyaXRlci5jbG9zZSgpOworCQkJdHJ5IChQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoSkdJVF9DT05GX0ZJTEUpKSB7CisJCQkJdGFyZ2V0LnN0b3JlKHdyaXRlciwgIkpHSVQgUzMgY29ubmVjdGlvbiBjb25maWd1cmF0aW9uIGZpbGUuIik7CisJCQl9CiAJCX0KIAogCQkvKioKQEAgLTc0MSw3ICs3MzgsNyBAQAogCQkJQW1hem9uUzMgczMgPSBuZXcgQW1hem9uUzMocHJvcHMpOwogCQkJU3RyaW5nIGZpbGUgPSBKR0lUX1VTRVIgKyAiLSIgKyBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpOwogCQkJU3RyaW5nIHBhdGggPSBKR0lUX1JFTU9URV9ESVIgKyAiLyIgKyBmaWxlOwotCQkJczMucHV0KGJ1Y2tldCwgcGF0aCwgZmlsZS5nZXRCeXRlcyhVVEZfOCkpOworCQkJczMucHV0KGJ1Y2tldCwgcGF0aCwgZmlsZS5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCQlzMy5kZWxldGUoYnVja2V0LCBwYXRoKTsKIAkJfQogCkBAIC04MzYsMTAgKzgzMywxMCBAQAogCQkJewogCQkJCWJ5dGVbXSBvcmlnaW4gPSBzb3VyY2VUZXh0LmdldEJ5dGVzKGNoYXJzZXQpOwogCQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSB0YXJnZXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQkJT3V0cHV0U3RyZWFtIHNvdXJjZSA9IGNyeXB0by5lbmNyeXB0KHRhcmdldCk7Ci0JCQkJc291cmNlLndyaXRlKG9yaWdpbik7Ci0JCQkJc291cmNlLmZsdXNoKCk7Ci0JCQkJc291cmNlLmNsb3NlKCk7CisJCQkJdHJ5IChPdXRwdXRTdHJlYW0gc291cmNlID0gY3J5cHRvLmVuY3J5cHQodGFyZ2V0KSkgeworCQkJCQlzb3VyY2Uud3JpdGUob3JpZ2luKTsKKwkJCQkJc291cmNlLmZsdXNoKCk7CisJCQkJfQogCQkJCWNpcGhlclRleHQgPSB0YXJnZXQudG9CeXRlQXJyYXkoKTsKIAkJCX0KIAkJCXsKQEAgLTEwNzQsMTAgKzEwNzEsMTAgQEAKIAkJCQlyZW1vdGVDb25maWcudXBkYXRlKGNvbmZpZyk7CiAJCQkJY29uZmlnLnNhdmUoKTsKIAotCQkJCUdpdCBnaXQgPSBHaXQub3BlbihkaXJPbmUpOwotCQkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm1hc3RlciIpLmNhbGwoKTsKLQkJCQlnaXQucHVzaCgpLnNldFJlbW90ZShyZW1vdGUpLnNldFJlZlNwZWNzKHNwZWNzKS5jYWxsKCk7Ci0JCQkJZ2l0LmNsb3NlKCk7CisJCQkJdHJ5IChHaXQgZ2l0ID0gR2l0Lm9wZW4oZGlyT25lKSkgeworCQkJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJtYXN0ZXIiKS5jYWxsKCk7CisJCQkJCWdpdC5wdXNoKCkuc2V0UmVtb3RlKHJlbW90ZSkuc2V0UmVmU3BlY3Moc3BlY3MpLmNhbGwoKTsKKwkJCQl9CiAKIAkJCQlGaWxlIGZpbGVTdGF0aWMgPSBuZXcgRmlsZShkaXJPbmUsIG5hbWVTdGF0aWMpOwogCQkJCWFzc2VydFRydWUoIlByb3ZpZGVkIGJ5IHNldHVwIiwgZmlsZVN0YXRpYy5leGlzdHMoKSk7CkBAIC0xMDg5LDExICsxMDg2LDExIEBACiAJCQkJRmlsZSBmaWxlU3RhdGljID0gbmV3IEZpbGUoZGlyVHdvLCBuYW1lU3RhdGljKTsKIAkJCQlhc3NlcnRGYWxzZSgiTm90IFByb3ZpZGVkIGJ5IHNldHVwIiwgZmlsZVN0YXRpYy5leGlzdHMoKSk7CiAKLQkJCQlHaXQgZ2l0ID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpLnNldFVSSSh1cmkpLnNldERpcmVjdG9yeShkaXJUd28pCi0JCQkJCQkuY2FsbCgpOwotCQkJCWdpdC5jbG9zZSgpOworCQkJCXRyeSAoR2l0IGdpdCA9IEdpdC5jbG9uZVJlcG9zaXRvcnkoKS5zZXRVUkkodXJpKQorCQkJCQkJLnNldERpcmVjdG9yeShkaXJUd28pLmNhbGwoKSkgeworCQkJCQlhc3NlcnRUcnVlKCJQcm92aWRlZCBieSBjbG9uZSIsIGZpbGVTdGF0aWMuZXhpc3RzKCkpOworCQkJCX0KIAotCQkJCWFzc2VydFRydWUoIlByb3ZpZGVkIGJ5IGNsb25lIiwgZmlsZVN0YXRpYy5leGlzdHMoKSk7CiAJCQl9CiAKIAkJCXsgLy8gVmVyaWZ5IHN0YXRpYyBmaWxlIGNvbnRlbnQuCkBAIC0xMTExLDExICsxMTA4LDExIEBACiAJCQkJYXNzZXJ0VHJ1ZSgiUHJvdmlkZWQgYnkgY3JlYXRlIiwgZmlsZUR5bmFtaWMuZXhpc3RzKCkpOwogCQkJCWFzc2VydFRydWUoIk5lZWQgY29udGVudCB0byBlbmNyeXB0IiwgZmlsZUR5bmFtaWMubGVuZ3RoKCkgPiAwKTsKIAotCQkJCUdpdCBnaXQgPSBHaXQub3BlbihkaXJPbmUpOwotCQkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybihuYW1lRHluYW1pYykuY2FsbCgpOwotCQkJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKG5hbWVEeW5hbWljKS5jYWxsKCk7Ci0JCQkJZ2l0LnB1c2goKS5zZXRSZW1vdGUocmVtb3RlKS5zZXRSZWZTcGVjcyhzcGVjcykuY2FsbCgpOwotCQkJCWdpdC5jbG9zZSgpOworCQkJCXRyeSAoR2l0IGdpdCA9IEdpdC5vcGVuKGRpck9uZSkpIHsKKwkJCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKG5hbWVEeW5hbWljKS5jYWxsKCk7CisJCQkJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKG5hbWVEeW5hbWljKS5jYWxsKCk7CisJCQkJCWdpdC5wdXNoKCkuc2V0UmVtb3RlKHJlbW90ZSkuc2V0UmVmU3BlY3Moc3BlY3MpLmNhbGwoKTsKKwkJCQl9CiAKIAkJCX0KIApAQCAtMTEyNCw5ICsxMTIxLDkgQEAKIAkJCQlGaWxlIGZpbGVEeW5hbWljID0gbmV3IEZpbGUoZGlyVHdvLCBuYW1lRHluYW1pYyk7CiAJCQkJYXNzZXJ0RmFsc2UoIk5vdCBQcm92aWRlZCBieSBzZXR1cCIsIGZpbGVEeW5hbWljLmV4aXN0cygpKTsKIAotCQkJCUdpdCBnaXQgPSBHaXQub3BlbihkaXJUd28pOwotCQkJCWdpdC5wdWxsKCkuY2FsbCgpOwotCQkJCWdpdC5jbG9zZSgpOworCQkJCXRyeSAoR2l0IGdpdCA9IEdpdC5vcGVuKGRpclR3bykpIHsKKwkJCQkJZ2l0LnB1bGwoKS5jYWxsKCk7CisJCQkJfQogCiAJCQkJYXNzZXJ0VHJ1ZSgiUHJvdmlkZWQgYnkgcHVsbCIsIGZpbGVEeW5hbWljLmV4aXN0cygpKTsKIAkJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9DYW5vbmljYWxUcmVlUGFyc2VyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0Nhbm9uaWNhbFRyZWVQYXJzZXJUZXN0LmphdmEKaW5kZXggZjVlOTdjMi4uNjE5NWU2NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0Nhbm9uaWNhbFRyZWVQYXJzZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0Nhbm9uaWNhbFRyZWVQYXJzZXJUZXN0LmphdmEKQEAgLTkxLDkgKzkxLDkgQEAKIAkJCQloYXNoX3NvbWV0cmVlKSwgZW50cnkobTY0NCwgImZvbyIsIGhhc2hfZm9vKSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIG1rdHJlZShmaW5hbCBieXRlW10uLi4gZGF0YSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIG1rdHJlZShieXRlW10uLi4gZGF0YSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCWZvciAoZmluYWwgYnl0ZVtdIGUgOiBkYXRhKQorCQlmb3IgKGJ5dGVbXSBlIDogZGF0YSkKIAkJCW91dC53cml0ZShlKTsKIAkJcmV0dXJuIG91dC50b0J5dGVBcnJheSgpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9GaWxlVHJlZUl0ZXJhdG9yVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0ZpbGVUcmVlSXRlcmF0b3JUZXN0LmphdmEKaW5kZXggZTM0Y2I5Ny4uMGUwMDliOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0ZpbGVUcmVlSXRlcmF0b3JUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0ZpbGVUcmVlSXRlcmF0b3JUZXN0LmphdmEKQEAgLTgyMSw3ICs4MjEsNyBAQAogCQlhc3NlcnRFcXVhbHMoc2hhMXN0cmluZywgdHcuZ2V0T2JqZWN0SWQoMSkuZ2V0TmFtZSgpIC8qIDE9ZmlsZXRyZWUgaGVyZSAqLyk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG5hbWVPZihmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciBpKSB7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG5hbWVPZihBYnN0cmFjdFRyZWVJdGVyYXRvciBpKSB7CiAJCXJldHVybiBSYXdQYXJzZVV0aWxzLmRlY29kZShDb25zdGFudHMuQ0hBUlNFVCwgaS5wYXRoLCAwLCBpLnBhdGhMZW4pOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9GaWxlVHJlZUl0ZXJhdG9yV2l0aFRpbWVDb250cm9sLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvRmlsZVRyZWVJdGVyYXRvcldpdGhUaW1lQ29udHJvbC5qYXZhCmluZGV4IDcxN2EyZjMuLmZjNzlkNDUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9GaWxlVHJlZUl0ZXJhdG9yV2l0aFRpbWVDb250cm9sLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0ZpbGVUcmVlSXRlcmF0b3JXaXRoVGltZUNvbnRyb2wuamF2YQpAQCAtOTMsNyArOTMsNyBAQAogCX0KIAogCUBPdmVycmlkZQotCXB1YmxpYyBBYnN0cmFjdFRyZWVJdGVyYXRvciBjcmVhdGVTdWJ0cmVlSXRlcmF0b3IoZmluYWwgT2JqZWN0UmVhZGVyIHJlYWRlcikgeworCXB1YmxpYyBBYnN0cmFjdFRyZWVJdGVyYXRvciBjcmVhdGVTdWJ0cmVlSXRlcmF0b3IoT2JqZWN0UmVhZGVyIHJlYWRlcikgewogCQlyZXR1cm4gbmV3IEZpbGVUcmVlSXRlcmF0b3JXaXRoVGltZUNvbnRyb2wodGhpcywKIAkJCQkoKEZpbGVFbnRyeSkgY3VycmVudCgpKS5nZXRGaWxlKCksIGZzLCBtb2RUaW1lcyk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1Bvc3RPcmRlclRyZWVXYWxrVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1Bvc3RPcmRlclRyZWVXYWxrVGVzdC5qYXZhCmluZGV4IDZhZDQ3YzIuLjIzMjQyMmUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9Qb3N0T3JkZXJUcmVlV2Fsa1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvUG9zdE9yZGVyVHJlZVdhbGtUZXN0LmphdmEKQEAgLTYwLDE0ICs2MCwxNCBAQAogcHVibGljIGNsYXNzIFBvc3RPcmRlclRyZWVXYWxrVGVzdCBleHRlbmRzIFJlcG9zaXRvcnlUZXN0Q2FzZSB7CiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbGl6ZV9Ob1Bvc3RPcmRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQl0cnkgKFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgewogCQkJYXNzZXJ0RmFsc2UodHcuaXNQb3N0T3JkZXJUcmF2ZXJzYWwoKSk7CiAJCX0KIAl9CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXplX1RvZ2dsZVBvc3RPcmRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQl0cnkgKFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgewogCQkJYXNzZXJ0RmFsc2UodHcuaXNQb3N0T3JkZXJUcmF2ZXJzYWwoKSk7CiAJCQl0dy5zZXRQb3N0T3JkZXJUcmF2ZXJzYWwodHJ1ZSk7CiAJCQlhc3NlcnRUcnVlKHR3LmlzUG9zdE9yZGVyVHJhdmVyc2FsKCkpOwpAQCAtNzgsNyArNzgsNyBAQAogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UmVzZXREb2VzTm90QWZmZWN0UG9zdE9yZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQl0dy5zZXRQb3N0T3JkZXJUcmF2ZXJzYWwodHJ1ZSk7CiAJCQlhc3NlcnRUcnVlKHR3LmlzUG9zdE9yZGVyVHJhdmVyc2FsKCkpOwogCQkJdHcucmVzZXQoKTsKQEAgLTEwNCw3ICsxMDQsNyBAQAogCQliLmZpbmlzaCgpOwogCQlhc3NlcnRFcXVhbHMoNCwgdHJlZS5nZXRFbnRyeUNvdW50KCkpOwogCi0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQl0dy5zZXRQb3N0T3JkZXJUcmF2ZXJzYWwoZmFsc2UpOwogCQkJdHcuYWRkVHJlZShuZXcgRGlyQ2FjaGVJdGVyYXRvcih0cmVlKSk7CiAKQEAgLTEzMiw3ICsxMzIsNyBAQAogCQliLmZpbmlzaCgpOwogCQlhc3NlcnRFcXVhbHMoNCwgdHJlZS5nZXRFbnRyeUNvdW50KCkpOwogCi0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQl0dy5zZXRQb3N0T3JkZXJUcmF2ZXJzYWwodHJ1ZSk7CiAJCQl0dy5hZGRUcmVlKG5ldyBEaXJDYWNoZUl0ZXJhdG9yKHRyZWUpKTsKIApAQCAtMTY2LDcgKzE2Niw3IEBACiAJCWIuZmluaXNoKCk7CiAJCWFzc2VydEVxdWFscyg0LCB0cmVlLmdldEVudHJ5Q291bnQoKSk7CiAKLQkJdHJ5IChmaW5hbCBUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKKwkJdHJ5IChUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKIAkJCXR3LnNldFBvc3RPcmRlclRyYXZlcnNhbCh0cnVlKTsKIAkJCXR3LmFkZFRyZWUobmV3IERpckNhY2hlSXRlcmF0b3IodHJlZSkpOwogCkBAIC0xODAsNyArMTgwLDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgRGlyQ2FjaGVFbnRyeSBtYWtlRmlsZShmaW5hbCBTdHJpbmcgcGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSBEaXJDYWNoZUVudHJ5IG1ha2VGaWxlKFN0cmluZyBwYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcmV0dXJuIGNyZWF0ZUVudHJ5KHBhdGgsIFJFR1VMQVJfRklMRSk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL0Fsd2F5c0Nsb25lVHJlZUZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9BbHdheXNDbG9uZVRyZWVGaWx0ZXIuamF2YQppbmRleCA4ZTJjY2E0Li5kOWNmYjYyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL0Fsd2F5c0Nsb25lVHJlZUZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvQWx3YXlzQ2xvbmVUcmVlRmlsdGVyLmphdmEKQEAgLTUyLDcgKzUyLDcgQEAKIAl9CiAKIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFRyZWVXYWxrIHdhbGtlcikgeworCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoVHJlZVdhbGsgd2Fsa2VyKSB7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvTm90VHJlZUZpbHRlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvTm90VHJlZUZpbHRlclRlc3QuamF2YQppbmRleCBmN2E3ZmI4Li5jNjM4OWZiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL05vdFRyZWVGaWx0ZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9Ob3RUcmVlRmlsdGVyVGVzdC5qYXZhCkBAIC01NywxMiArNTcsMTMgQEAKIHB1YmxpYyBjbGFzcyBOb3RUcmVlRmlsdGVyVGVzdCBleHRlbmRzIFJlcG9zaXRvcnlUZXN0Q2FzZSB7CiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0V3JhcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlmaW5hbCBUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYik7Ci0JCWZpbmFsIFRyZWVGaWx0ZXIgYSA9IFRyZWVGaWx0ZXIuQUxMOwotCQlmaW5hbCBUcmVlRmlsdGVyIG4gPSBOb3RUcmVlRmlsdGVyLmNyZWF0ZShhKTsKLQkJYXNzZXJ0Tm90TnVsbChuKTsKLQkJYXNzZXJ0VHJ1ZShhLmluY2x1ZGUodHcpKTsKLQkJYXNzZXJ0RmFsc2Uobi5pbmNsdWRlKHR3KSk7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCQlmaW5hbCBUcmVlRmlsdGVyIGEgPSBUcmVlRmlsdGVyLkFMTDsKKwkJCWZpbmFsIFRyZWVGaWx0ZXIgbiA9IE5vdFRyZWVGaWx0ZXIuY3JlYXRlKGEpOworCQkJYXNzZXJ0Tm90TnVsbChuKTsKKwkJCWFzc2VydFRydWUoYS5pbmNsdWRlKHR3KSk7CisJCQlhc3NlcnRGYWxzZShuLmluY2x1ZGUodHcpKTsKKwkJfQogCX0KIAogCUBUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1BhdGhGaWx0ZXJHcm91cFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aEZpbHRlckdyb3VwVGVzdC5qYXZhCmluZGV4IGQ5MjFhYWIuLjcxYTJmMzIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aEZpbHRlckdyb3VwVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aEZpbHRlckdyb3VwVGVzdC5qYXZhCkBAIC0yNTQsNyArMjU0LDcgQEAKIAkJfQogCX0KIAotCVRyZWVXYWxrIGZha2VXYWxrKGZpbmFsIFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCVRyZWVXYWxrIGZha2VXYWxrKFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlEaXJDYWNoZSBkYyA9IERpckNhY2hlLm5ld0luQ29yZSgpOwogCQlEaXJDYWNoZUVkaXRvciBkY2UgPSBkYy5lZGl0b3IoKTsKIAkJZGNlLmFkZChuZXcgRGlyQ2FjaGVFZGl0b3IuUGF0aEVkaXQocGF0aCkgewpAQCAtMjc0LDcgKzI3NCw3IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JVHJlZVdhbGsgZmFrZVdhbGtBdFN1YnRyZWUoZmluYWwgU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJVHJlZVdhbGsgZmFrZVdhbGtBdFN1YnRyZWUoU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCURpckNhY2hlIGRjID0gRGlyQ2FjaGUubmV3SW5Db3JlKCk7CiAJCURpckNhY2hlRWRpdG9yIGRjZSA9IGRjLmVkaXRvcigpOwogCQlkY2UuYWRkKG5ldyBEaXJDYWNoZUVkaXRvci5QYXRoRWRpdChwYXRoICsgIi9SRUFETUUiKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1BhdGhTdWZmaXhGaWx0ZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1BhdGhTdWZmaXhGaWx0ZXJUZXN0LmphdmEKaW5kZXggMzhhZGRhMy4uMTQ4ZDVhYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9QYXRoU3VmZml4RmlsdGVyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aFN1ZmZpeEZpbHRlclRlc3QuamF2YQpAQCAtMTEzLDcgKzExMyw3IEBACiAKIAlwcml2YXRlIExpc3Q8U3RyaW5nPiBnZXRNYXRjaGluZ1BhdGhzKFN0cmluZyBzdWZmaXhGaWx0ZXIsCiAJCQlmaW5hbCBPYmplY3RJZCB0cmVlSWQsIGJvb2xlYW4gcmVjdXJzaXZlV2FsaykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdHJ5IChmaW5hbCBUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKKwkJdHJ5IChUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKIAkJCXR3LnNldEZpbHRlcihQYXRoU3VmZml4RmlsdGVyLmNyZWF0ZShzdWZmaXhGaWx0ZXIpKTsKIAkJCXR3LnNldFJlY3Vyc2l2ZShyZWN1cnNpdmVXYWxrKTsKIAkJCXR3LmFkZFRyZWUodHJlZUlkKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvVHJlZUZpbHRlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvVHJlZUZpbHRlclRlc3QuamF2YQppbmRleCBjMzQyM2I2Li44Njg2YzRmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1RyZWVGaWx0ZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9UcmVlRmlsdGVyVGVzdC5qYXZhCkBAIC01NSw3ICs1NSw3IEBACiBwdWJsaWMgY2xhc3MgVHJlZUZpbHRlclRlc3QgZXh0ZW5kcyBSZXBvc2l0b3J5VGVzdENhc2UgewogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdEFMTF9JbmNsdWRlc0FueXRoaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQl0dy5hZGRUcmVlKG5ldyBFbXB0eVRyZWVJdGVyYXRvcigpKTsKIAkJCWFzc2VydFRydWUoVHJlZUZpbHRlci5BTEwuaW5jbHVkZSh0dykpOwogCQl9CkBAIC03Myw3ICs3Myw3IEBACiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3ROb3RBTExfSW5jbHVkZXNOb3RoaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQl0dy5hZGRUcmVlKG5ldyBFbXB0eVRyZWVJdGVyYXRvcigpKTsKIAkJCWFzc2VydEZhbHNlKFRyZWVGaWx0ZXIuQUxMLm5lZ2F0ZSgpLmluY2x1ZGUodHcpKTsKIAkJfQpAQCAtODEsNyArODEsNyBAQAogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0QU5ZX0RJRkZfSW5jbHVkZXNTaW5nbGVUcmVlQ2FzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQl0cnkgKFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgewogCQkJdHcuYWRkVHJlZShuZXcgRW1wdHlUcmVlSXRlcmF0b3IoKSk7CiAJCQlhc3NlcnRUcnVlKFRyZWVGaWx0ZXIuQU5ZX0RJRkYuaW5jbHVkZSh0dykpOwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9DaGFuZ2VJZFV0aWxUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9DaGFuZ2VJZFV0aWxUZXN0LmphdmEKaW5kZXggNmZlZDIzMy4uODE0NjdjMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvQ2hhbmdlSWRVdGlsVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL0NoYW5nZUlkVXRpbFRlc3QuamF2YQpAQCAtNjgwLDE1ICs2ODAsMTUgQEAKIAkJCQkiXG4iKSk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGhvb2tEb2VzTm90TW9kaWZ5KGZpbmFsIFN0cmluZyBpbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIGhvb2tEb2VzTm90TW9kaWZ5KFN0cmluZyBpbikgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWFzc2VydEVxdWFscyhpbiwgY2FsbChpbikpOwogCX0KIAotCXByaXZhdGUgU3RyaW5nIGNhbGwoZmluYWwgU3RyaW5nIGJvZHkpIHRocm93cyBFeGNlcHRpb24geworCXByaXZhdGUgU3RyaW5nIGNhbGwoU3RyaW5nIGJvZHkpIHRocm93cyBFeGNlcHRpb24gewogCQlyZXR1cm4gY2FsbChib2R5LCBmYWxzZSk7CiAJfQogCi0JcHJpdmF0ZSBTdHJpbmcgY2FsbChmaW5hbCBTdHJpbmcgYm9keSwgYm9vbGVhbiByZXBsYWNlRXhpc3RpbmcpIHRocm93cyBFeGNlcHRpb24geworCXByaXZhdGUgU3RyaW5nIGNhbGwoU3RyaW5nIGJvZHksIGJvb2xlYW4gcmVwbGFjZUV4aXN0aW5nKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJT2JqZWN0SWQgY29tcHV0ZUNoYW5nZUlkID0gQ2hhbmdlSWRVdGlsLmNvbXB1dGVDaGFuZ2VJZCh0cmVlSWQxLAogCQkJCXBhcmVudElkMSwgYXV0aG9yLCBjb21taXR0ZXIsIGJvZHkpOwogCQlpZiAoY29tcHV0ZUNoYW5nZUlkID09IG51bGwpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9Ib29rVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvSG9va1Rlc3QuamF2YQppbmRleCBhNjgwZWY5Li5lMzRjM2NlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9Ib29rVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL0hvb2tUZXN0LmphdmEKQEAgLTI0MSw3ICsyNDEsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBGaWxlIHdyaXRlSG9va0ZpbGUoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBkYXRhKQorCXByaXZhdGUgRmlsZSB3cml0ZUhvb2tGaWxlKFN0cmluZyBuYW1lLCBTdHJpbmcgZGF0YSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCUZpbGUgcGF0aCA9IG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCkgKyAiLy5naXQvaG9va3MvIiwgbmFtZSk7CiAJCUpHaXRUZXN0VXRpbC53cml0ZShwYXRoLCBkYXRhKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL05CVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvTkJUZXN0LmphdmEKaW5kZXggZDJkNDRmZi4uODMwZjIwZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvTkJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvTkJUZXN0LmphdmEKQEAgLTMzOCw3ICszMzgsNyBAQAogCQlhc3NlcnRPdXRwdXQoYigweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmKSwgb3V0LCAzKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHByZXBhcmVPdXRwdXQoZmluYWwgYnl0ZVtdIGJ1ZikgeworCXByaXZhdGUgc3RhdGljIHZvaWQgcHJlcGFyZU91dHB1dChieXRlW10gYnVmKSB7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgYnVmLmxlbmd0aDsgaSsrKQogCQkJYnVmW2ldID0gKGJ5dGUpICgweDc3ICsgaSk7CiAJfQpAQCAtMzUzLDExICszNTMsMTEgQEAKIAkJCWFzc2VydEVxdWFscygoYnl0ZSkgKDB4NzcgKyBpKSwgYnVmW2ldKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBieXRlW10gYihmaW5hbCBpbnQgYSwgZmluYWwgaW50IGIpIHsKKwlwcml2YXRlIHN0YXRpYyBieXRlW10gYihpbnQgYSwgaW50IGIpIHsKIAkJcmV0dXJuIG5ldyBieXRlW10geyAoYnl0ZSkgYSwgKGJ5dGUpIGIgfTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBieXRlW10gcGFkYihmaW5hbCBpbnQgbGVuLCBmaW5hbCBpbnQgYSwgZmluYWwgaW50IGIpIHsKKwlwcml2YXRlIHN0YXRpYyBieXRlW10gcGFkYihpbnQgbGVuLCBpbnQgYSwgaW50IGIpIHsKIAkJZmluYWwgYnl0ZVtdIHIgPSBuZXcgYnl0ZVtsZW4gKyAyXTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykKIAkJCXJbaV0gPSAoYnl0ZSkgMHhhZjsKQEAgLTM3MCw3ICszNzAsNyBAQAogCQlyZXR1cm4gbmV3IGJ5dGVbXSB7IChieXRlKSBhLCAoYnl0ZSkgYiwgKGJ5dGUpIGMgfTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBieXRlW10gYihmaW5hbCBpbnQgYSwgZmluYWwgaW50IGIsIGZpbmFsIGludCBjLCBmaW5hbCBpbnQgZCkgeworCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBiKGludCBhLCBpbnQgYiwgaW50IGMsIGludCBkKSB7CiAJCXJldHVybiBuZXcgYnl0ZVtdIHsgKGJ5dGUpIGEsIChieXRlKSBiLCAoYnl0ZSkgYywgKGJ5dGUpIGQgfTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1F1b3RlZFN0cmluZ0JvdXJuZVN0eWxlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUXVvdGVkU3RyaW5nQm91cm5lU3R5bGVUZXN0LmphdmEKaW5kZXggNjUwNzg3Ni4uNDlhZDU1ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUXVvdGVkU3RyaW5nQm91cm5lU3R5bGVUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUXVvdGVkU3RyaW5nQm91cm5lU3R5bGVUZXN0LmphdmEKQEAgLTUyLDE0ICs1MiwxNCBAQAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBwdWJsaWMgY2xhc3MgUXVvdGVkU3RyaW5nQm91cm5lU3R5bGVUZXN0IHsKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydFF1b3RlKGZpbmFsIFN0cmluZyBpbiwgZmluYWwgU3RyaW5nIGV4cCkgeworCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0UXVvdGUoU3RyaW5nIGluLCBTdHJpbmcgZXhwKSB7CiAJCWZpbmFsIFN0cmluZyByID0gQk9VUk5FLnF1b3RlKGluKTsKIAkJYXNzZXJ0Tm90U2FtZShpbiwgcik7CiAJCWFzc2VydEZhbHNlKGluLmVxdWFscyhyKSk7CiAJCWFzc2VydEVxdWFscygnXCcnICsgZXhwICsgJ1wnJywgcik7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnREZXF1b3RlKGZpbmFsIFN0cmluZyBleHAsIGZpbmFsIFN0cmluZyBpbikgeworCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RGVxdW90ZShTdHJpbmcgZXhwLCBTdHJpbmcgaW4pIHsKIAkJZmluYWwgYnl0ZVtdIGIgPSBDb25zdGFudHMuZW5jb2RlKCdcJycgKyBpbiArICdcJycpOwogCQlmaW5hbCBTdHJpbmcgciA9IEJPVVJORS5kZXF1b3RlKGIsIDAsIGIubGVuZ3RoKTsKIAkJYXNzZXJ0RXF1YWxzKGV4cCwgcik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9RdW90ZWRTdHJpbmdCb3VybmVVc2VyUGF0aFN0eWxlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUXVvdGVkU3RyaW5nQm91cm5lVXNlclBhdGhTdHlsZVRlc3QuamF2YQppbmRleCA3NDYzNTI4Li4xN2YxYjc3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9RdW90ZWRTdHJpbmdCb3VybmVVc2VyUGF0aFN0eWxlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1F1b3RlZFN0cmluZ0JvdXJuZVVzZXJQYXRoU3R5bGVUZXN0LmphdmEKQEAgLTUyLDE0ICs1MiwxNCBAQAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBwdWJsaWMgY2xhc3MgUXVvdGVkU3RyaW5nQm91cm5lVXNlclBhdGhTdHlsZVRlc3QgewotCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0UXVvdGUoZmluYWwgU3RyaW5nIGluLCBmaW5hbCBTdHJpbmcgZXhwKSB7CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRRdW90ZShTdHJpbmcgaW4sIFN0cmluZyBleHApIHsKIAkJZmluYWwgU3RyaW5nIHIgPSBCT1VSTkVfVVNFUl9QQVRILnF1b3RlKGluKTsKIAkJYXNzZXJ0Tm90U2FtZShpbiwgcik7CiAJCWFzc2VydEZhbHNlKGluLmVxdWFscyhyKSk7CiAJCWFzc2VydEVxdWFscygnXCcnICsgZXhwICsgJ1wnJywgcik7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnREZXF1b3RlKGZpbmFsIFN0cmluZyBleHAsIGZpbmFsIFN0cmluZyBpbikgeworCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RGVxdW90ZShTdHJpbmcgZXhwLCBTdHJpbmcgaW4pIHsKIAkJZmluYWwgYnl0ZVtdIGIgPSBDb25zdGFudHMuZW5jb2RlKCdcJycgKyBpbiArICdcJycpOwogCQlmaW5hbCBTdHJpbmcgciA9IEJPVVJORV9VU0VSX1BBVEguZGVxdW90ZShiLCAwLCBiLmxlbmd0aCk7CiAJCWFzc2VydEVxdWFscyhleHAsIHIpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUXVvdGVkU3RyaW5nR2l0UGF0aFN0eWxlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUXVvdGVkU3RyaW5nR2l0UGF0aFN0eWxlVGVzdC5qYXZhCmluZGV4IGE2ZjMzNDUuLjlhMGM5NmUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1F1b3RlZFN0cmluZ0dpdFBhdGhTdHlsZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9RdW90ZWRTdHJpbmdHaXRQYXRoU3R5bGVUZXN0LmphdmEKQEAgLTU0LDE0ICs1NCwxNCBAQAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBwdWJsaWMgY2xhc3MgUXVvdGVkU3RyaW5nR2l0UGF0aFN0eWxlVGVzdCB7Ci0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRRdW90ZShmaW5hbCBTdHJpbmcgZXhwLCBmaW5hbCBTdHJpbmcgaW4pIHsKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydFF1b3RlKFN0cmluZyBleHAsIFN0cmluZyBpbikgewogCQlmaW5hbCBTdHJpbmcgciA9IEdJVF9QQVRILnF1b3RlKGluKTsKIAkJYXNzZXJ0Tm90U2FtZShpbiwgcik7CiAJCWFzc2VydEZhbHNlKGluLmVxdWFscyhyKSk7CiAJCWFzc2VydEVxdWFscygnIicgKyBleHAgKyAnIicsIHIpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RGVxdW90ZShmaW5hbCBTdHJpbmcgZXhwLCBmaW5hbCBTdHJpbmcgaW4pIHsKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydERlcXVvdGUoU3RyaW5nIGV4cCwgU3RyaW5nIGluKSB7CiAJCWZpbmFsIGJ5dGVbXSBiID0gKCciJyArIGluICsgJyInKS5nZXRCeXRlcyhJU09fODg1OV8xKTsKIAkJZmluYWwgU3RyaW5nIHIgPSBHSVRfUEFUSC5kZXF1b3RlKGIsIDAsIGIubGVuZ3RoKTsKIAkJYXNzZXJ0RXF1YWxzKGV4cCwgcik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdQYXJzZVV0aWxzX0hleFBhcnNlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3UGFyc2VVdGlsc19IZXhQYXJzZVRlc3QuamF2YQppbmRleCBmNWI1NmU3Li5mM2MwNDZkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdQYXJzZVV0aWxzX0hleFBhcnNlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd1BhcnNlVXRpbHNfSGV4UGFyc2VUZXN0LmphdmEKQEAgLTgxLDcgKzgxLDcgQEAKIAkJYXNzZXJ0Tm90SGV4KCcuJyk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnROb3RIZXgoZmluYWwgY2hhciBjKSB7CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnROb3RIZXgoY2hhciBjKSB7CiAJCXRyeSB7CiAJCQlSYXdQYXJzZVV0aWxzLnBhcnNlSGV4SW50NCgoYnl0ZSkgYyk7CiAJCQlmYWlsKCJJbmNvcnJlY3RseSBhY2NjZXB0ZWQgIiArIGMpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3UGFyc2VVdGlsc19MaW5lTWFwVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3UGFyc2VVdGlsc19MaW5lTWFwVGVzdC5qYXZhCmluZGV4IDAyNDM3OTguLjc2MzBjMTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd1BhcnNlVXRpbHNfTGluZU1hcFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdQYXJzZVV0aWxzX0xpbmVNYXBUZXN0LmphdmEKQEAgLTQ3LDE4ICs0NywyNSBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5CaW5hcnlCbG9iRXhjZXB0aW9uOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5FeHBlY3RlZEV4Y2VwdGlvbjsKIAogcHVibGljIGNsYXNzIFJhd1BhcnNlVXRpbHNfTGluZU1hcFRlc3QgeworCUBSdWxlCisJcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKKworCiAJQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHkoKSB7CisJcHVibGljIHZvaWQgdGVzdEVtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIEludExpc3QgbWFwID0gUmF3UGFyc2VVdGlscy5saW5lTWFwKG5ldyBieXRlW10ge30sIDAsIDApOwogCQlhc3NlcnROb3ROdWxsKG1hcCk7CiAJCWFzc2VydEFycmF5RXF1YWxzKG5ldyBpbnRbXXtJbnRlZ2VyLk1JTl9WQUxVRSwgMH0sIGFzSW50cyhtYXApKTsKIAl9CiAKIAlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RPbmVCbGFua0xpbmUoKSB7CisJcHVibGljIHZvaWQgdGVzdE9uZUJsYW5rTGluZSgpIHRocm93cyBFeGNlcHRpb24gIHsKIAkJZmluYWwgSW50TGlzdCBtYXAgPSBSYXdQYXJzZVV0aWxzLmxpbmVNYXAobmV3IGJ5dGVbXSB7ICdcbicgfSwgMCwgMSk7CiAJCWFzc2VydEFycmF5RXF1YWxzKG5ldyBpbnRbXXtJbnRlZ2VyLk1JTl9WQUxVRSwgMCwgMX0sIGFzSW50cyhtYXApKTsKIAl9CkBAIC04NSw2ICs5MiwxMyBAQAogCX0KIAogCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdExpbmVNYXBPckJpbmFyeSgpIHRocm93cyBFeGNlcHRpb24geworCQlmaW5hbCBieXRlW10gYnVmID0gInh4eGZvb1xuYlwwYXIiLmdldEJ5dGVzKElTT184ODU5XzEpOworCQlleGNlcHRpb24uZXhwZWN0KEJpbmFyeUJsb2JFeGNlcHRpb24uY2xhc3MpOworCQlSYXdQYXJzZVV0aWxzLmxpbmVNYXBPckJpbmFyeShidWYsIDMsIGJ1Zi5sZW5ndGgpOworCX0KKworCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdEZvdXJMaW5lQmxhbmtzKCkgewogCQlmaW5hbCBieXRlW10gYnVmID0gImZvb1xuXG5cbmJhclxuIi5nZXRCeXRlcyhJU09fODg1OV8xKTsKIAkJZmluYWwgSW50TGlzdCBtYXAgPSBSYXdQYXJzZVV0aWxzLmxpbmVNYXAoYnVmLCAwLCBidWYubGVuZ3RoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd1N1YlN0cmluZ1BhdHRlcm5UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdTdWJTdHJpbmdQYXR0ZXJuVGVzdC5qYXZhCmluZGV4IGU4NTY2ZDIuLmE3NDhiNTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd1N1YlN0cmluZ1BhdHRlcm5UZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3U3ViU3RyaW5nUGF0dGVyblRlc3QuamF2YQpAQCAtNDIsNyArNDIsNyBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudXRpbDsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogCkBAIC05Myw3ICs5Myw3IEBACiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgUmF3Q2hhclNlcXVlbmNlIHJhdyhTdHJpbmcgdGV4dCkgewotCQlieXRlW10gYnl0ZXMgPSB0ZXh0LmdldEJ5dGVzKFVURl84KTsKKwkJYnl0ZVtdIGJ5dGVzID0gdGV4dC5nZXRCeXRlcyhDSEFSU0VUKTsKIAkJcmV0dXJuIG5ldyBSYXdDaGFyU2VxdWVuY2UoYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmVmTGlzdFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1JlZkxpc3RUZXN0LmphdmEKaW5kZXggNWExNDY4YS4uZDEyNGQ3MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmVmTGlzdFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SZWZMaXN0VGVzdC5qYXZhCkBAIC00NTYsNyArNDU2LDcgQEAKIAkJcmV0dXJuIGIudG9SZWZMaXN0KCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgUmVmIG5ld1JlZihmaW5hbCBTdHJpbmcgbmFtZSkgeworCXByaXZhdGUgc3RhdGljIFJlZiBuZXdSZWYoU3RyaW5nIG5hbWUpIHsKIAkJcmV0dXJuIG5ldyBPYmplY3RJZFJlZi5VbnBlZWxlZChSZWYuU3RvcmFnZS5MT09TRSwgbmFtZSwgSUQpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1RlbXBvcmFyeUJ1ZmZlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1RlbXBvcmFyeUJ1ZmZlclRlc3QuamF2YQppbmRleCBkOTc4ODA0Li5lZGNjZTEyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9UZW1wb3JhcnlCdWZmZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvVGVtcG9yYXJ5QnVmZmVyVGVzdC5qYXZhCkBAIC02MSw2ICs2MSw3IEBACiBwdWJsaWMgY2xhc3MgVGVtcG9yYXJ5QnVmZmVyVGVzdCB7CiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0RW1wdHkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBCdWZmZXIgaXMgZXhwbGljaXRseSBkZXN0cm95ZWQgaW4gZmluYWxseSBibG9jawogCQlmaW5hbCBUZW1wb3JhcnlCdWZmZXIgYiA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuTG9jYWxGaWxlKG51bGwpOwogCQl0cnkgewogCQkJYi5jbG9zZSgpOwpAQCAtNzUsNiArNzYsNyBAQAogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0T25lQnl0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIEJ1ZmZlciBpcyBleHBsaWNpdGx5IGRlc3Ryb3llZCBpbiBmaW5hbGx5IGJsb2NrCiAJCWZpbmFsIFRlbXBvcmFyeUJ1ZmZlciBiID0gbmV3IFRlbXBvcmFyeUJ1ZmZlci5Mb2NhbEZpbGUobnVsbCk7CiAJCWZpbmFsIGJ5dGUgdGVzdCA9IChieXRlKSBuZXcgVGVzdFJuZyhnZXROYW1lKCkpLm5leHRJbnQoKTsKIAkJdHJ5IHsKQEAgLTg3LDEwICs4OSw4IEBACiAJCQkJYXNzZXJ0RXF1YWxzKDEsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRFcXVhbHModGVzdCwgclswXSk7CiAJCQl9Ci0JCQl7Ci0JCQkJZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCQl0cnkgKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKSB7CiAJCQkJYi53cml0ZVRvKG8sIG51bGwpOwotCQkJCW8uY2xvc2UoKTsKIAkJCQlmaW5hbCBieXRlW10gciA9IG8udG9CeXRlQXJyYXkoKTsKIAkJCQlhc3NlcnRFcXVhbHMoMSwgci5sZW5ndGgpOwogCQkJCWFzc2VydEVxdWFscyh0ZXN0LCByWzBdKTsKQEAgLTEwMiw2ICsxMDIsNyBAQAogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0T25lQmxvY2tfQnVsa1dyaXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gQnVmZmVyIGlzIGV4cGxpY2l0bHkgZGVzdHJveWVkIGluIGZpbmFsbHkgYmxvY2sKIAkJZmluYWwgVGVtcG9yYXJ5QnVmZmVyIGIgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkxvY2FsRmlsZShudWxsKTsKIAkJZmluYWwgYnl0ZVtdIHRlc3QgPSBuZXcgVGVzdFJuZyhnZXROYW1lKCkpCiAJCQkJLm5leHRCeXRlcyhUZW1wb3JhcnlCdWZmZXIuQmxvY2suU1opOwpAQCAtMTE4LDEwICsxMTksOCBAQAogCQkJCWFzc2VydEVxdWFscyh0ZXN0Lmxlbmd0aCwgci5sZW5ndGgpOwogCQkJCWFzc2VydEFycmF5RXF1YWxzKHRlc3QsIHIpOwogCQkJfQotCQkJewotCQkJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCQkJdHJ5IChCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSkgewogCQkJCWIud3JpdGVUbyhvLCBudWxsKTsKLQkJCQlvLmNsb3NlKCk7CiAJCQkJZmluYWwgYnl0ZVtdIHIgPSBvLnRvQnl0ZUFycmF5KCk7CiAJCQkJYXNzZXJ0RXF1YWxzKHRlc3QubGVuZ3RoLCByLmxlbmd0aCk7CiAJCQkJYXNzZXJ0QXJyYXlFcXVhbHModGVzdCwgcik7CkBAIC0xMzMsNiArMTMyLDcgQEAKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdE9uZUJsb2NrQW5kSGFsZl9CdWxrV3JpdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBCdWZmZXIgaXMgZXhwbGljaXRseSBkZXN0cm95ZWQgaW4gZmluYWxseSBibG9jawogCQlmaW5hbCBUZW1wb3JhcnlCdWZmZXIgYiA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuTG9jYWxGaWxlKG51bGwpOwogCQlmaW5hbCBieXRlW10gdGVzdCA9IG5ldyBUZXN0Um5nKGdldE5hbWUoKSkKIAkJCQkubmV4dEJ5dGVzKFRlbXBvcmFyeUJ1ZmZlci5CbG9jay5TWiAqIDMgLyAyKTsKQEAgLTE0OSwxMCArMTQ5LDggQEAKIAkJCQlhc3NlcnRFcXVhbHModGVzdC5sZW5ndGgsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRBcnJheUVxdWFscyh0ZXN0LCByKTsKIAkJCX0KLQkJCXsKLQkJCQlmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKwkJCXRyeSAoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkpIHsKIAkJCQliLndyaXRlVG8obywgbnVsbCk7Ci0JCQkJby5jbG9zZSgpOwogCQkJCWZpbmFsIGJ5dGVbXSByID0gby50b0J5dGVBcnJheSgpOwogCQkJCWFzc2VydEVxdWFscyh0ZXN0Lmxlbmd0aCwgci5sZW5ndGgpOwogCQkJCWFzc2VydEFycmF5RXF1YWxzKHRlc3QsIHIpOwpAQCAtMTY0LDYgKzE2Miw3IEBACiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RPbmVCbG9ja0FuZEhhbGZfU2luZ2xlV3JpdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBCdWZmZXIgaXMgZXhwbGljaXRseSBkZXN0cm95ZWQgaW4gZmluYWxseSBibG9jawogCQlmaW5hbCBUZW1wb3JhcnlCdWZmZXIgYiA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuTG9jYWxGaWxlKG51bGwpOwogCQlmaW5hbCBieXRlW10gdGVzdCA9IG5ldyBUZXN0Um5nKGdldE5hbWUoKSkKIAkJCQkubmV4dEJ5dGVzKFRlbXBvcmFyeUJ1ZmZlci5CbG9jay5TWiAqIDMgLyAyKTsKQEAgLTE3OCwxMCArMTc3LDggQEAKIAkJCQlhc3NlcnRFcXVhbHModGVzdC5sZW5ndGgsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRBcnJheUVxdWFscyh0ZXN0LCByKTsKIAkJCX0KLQkJCXsKLQkJCQlmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKwkJCXRyeSAoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkpIHsKIAkJCQliLndyaXRlVG8obywgbnVsbCk7Ci0JCQkJby5jbG9zZSgpOwogCQkJCWZpbmFsIGJ5dGVbXSByID0gby50b0J5dGVBcnJheSgpOwogCQkJCWFzc2VydEVxdWFscyh0ZXN0Lmxlbmd0aCwgci5sZW5ndGgpOwogCQkJCWFzc2VydEFycmF5RXF1YWxzKHRlc3QsIHIpOwpAQCAtMTkzLDYgKzE5MCw3IEBACiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RPbmVCbG9ja0FuZEhhbGZfQ29weSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIEJ1ZmZlciBpcyBleHBsaWNpdGx5IGRlc3Ryb3llZCBpbiBmaW5hbGx5IGJsb2NrCiAJCWZpbmFsIFRlbXBvcmFyeUJ1ZmZlciBiID0gbmV3IFRlbXBvcmFyeUJ1ZmZlci5Mb2NhbEZpbGUobnVsbCk7CiAJCWZpbmFsIGJ5dGVbXSB0ZXN0ID0gbmV3IFRlc3RSbmcoZ2V0TmFtZSgpKQogCQkJCS5uZXh0Qnl0ZXMoVGVtcG9yYXJ5QnVmZmVyLkJsb2NrLlNaICogMyAvIDIpOwpAQCAtMjA4LDEwICsyMDYsOCBAQAogCQkJCWFzc2VydEVxdWFscyh0ZXN0Lmxlbmd0aCwgci5sZW5ndGgpOwogCQkJCWFzc2VydEFycmF5RXF1YWxzKHRlc3QsIHIpOwogCQkJfQotCQkJewotCQkJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCQkJdHJ5IChCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSkgewogCQkJCWIud3JpdGVUbyhvLCBudWxsKTsKLQkJCQlvLmNsb3NlKCk7CiAJCQkJZmluYWwgYnl0ZVtdIHIgPSBvLnRvQnl0ZUFycmF5KCk7CiAJCQkJYXNzZXJ0RXF1YWxzKHRlc3QubGVuZ3RoLCByLmxlbmd0aCk7CiAJCQkJYXNzZXJ0QXJyYXlFcXVhbHModGVzdCwgcik7CkBAIC0yMjMsNiArMjE5LDcgQEAKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdExhcmdlX1NpbmdsZVdyaXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gQnVmZmVyIGlzIGV4cGxpY2l0bHkgZGVzdHJveWVkIGluIGZpbmFsbHkgYmxvY2sKIAkJZmluYWwgVGVtcG9yYXJ5QnVmZmVyIGIgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkxvY2FsRmlsZShudWxsKTsKIAkJZmluYWwgYnl0ZVtdIHRlc3QgPSBuZXcgVGVzdFJuZyhnZXROYW1lKCkpCiAJCQkJLm5leHRCeXRlcyhUZW1wb3JhcnlCdWZmZXIuREVGQVVMVF9JTl9DT1JFX0xJTUlUICogMyk7CkBAIC0yMzYsMTAgKzIzMyw4IEBACiAJCQkJYXNzZXJ0RXF1YWxzKHRlc3QubGVuZ3RoLCByLmxlbmd0aCk7CiAJCQkJYXNzZXJ0QXJyYXlFcXVhbHModGVzdCwgcik7CiAJCQl9Ci0JCQl7Ci0JCQkJZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCQl0cnkgKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKSB7CiAJCQkJYi53cml0ZVRvKG8sIG51bGwpOwotCQkJCW8uY2xvc2UoKTsKIAkJCQlmaW5hbCBieXRlW10gciA9IG8udG9CeXRlQXJyYXkoKTsKIAkJCQlhc3NlcnRFcXVhbHModGVzdC5sZW5ndGgsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRBcnJheUVxdWFscyh0ZXN0LCByKTsKQEAgLTI1MywxOCArMjQ4LDE4IEBACiAJcHVibGljIHZvaWQgdGVzdEluQ29yZUlucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgaW50IGNudCA9IDI1NjsKIAkJZmluYWwgYnl0ZVtdIHRlc3QgPSBuZXcgVGVzdFJuZyhnZXROYW1lKCkpLm5leHRCeXRlcyhjbnQpOwotCQlmaW5hbCBUZW1wb3JhcnlCdWZmZXIuSGVhcCBiID0gbmV3IFRlbXBvcmFyeUJ1ZmZlci5IZWFwKGNudCArIDQpOwotCQliLndyaXRlKHRlc3QpOwotCQliLmNsb3NlKCk7Ci0KLQkJSW5wdXRTdHJlYW0gaW4gPSBiLm9wZW5JbnB1dFN0cmVhbSgpOwotCQlieXRlW10gYWN0ID0gbmV3IGJ5dGVbY250XTsKLQkJSU8ucmVhZEZ1bGx5KGluLCBhY3QsIDAsIGNudCk7Ci0JCWFzc2VydEFycmF5RXF1YWxzKHRlc3QsIGFjdCk7CisJCXRyeSAoVGVtcG9yYXJ5QnVmZmVyLkhlYXAgYiA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuSGVhcChjbnQgKyA0KSkgeworCQkJYi53cml0ZSh0ZXN0KTsKKwkJCUlucHV0U3RyZWFtIGluID0gYi5vcGVuSW5wdXRTdHJlYW0oKTsKKwkJCWJ5dGVbXSBhY3QgPSBuZXcgYnl0ZVtjbnRdOworCQkJSU8ucmVhZEZ1bGx5KGluLCBhY3QsIDAsIGNudCk7CisJCQlhc3NlcnRBcnJheUVxdWFscyh0ZXN0LCBhY3QpOworCQl9CiAJfQogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0SW5Db3JlTGltaXRfU3dpdGNoT25BcHBlbmRCeXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gQnVmZmVyIGlzIGV4cGxpY2l0bHkgZGVzdHJveWVkIGluIGZpbmFsbHkgYmxvY2sKIAkJZmluYWwgVGVtcG9yYXJ5QnVmZmVyIGIgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkxvY2FsRmlsZShudWxsKTsKIAkJZmluYWwgYnl0ZVtdIHRlc3QgPSBuZXcgVGVzdFJuZyhnZXROYW1lKCkpCiAJCQkJLm5leHRCeXRlcyhUZW1wb3JhcnlCdWZmZXIuREVGQVVMVF9JTl9DT1JFX0xJTUlUICsgMSk7CkBAIC0yNzksMTAgKzI3NCw4IEBACiAJCQkJYXNzZXJ0RXF1YWxzKHRlc3QubGVuZ3RoLCByLmxlbmd0aCk7CiAJCQkJYXNzZXJ0QXJyYXlFcXVhbHModGVzdCwgcik7CiAJCQl9Ci0JCQl7Ci0JCQkJZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCQl0cnkgKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKSB7CiAJCQkJYi53cml0ZVRvKG8sIG51bGwpOwotCQkJCW8uY2xvc2UoKTsKIAkJCQlmaW5hbCBieXRlW10gciA9IG8udG9CeXRlQXJyYXkoKTsKIAkJCQlhc3NlcnRFcXVhbHModGVzdC5sZW5ndGgsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRBcnJheUVxdWFscyh0ZXN0LCByKTsKQEAgLTI5NCw2ICsyODcsNyBAQAogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0SW5Db3JlTGltaXRfU3dpdGNoQmVmb3JlQXBwZW5kQnl0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIEJ1ZmZlciBpcyBleHBsaWNpdGx5IGRlc3Ryb3llZCBpbiBmaW5hbGx5IGJsb2NrCiAJCWZpbmFsIFRlbXBvcmFyeUJ1ZmZlciBiID0gbmV3IFRlbXBvcmFyeUJ1ZmZlci5Mb2NhbEZpbGUobnVsbCk7CiAJCWZpbmFsIGJ5dGVbXSB0ZXN0ID0gbmV3IFRlc3RSbmcoZ2V0TmFtZSgpKQogCQkJCS5uZXh0Qnl0ZXMoVGVtcG9yYXJ5QnVmZmVyLkRFRkFVTFRfSU5fQ09SRV9MSU1JVCAqIDMpOwpAQCAtMzA4LDEwICszMDIsOCBAQAogCQkJCWFzc2VydEVxdWFscyh0ZXN0Lmxlbmd0aCwgci5sZW5ndGgpOwogCQkJCWFzc2VydEFycmF5RXF1YWxzKHRlc3QsIHIpOwogCQkJfQotCQkJewotCQkJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCQkJdHJ5IChCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSkgewogCQkJCWIud3JpdGVUbyhvLCBudWxsKTsKLQkJCQlvLmNsb3NlKCk7CiAJCQkJZmluYWwgYnl0ZVtdIHIgPSBvLnRvQnl0ZUFycmF5KCk7CiAJCQkJYXNzZXJ0RXF1YWxzKHRlc3QubGVuZ3RoLCByLmxlbmd0aCk7CiAJCQkJYXNzZXJ0QXJyYXlFcXVhbHModGVzdCwgcik7CkBAIC0zMjMsNiArMzE1LDcgQEAKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdEluQ29yZUxpbWl0X1N3aXRjaE9uQ29weSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIEJ1ZmZlciBpcyBleHBsaWNpdGx5IGRlc3Ryb3llZCBpbiBmaW5hbGx5IGJsb2NrCiAJCWZpbmFsIFRlbXBvcmFyeUJ1ZmZlciBiID0gbmV3IFRlbXBvcmFyeUJ1ZmZlci5Mb2NhbEZpbGUobnVsbCk7CiAJCWZpbmFsIGJ5dGVbXSB0ZXN0ID0gbmV3IFRlc3RSbmcoZ2V0TmFtZSgpKQogCQkJCS5uZXh0Qnl0ZXMoVGVtcG9yYXJ5QnVmZmVyLkRFRkFVTFRfSU5fQ09SRV9MSU1JVCAqIDIpOwpAQCAtMzQwLDEwICszMzMsOCBAQAogCQkJCWFzc2VydEVxdWFscyh0ZXN0Lmxlbmd0aCwgci5sZW5ndGgpOwogCQkJCWFzc2VydEFycmF5RXF1YWxzKHRlc3QsIHIpOwogCQkJfQotCQkJewotCQkJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCQkJdHJ5IChCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSkgewogCQkJCWIud3JpdGVUbyhvLCBudWxsKTsKLQkJCQlvLmNsb3NlKCk7CiAJCQkJZmluYWwgYnl0ZVtdIHIgPSBvLnRvQnl0ZUFycmF5KCk7CiAJCQkJYXNzZXJ0RXF1YWxzKHRlc3QubGVuZ3RoLCByLmxlbmd0aCk7CiAJCQkJYXNzZXJ0QXJyYXlFcXVhbHModGVzdCwgcik7CkBAIC0zNTUsNyArMzQ2LDcgQEAKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdERlc3Ryb3lXaGlsZU9wZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiIC8qIGphdmEgNyAqLykKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gQnVmZmVyIGlzIGV4cGxpY2l0bHkgZGVzdHJveWVkIGluIGZpbmFsbHkgYmxvY2sKIAkJZmluYWwgVGVtcG9yYXJ5QnVmZmVyIGIgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkxvY2FsRmlsZShudWxsKTsKIAkJdHJ5IHsKIAkJCWIud3JpdGUobmV3IFRlc3RSbmcoZ2V0TmFtZSgpKQpAQCAtMzY3LDYgKzM1OCw3IEBACiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RSYW5kb21Xcml0ZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBCdWZmZXIgaXMgZXhwbGljaXRseSBkZXN0cm95ZWQgaW4gZmluYWxseSBibG9jawogCQlmaW5hbCBUZW1wb3JhcnlCdWZmZXIgYiA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuTG9jYWxGaWxlKG51bGwpOwogCQlmaW5hbCBUZXN0Um5nIHJuZyA9IG5ldyBUZXN0Um5nKGdldE5hbWUoKSk7CiAJCWZpbmFsIGludCBtYXggPSBUZW1wb3JhcnlCdWZmZXIuREVGQVVMVF9JTl9DT1JFX0xJTUlUICogMjsKQEAgLTM5OSwxMCArMzkxLDggQEAKIAkJCQlhc3NlcnRFcXVhbHMoZXhwZWN0Lmxlbmd0aCwgci5sZW5ndGgpOwogCQkJCWFzc2VydEFycmF5RXF1YWxzKGV4cGVjdCwgcik7CiAJCQl9Ci0JCQl7Ci0JCQkJZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCQl0cnkgKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKSB7CiAJCQkJYi53cml0ZVRvKG8sIG51bGwpOwotCQkJCW8uY2xvc2UoKTsKIAkJCQlmaW5hbCBieXRlW10gciA9IG8udG9CeXRlQXJyYXkoKTsKIAkJCQlhc3NlcnRFcXVhbHMoZXhwZWN0Lmxlbmd0aCwgci5sZW5ndGgpOwogCQkJCWFzc2VydEFycmF5RXF1YWxzKGV4cGVjdCwgcik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvQ1JMRk91dHB1dFN0cmVhbVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0F1dG9DUkxGT3V0cHV0U3RyZWFtVGVzdC5qYXZhCmluZGV4IGE3MmQzM2MuLjA2NTU4MjcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0F1dG9DUkxGT3V0cHV0U3RyZWFtVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0F1dG9DUkxGT3V0cHV0U3RyZWFtVGVzdC5qYXZhCkBAIC05NiwzMiArOTYsMzEgQEAKIAkJZm9yIChpbnQgaSA9IC00OyBpIDwgNTsgKytpKSB7CiAJCQlpbnQgc2l6ZSA9IE1hdGguYWJzKGkpOwogCQkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW3NpemVdOwotCQkJSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oaW5ieXRlcyk7Ci0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBBdXRvQ1JMRk91dHB1dFN0cmVhbShib3MpOwotCQkJaWYgKGkgPiAwKSB7Ci0JCQkJaW50IG47Ci0JCQkJd2hpbGUgKChuID0gaW4ucmVhZChidWYpKSA+PSAwKSB7Ci0JCQkJCW91dC53cml0ZShidWYsIDAsIG4pOworCQkJdHJ5IChJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbmJ5dGVzKTsKKwkJCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKwkJCQkJT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBBdXRvQ1JMRk91dHB1dFN0cmVhbShib3MpKSB7CisJCQkJaWYgKGkgPiAwKSB7CisJCQkJCWludCBuOworCQkJCQl3aGlsZSAoKG4gPSBpbi5yZWFkKGJ1ZikpID49IDApIHsKKwkJCQkJCW91dC53cml0ZShidWYsIDAsIG4pOworCQkJCQl9CisJCQkJfSBlbHNlIGlmIChpIDwgMCkgeworCQkJCQlpbnQgbjsKKwkJCQkJd2hpbGUgKChuID0gaW4ucmVhZChidWYpKSA+PSAwKSB7CisJCQkJCQlieXRlW10gYiA9IG5ldyBieXRlW25dOworCQkJCQkJU3lzdGVtLmFycmF5Y29weShidWYsIDAsIGIsIDAsIG4pOworCQkJCQkJb3V0LndyaXRlKGIpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJaW50IGM7CisJCQkJCXdoaWxlICgoYyA9IGluLnJlYWQoKSkgIT0gLTEpCisJCQkJCQlvdXQud3JpdGUoYyk7CiAJCQkJfQotCQkJfSBlbHNlIGlmIChpIDwgMCkgewotCQkJCWludCBuOwotCQkJCXdoaWxlICgobiA9IGluLnJlYWQoYnVmKSkgPj0gMCkgewotCQkJCQlieXRlW10gYiA9IG5ldyBieXRlW25dOwotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGJ1ZiwgMCwgYiwgMCwgbik7Ci0JCQkJCW91dC53cml0ZShiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWludCBjOwotCQkJCXdoaWxlICgoYyA9IGluLnJlYWQoKSkgIT0gLTEpCi0JCQkJCW91dC53cml0ZShjKTsKKwkJCQlvdXQuZmx1c2goKTsKKwkJCQlieXRlW10gYWN0dWFsQnl0ZXMgPSBib3MudG9CeXRlQXJyYXkoKTsKKwkJCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJidWZzaXplPSIgKyBzaXplLCBlbmNvZGUoZXhwZWN0Qnl0ZXMpLAorCQkJCQkJZW5jb2RlKGFjdHVhbEJ5dGVzKSk7CiAJCQl9Ci0JCQlvdXQuZmx1c2goKTsKLQkJCWluLmNsb3NlKCk7Ci0JCQlvdXQuY2xvc2UoKTsKLQkJCWJ5dGVbXSBhY3R1YWxCeXRlcyA9IGJvcy50b0J5dGVBcnJheSgpOwotCQkJQXNzZXJ0LmFzc2VydEVxdWFscygiYnVmc2l6ZT0iICsgc2l6ZSwgZW5jb2RlKGV4cGVjdEJ5dGVzKSwKLQkJCQkJZW5jb2RlKGFjdHVhbEJ5dGVzKSk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0F1dG9MRklucHV0U3RyZWFtVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0xGSW5wdXRTdHJlYW1UZXN0LmphdmEKaW5kZXggMzgxOTlkOC4uNTA1ODE2NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0xGSW5wdXRTdHJlYW1UZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0xGSW5wdXRTdHJlYW1UZXN0LmphdmEKQEAgLTQ0LDcgKzQ0LDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW87CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwpAQCAtOTcsMzggKzk3LDQxIEBACiAKIAlwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3QoYnl0ZVtdIGlucHV0LCBieXRlW10gZXhwZWN0ZWQsCiAJCQlib29sZWFuIGRldGVjdEJpbmFyeSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZmluYWwgSW5wdXRTdHJlYW0gYmlzMSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbnB1dCk7Ci0JCWZpbmFsIElucHV0U3RyZWFtIGNpczEgPSBuZXcgQXV0b0xGSW5wdXRTdHJlYW0oYmlzMSwgZGV0ZWN0QmluYXJ5KTsKLQkJaW50IGluZGV4MSA9IDA7Ci0JCWZvciAoaW50IGIgPSBjaXMxLnJlYWQoKTsgYiAhPSAtMTsgYiA9IGNpczEucmVhZCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRbaW5kZXgxXSwgKGJ5dGUpIGIpOwotCQkJaW5kZXgxKys7Ci0JCX0KLQotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBpbmRleDEpOwotCi0JCWZvciAoaW50IGJ1ZmZlclNpemUgPSAxOyBidWZmZXJTaXplIDwgMTA7IGJ1ZmZlclNpemUrKykgewotCQkJZmluYWwgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW2J1ZmZlclNpemVdOwotCQkJZmluYWwgSW5wdXRTdHJlYW0gYmlzMiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbnB1dCk7Ci0JCQlmaW5hbCBJbnB1dFN0cmVhbSBjaXMyID0gbmV3IEF1dG9MRklucHV0U3RyZWFtKGJpczIsIGRldGVjdEJpbmFyeSk7Ci0KLQkJCWludCByZWFkID0gMDsKLQkJCWZvciAoaW50IHJlYWROb3cgPSBjaXMyLnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKTsgcmVhZE5vdyAhPSAtMQotCQkJCQkmJiByZWFkIDwgZXhwZWN0ZWQubGVuZ3RoOyByZWFkTm93ID0gY2lzMi5yZWFkKGJ1ZmZlciwgMCwKLQkJCQkJYnVmZmVyLmxlbmd0aCkpIHsKLQkJCQlmb3IgKGludCBpbmRleDIgPSAwOyBpbmRleDIgPCByZWFkTm93OyBpbmRleDIrKykgewotCQkJCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRbcmVhZCArIGluZGV4Ml0sIGJ1ZmZlcltpbmRleDJdKTsKLQkJCQl9Ci0JCQkJcmVhZCArPSByZWFkTm93OworCQl0cnkgKElucHV0U3RyZWFtIGJpczEgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oaW5wdXQpOworCQkJCUlucHV0U3RyZWFtIGNpczEgPSBuZXcgQXV0b0xGSW5wdXRTdHJlYW0oYmlzMSwgZGV0ZWN0QmluYXJ5KSkgeworCQkJaW50IGluZGV4MSA9IDA7CisJCQlmb3IgKGludCBiID0gY2lzMS5yZWFkKCk7IGIgIT0gLTE7IGIgPSBjaXMxLnJlYWQoKSkgeworCQkJCWFzc2VydEVxdWFscyhleHBlY3RlZFtpbmRleDFdLCAoYnl0ZSkgYik7CisJCQkJaW5kZXgxKys7CiAJCQl9CiAKLQkJCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHJlYWQpOwotCQkJY2lzMi5jbG9zZSgpOworCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgaW5kZXgxKTsKKworCQkJZm9yIChpbnQgYnVmZmVyU2l6ZSA9IDE7IGJ1ZmZlclNpemUgPCAxMDsgYnVmZmVyU2l6ZSsrKSB7CisJCQkJZmluYWwgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW2J1ZmZlclNpemVdOworCQkJCXRyeSAoSW5wdXRTdHJlYW0gYmlzMiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbnB1dCk7CisJCQkJCQlJbnB1dFN0cmVhbSBjaXMyID0gbmV3IEF1dG9MRklucHV0U3RyZWFtKGJpczIsCisJCQkJCQkJCWRldGVjdEJpbmFyeSkpIHsKKworCQkJCQlpbnQgcmVhZCA9IDA7CisJCQkJCWZvciAoaW50IHJlYWROb3cgPSBjaXMyLnJlYWQoYnVmZmVyLCAwLAorCQkJCQkJCWJ1ZmZlci5sZW5ndGgpOyByZWFkTm93ICE9IC0xCisJCQkJCQkJCQkmJiByZWFkIDwgZXhwZWN0ZWQubGVuZ3RoOyByZWFkTm93ID0gY2lzMgorCQkJCQkJCQkJCQkucmVhZChidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgpKSB7CisJCQkJCQlmb3IgKGludCBpbmRleDIgPSAwOyBpbmRleDIgPCByZWFkTm93OyBpbmRleDIrKykgeworCQkJCQkJCWFzc2VydEVxdWFscyhleHBlY3RlZFtyZWFkICsgaW5kZXgyXSwKKwkJCQkJCQkJCWJ1ZmZlcltpbmRleDJdKTsKKwkJCQkJCX0KKwkJCQkJCXJlYWQgKz0gcmVhZE5vdzsKKwkJCQkJfQorCisJCQkJCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHJlYWQpOworCQkJCX0KKwkJCX0KIAkJfQotCQljaXMxLmNsb3NlKCk7CiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGFzQnl0ZXMoU3RyaW5nIGluKSB7Ci0JCXJldHVybiBpbi5nZXRCeXRlcyhVVEZfOCk7CisJCXJldHVybiBpbi5nZXRCeXRlcyhDSEFSU0VUKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9VbmlvbklucHV0U3RyZWFtVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vVW5pb25JbnB1dFN0cmVhbVRlc3QuamF2YQppbmRleCA2YjVlZjdlLi5iODI0ZmFlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9VbmlvbklucHV0U3RyZWFtVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1VuaW9uSW5wdXRTdHJlYW1UZXN0LmphdmEKQEAgLTU4LDEzICs1OCwxMyBAQAogcHVibGljIGNsYXNzIFVuaW9uSW5wdXRTdHJlYW1UZXN0IHsKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RFbXB0eVN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZpbmFsIFVuaW9uSW5wdXRTdHJlYW0gdSA9IG5ldyBVbmlvbklucHV0U3RyZWFtKCk7Ci0JCWFzc2VydFRydWUodS5pc0VtcHR5KCkpOwotCQlhc3NlcnRFcXVhbHMoLTEsIHUucmVhZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCB1LnJlYWQobmV3IGJ5dGVbMV0sIDAsIDEpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHUuYXZhaWxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdS5za2lwKDEpKTsKLQkJdS5jbG9zZSgpOworCQl0cnkgKFVuaW9uSW5wdXRTdHJlYW0gdSA9IG5ldyBVbmlvbklucHV0U3RyZWFtKCkpIHsKKwkJCWFzc2VydFRydWUodS5pc0VtcHR5KCkpOworCQkJYXNzZXJ0RXF1YWxzKC0xLCB1LnJlYWQoKSk7CisJCQlhc3NlcnRFcXVhbHMoLTEsIHUucmVhZChuZXcgYnl0ZVsxXSwgMCwgMSkpOworCQkJYXNzZXJ0RXF1YWxzKDAsIHUuYXZhaWxhYmxlKCkpOworCQkJYXNzZXJ0RXF1YWxzKDAsIHUuc2tpcCgxKSk7CisJCX0KIAl9CiAKIAlAVGVzdApAQCAtMjExLDI1ICsyMTEsMjQgQEAKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdENsb3NlRHVyaW5nQ2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmaW5hbCBVbmlvbklucHV0U3RyZWFtIHUgPSBuZXcgVW5pb25JbnB1dFN0cmVhbSgpOwogCQlmaW5hbCBib29sZWFuIGNsb3NlZFtdID0gbmV3IGJvb2xlYW5bMl07Ci0JCXUuYWRkKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVtdIHsgMSB9KSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGNsb3NlKCkgewotCQkJCWNsb3NlZFswXSA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQl1LmFkZChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbXSB7IDIgfSkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQkJCQljbG9zZWRbMV0gPSB0cnVlOwotCQkJfQotCQl9KTsKKwkJdHJ5IChVbmlvbklucHV0U3RyZWFtIHUgPSBuZXcgVW5pb25JbnB1dFN0cmVhbSgpKSB7CisJCQl1LmFkZChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbXSB7IDEgfSkgeworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIGNsb3NlKCkgeworCQkJCQljbG9zZWRbMF0gPSB0cnVlOworCQkJCX0KKwkJCX0pOworCQkJdS5hZGQobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlW10geyAyIH0pIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKwkJCQkJY2xvc2VkWzFdID0gdHJ1ZTsKKwkJCQl9CisJCQl9KTsKIAotCQlhc3NlcnRGYWxzZShjbG9zZWRbMF0pOwotCQlhc3NlcnRGYWxzZShjbG9zZWRbMV0pOwotCi0JCXUuY2xvc2UoKTsKKwkJCWFzc2VydEZhbHNlKGNsb3NlZFswXSk7CisJCQlhc3NlcnRGYWxzZShjbG9zZWRbMV0pOworCQl9CiAKIAkJYXNzZXJ0VHJ1ZShjbG9zZWRbMF0pOwogCQlhc3NlcnRUcnVlKGNsb3NlZFsxXSk7CkBAIC0yMzcsNiArMjM2LDcgQEAKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbkR1cmluZ0Nsb3NlKCkgeworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBXZSBhcmUgdGVzdGluZyB0aGUgY2xvc2UoKSBtZXRob2QKIAkJZmluYWwgVW5pb25JbnB1dFN0cmVhbSB1ID0gbmV3IFVuaW9uSW5wdXRTdHJlYW0oKTsKIAkJdS5hZGQobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlW10geyAxIH0pIHsKIAkJCUBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvc2hhMS9TSEExVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvc2hhMS9TSEExVGVzdC5qYXZhCmluZGV4IGU2MDQ1YTkuLjNjNjEyZTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL3NoYTEvU0hBMVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9zaGExL1NIQTFUZXN0LmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuc2hhMTsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CkBAIC05NSwxNSArOTUsMTUgQEAKIAkJCQkuZnJvbVN0cmluZygiYTk5OTNlMzY0NzA2ODE2YWJhM2UyNTcxNzg1MGMyNmM5Y2QwZDg5ZCIpOwogCiAJCU1lc3NhZ2VEaWdlc3QgbSA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoIlNIQS0xIik7Ci0JCW0udXBkYXRlKFRFU1QxLmdldEJ5dGVzKFVURl84KSk7CisJCW0udXBkYXRlKFRFU1QxLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJT2JqZWN0SWQgbTEgPSBPYmplY3RJZC5mcm9tUmF3KG0uZGlnZXN0KCkpOwogCiAJCVNIQTEgcyA9IFNIQTEubmV3SW5zdGFuY2UoKTsKLQkJcy51cGRhdGUoVEVTVDEuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJcy51cGRhdGUoVEVTVDEuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlPYmplY3RJZCBzMSA9IE9iamVjdElkLmZyb21SYXcocy5kaWdlc3QoKSk7CiAKIAkJcy5yZXNldCgpOwotCQlzLnVwZGF0ZShURVNUMS5nZXRCeXRlcyhVVEZfOCkpOworCQlzLnVwZGF0ZShURVNUMS5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCU9iamVjdElkIHMyID0gcy50b09iamVjdElkKCk7CiAKIAkJYXNzZXJ0RXF1YWxzKG0xLCBzMSk7CkBAIC0xMTcsMTUgKzExNywxNSBAQAogCQkJCS5mcm9tU3RyaW5nKCI4NDk4M2U0NDFjM2JkMjZlYmFhZTRhYTFmOTUxMjllNWU1NDY3MGYxIik7CiAKIAkJTWVzc2FnZURpZ2VzdCBtID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiU0hBLTEiKTsKLQkJbS51cGRhdGUoVEVTVDIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJbS51cGRhdGUoVEVTVDIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlPYmplY3RJZCBtMSA9IE9iamVjdElkLmZyb21SYXcobS5kaWdlc3QoKSk7CiAKIAkJU0hBMSBzID0gU0hBMS5uZXdJbnN0YW5jZSgpOwotCQlzLnVwZGF0ZShURVNUMi5nZXRCeXRlcyhVVEZfOCkpOworCQlzLnVwZGF0ZShURVNUMi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCU9iamVjdElkIHMxID0gT2JqZWN0SWQuZnJvbVJhdyhzLmRpZ2VzdCgpKTsKIAogCQlzLnJlc2V0KCk7Ci0JCXMudXBkYXRlKFRFU1QyLmdldEJ5dGVzKFVURl84KSk7CisJCXMudXBkYXRlKFRFU1QyLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJT2JqZWN0SWQgczIgPSBzLnRvT2JqZWN0SWQoKTsKIAogCQlhc3NlcnRFcXVhbHMobTEsIHMxKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LnVpL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IGQ5OWRhZjIuLjc2NjdhZjQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtNCwxNCArNCwxNCBAQAogQnVuZGxlLU5hbWU6ICVwbHVnaW5fbmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnVpCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnVpCi1CdW5kbGUtVmVyc2lvbjogNC4xMS40LnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDUuMC40LnF1YWxpZmllcgogQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyX25hbWUKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS44Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5hd3R1aTt2ZXJzaW9uPSI0LjExLjQiCi1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNC4xMS40LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZwbG90O3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils0LjExLjQsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzQuMTEuNCw0LjEyLjApIgorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuYXd0dWk7dmVyc2lvbj0iNS4wLjQiCitJbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZwbG90O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudWkvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQudWkvcG9tLnhtbAppbmRleCA5NWMzZGIzLi43ZDEwYzA5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnVpL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC51aS9wb20ueG1sCkBAIC01Miw3ICs1Miw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjQtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQudWk8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnVpL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2F3dHVpL0FXVFBsb3RSZW5kZXJlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC51aS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hd3R1aS9BV1RQbG90UmVuZGVyZXIuamF2YQppbmRleCBiY2NmMGMwLi5iMWZmZmQ4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnVpL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2F3dHVpL0FXVFBsb3RSZW5kZXJlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudWkvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXd0dWkvQVdUUGxvdFJlbmRlcmVyLmphdmEKQEAgLTY2LDExICs2NiwxMSBAQAogCiAJdHJhbnNpZW50IEdyYXBoaWNzMkQgZzsKIAotCUFXVFBsb3RSZW5kZXJlcihmaW5hbCBHcmFwaENlbGxSZW5kZXIgYykgeworCUFXVFBsb3RSZW5kZXJlcihHcmFwaENlbGxSZW5kZXIgYykgewogCQljZWxsID0gYzsKIAl9CiAKLQl2b2lkIHBhaW50KGZpbmFsIEdyYXBoaWNzIGluLCBmaW5hbCBQbG90Q29tbWl0PFN3aW5nTGFuZT4gY29tbWl0KSB7CisJdm9pZCBwYWludChHcmFwaGljcyBpbiwgUGxvdENvbW1pdDxTd2luZ0xhbmU+IGNvbW1pdCkgewogCQlnID0gKEdyYXBoaWNzMkQpIGluLmNyZWF0ZSgpOwogCQl0cnkgewogCQkJZmluYWwgaW50IGggPSBjZWxsLmdldEhlaWdodCgpOwpAQCAtMTI1LDcgKzEyNSw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRyYXdUZXh0KGZpbmFsIFN0cmluZyBtc2csIGZpbmFsIGludCB4LCBmaW5hbCBpbnQgeSkgeworCXByb3RlY3RlZCB2b2lkIGRyYXdUZXh0KFN0cmluZyBtc2csIGludCB4LCBpbnQgeSkgewogCQlmaW5hbCBpbnQgdGV4dGggPSBnLmdldEZvbnRNZXRyaWNzKCkuZ2V0SGVpZ2h0KCk7CiAJCWZpbmFsIGludCB5MCA9ICh5IC0gdGV4dGgpIC8gMiArIChjZWxsLmdldEhlaWdodCgpIC0gdGV4dGgpIC8gMjsKIAkJZy5zZXRDb2xvcihjZWxsLmdldEZvcmVncm91bmQoKSk7CkBAIC0xMzQsMTEgKzEzNCwxMSBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29sb3IgbGFuZUNvbG9yKGZpbmFsIFN3aW5nTGFuZSBteUxhbmUpIHsKKwlwcm90ZWN0ZWQgQ29sb3IgbGFuZUNvbG9yKFN3aW5nTGFuZSBteUxhbmUpIHsKIAkJcmV0dXJuIG15TGFuZSAhPSBudWxsID8gbXlMYW5lLmNvbG9yIDogQ29sb3IuYmxhY2s7CiAJfQogCi0Jdm9pZCBwYWludFRyaWFuZ2xlRG93bihmaW5hbCBpbnQgY3gsIGZpbmFsIGludCB5LCBmaW5hbCBpbnQgaCkgeworCXZvaWQgcGFpbnRUcmlhbmdsZURvd24oaW50IGN4LCBpbnQgeSwgaW50IGgpIHsKIAkJZmluYWwgaW50IHRpcFggPSBjeDsKIAkJZmluYWwgaW50IHRpcFkgPSB5ICsgaDsKIAkJZmluYWwgaW50IGJhc2VYMSA9IGN4IC0gMTAgLyAyOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC51aS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hd3R1aS9Db21taXRHcmFwaFBhbmUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudWkvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXd0dWkvQ29tbWl0R3JhcGhQYW5lLmphdmEKaW5kZXggZDEyMmE3Ny4uOTQzYTMyNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC51aS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hd3R1aS9Db21taXRHcmFwaFBhbmUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnVpL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2F3dHVpL0NvbW1pdEdyYXBoUGFuZS5qYXZhCkBAIC0xMTQsNyArMTE0LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0TW9kZWwoZmluYWwgVGFibGVNb2RlbCBkYXRhTW9kZWwpIHsKKwlwdWJsaWMgdm9pZCBzZXRNb2RlbChUYWJsZU1vZGVsIGRhdGFNb2RlbCkgewogCQlpZiAoZGF0YU1vZGVsICE9IG51bGwgJiYgIShkYXRhTW9kZWwgaW5zdGFuY2VvZiBDb21taXRUYWJsZU1vZGVsKSkKIAkJCXRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oVUlUZXh0LmdldCgpLm11c3RCZVNwZWNpYWxUYWJsZU1vZGVsKTsKIAkJc3VwZXIuc2V0TW9kZWwoZGF0YU1vZGVsKTsKQEAgLTE2MSw3ICsxNjEsNyBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWVBdChmaW5hbCBpbnQgcm93SW5kZXgsIGZpbmFsIGludCBjb2x1bW5JbmRleCkgeworCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlQXQoaW50IHJvd0luZGV4LCBpbnQgY29sdW1uSW5kZXgpIHsKIAkJCWZpbmFsIFBsb3RDb21taXQ8U3dpbmdMYW5lPiBjID0gYWxsQ29tbWl0cy5nZXQocm93SW5kZXgpOwogCQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewogCQkJY2FzZSAwOgpAQCAtMTc1LDcgKzE3NSw3IEBACiAJCQl9CiAJCX0KIAotCQlQZXJzb25JZGVudCBhdXRob3JGb3IoZmluYWwgUGxvdENvbW1pdDxTd2luZ0xhbmU+IGMpIHsKKwkJUGVyc29uSWRlbnQgYXV0aG9yRm9yKFBsb3RDb21taXQ8U3dpbmdMYW5lPiBjKSB7CiAJCQlpZiAoYyAhPSBsYXN0Q29tbWl0KSB7CiAJCQkJbGFzdENvbW1pdCA9IGM7CiAJCQkJbGFzdEF1dGhvciA9IGMuZ2V0QXV0aG9ySWRlbnQoKTsKQEAgLTI0NCw3ICsyNDQsNyBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIHBhaW50Q29tcG9uZW50KGZpbmFsIEdyYXBoaWNzIGlucHV0R3JhcGhpY3MpIHsKKwkJcHJvdGVjdGVkIHZvaWQgcGFpbnRDb21wb25lbnQoR3JhcGhpY3MgaW5wdXRHcmFwaGljcykgewogCQkJaWYgKGlucHV0R3JhcGhpY3MgPT0gbnVsbCkKIAkJCQlyZXR1cm47CiAJCQlyZW5kZXJlci5wYWludChpbnB1dEdyYXBoaWNzLCBjb21taXQpOwpAQCAtMjU5LDcgKzI1OSw3IEBACiAJCQlzdHJva2VDYWNoZVtpXSA9IG5ldyBCYXNpY1N0cm9rZShpKTsKIAl9CiAKLQlzdGF0aWMgU3Ryb2tlIHN0cm9rZShmaW5hbCBpbnQgd2lkdGgpIHsKKwlzdGF0aWMgU3Ryb2tlIHN0cm9rZShpbnQgd2lkdGgpIHsKIAkJaWYgKHdpZHRoIDwgc3Ryb2tlQ2FjaGUubGVuZ3RoKQogCQkJcmV0dXJuIHN0cm9rZUNhY2hlW3dpZHRoXTsKIAkJcmV0dXJuIG5ldyBCYXNpY1N0cm9rZSh3aWR0aCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnVpL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2F3dHVpL1N3aW5nQ29tbWl0TGlzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC51aS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hd3R1aS9Td2luZ0NvbW1pdExpc3QuamF2YQppbmRleCA3NDNlYjc4Li4xMDUxOWNhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnVpL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2F3dHVpL1N3aW5nQ29tbWl0TGlzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudWkvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXd0dWkvU3dpbmdDb21taXRMaXN0LmphdmEKQEAgLTc5LDcgKzc5LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVjeWNsZUxhbmUoZmluYWwgU3dpbmdMYW5lIGxhbmUpIHsKKwlwcm90ZWN0ZWQgdm9pZCByZWN5Y2xlTGFuZShTd2luZ0xhbmUgbGFuZSkgewogCQljb2xvcnMuYWRkKGxhbmUuY29sb3IpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC8uc2V0dGluZ3MvLmFwaV9maWx0ZXJzIGIvb3JnLmVjbGlwc2UuamdpdC8uc2V0dGluZ3MvLmFwaV9maWx0ZXJzCmluZGV4IGU2ZTMzMDkuLmU3ZWEyMjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvLnNldHRpbmdzLy5hcGlfZmlsdGVycworKysgYi9vcmcuZWNsaXBzZS5qZ2l0Ly5zZXR0aW5ncy8uYXBpX2ZpbHRlcnMKQEAgLTMsMTcgKzMsMTQgQEAKICAgICA8cmVzb3VyY2UgcGF0aD0iTUVUQS1JTkYvTUFOSUZFU1QuTUYiPgogICAgICAgICA8ZmlsdGVyIGlkPSI5MjQ4NDQwMzkiPgogICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgotICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSI0LjExLjIiLz4KLSAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iNC4xMS4wIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjUuMC4zIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjUuMC4wIi8+CiAgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgogICAgICAgICA8L2ZpbHRlcj4KLSAgICA8L3Jlc291cmNlPgotICAgIDxyZXNvdXJjZSBwYXRoPSJzcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uc3RhbnRzLmphdmEiIHR5cGU9Im9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cyI+Ci0gICAgICAgIDxmaWx0ZXIgaWQ9IjExNDE4OTkyNjYiPgorICAgICAgICA8ZmlsdGVyIGlkPSI5MjQ4NDQwMzkiPgogICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgotICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSI0LjciLz4KLSAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iNC4xMSIvPgotICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJMT0NLX1NVRkZJWCIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSI1LjAuNCIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSI1LjAuMCIvPgogICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KICAgICAgICAgPC9maWx0ZXI+CiAgICAgPC9yZXNvdXJjZT4KQEAgLTIxLDcgKzE4LDcgQEAKICAgICAgICAgPGZpbHRlciBpZD0iMTE0MTg5OTI2NiI+CiAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CiAgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjQuNyIvPgotICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSI0LjExIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjUuMCIvPgogICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJjcmVhdGVOZXdGaWxlQXRvbWljKEZpbGUpIi8+CiAgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgogICAgICAgICA8L2ZpbHRlcj4KQEAgLTMwLDcgKzI3LDcgQEAKICAgICAgICAgPGZpbHRlciBpZD0iMTE0MTg5OTI2NiI+CiAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CiAgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjQuNyIvPgotICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSI0LjExIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjUuMCIvPgogICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJMb2NrVG9rZW4iLz4KICAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+CiAgICAgICAgIDwvZmlsdGVyPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggMDBhY2E0OS4uYTgxMTRkOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDEyICszLDEyIEBACiBCdW5kbGUtTmFtZTogJXBsdWdpbl9uYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQKLUJ1bmRsZS1WZXJzaW9uOiA0LjExLjQucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNS4wLjQucXVhbGlmaWVyCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlcl9uYW1lCiBCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnM7dmVyc2lvbj0iNC4xMS40IiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSI0LjExLjQiOworRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnM7dmVyc2lvbj0iNS4wLjQiLAorIG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQucmV2d2FsaywKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLAogICAgb3JnLmVjbGlwc2UuamdpdC5kaWZmLApAQCAtMjIsNTIgKzIyLDUyIEBACiAgICBvcmcuZWNsaXBzZS5qZ2l0LnN1Ym1vZHVsZSwKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LAogICAgb3JnLmVjbGlwc2UuamdpdC5tZXJnZSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249IjQuMTEuNCI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXM7dmVyc2lvbj0iNC4xMS40IiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmJsYW1lO3ZlcnNpb249IjQuMTEuNCI7Cisgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249IjUuMC40Ijt1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMiLAorIG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlczt2ZXJzaW9uPSI1LjAuNCIsCisgb3JnLmVjbGlwc2UuamdpdC5ibGFtZTt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQucmV2d2FsaywKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLAogICAgb3JnLmVjbGlwc2UuamdpdC5kaWZmIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmRpZmY7dmVyc2lvbj0iNC4xMS40IjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmRpZmY7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5wYXRjaCwKICAgIG9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2FsaywKICAgIG9yZy5lY2xpcHNlLmpnaXQucmV2d2FsaywKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLAogICAgb3JnLmVjbGlwc2UuamdpdC51dGlsIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlO3ZlcnNpb249IjQuMTEuNCI7Cisgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGssCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmV2ZW50cywKICAgIG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlcyIsCi0gb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iNC4xMS40IjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5wYWNrLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmV2ZW50czt2ZXJzaW9uPSI0LjExLjQiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiIsCi0gb3JnLmVjbGlwc2UuamdpdC5mbm1hdGNoO3ZlcnNpb249IjQuMTEuNCIsCi0gb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvO3ZlcnNpb249IjQuMTEuNCI7Cisgb3JnLmVjbGlwc2UuamdpdC5ldmVudHM7dmVyc2lvbj0iNS4wLjQiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiIsCisgb3JnLmVjbGlwc2UuamdpdC5mbm1hdGNoO3ZlcnNpb249IjUuMC40IiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG87dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5hcGksCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQucmV2d2FsaywKICAgIG9yZy54bWwuc2F4LmhlbHBlcnMsCiAgICBvcmcueG1sLnNheCIsCi0gb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvLmludGVybmFsO3ZlcnNpb249IjQuMTEuNCI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmhvb2tzO3ZlcnNpb249IjQuMTEuNCI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmlnbm9yZTt2ZXJzaW9uPSI0LjExLjQiLAotIG9yZy5lY2xpcHNlLmpnaXQuaWdub3JlLmludGVybmFsO3ZlcnNpb249IjQuMTEuNCI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC50ZXN0IiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsO3ZlcnNpb249IjQuMTEuNCI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC50ZXN0LG9yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0IiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmZzY2s7dmVyc2lvbj0iNC4xMS40Ijt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRlc3QiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwua2V0Y2g7dmVyc2lvbj0iNC4xMS40Ijt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LG9yZy5lY2xpcHNlLmpnaXQudGVzdCxvcmcuZWNsaXBzZS5qZ2l0LnBnbSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSI0LjExLjQiOworIG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwby5pbnRlcm5hbDt2ZXJzaW9uPSI1LjAuNCI7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmhvb2tzO3ZlcnNpb249IjUuMC40Ijt1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIiLAorIG9yZy5lY2xpcHNlLmpnaXQuaWdub3JlO3ZlcnNpb249IjUuMC40IiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmlnbm9yZS5pbnRlcm5hbDt2ZXJzaW9uPSI1LjAuNCI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC50ZXN0IiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsO3ZlcnNpb249IjUuMC40Ijt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRlc3Qsb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZnNjazt2ZXJzaW9uPSI1LjAuNCI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC50ZXN0IiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmtldGNoO3ZlcnNpb249IjUuMC40Ijt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LG9yZy5lY2xpcHNlLmpnaXQudGVzdCxvcmcuZWNsaXBzZS5qZ2l0LnBnbSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSI1LjAuNCI7CiAgIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQudGVzdCwKICAgIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdCwKICAgIG9yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249IjQuMTEuNCI7Cisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iNS4wLjQiOwogICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRlc3QsCiAgICBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LAogICAgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwLApAQCAtNzUsMTIgKzc1LDEyIEBACiAgICBvcmcuZWNsaXBzZS5qZ2l0LmxmcywKICAgIG9yZy5lY2xpcHNlLmpnaXQucGdtLAogICAgb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdCIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmlvO3ZlcnNpb249IjQuMTEuNCI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC5qdW5pdCxvcmcuZWNsaXBzZS5qZ2l0LnRlc3Qsb3JnLmVjbGlwc2UuamdpdC5wZ20iLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5wYWNrO3ZlcnNpb249IjQuMTEuNCI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC5qdW5pdCxvcmcuZWNsaXBzZS5qZ2l0LnRlc3Qsb3JnLmVjbGlwc2UuamdpdC5wZ20iLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0YWJsZTt2ZXJzaW9uPSI0LjExLjQiOworIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5pbzt2ZXJzaW9uPSI1LjAuNCI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC5qdW5pdCxvcmcuZWNsaXBzZS5qZ2l0LnRlc3Qsb3JnLmVjbGlwc2UuamdpdC5wZ20iLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5wYWNrO3ZlcnNpb249IjUuMC40Ijt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LG9yZy5lY2xpcHNlLmpnaXQudGVzdCxvcmcuZWNsaXBzZS5qZ2l0LnBnbSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlO3ZlcnNpb249IjUuMC40IjsKICAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3Qsb3JnLmVjbGlwc2UuamdpdC5qdW5pdCxvcmcuZWNsaXBzZS5qZ2l0LnRlc3Qsb3JnLmVjbGlwc2UuamdpdC5wZ20iLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0cmVlO3ZlcnNpb249IjQuMTEuNCI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC5qdW5pdCxvcmcuZWNsaXBzZS5qZ2l0LnRlc3Qsb3JnLmVjbGlwc2UuamdpdC5wZ20iLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249IjQuMTEuNCI7Cisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRyZWU7dmVyc2lvbj0iNS4wLjQiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQuanVuaXQsb3JnLmVjbGlwc2UuamdpdC50ZXN0LG9yZy5lY2xpcHNlLmpnaXQucGdtIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlciwKICAgIG9yZy5lY2xpcHNlLmpnaXQudXRpbCwKQEAgLTkwLDMzICs5MCwzMyBAQAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2FsaywKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LAogICAgb3JnLmVjbGlwc2UuamdpdC5zdWJtb2R1bGUiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliLmludGVybmFsO3ZlcnNpb249IjQuMTEuNCI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlO3ZlcnNpb249IjQuMTEuNCI7Cisgb3JnLmVjbGlwc2UuamdpdC5saWIuaW50ZXJuYWw7dmVyc2lvbj0iNS4wLjQiO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuamdpdC5tZXJnZTt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGssCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLAogICAgb3JnLmVjbGlwc2UuamdpdC5hcGkiLAotIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249IjQuMTEuNCIsCi0gb3JnLmVjbGlwc2UuamdpdC5ub3Rlczt2ZXJzaW9uPSI0LjExLjQiOworIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249IjUuMC40IiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm5vdGVzO3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2FsaywKICAgIG9yZy5lY2xpcHNlLmpnaXQucmV2d2FsaywKICAgIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2UiLAotIG9yZy5lY2xpcHNlLmpnaXQucGF0Y2g7dmVyc2lvbj0iNC4xMS40Ijt1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsb3JnLmVjbGlwc2UuamdpdC5kaWZmIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldnBsb3Q7dmVyc2lvbj0iNC4xMS40Ijt1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iNC4xMS40IjsKKyBvcmcuZWNsaXBzZS5qZ2l0LnBhdGNoO3ZlcnNpb249IjUuMC40Ijt1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsb3JnLmVjbGlwc2UuamdpdC5kaWZmIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldnBsb3Q7dmVyc2lvbj0iNS4wLjQiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYixvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGssCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlciwKICAgIG9yZy5lY2xpcHNlLmpnaXQuZGlmZiwKICAgIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5maWx0ZXIiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5maWx0ZXI7dmVyc2lvbj0iNC4xMS40Ijt1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLG9yZy5lY2xpcHNlLmpnaXQubGliLG9yZy5lY2xpcHNlLmpnaXQudXRpbCIsCi0gb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iNC4xMS40Ijt1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsb3JnLmVjbGlwc2UuamdpdC51dGlsIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UucGFjazt2ZXJzaW9uPSI0LjExLjQiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiIsCi0gb3JnLmVjbGlwc2UuamdpdC5zdWJtb2R1bGU7dmVyc2lvbj0iNC4xMS40Ijt1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXIsb3JnLmVjbGlwc2UuamdpdC50cmVld2FsayIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iNC4xMS40IjsKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuZmlsdGVyO3ZlcnNpb249IjUuMC40Ijt1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLG9yZy5lY2xpcHNlLmpnaXQubGliLG9yZy5lY2xpcHNlLmpnaXQudXRpbCIsCisgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iNS4wLjQiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYixvcmcuZWNsaXBzZS5qZ2l0LnV0aWwiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5wYWNrO3ZlcnNpb249IjUuMC40Ijt1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3VibW9kdWxlO3ZlcnNpb249IjUuMC40Ijt1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXIsb3JnLmVjbGlwc2UuamdpdC50cmVld2FsayIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucGFjaywKQEAgLTEyOCwyNCArMTI4LDI0IEBACiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLAogICAgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UucGFjayIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cDt2ZXJzaW9uPSI0LjExLjQiO3VzZXM6PSJqYXZheC5uZXQuc3NsIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlcjt2ZXJzaW9uPSI0LjExLjQiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYixvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydCIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSI0LjExLjQiOworIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iNS4wLjQiO3VzZXM6PSJqYXZheC5uZXQuc3NsIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlcjt2ZXJzaW9uPSI1LjAuNCI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0IiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlcjt2ZXJzaW9uPSI0LjExLjQiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iNC4xMS40IjsKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlcjt2ZXJzaW9uPSI1LjAuNCI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHAsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZSwKICAgIG9yZy5pZXRmLmpnc3MiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzt2ZXJzaW9uPSI0LjExLjQiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5zaGExO3ZlcnNpb249IjQuMTEuNCIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsLnRpbWU7dmVyc2lvbj0iNC4xMS40IgorIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzt2ZXJzaW9uPSI1LjAuNCIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsLnNoYTE7dmVyc2lvbj0iNS4wLjQiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbC50aW1lO3ZlcnNpb249IjUuMC40IgogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xLjgKIEltcG9ydC1QYWNrYWdlOiBjb20uZ29vZ2xlY29kZS5qYXZhZXdhaDt2ZXJzaW9uPSJbMS4xLjYsMi4wLjApIiwKICBjb20uamNyYWZ0LmpzY2g7dmVyc2lvbj0iWzAuMS4zNywwLjIuMCkiLApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0L01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgppbmRleCBjNmFmYjY5Li5iMmQ2OTRhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgpAQCAtMyw1ICszLDUgQEAKIEJ1bmRsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0IC0gU291cmNlcwogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UKIEJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnIC0gSkdpdAotQnVuZGxlLVZlcnNpb246IDQuMTEuNC5xdWFsaWZpZXIKLUVjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0O3ZlcnNpb249IjQuMTEuNC5xdWFsaWZpZXIiO3Jvb3RzPSIuIgorQnVuZGxlLVZlcnNpb246IDUuMC40LnF1YWxpZmllcgorRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQ7dmVyc2lvbj0iNS4wLjQucXVhbGlmaWVyIjtyb290cz0iLiIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQvcG9tLnhtbAppbmRleCA1ZWNhMWM4Li4yYjU2ZDBhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9wb20ueG1sCkBAIC01Myw3ICs1Myw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjQtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQ8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL0pHaXRUZXh0LnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5qZ2l0L3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL0pHaXRUZXh0LnByb3BlcnRpZXMKaW5kZXggYzVkMDNiYS4uYzhiMjRmNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9KR2l0VGV4dC5wcm9wZXJ0aWVzCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvSkdpdFRleHQucHJvcGVydGllcwpAQCAtMjI2LDYgKzIyNiw4IEBACiBjcmVkZW50aWFsVXNlcm5hbWU9VXNlcm5hbWUKIGRhZW1vbkFscmVhZHlSdW5uaW5nPURhZW1vbiBhbHJlYWR5IHJ1bm5pbmcKIGRheXNBZ289ezB9IGRheXMgYWdvCitkZWVwZW5Ob3RXaXRoRGVlcGVuPUNhbm5vdCBjb21iaW5lIGRlZXBlbiB3aXRoIGRlZXBlbi1ub3QKK2RlZXBlblNpbmNlV2l0aERlZXBlbj1DYW5ub3QgY29tYmluZSBkZWVwZW4gd2l0aCBkZWVwZW4tc2luY2UKIGRlbGV0ZUJyYW5jaFVuZXhwZWN0ZWRSZXN1bHQ9RGVsZXRlIGJyYW5jaCByZXR1cm5lZCB1bmV4cGVjdGVkIHJlc3VsdCB7MH0KIGRlbGV0ZUZpbGVGYWlsZWQ9Q291bGQgbm90IGRlbGV0ZSBmaWxlIHswfQogZGVsZXRlUmVxdWlyZXNaZXJvTmV3SWQ9RGVsZXRlIHJlcXVpcmVzIG5ldyBJRCB0byBiZSB6ZXJvCkBAIC0zMTEsNiArMzEzLDcgQEAKIGZpbGVNb2RlTm90U2V0Rm9yUGF0aD1GaWxlTW9kZSBub3Qgc2V0IGZvciBwYXRoIHswfQogZmlsdGVyRXhlY3V0aW9uRmFpbGVkPUV4ZWN1dGlvbiBvZiBmaWx0ZXIgY29tbWFuZCAnJ3swfScnIG9uIGZpbGUgJyd7MX0nJyBmYWlsZWQKIGZpbHRlckV4ZWN1dGlvbkZhaWxlZFJjPUV4ZWN1dGlvbiBvZiBmaWx0ZXIgY29tbWFuZCAnJ3swfScnIG9uIGZpbGUgJyd7MX0nJyBmYWlsZWQgd2l0aCByZXR1cm4gY29kZSAnJ3syfScnLCBtZXNzYWdlIG9uIHN0ZGVycjogJyd7M30nJworZmlsdGVyUmVxdWlyZXNDYXBhYmlsaXR5PWZpbHRlciByZXF1aXJlcyBzZXJ2ZXIgdG8gYWR2ZXJ0aXNlIHRoYXQgY2FwYWJpbGl0eQogZmluZGluZ0dhcmJhZ2U9RmluZGluZyBnYXJiYWdlCiBmbGFnSXNEaXNwb3NlZD17MH0gaXMgZGlzcG9zZWQuCiBmbGFnTm90RnJvbVRoaXM9ezB9IG5vdCBmcm9tIHRoaXMuCkBAIC0zNjIsNiArMzY1LDcgQEAKIGludmFsaWREZXB0aD1JbnZhbGlkIGRlcHRoOiB7MH0KIGludmFsaWRFbmNyeXB0aW9uPUludmFsaWQgZW5jcnlwdGlvbgogaW52YWxpZEV4cGFuZFdpbGRjYXJkPUV4cGFuZEZyb21Tb3VyY2Ugb24gYSByZWZzcGVjIHRoYXQgY2FuIGhhdmUgbWlzbWF0Y2hlZCB3aWxkY2FyZHMgZG9lcyBub3QgbWFrZSBzZW5zZS4KK2ludmFsaWRGaWx0ZXI9SW52YWxpZCBmaWx0ZXI6IHswfQogaW52YWxpZEdpdGRpclJlZiA9IEludmFsaWQgLmdpdCByZWZlcmVuY2UgaW4gZmlsZSAnJ3swfScnCiBpbnZhbGlkR2l0VHlwZT1pbnZhbGlkIGdpdCB0eXBlOiB7MH0KIGludmFsaWRJZD1JbnZhbGlkIGlkOiB7MH0KQEAgLTM5Niw2ICs0MDAsNyBAQAogaW52YWxpZFN5c3RlbVByb3BlcnR5PUludmFsaWQgc3lzdGVtIHByb3BlcnR5ICcnezB9Jyc6ICcnezF9Jyc7IHVzaW5nIGRlZmF1bHQgdmFsdWUgezJ9CiBpbnZhbGlkVGFnT3B0aW9uPUludmFsaWQgdGFnIG9wdGlvbjogezB9CiBpbnZhbGlkVGltZW91dD1JbnZhbGlkIHRpbWVvdXQ6IHswfQoraW52YWxpZFRpbWVzdGFtcD1JbnZhbGlkIHRpbWVzdGFtcCBpbiB7MH0KIGludmFsaWRUaW1lVW5pdFZhbHVlMj1JbnZhbGlkIHRpbWUgdW5pdCB2YWx1ZTogezB9LnsxfT17Mn0KIGludmFsaWRUaW1lVW5pdFZhbHVlMz1JbnZhbGlkIHRpbWUgdW5pdCB2YWx1ZTogezB9LnsxfS57Mn09ezN9CiBpbnZhbGlkVHJlZVplcm9MZW5ndGhOYW1lPUNhbm5vdCBhcHBlbmQgYSB0cmVlIGVudHJ5IHdpdGggemVyby1sZW5ndGggbmFtZQpAQCAtNjI3LDYgKzYzMiw3IEBACiBzb3VyY2VSZWZEb2VzbnRSZXNvbHZlVG9BbnlPYmplY3Q9U291cmNlIHJlZiB7MH0gZG9lc24nJ3QgcmVzb2x2ZSB0byBhbnkgb2JqZWN0Lgogc291cmNlUmVmTm90U3BlY2lmaWVkRm9yUmVmc3BlYz1Tb3VyY2UgcmVmIG5vdCBzcGVjaWZpZWQgZm9yIHJlZnNwZWM6IHswfQogc3F1YXNoQ29tbWl0Tm90VXBkYXRpbmdIRUFEPVNxdWFzaCBjb21taXQgLS0gbm90IHVwZGF0aW5nIEhFQUQKK3NzaENvbW1hbmRGYWlsZWQ9RXhlY3V0aW9uIG9mIHNzaCBjb21tYW5kICcnezB9JycgZmFpbGVkIHdpdGggZXJyb3IgJyd7MX0nJwogc3NoVXNlck5hbWVFcnJvcj1Kc2NoIGVycm9yOiBmYWlsZWQgdG8gc2V0IFNTSCB1c2VyIG5hbWUgY29ycmVjdGx5IHRvICcnezB9Jyc7IHVzaW5nICcnezF9JycgcGlja2VkIHVwIGZyb20gU1NIIGNvbmZpZyBmaWxlLgogc3NsRmFpbHVyZUV4Y2VwdGlvbk1lc3NhZ2U9U2VjdXJlIGNvbm5lY3Rpb24gdG8gezB9IGNvdWxkIG5vdCBiZSBzdGFibGlzaGVkIGJlY2F1c2Ugb2YgU1NMIHByb2JsZW1zCiBzc2xGYWlsdXJlSW5mbz1BIHNlY3VyZSBjb25uZWN0aW9uIHRvIHswfVxuY291bGQgbm90IGJlIGVzdGFibGlzaGVkIGJlY2F1c2UgdGhlIHNlcnZlcicncyBjZXJ0aWZpY2F0ZSBjb3VsZCBub3QgYmUgdmFsaWRhdGVkLgpAQCAtNjY4LDYgKzY3NCw3IEBACiB0aW1lSXNVbmNlcnRhaW49VGltZSBpcyB1bmNlcnRhaW4KIHRpbWVyQWxyZWFkeVRlcm1pbmF0ZWQ9VGltZXIgYWxyZWFkeSB0ZXJtaW5hdGVkCiB0b29NYW55Q29tbWFuZHM9VG9vIG1hbnkgY29tbWFuZHMKK3Rvb01hbnlGaWx0ZXJzPVRvbyBtYW55ICJmaWx0ZXIiIGxpbmVzIGluIHJlcXVlc3QKIHRvb01hbnlJbmNsdWRlUmVjdXJzaW9ucz1Ub28gbWFueSByZWN1cnNpb25zOyBjaXJjdWxhciBpbmNsdWRlcyBpbiBjb25maWcgZmlsZShzKT8KIHRvcG9sb2dpY2FsU29ydFJlcXVpcmVkPVRvcG9sb2dpY2FsIHNvcnQgcmVxdWlyZWQuCiB0cmFuc2FjdGlvbkFib3J0ZWQ9dHJhbnNhY3Rpb24gYWJvcnRlZApAQCAtNzEwLDYgKzcxNyw3IEBACiB1bmV4cGVjdGVkRW9mSW5QYWNrPVVuZXhwZWN0ZWQgRU9GIGluIHBhcnRpYWxseSBjcmVhdGVkIHBhY2sKIHVuZXhwZWN0ZWRIdW5rVHJhaWxlcj1VbmV4cGVjdGVkIGh1bmsgdHJhaWxlcgogdW5leHBlY3RlZE9kZFJlc3VsdD1vZGQ6IHswfSArIHsxfSAtIHsyfQordW5leHBlY3RlZFBhY2tldExpbmU9dW5leHBlY3RlZCB7MH0KIHVuZXhwZWN0ZWRSZWZSZXBvcnQ9ezB9OiB1bmV4cGVjdGVkIHJlZiByZXBvcnQ6IHsxfQogdW5leHBlY3RlZFJlcG9ydExpbmU9dW5leHBlY3RlZCByZXBvcnQgbGluZTogezB9CiB1bmV4cGVjdGVkUmVwb3J0TGluZTI9ezB9IHVuZXhwZWN0ZWQgcmVwb3J0IGxpbmU6IHsxfQpAQCAtNzI0LDYgKzczMiw3IEBACiB1bmtub3duT2JqZWN0VHlwZTI9dW5rbm93bgogdW5rbm93blJlcG9zaXRvcnlGb3JtYXQ9VW5rbm93biByZXBvc2l0b3J5IGZvcm1hdAogdW5rbm93blJlcG9zaXRvcnlGb3JtYXQyPVVua25vd24gcmVwb3NpdG9yeSBmb3JtYXQgInswfSI7IGV4cGVjdGVkICIwIi4KK3Vua25vd25UcmFuc3BvcnRDb21tYW5kPXVua25vd24gY29tbWFuZCB7MH0KIHVua25vd25abGliRXJyb3I9VW5rbm93biB6bGliIGVycm9yLgogdW5sb2NrTG9ja0ZpbGVGYWlsZWQ9VW5sb2NraW5nIExvY2tGaWxlICcnezB9JycgZmFpbGVkCiB1bm1lcmdlZFBhdGg9VW5tZXJnZWQgcGF0aDogezB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9BcmNoaXZlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQXJjaGl2ZUNvbW1hbmQuamF2YQppbmRleCAxMDM5N2Y4Li4yN2JiNWE5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9BcmNoaXZlQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0FyY2hpdmVDb21tYW5kLmphdmEKQEAgLTE1NywzMCArMTU3LDYgQEAKIAkJICoKIAkJICogQHBhcmFtIG91dAogCQkgKiAgICAgICAgICAgIGFyY2hpdmUgb2JqZWN0IGZyb20gY3JlYXRlQXJjaGl2ZU91dHB1dFN0cmVhbQotCQkgKiBAcGFyYW0gcGF0aAotCQkgKiAgICAgICAgICAgIGZ1bGwgZmlsZW5hbWUgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIGFyY2hpdmUgKHdpdGgKLQkJICogICAgICAgICAgICB0cmFpbGluZyAnLycgZm9yIGRpcmVjdG9yaWVzKQotCQkgKiBAcGFyYW0gbW9kZQotCQkgKiAgICAgICAgICAgIG1vZGUgKGZvciBleGFtcGxlIEZpbGVNb2RlLlJFR1VMQVJfRklMRSBvcgotCQkgKiAgICAgICAgICAgIEZpbGVNb2RlLlNZTUxJTkspCi0JCSAqIEBwYXJhbSBsb2FkZXIKLQkJICogICAgICAgICAgICBibG9iIG9iamVjdCB3aXRoIGRhdGEgZm9yIHRoaXMgZW50cnkgKG51bGwgZm9yCi0JCSAqICAgICAgICAgICAgZGlyZWN0b3JpZXMpCi0JCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkJICogICAgICAgICAgICAgdGhyb3duIGJ5IHRoZSB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0gZm9yIEkvTyBlcnJvcnMKLQkJICogQGRlcHJlY2F0ZWQgdXNlCi0JCSAqICAgICAgICAgICAgIHtAbGluayAjcHV0RW50cnkoQ2xvc2VhYmxlLCBPYmplY3RJZCwgU3RyaW5nLCBGaWxlTW9kZSwgT2JqZWN0TG9hZGVyKX0KLQkJICogICAgICAgICAgICAgaW5zdGVhZAotCQkgKi8KLQkJQERlcHJlY2F0ZWQKLQkJdm9pZCBwdXRFbnRyeShUIG91dCwgU3RyaW5nIHBhdGgsIEZpbGVNb2RlIG1vZGUsCi0JCQkJCSAgT2JqZWN0TG9hZGVyIGxvYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JCS8qKgotCQkgKiBXcml0ZSBhbiBlbnRyeSB0byBhbiBhcmNoaXZlLgotCQkgKgotCQkgKiBAcGFyYW0gb3V0Ci0JCSAqICAgICAgICAgICAgYXJjaGl2ZSBvYmplY3QgZnJvbSBjcmVhdGVBcmNoaXZlT3V0cHV0U3RyZWFtCiAJCSAqIEBwYXJhbSB0cmVlCiAJCSAqICAgICAgICAgICAgdGhlIHRhZywgY29tbWl0LCBvciB0cmVlIG9iamVjdCB0byBwcm9kdWNlIGFuIGFyY2hpdmUgZm9yCiAJCSAqIEBwYXJhbSBwYXRoCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DaGVycnlQaWNrQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ2hlcnJ5UGlja0NvbW1hbmQuamF2YQppbmRleCBmNDVlMzllLi42NWI3MmY3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DaGVycnlQaWNrQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0NoZXJyeVBpY2tDb21tYW5kLmphdmEKQEAgLTI4OCw3ICsyODgsNyBAQAogCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CiAJICogQHNpbmNlIDMuMQogCSAqLwotCXB1YmxpYyBDaGVycnlQaWNrQ29tbWFuZCBzZXRSZWZsb2dQcmVmaXgoZmluYWwgU3RyaW5nIHByZWZpeCkgeworCXB1YmxpYyBDaGVycnlQaWNrQ29tbWFuZCBzZXRSZWZsb2dQcmVmaXgoU3RyaW5nIHByZWZpeCkgewogCQl0aGlzLnJlZmxvZ1ByZWZpeCA9IHByZWZpeDsKIAkJcmV0dXJuIHRoaXM7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ2xvbmVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DbG9uZUNvbW1hbmQuamF2YQppbmRleCA3OWIwZWZiLi41YzA2YmFjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DbG9uZUNvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DbG9uZUNvbW1hbmQuamF2YQpAQCAtMTkxLDEyICsxOTEsMTIgQEAKIAkJCXRocm93IG5ldyBJbnZhbGlkUmVtb3RlRXhjZXB0aW9uKAogCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5pbnZhbGlkVVJMLCB1cmkpKTsKIAkJfQotCQlSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSBudWxsOworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBDbG9zZWQgYnkgY2FsbGVyCisJCVJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IGluaXQoKTsKIAkJRmV0Y2hSZXN1bHQgZmV0Y2hSZXN1bHQgPSBudWxsOwogCQlUaHJlYWQgY2xlYW51cEhvb2sgPSBuZXcgVGhyZWFkKCgpIC0+IGNsZWFudXAoKSk7CiAJCVJ1bnRpbWUuZ2V0UnVudGltZSgpLmFkZFNodXRkb3duSG9vayhjbGVhbnVwSG9vayk7CiAJCXRyeSB7Ci0JCQlyZXBvc2l0b3J5ID0gaW5pdCgpOwogCQkJZmV0Y2hSZXN1bHQgPSBmZXRjaChyZXBvc2l0b3J5LCB1KTsKIAkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CiAJCQlpZiAocmVwb3NpdG9yeSAhPSBudWxsKSB7CkBAIC0zMDYsNyArMzA2LDcgQEAKIAkJcmV0dXJuIGNvbW1hbmQuY2FsbCgpOwogCX0KIAotCXByaXZhdGUgTGlzdDxSZWZTcGVjPiBjYWxjdWxhdGVSZWZTcGVjcyhmaW5hbCBTdHJpbmcgZHN0KSB7CisJcHJpdmF0ZSBMaXN0PFJlZlNwZWM+IGNhbGN1bGF0ZVJlZlNwZWNzKFN0cmluZyBkc3QpIHsKIAkJUmVmU3BlYyB3Y3JzID0gbmV3IFJlZlNwZWMoKTsKIAkJd2NycyA9IHdjcnMuc2V0Rm9yY2VVcGRhdGUodHJ1ZSk7CiAJCXdjcnMgPSB3Y3JzLnNldFNvdXJjZURlc3RpbmF0aW9uKENvbnN0YW50cy5SX0hFQURTICsgIioiLCBkc3QpOyAvLyROT04tTkxTLTEkCkBAIC0zMTUsNyArMzE1LDcgQEAKIAkJCXNwZWNzLmFkZCh3Y3JzKTsKIAkJZWxzZSBpZiAoYnJhbmNoZXNUb0Nsb25lICE9IG51bGwKIAkJCQkmJiBicmFuY2hlc1RvQ2xvbmUuc2l6ZSgpID4gMCkgewotCQkJZm9yIChmaW5hbCBTdHJpbmcgc2VsZWN0ZWRSZWYgOiBicmFuY2hlc1RvQ2xvbmUpCisJCQlmb3IgKFN0cmluZyBzZWxlY3RlZFJlZiA6IGJyYW5jaGVzVG9DbG9uZSkKIAkJCQlpZiAod2Nycy5tYXRjaFNvdXJjZShzZWxlY3RlZFJlZikpCiAJCQkJCXNwZWNzLmFkZCh3Y3JzLmV4cGFuZEZyb21Tb3VyY2Uoc2VsZWN0ZWRSZWYpKTsKIAkJfQpAQCAtMzg2LDEyICszODYsOSBAQAogCQlpZiAoIXVwZGF0ZS5jYWxsKCkuaXNFbXB0eSgpKSB7CiAJCQlTdWJtb2R1bGVXYWxrIHdhbGsgPSBTdWJtb2R1bGVXYWxrLmZvckluZGV4KGNsb25lZFJlcG8pOwogCQkJd2hpbGUgKHdhbGsubmV4dCgpKSB7Ci0JCQkJUmVwb3NpdG9yeSBzdWJSZXBvID0gd2Fsay5nZXRSZXBvc2l0b3J5KCk7Ci0JCQkJaWYgKHN1YlJlcG8gIT0gbnVsbCkgewotCQkJCQl0cnkgeworCQkJCXRyeSAoUmVwb3NpdG9yeSBzdWJSZXBvID0gd2Fsay5nZXRSZXBvc2l0b3J5KCkpIHsKKwkJCQkJaWYgKHN1YlJlcG8gIT0gbnVsbCkgewogCQkJCQkJY2xvbmVTdWJtb2R1bGVzKHN1YlJlcG8pOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJc3ViUmVwby5jbG9zZSgpOwogCQkJCQl9CiAJCQkJfQogCQkJfQpAQCAtNDEzLDcgKzQxMCw3IEBACiAJCX0KIAogCQlSZWYgZm91bmRCcmFuY2ggPSBudWxsOwotCQlmb3IgKGZpbmFsIFJlZiByIDogcmVzdWx0LmdldEFkdmVydGlzZWRSZWZzKCkpIHsKKwkJZm9yIChSZWYgciA6IHJlc3VsdC5nZXRBZHZlcnRpc2VkUmVmcygpKSB7CiAJCQlmaW5hbCBTdHJpbmcgbiA9IHIuZ2V0TmFtZSgpOwogCQkJaWYgKCFuLnN0YXJ0c1dpdGgoQ29uc3RhbnRzLlJfSEVBRFMpKQogCQkJCWNvbnRpbnVlOwpAQCAtNDQzLDExICs0NDAsMTEgQEAKIAkJY2xvbmVkUmVwby5nZXRDb25maWcoKS5zYXZlKCk7CiAJfQogCi0JcHJpdmF0ZSBSZXZDb21taXQgcGFyc2VDb21taXQoZmluYWwgUmVwb3NpdG9yeSBjbG9uZWRSZXBvLCBmaW5hbCBSZWYgcmVmKQorCXByaXZhdGUgUmV2Q29tbWl0IHBhcnNlQ29tbWl0KFJlcG9zaXRvcnkgY2xvbmVkUmVwbywgUmVmIHJlZikKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJSU9FeGNlcHRpb24gewogCQlmaW5hbCBSZXZDb21taXQgY29tbWl0OwotCQl0cnkgKGZpbmFsIFJldldhbGsgcncgPSBuZXcgUmV2V2FsayhjbG9uZWRSZXBvKSkgeworCQl0cnkgKFJldldhbGsgcncgPSBuZXcgUmV2V2FsayhjbG9uZWRSZXBvKSkgewogCQkJY29tbWl0ID0gcncucGFyc2VDb21taXQocmVmLmdldE9iamVjdElkKCkpOwogCQl9CiAJCXJldHVybiBjb21taXQ7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Db21taXRDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Db21taXRDb21tYW5kLmphdmEKaW5kZXggZjI1NzI4My4uZDA3NTMyYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ29tbWl0Q29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0NvbW1pdENvbW1hbmQuamF2YQpAQCAtNTQsNyArNTQsNyBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkFib3J0ZWRCeUhvb2tFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkNvbmN1cnJlbnRSZWZVcGRhdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkVtdHB5Q29tbWl0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5FbXB0eUNvbW1pdEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuR2l0QVBJRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5KR2l0SW50ZXJuYWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLk5vRmlsZXBhdHRlcm5FeGNlcHRpb247CkBAIC0yMzgsNyArMjM4LDcgQEAKIAkJCQkJUmV2Q29tbWl0IGhlYWRDb21taXQgPSBydy5wYXJzZUNvbW1pdChoZWFkSWQpOwogCQkJCQloZWFkQ29tbWl0LmdldFRyZWUoKTsKIAkJCQkJaWYgKGluZGV4VHJlZUlkLmVxdWFscyhoZWFkQ29tbWl0LmdldFRyZWUoKSkpIHsKLQkJCQkJCXRocm93IG5ldyBFbXRweUNvbW1pdEV4Y2VwdGlvbigKKwkJCQkJCXRocm93IG5ldyBFbXB0eUNvbW1pdEV4Y2VwdGlvbigKIAkJCQkJCQkJSkdpdFRleHQuZ2V0KCkuZW1wdHlDb21taXQpOwogCQkJCQl9CiAJCQkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ3JlYXRlQnJhbmNoQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ3JlYXRlQnJhbmNoQ29tbWFuZC5qYXZhCmluZGV4IDI5YmFmNGMuLmJhNmYzZjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0NyZWF0ZUJyYW5jaENvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DcmVhdGVCcmFuY2hDb21tYW5kLmphdmEKQEAgLTQzLDYgKzQzLDkgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuSEVBRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLlJfSEVBRFM7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwogCkBAIC03OCw3ICs4MSw3IEBACiAKIAlwcml2YXRlIFNldHVwVXBzdHJlYW1Nb2RlIHVwc3RyZWFtTW9kZTsKIAotCXByaXZhdGUgU3RyaW5nIHN0YXJ0UG9pbnQgPSBDb25zdGFudHMuSEVBRDsKKwlwcml2YXRlIFN0cmluZyBzdGFydFBvaW50ID0gSEVBRDsKIAogCXByaXZhdGUgUmV2Q29tbWl0IHN0YXJ0Q29tbWl0OwogCkBAIC0xMjEsNyArMTI0LDcgQEAKIAkJdHJ5IChSZXZXYWxrIHJldldhbGsgPSBuZXcgUmV2V2FsayhyZXBvKSkgewogCQkJUmVmIHJlZlRvQ2hlY2sgPSByZXBvLmZpbmRSZWYobmFtZSk7CiAJCQlib29sZWFuIGV4aXN0cyA9IHJlZlRvQ2hlY2sgIT0gbnVsbAotCQkJCQkmJiByZWZUb0NoZWNrLmdldE5hbWUoKS5zdGFydHNXaXRoKENvbnN0YW50cy5SX0hFQURTKTsKKwkJCQkJJiYgcmVmVG9DaGVjay5nZXROYW1lKCkuc3RhcnRzV2l0aChSX0hFQURTKTsKIAkJCWlmICghZm9yY2UgJiYgZXhpc3RzKQogCQkJCXRocm93IG5ldyBSZWZBbHJlYWR5RXhpc3RzRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAogCQkJCQkJSkdpdFRleHQuZ2V0KCkucmVmQWxyZWFkeUV4aXN0czEsIG5hbWUpKTsKQEAgLTE1Myw3ICsxNTYsNyBAQAogCQkJCWVsc2UKIAkJCQkJcmVmTG9nTWVzc2FnZSA9ICJicmFuY2g6IENyZWF0ZWQgZnJvbSBjb21taXQgIiArIGJhc2VDb21taXQ7IC8vJE5PTi1OTFMtMSQKIAotCQkJfSBlbHNlIGlmIChzdGFydFBvaW50RnVsbE5hbWUuc3RhcnRzV2l0aChDb25zdGFudHMuUl9IRUFEUykKKwkJCX0gZWxzZSBpZiAoc3RhcnRQb2ludEZ1bGxOYW1lLnN0YXJ0c1dpdGgoUl9IRUFEUykKIAkJCQkJfHwgc3RhcnRQb2ludEZ1bGxOYW1lLnN0YXJ0c1dpdGgoQ29uc3RhbnRzLlJfUkVNT1RFUykpIHsKIAkJCQliYXNlQnJhbmNoID0gc3RhcnRQb2ludEZ1bGxOYW1lOwogCQkJCWlmIChleGlzdHMpCkBAIC0xNzEsNyArMTc0LDcgQEAKIAkJCQkJCQkrIHN0YXJ0UG9pbnRGdWxsTmFtZTsKIAkJCX0KIAotCQkJUmVmVXBkYXRlIHVwZGF0ZVJlZiA9IHJlcG8udXBkYXRlUmVmKENvbnN0YW50cy5SX0hFQURTICsgbmFtZSk7CisJCQlSZWZVcGRhdGUgdXBkYXRlUmVmID0gcmVwby51cGRhdGVSZWYoUl9IRUFEUyArIG5hbWUpOwogCQkJdXBkYXRlUmVmLnNldE5ld09iamVjdElkKHN0YXJ0QXQpOwogCQkJdXBkYXRlUmVmLnNldFJlZkxvZ01lc3NhZ2UocmVmTG9nTWVzc2FnZSwgZmFsc2UpOwogCQkJUmVzdWx0IHVwZGF0ZVJlc3VsdDsKQEAgLTI3OSwxNyArMjgyLDM0IEBACiAJfQogCiAJcHJpdmF0ZSBTdHJpbmcgZ2V0U3RhcnRQb2ludE9ySGVhZCgpIHsKLQkJcmV0dXJuIHN0YXJ0UG9pbnQgIT0gbnVsbCA/IHN0YXJ0UG9pbnQgOiBDb25zdGFudHMuSEVBRDsKKwkJcmV0dXJuIHN0YXJ0UG9pbnQgIT0gbnVsbCA/IHN0YXJ0UG9pbnQgOiBIRUFEOwogCX0KIAogCXByaXZhdGUgdm9pZCBwcm9jZXNzT3B0aW9ucygpIHRocm93cyBJbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbiB7CiAJCWlmIChuYW1lID09IG51bGwKLQkJCQl8fCAhUmVwb3NpdG9yeS5pc1ZhbGlkUmVmTmFtZShDb25zdGFudHMuUl9IRUFEUyArIG5hbWUpKQorCQkJCXx8ICFSZXBvc2l0b3J5LmlzVmFsaWRSZWZOYW1lKFJfSEVBRFMgKyBuYW1lKQorCQkJCXx8ICFpc1ZhbGlkQnJhbmNoTmFtZShuYW1lKSkKIAkJCXRocm93IG5ldyBJbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dAogCQkJCQkuZ2V0KCkuYnJhbmNoTmFtZUludmFsaWQsIG5hbWUgPT0gbnVsbCA/ICI8bnVsbD4iIDogbmFtZSkpOyAvLyROT04tTkxTLTEkCiAJfQogCiAJLyoqCisJICogQ2hlY2sgaWYgdGhlIGdpdmVuIGJyYW5jaCBuYW1lIGlzIHZhbGlkCisJICoKKwkgKiBAcGFyYW0gYnJhbmNoTmFtZQorCSAqICAgICAgICAgICAgYnJhbmNoIG5hbWUgdG8gY2hlY2sKKwkgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgYnJhbmNoIG5hbWUgaXMgdmFsaWQKKwkgKgorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEJyYW5jaE5hbWUoU3RyaW5nIGJyYW5jaE5hbWUpIHsKKwkJaWYgKEhFQUQuZXF1YWxzKGJyYW5jaE5hbWUpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuICFicmFuY2hOYW1lLnN0YXJ0c1dpdGgoIi0iKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgogCSAqIFNldCB0aGUgbmFtZSBvZiB0aGUgbmV3IGJyYW5jaAogCSAqCiAJICogQHBhcmFtIG5hbWUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0Rlc2NyaWJlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvRGVzY3JpYmVDb21tYW5kLmphdmEKaW5kZXggMDFmZTRhYS4uNGQ1ZTQ5OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvRGVzY3JpYmVDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvRGVzY3JpYmVDb21tYW5kLmphdmEKQEAgLTEwNCw2ICsxMDQsMTEgQEAKIAlwcml2YXRlIExpc3Q8SU1hdGNoZXI+IG1hdGNoZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKIAkvKioKKwkgKiBXaGV0aGVyIHRvIHVzZSBhbGwgdGFncyAoaW5jbC4gbGlnaHR3ZWlnaHQpIG9yIG5vdAorCSAqLworCXByaXZhdGUgYm9vbGVhbiB1c2VUYWdzID0gZmFsc2U7CisKKwkvKioKIAkgKiBDb25zdHJ1Y3RvciBmb3IgRGVzY3JpYmVDb21tYW5kLgogCSAqCiAJICogQHBhcmFtIHJlcG8KQEAgLTE3Myw2ICsxNzgsMjIgQEAKIAkJcmV0dXJuIHRoaXM7CiAJfQogCisJLyoqCisJICogSW5zdGVhZCBvZiB1c2luZyBvbmx5IHRoZSBhbm5vdGF0ZWQgdGFncywgdXNlIGFueSB0YWcgZm91bmQgaW4gcmVmcy90YWdzCisJICogbmFtZXNwYWNlLiBUaGlzIG9wdGlvbiBlbmFibGVzIG1hdGNoaW5nIGxpZ2h0d2VpZ2h0IChub24tYW5ub3RhdGVkKSB0YWdzCisJICogb3Igbm90LgorCSAqCisJICogQHBhcmFtIHRhZ3MKKwkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGVuYWJsZXMgbWF0Y2hpbmcgbGlnaHR3ZWlnaHQgKG5vbi1hbm5vdGF0ZWQpCisJICogICAgICAgICAgICB0YWdzIGxpa2Ugc2V0dGluZyBvcHRpb24gLS10YWdzIGluIGMgZ2l0CisJICogQHJldHVybiB7QGNvZGUgdGhpc30KKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIERlc2NyaWJlQ29tbWFuZCBzZXRUYWdzKGJvb2xlYW4gdGFncykgeworCQl0aGlzLnVzZVRhZ3MgPSB0YWdzOworCQlyZXR1cm4gdGhpczsKKwl9CisKIAlwcml2YXRlIFN0cmluZyBsb25nRGVzY3JpcHRpb24oUmVmIHRhZywgaW50IGRlcHRoLCBPYmplY3RJZCB0aXApCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gU3RyaW5nLmZvcm1hdCgKQEAgLTIyNCwxMiArMjQ1LDE2IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIE9iamVjdElkIGdldE9iamVjdElkRnJvbVJlZihSZWYgcikgewotCQlPYmplY3RJZCBrZXkgPSByZXBvLnBlZWwocikuZ2V0UGVlbGVkT2JqZWN0SWQoKTsKLQkJaWYgKGtleSA9PSBudWxsKSB7Ci0JCQlrZXkgPSByLmdldE9iamVjdElkKCk7CisJcHJpdmF0ZSBPYmplY3RJZCBnZXRPYmplY3RJZEZyb21SZWYoUmVmIHIpIHRocm93cyBKR2l0SW50ZXJuYWxFeGNlcHRpb24geworCQl0cnkgeworCQkJT2JqZWN0SWQga2V5ID0gcmVwby5nZXRSZWZEYXRhYmFzZSgpLnBlZWwocikuZ2V0UGVlbGVkT2JqZWN0SWQoKTsKKwkJCWlmIChrZXkgPT0gbnVsbCkgeworCQkJCWtleSA9IHIuZ2V0T2JqZWN0SWQoKTsKKwkJCX0KKwkJCXJldHVybiBrZXk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBKR2l0SW50ZXJuYWxFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwogCQl9Ci0JCXJldHVybiBrZXk7CiAJfQogCiAJLyoqCkBAIC0yNDIsMTIgKzI2NywxNCBAQAogCXB1YmxpYyBTdHJpbmcgY2FsbCgpIHRocm93cyBHaXRBUElFeGNlcHRpb24gewogCQl0cnkgewogCQkJY2hlY2tDYWxsYWJsZSgpOwotCi0JCQlpZiAodGFyZ2V0ID09IG51bGwpCisJCQlpZiAodGFyZ2V0ID09IG51bGwpIHsKIAkJCQlzZXRUYXJnZXQoQ29uc3RhbnRzLkhFQUQpOworCQkJfQogCi0JCQlDb2xsZWN0aW9uPFJlZj4gdGFnTGlzdCA9IHJlcG8uZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKFJfVEFHUykudmFsdWVzKCk7CisJCQlDb2xsZWN0aW9uPFJlZj4gdGFnTGlzdCA9IHJlcG8uZ2V0UmVmRGF0YWJhc2UoKQorCQkJCQkuZ2V0UmVmc0J5UHJlZml4KFJfVEFHUyk7CiAJCQlNYXA8T2JqZWN0SWQsIExpc3Q8UmVmPj4gdGFncyA9IHRhZ0xpc3Quc3RyZWFtKCkKKwkJCQkJLmZpbHRlcih0aGlzOjpmaWx0ZXJMaWdodHdlaWdodFRhZ3MpCiAJCQkJCS5jb2xsZWN0KENvbGxlY3RvcnMuZ3JvdXBpbmdCeSh0aGlzOjpnZXRPYmplY3RJZEZyb21SZWYpKTsKIAogCQkJLy8gY29tYmluZWQgZmxhZ3Mgb2YgYWxsIHRoZSBjYW5kaWRhdGUgaW5zdGFuY2VzCkBAIC0zNzEsNCArMzk4LDIyIEBACiAJCQl3LmNsb3NlKCk7CiAJCX0KIAl9CisKKwkvKioKKwkgKiBXaGV0aGVyIHdlIHVzZSBsaWdodHdlaWdodCB0YWdzIG9yIG5vdCBmb3IgZGVzY3JpYmUgQ2FuZGlkYXRlcworCSAqCisJICogQHBhcmFtIHJlZgorCSAqICAgICAgICAgICAgcmVmZXJlbmNlIHVuZGVyIGluc3BlY3Rpb24KKwkgKiBAcmV0dXJuIHRydWUgaWYgaXQgc2hvdWxkIGJlIHVzZWQgZm9yIGRlc2NyaWJlIG9yIG5vdCByZWdhcmRpbmcKKwkgKiAgICAgICAgIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5EZXNjcmliZUNvbW1hbmQjdXNlVGFnc30KKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygibnVsbCIpCisJcHJpdmF0ZSBib29sZWFuIGZpbHRlckxpZ2h0d2VpZ2h0VGFncyhSZWYgcmVmKSB7CisJCU9iamVjdElkIGlkID0gcmVmLmdldE9iamVjdElkKCk7CisJCXRyeSB7CisJCQlyZXR1cm4gdGhpcy51c2VUYWdzIHx8IChpZCAhPSBudWxsICYmICh3LnBhcnNlVGFnKGlkKSAhPSBudWxsKSk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0ZldGNoQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvRmV0Y2hDb21tYW5kLmphdmEKaW5kZXggNWQxNzhiYy4uNzNlOTNhMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvRmV0Y2hDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvRmV0Y2hDb21tYW5kLmphdmEKQEAgLTEwNSw2ICsxMDUsOCBAQAogCiAJcHJpdmF0ZSBDYWxsYmFjayBjYWxsYmFjazsKIAorCXByaXZhdGUgYm9vbGVhbiBpc0ZvcmNlVXBkYXRlOworCiAJLyoqCiAJICogQ2FsbGJhY2sgZm9yIHN0YXR1cyBvZiBmZXRjaCBvcGVyYXRpb24uCiAJICoKQEAgLTE5OCw3ICsyMDAsOCBAQAogCQkJCQkJCQkuc2V0VGFnT3B0KHRhZ09wdGlvbikKIAkJCQkJCQkJLnNldENoZWNrRmV0Y2hlZE9iamVjdHMoY2hlY2tGZXRjaGVkT2JqZWN0cykKIAkJCQkJCQkJLnNldFJlbW92ZURlbGV0ZWRSZWZzKGlzUmVtb3ZlRGVsZXRlZFJlZnMoKSkKLQkJCQkJCQkJLnNldFRoaW4odGhpbikuc2V0UmVmU3BlY3MocmVmU3BlY3MpCisJCQkJCQkJCS5zZXRUaGluKHRoaW4pCisJCQkJCQkJCS5zZXRSZWZTcGVjcyhhcHBseU9wdGlvbnMocmVmU3BlY3MpKQogCQkJCQkJCQkuc2V0RHJ5UnVuKGRyeVJ1bikKIAkJCQkJCQkJLnNldFJlY3Vyc2VTdWJtb2R1bGVzKHJlY3Vyc2VNb2RlKTsKIAkJCQkJCWNvbmZpZ3VyZShmKTsKQEAgLTIzNyw4ICsyNDAsOCBAQAogCQkJCXRyYW5zcG9ydC5zZXRUYWdPcHQodGFnT3B0aW9uKTsKIAkJCXRyYW5zcG9ydC5zZXRGZXRjaFRoaW4odGhpbik7CiAJCQljb25maWd1cmUodHJhbnNwb3J0KTsKLQotCQkJRmV0Y2hSZXN1bHQgcmVzdWx0ID0gdHJhbnNwb3J0LmZldGNoKG1vbml0b3IsIHJlZlNwZWNzKTsKKwkJCUZldGNoUmVzdWx0IHJlc3VsdCA9IHRyYW5zcG9ydC5mZXRjaChtb25pdG9yLAorCQkJCQlhcHBseU9wdGlvbnMocmVmU3BlY3MpKTsKIAkJCWlmICghcmVwby5pc0JhcmUoKSkgewogCQkJCWZldGNoU3VibW9kdWxlcyhyZXN1bHQpOwogCQkJfQpAQCAtMjYxLDYgKzI2NCwxNyBAQAogCiAJfQogCisJcHJpdmF0ZSBMaXN0PFJlZlNwZWM+IGFwcGx5T3B0aW9ucyhMaXN0PFJlZlNwZWM+IHJlZlNwZWNzMikgeworCQlpZiAoIWlzRm9yY2VVcGRhdGUoKSkgeworCQkJcmV0dXJuIHJlZlNwZWNzMjsKKwkJfQorCQlMaXN0PFJlZlNwZWM+IHVwZGF0ZWQgPSBuZXcgQXJyYXlMaXN0PD4oMyk7CisJCWZvciAoUmVmU3BlYyByZWZTcGVjIDogcmVmU3BlY3MyKSB7CisJCQl1cGRhdGVkLmFkZChyZWZTcGVjLnNldEZvcmNlVXBkYXRlKHRydWUpKTsKKwkJfQorCQlyZXR1cm4gdXBkYXRlZDsKKwl9CisKIAkvKioKIAkgKiBTZXQgdGhlIG1vZGUgdG8gYmUgdXNlZCBmb3IgcmVjdXJzaW5nIGludG8gc3VibW9kdWxlcy4KIAkgKgpAQCAtNTE3LDQgKzUzMSwyNyBAQAogCQl0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7CiAJCXJldHVybiB0aGlzOwogCX0KKworCS8qKgorCSAqIFdoZXRoZXIgZmV0Y2ggLS1mb3JjZSBvcHRpb24gaXMgZW5hYmxlZAorCSAqCisJICogQHJldHVybiB3aGV0aGVyIHJlZnMgYWZmZWN0ZWQgYnkgdGhlIGZldGNoIGFyZSB1cGRhdGVkIGZvcmNlZnVsbHkKKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIGJvb2xlYW4gaXNGb3JjZVVwZGF0ZSgpIHsKKwkJcmV0dXJuIHRoaXMuaXNGb3JjZVVwZGF0ZTsKKwl9CisKKwkvKioKKwkgKiBTZXQgZmV0Y2ggLS1mb3JjZSBvcHRpb24KKwkgKgorCSAqIEBwYXJhbSBmb3JjZQorCSAqICAgICAgICAgICAgd2hldGhlciB0byB1cGRhdGUgcmVmcyBhZmZlY3RlZCBieSB0aGUgZmV0Y2ggZm9yY2VmdWxseQorCSAqIEByZXR1cm4gdGhpcyBjb21tYW5kCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyBGZXRjaENvbW1hbmQgc2V0Rm9yY2VVcGRhdGUoYm9vbGVhbiBmb3JjZSkgeworCQl0aGlzLmlzRm9yY2VVcGRhdGUgPSBmb3JjZTsKKwkJcmV0dXJuIHRoaXM7CisJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTGlzdEJyYW5jaENvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0xpc3RCcmFuY2hDb21tYW5kLmphdmEKaW5kZXggY2RhZTc4Mi4uMjhhMjdhOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTGlzdEJyYW5jaENvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9MaXN0QnJhbmNoQ29tbWFuZC5qYXZhCkBAIC0xODcsNiArMTg3LDYgQEAKIAl9CiAKIAlwcml2YXRlIENvbGxlY3Rpb248UmVmPiBnZXRSZWZzKFN0cmluZyBwcmVmaXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiByZXBvLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhwcmVmaXgpLnZhbHVlcygpOworCQlyZXR1cm4gcmVwby5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnNCeVByZWZpeChwcmVmaXgpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0xpc3RUYWdDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9MaXN0VGFnQ29tbWFuZC5qYXZhCmluZGV4IDkxNjEyMTEuLjAxYzE5OTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0xpc3RUYWdDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTGlzdFRhZ0NvbW1hbmQuamF2YQpAQCAtNDcsNyArNDcsNiBAQAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkdpdEFQSUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuSkdpdEludGVybmFsRXhjZXB0aW9uOwpAQCAtNzgsMTEgKzc3LDExIEBACiAJQE92ZXJyaWRlCiAJcHVibGljIExpc3Q8UmVmPiBjYWxsKCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiB7CiAJCWNoZWNrQ2FsbGFibGUoKTsKLQkJTWFwPFN0cmluZywgUmVmPiByZWZMaXN0OwogCQlMaXN0PFJlZj4gdGFncyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCQl0cnkgKFJldldhbGsgcmV2V2FsayA9IG5ldyBSZXZXYWxrKHJlcG8pKSB7Ci0JCQlyZWZMaXN0ID0gcmVwby5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoQ29uc3RhbnRzLlJfVEFHUyk7Ci0JCQlmb3IgKFJlZiByZWYgOiByZWZMaXN0LnZhbHVlcygpKSB7CisJCQlMaXN0PFJlZj4gcmVmTGlzdCA9IHJlcG8uZ2V0UmVmRGF0YWJhc2UoKQorCQkJCQkuZ2V0UmVmc0J5UHJlZml4KENvbnN0YW50cy5SX1RBR1MpOworCQkJZm9yIChSZWYgcmVmIDogcmVmTGlzdCkgewogCQkJCXRhZ3MuYWRkKHJlZik7CiAJCQl9CiAJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0xvZ0NvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0xvZ0NvbW1hbmQuamF2YQppbmRleCBmZDZjMWZhLi5jZjNkMzVmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Mb2dDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTG9nQ29tbWFuZC5qYXZhCkBAIC00MiwxMyArNDIsMTAgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTsKIAotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZEYXRhYmFzZS5BTEw7Ci0KIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5HaXRBUElFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkpHaXRJbnRlcm5hbEV4Y2VwdGlvbjsKQEAgLTI3NSwxMCArMjcyLDkgQEAKIAkgKiAgICAgICAgICAgICB0aGUgcmVmZXJlbmNlcyBjb3VsZCBub3QgYmUgYWNjZXNzZWQKIAkgKi8KIAlwdWJsaWMgTG9nQ29tbWFuZCBhbGwoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlNYXA8U3RyaW5nLCBSZWY+IHJlZnMgPSBnZXRSZXBvc2l0b3J5KCkuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKEFMTCk7Ci0JCWZvciAoUmVmIHJlZiA6IHJlZnMudmFsdWVzKCkpIHsKKwkJZm9yIChSZWYgcmVmIDogZ2V0UmVwb3NpdG9yeSgpLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpKSB7CiAJCQlpZighcmVmLmlzUGVlbGVkKCkpCi0JCQkJcmVmID0gZ2V0UmVwb3NpdG9yeSgpLnBlZWwocmVmKTsKKwkJCQlyZWYgPSBnZXRSZXBvc2l0b3J5KCkuZ2V0UmVmRGF0YWJhc2UoKS5wZWVsKHJlZik7CiAKIAkJCU9iamVjdElkIG9iamVjdElkID0gcmVmLmdldFBlZWxlZE9iamVjdElkKCk7CiAJCQlpZiAob2JqZWN0SWQgPT0gbnVsbCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL01lcmdlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTWVyZ2VDb21tYW5kLmphdmEKaW5kZXggY2Q1MGNhZS4uYjhmYTc0ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTWVyZ2VDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTWVyZ2VDb21tYW5kLmphdmEKQEAgLTExMiw2ICsxMTIsOCBAQAogCiAJcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKIAorCXByaXZhdGUgYm9vbGVhbiBpbnNlcnRDaGFuZ2VJZDsKKwogCXByaXZhdGUgUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBOdWxsUHJvZ3Jlc3NNb25pdG9yLklOU1RBTkNFOwogCiAJLyoqCkBAIC0yNTMsNyArMjU1LDcgQEAKIAkJCXJlZkxvZ01lc3NhZ2UuYXBwZW5kKHJlZi5nZXROYW1lKCkpOwogCiAJCQkvLyBoYW5kbGUgYW5ub3RhdGVkIHRhZ3MKLQkJCXJlZiA9IHJlcG8ucGVlbChyZWYpOworCQkJcmVmID0gcmVwby5nZXRSZWZEYXRhYmFzZSgpLnBlZWwocmVmKTsKIAkJCU9iamVjdElkIG9iamVjdElkID0gcmVmLmdldFBlZWxlZE9iamVjdElkKCk7CiAJCQlpZiAob2JqZWN0SWQgPT0gbnVsbCkKIAkJCQlvYmplY3RJZCA9IHJlZi5nZXRPYmplY3RJZCgpOwpAQCAtMzkyLDYgKzM5NCw3IEBACiAJCQkJCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGdldFJlcG9zaXRvcnkoKSkpIHsKIAkJCQkJCQluZXdIZWFkSWQgPSBnaXQuY29tbWl0KCkKIAkJCQkJCQkJCS5zZXRSZWZsb2dDb21tZW50KHJlZkxvZ01lc3NhZ2UudG9TdHJpbmcoKSkKKwkJCQkJCQkJCS5zZXRJbnNlcnRDaGFuZ2VJZChpbnNlcnRDaGFuZ2VJZCkKIAkJCQkJCQkJCS5jYWxsKCkuZ2V0SWQoKTsKIAkJCQkJCX0KIAkJCQkJCW1lcmdlU3RhdHVzID0gTWVyZ2VTdGF0dXMuTUVSR0VEOwpAQCAtNjE5LDYgKzYyMiwyMyBAQAogCX0KIAogCS8qKgorCSAqIElmIHNldCB0byB0cnVlIGEgY2hhbmdlIGlkIHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGUgY29tbWl0IG1lc3NhZ2UKKwkgKgorCSAqIEFuIGV4aXN0aW5nIGNoYW5nZSBpZCBpcyBub3QgcmVwbGFjZWQuIEFuIGluaXRpYWwgY2hhbmdlIGlkIChJMDAwLi4uKQorCSAqIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGNoYW5nZSBpZC4KKwkgKgorCSAqIEBwYXJhbSBpbnNlcnRDaGFuZ2VJZAorCSAqICAgICAgICAgICAgd2hldGhlciB0byBpbnNlcnQgYSBjaGFuZ2UgaWQKKwkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgTWVyZ2VDb21tYW5kIHNldEluc2VydENoYW5nZUlkKGJvb2xlYW4gaW5zZXJ0Q2hhbmdlSWQpIHsKKwkJY2hlY2tDYWxsYWJsZSgpOworCQl0aGlzLmluc2VydENoYW5nZUlkID0gaW5zZXJ0Q2hhbmdlSWQ7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgogCSAqIFRoZSBwcm9ncmVzcyBtb25pdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlmZiBvcGVyYXRpb24uIEJ5IGRlZmF1bHQsIHRoaXMKIAkgKiBpcyBzZXQgdG8gPGNvZGU+TnVsbFByb2dyZXNzTW9uaXRvcjwvY29kZT4KIAkgKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTmFtZVJldkNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL05hbWVSZXZDb21tYW5kLmphdmEKaW5kZXggYTlkOTc1OS4uYTJiMjAwNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTmFtZVJldkNvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9OYW1lUmV2Q29tbWFuZC5qYXZhCkBAIC0yNTEsOCArMjUxLDcgQEAKIAkgKiBwcmVmaXggYWRkZWQgYnkge0BsaW5rICNhZGRQcmVmaXgoU3RyaW5nKX0uCiAJICoKIAkgKiBAcGFyYW0gcHJlZml4Ci0JICogICAgICAgICAgICBwcmVmaXggdG8gYWRkOyBzZWUKLQkgKiAgICAgICAgICAgIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZEYXRhYmFzZSNnZXRSZWZzKFN0cmluZyl9CisJICogICAgICAgICAgICBwcmVmaXggdG8gYWRkOyB0aGUgcHJlZml4IG11c3QgZW5kIHdpdGggYSBzbGFzaAogCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CiAJICovCiAJcHVibGljIE5hbWVSZXZDb21tYW5kIGFkZFByZWZpeChTdHJpbmcgcHJlZml4KSB7CkBAIC0yNzksNyArMjc4LDggQEAKIAkJaWYgKHJlZnMgPT0gbnVsbCkKIAkJCXJlZnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAkJdHJ5IHsKLQkJCWZvciAoUmVmIHJlZiA6IHJlcG8uZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKENvbnN0YW50cy5SX1RBR1MpLnZhbHVlcygpKSB7CisJCQlmb3IgKFJlZiByZWYgOiByZXBvLmdldFJlZkRhdGFiYXNlKCkKKwkJCQkJLmdldFJlZnNCeVByZWZpeChDb25zdGFudHMuUl9UQUdTKSkgewogCQkJCU9iamVjdElkIGlkID0gcmVmLmdldE9iamVjdElkKCk7CiAJCQkJaWYgKGlkICE9IG51bGwgJiYgKHdhbGsucGFyc2VBbnkoaWQpIGluc3RhbmNlb2YgUmV2VGFnKSkKIAkJCQkJYWRkUmVmKHJlZik7CkBAIC0zMjUsNyArMzI1LDcgQEAKIAogCXByaXZhdGUgdm9pZCBhZGRQcmVmaXgoU3RyaW5nIHByZWZpeCwgTWFwPE9iamVjdElkLCBTdHJpbmc+IG5vbkNvbW1pdHMsCiAJCQlGSUZPUmV2UXVldWUgcGVuZGluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZm9yIChSZWYgcmVmIDogcmVwby5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMocHJlZml4KS52YWx1ZXMoKSkKKwkJZm9yIChSZWYgcmVmIDogcmVwby5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnNCeVByZWZpeChwcmVmaXgpKQogCQkJYWRkUmVmKHJlZiwgbm9uQ29tbWl0cywgcGVuZGluZyk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdXNoQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVzaENvbW1hbmQuamF2YQppbmRleCAxOWJkZDM1Li40NTk0NTFmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdXNoQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1c2hDb21tYW5kLmphdmEKQEAgLTE1Myw3ICsxNTMsOCBAQAogCiAJCQlmaW5hbCBMaXN0PFRyYW5zcG9ydD4gdHJhbnNwb3J0czsKIAkJCXRyYW5zcG9ydHMgPSBUcmFuc3BvcnQub3BlbkFsbChyZXBvLCByZW1vdGUsIFRyYW5zcG9ydC5PcGVyYXRpb24uUFVTSCk7Ci0JCQlmb3IgKGZpbmFsIFRyYW5zcG9ydCB0cmFuc3BvcnQgOiB0cmFuc3BvcnRzKSB7CisJCQlmb3IgKEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIEV4cGxpY2l0bHkgY2xvc2VkIGluIGZpbmFsbHkKKwkJCQkJZmluYWwgVHJhbnNwb3J0IHRyYW5zcG9ydCA6IHRyYW5zcG9ydHMpIHsKIAkJCQl0cmFuc3BvcnQuc2V0UHVzaFRoaW4odGhpbik7CiAJCQkJdHJhbnNwb3J0LnNldFB1c2hBdG9taWMoYXRvbWljKTsKIAkJCQlpZiAocmVjZWl2ZVBhY2sgIT0gbnVsbCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1JlYmFzZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1JlYmFzZUNvbW1hbmQuamF2YQppbmRleCBkYTFmZjA2Li45OGMxNmI4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZWJhc2VDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmViYXNlQ29tbWFuZC5qYXZhCkBAIC0xNzM0LDIzICsxNzM0LDE3IEBACiAJCQkJU3RyaW5nIGNvbnRlbnQpCiAJCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhcmVudERpciwgbmFtZSk7Ci0JCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotCQkJdHJ5IHsKKwkJCXRyeSAoRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKSkgewogCQkJCWZvcy53cml0ZShjb250ZW50LmdldEJ5dGVzKENvbnN0YW50cy5DSEFSQUNURVJfRU5DT0RJTkcpKTsKIAkJCQlmb3Mud3JpdGUoJ1xuJyk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWZvcy5jbG9zZSgpOwogCQkJfQogCQl9CiAKIAkJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBlbmRUb0ZpbGUoRmlsZSBmaWxlLCBTdHJpbmcgY29udGVudCkKIAkJCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlLCB0cnVlKTsKLQkJCXRyeSB7CisJCQl0cnkgKEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSwgdHJ1ZSkpIHsKIAkJCQlmb3Mud3JpdGUoY29udGVudC5nZXRCeXRlcyhDb25zdGFudHMuQ0hBUkFDVEVSX0VOQ09ESU5HKSk7CiAJCQkJZm9zLndyaXRlKCdcbicpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlmb3MuY2xvc2UoKTsKIAkJCX0KIAkJfQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1JlbW90ZUFkZENvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1JlbW90ZUFkZENvbW1hbmQuamF2YQppbmRleCBjNDNjNWM2Li5hOGZkY2QyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZW1vdGVBZGRDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmVtb3RlQWRkQ29tbWFuZC5qYXZhCkBAIC04Niw5ICs4NiwxMiBAQAogCSAqCiAJICogQHBhcmFtIG5hbWUKIAkgKiAgICAgICAgICAgIGEgcmVtb3RlIG5hbWUKKwkgKiBAcmV0dXJuIHRoaXMgaW5zdGFuY2UKKwkgKiBAc2luY2UgNS4wCiAJICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCXB1YmxpYyBSZW1vdGVBZGRDb21tYW5kIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKIAkJdGhpcy5uYW1lID0gbmFtZTsKKwkJcmV0dXJuIHRoaXM7CiAJfQogCiAJLyoqCkBAIC05Niw5ICs5OSwxMiBAQAogCSAqCiAJICogQHBhcmFtIHVyaQogCSAqICAgICAgICAgICAgYW4gVVJMIGZvciB0aGUgcmVtb3RlCisJICogQHJldHVybiB0aGlzIGluc3RhbmNlCisJICogQHNpbmNlIDUuMAogCSAqLwotCXB1YmxpYyB2b2lkIHNldFVyaShVUklpc2ggdXJpKSB7CisJcHVibGljIFJlbW90ZUFkZENvbW1hbmQgc2V0VXJpKFVSSWlzaCB1cmkpIHsKIAkJdGhpcy51cmkgPSB1cmk7CisJCXJldHVybiB0aGlzOwogCX0KIAogCS8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmVzZXRDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZXNldENvbW1hbmQuamF2YQppbmRleCBiZTQ0NmY5Li4xM2NlNGU3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZXNldENvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZXNldENvbW1hbmQuamF2YQpAQCAtMjQ1LDcgKzI0NSw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIFJldkNvbW1pdCBwYXJzZUNvbW1pdChmaW5hbCBPYmplY3RJZCBjb21taXRJZCkgeworCXByaXZhdGUgUmV2Q29tbWl0IHBhcnNlQ29tbWl0KE9iamVjdElkIGNvbW1pdElkKSB7CiAJCXRyeSAoUmV2V2FsayBydyA9IG5ldyBSZXZXYWxrKHJlcG8pKSB7CiAJCQlyZXR1cm4gcncucGFyc2VDb21taXQoY29tbWl0SWQpOwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CkBAIC0zNjAsNyArMzYwLDcgQEAKIAogCXByaXZhdGUgdm9pZCByZXNldEluZGV4Rm9yUGF0aHMoT2JqZWN0SWQgY29tbWl0VHJlZSkgewogCQlEaXJDYWNoZSBkYyA9IG51bGw7Ci0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsocmVwbykpIHsKKwkJdHJ5IChUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhyZXBvKSkgewogCQkJZGMgPSByZXBvLmxvY2tEaXJDYWNoZSgpOwogCQkJRGlyQ2FjaGVCdWlsZGVyIGJ1aWxkZXIgPSBkYy5idWlsZGVyKCk7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1JtQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUm1Db21tYW5kLmphdmEKaW5kZXggMDg4YWExNS4uZDJmNGJlOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUm1Db21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUm1Db21tYW5kLmphdmEKQEAgLTE1NCw3ICsxNTQsNyBAQAogCQlEaXJDYWNoZSBkYyA9IG51bGw7CiAKIAkJTGlzdDxTdHJpbmc+IGFjdHVhbGx5RGVsZXRlZEZpbGVzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsocmVwbykpIHsKKwkJdHJ5IChUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhyZXBvKSkgewogCQkJZGMgPSByZXBvLmxvY2tEaXJDYWNoZSgpOwogCQkJRGlyQ2FjaGVCdWlsZGVyIGJ1aWxkZXIgPSBkYy5idWlsZGVyKCk7CiAJCQl0dy5yZXNldCgpOyAvLyBkcm9wIHRoZSBmaXJzdCBlbXB0eSB0cmVlLCB3aGljaCB3ZSBkbyBub3QgbmVlZCBoZXJlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGFzaEFwcGx5Q29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hBcHBseUNvbW1hbmQuamF2YQppbmRleCA1Zjc5MjhkLi4wMWQwNzBjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGFzaEFwcGx5Q29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoQXBwbHlDb21tYW5kLmphdmEKQEAgLTExMSw3ICsxMTEsNyBAQAogCSAqICAgICAgICAgICAgdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5fSB0byBhcHBseSB0aGUgc3Rhc2gKIAkgKiAgICAgICAgICAgIHRvCiAJICovCi0JcHVibGljIFN0YXNoQXBwbHlDb21tYW5kKGZpbmFsIFJlcG9zaXRvcnkgcmVwbykgeworCXB1YmxpYyBTdGFzaEFwcGx5Q29tbWFuZChSZXBvc2l0b3J5IHJlcG8pIHsKIAkJc3VwZXIocmVwbyk7CiAJfQogCkBAIC0xMjUsNyArMTI1LDcgQEAKIAkgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIHN0YXNoIHtAY29kZSBSZWZ9IHRvIGFwcGx5CiAJICogQHJldHVybiB7QGNvZGUgdGhpc30KIAkgKi8KLQlwdWJsaWMgU3Rhc2hBcHBseUNvbW1hbmQgc2V0U3Rhc2hSZWYoZmluYWwgU3RyaW5nIHN0YXNoUmVmKSB7CisJcHVibGljIFN0YXNoQXBwbHlDb21tYW5kIHNldFN0YXNoUmVmKFN0cmluZyBzdGFzaFJlZikgewogCQl0aGlzLnN0YXNoUmVmID0gc3Rhc2hSZWY7CiAJCXJldHVybiB0aGlzOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoQ3JlYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hDcmVhdGVDb21tYW5kLmphdmEKaW5kZXggMzQ5NWZmOC4uYzMyODkwZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hDcmVhdGVDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hDcmVhdGVDb21tYW5kLmphdmEKQEAgLTE5NSw3ICsxOTUsNyBAQAogCiAJcHJpdmF0ZSBSZXZDb21taXQgcGFyc2VDb21taXQoZmluYWwgT2JqZWN0UmVhZGVyIHJlYWRlciwKIAkJCWZpbmFsIE9iamVjdElkIGhlYWRJZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdHJ5IChmaW5hbCBSZXZXYWxrIHdhbGsgPSBuZXcgUmV2V2FsayhyZWFkZXIpKSB7CisJCXRyeSAoUmV2V2FsayB3YWxrID0gbmV3IFJldldhbGsocmVhZGVyKSkgewogCQkJcmV0dXJuIHdhbGsucGFyc2VDb21taXQoaGVhZElkKTsKIAkJfQogCX0KQEAgLTMwMywxMiArMzAzLDkgQEAKIAkJCQkJCWVudHJ5LnNldExhc3RNb2RpZmllZCh3dEl0ZXIuZ2V0RW50cnlMYXN0TW9kaWZpZWQoKSk7CiAJCQkJCQllbnRyeS5zZXRGaWxlTW9kZSh3dEl0ZXIuZ2V0RW50cnlGaWxlTW9kZSgpKTsKIAkJCQkJCWxvbmcgY29udGVudExlbmd0aCA9IHd0SXRlci5nZXRFbnRyeUNvbnRlbnRMZW5ndGgoKTsKLQkJCQkJCUlucHV0U3RyZWFtIGluID0gd3RJdGVyLm9wZW5FbnRyeVN0cmVhbSgpOwotCQkJCQkJdHJ5IHsKKwkJCQkJCXRyeSAoSW5wdXRTdHJlYW0gaW4gPSB3dEl0ZXIub3BlbkVudHJ5U3RyZWFtKCkpIHsKIAkJCQkJCQllbnRyeS5zZXRPYmplY3RJZChpbnNlcnRlci5pbnNlcnQoCiAJCQkJCQkJCQlDb25zdGFudHMuT0JKX0JMT0IsIGNvbnRlbnRMZW5ndGgsIGluKSk7Ci0JCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCWluLmNsb3NlKCk7CiAJCQkJCQl9CiAKIAkJCQkJCWlmIChpbmRleEl0ZXIgPT0gbnVsbCAmJiBoZWFkSXRlciA9PSBudWxsKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hEcm9wQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hEcm9wQ29tbWFuZC5qYXZhCmluZGV4IGNkOGY4ZTYuLjdmMDJhYWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoRHJvcENvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGFzaERyb3BDb21tYW5kLmphdmEKQEAgLTEwNyw3ICsxMDcsNyBAQAogCSAqICAgICAgICAgICAgdGhlIDAtYmFzZWQgaW5kZXggb2YgdGhlIHN0YXNoIHJlZmVyZW5jZQogCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CiAJICovCi0JcHVibGljIFN0YXNoRHJvcENvbW1hbmQgc2V0U3Rhc2hSZWYoZmluYWwgaW50IHN0YXNoUmVmKSB7CisJcHVibGljIFN0YXNoRHJvcENvbW1hbmQgc2V0U3Rhc2hSZWYoaW50IHN0YXNoUmVmKSB7CiAJCWlmIChzdGFzaFJlZiA8IDApCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAKQEAgLTEyNCw3ICsxMjQsNyBAQAogCSAqICAgICAgICAgICAge0BsaW5rICNzZXRTdGFzaFJlZihpbnQpfQogCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CiAJICovCi0JcHVibGljIFN0YXNoRHJvcENvbW1hbmQgc2V0QWxsKGZpbmFsIGJvb2xlYW4gYWxsKSB7CisJcHVibGljIFN0YXNoRHJvcENvbW1hbmQgc2V0QWxsKGJvb2xlYW4gYWxsKSB7CiAJCXRoaXMuYWxsID0gYWxsOwogCQlyZXR1cm4gdGhpczsKIAl9CkBAIC0xMzgsNyArMTM4LDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgUmVmVXBkYXRlIGNyZWF0ZVJlZlVwZGF0ZShmaW5hbCBSZWYgc3Rhc2hSZWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSBSZWZVcGRhdGUgY3JlYXRlUmVmVXBkYXRlKFJlZiBzdGFzaFJlZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJUmVmVXBkYXRlIHVwZGF0ZSA9IHJlcG8udXBkYXRlUmVmKFJfU1RBU0gpOwogCQl1cGRhdGUuZGlzYWJsZVJlZkxvZygpOwogCQl1cGRhdGUuc2V0RXhwZWN0ZWRPbGRPYmplY3RJZChzdGFzaFJlZi5nZXRPYmplY3RJZCgpKTsKQEAgLTE0Niw3ICsxNDYsNyBAQAogCQlyZXR1cm4gdXBkYXRlOwogCX0KIAotCXByaXZhdGUgdm9pZCBkZWxldGVSZWYoZmluYWwgUmVmIHN0YXNoUmVmKSB7CisJcHJpdmF0ZSB2b2lkIGRlbGV0ZVJlZihSZWYgc3Rhc2hSZWYpIHsKIAkJdHJ5IHsKIAkJCVJlc3VsdCByZXN1bHQgPSBjcmVhdGVSZWZVcGRhdGUoc3Rhc2hSZWYpLmRlbGV0ZSgpOwogCQkJaWYgKFJlc3VsdC5GT1JDRUQgIT0gcmVzdWx0KQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hMaXN0Q29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hMaXN0Q29tbWFuZC5qYXZhCmluZGV4IDY0NTFiNzAuLmYzMTZiMjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoTGlzdENvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGFzaExpc3RDb21tYW5kLmphdmEKQEAgLTcyLDcgKzcyLDcgQEAKIAkgKgogCSAqIEBwYXJhbSByZXBvIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnl9IG9iamVjdC4KIAkgKi8KLQlwdWJsaWMgU3Rhc2hMaXN0Q29tbWFuZChmaW5hbCBSZXBvc2l0b3J5IHJlcG8pIHsKKwlwdWJsaWMgU3Rhc2hMaXN0Q29tbWFuZChSZXBvc2l0b3J5IHJlcG8pIHsKIAkJc3VwZXIocmVwbyk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdWJtb2R1bGVBZGRDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdWJtb2R1bGVBZGRDb21tYW5kLmphdmEKaW5kZXggMWFhMDUwZi4uOTUzOGQyYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3VibW9kdWxlQWRkQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N1Ym1vZHVsZUFkZENvbW1hbmQuamF2YQpAQCAtODgsNyArODgsNyBAQAogCSAqIEBwYXJhbSByZXBvCiAJICogICAgICAgICAgICBhIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5fSBvYmplY3QuCiAJICovCi0JcHVibGljIFN1Ym1vZHVsZUFkZENvbW1hbmQoZmluYWwgUmVwb3NpdG9yeSByZXBvKSB7CisJcHVibGljIFN1Ym1vZHVsZUFkZENvbW1hbmQoUmVwb3NpdG9yeSByZXBvKSB7CiAJCXN1cGVyKHJlcG8pOwogCX0KIApAQCAtOTksNyArOTksNyBAQAogCSAqICAgICAgICAgICAgKHdpdGggPGNvZGU+LzwvY29kZT4gYXMgc2VwYXJhdG9yKQogCSAqIEByZXR1cm4gdGhpcyBjb21tYW5kCiAJICovCi0JcHVibGljIFN1Ym1vZHVsZUFkZENvbW1hbmQgc2V0UGF0aChmaW5hbCBTdHJpbmcgcGF0aCkgeworCXB1YmxpYyBTdWJtb2R1bGVBZGRDb21tYW5kIHNldFBhdGgoU3RyaW5nIHBhdGgpIHsKIAkJdGhpcy5wYXRoID0gcGF0aDsKIAkJcmV0dXJuIHRoaXM7CiAJfQpAQCAtMTExLDcgKzExMSw3IEBACiAJICogICAgICAgICAgICBhIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSBvYmplY3QuCiAJICogQHJldHVybiB0aGlzIGNvbW1hbmQKIAkgKi8KLQlwdWJsaWMgU3VibW9kdWxlQWRkQ29tbWFuZCBzZXRVUkkoZmluYWwgU3RyaW5nIHVyaSkgeworCXB1YmxpYyBTdWJtb2R1bGVBZGRDb21tYW5kIHNldFVSSShTdHJpbmcgdXJpKSB7CiAJCXRoaXMudXJpID0gdXJpOwogCQlyZXR1cm4gdGhpczsKIAl9CkBAIC0xMjUsNyArMTI1LDcgQEAKIAkgKiAgICAgICAgICAgIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGliLlByb2dyZXNzTW9uaXRvcn0gb2JqZWN0LgogCSAqIEByZXR1cm4gdGhpcyBjb21tYW5kCiAJICovCi0JcHVibGljIFN1Ym1vZHVsZUFkZENvbW1hbmQgc2V0UHJvZ3Jlc3NNb25pdG9yKGZpbmFsIFByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJcHVibGljIFN1Ym1vZHVsZUFkZENvbW1hbmQgc2V0UHJvZ3Jlc3NNb25pdG9yKFByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CiAJCXRoaXMubW9uaXRvciA9IG1vbml0b3I7CiAJCXJldHVybiB0aGlzOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N1Ym1vZHVsZUluaXRDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdWJtb2R1bGVJbml0Q29tbWFuZC5qYXZhCmluZGV4IDZhZjI3ZDcuLjJkYjEyYjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N1Ym1vZHVsZUluaXRDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3VibW9kdWxlSW5pdENvbW1hbmQuamF2YQpAQCAtNzcsNyArNzcsNyBAQAogCSAqIEBwYXJhbSByZXBvCiAJICogICAgICAgICAgICBhIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5fSBvYmplY3QuCiAJICovCi0JcHVibGljIFN1Ym1vZHVsZUluaXRDb21tYW5kKGZpbmFsIFJlcG9zaXRvcnkgcmVwbykgeworCXB1YmxpYyBTdWJtb2R1bGVJbml0Q29tbWFuZChSZXBvc2l0b3J5IHJlcG8pIHsKIAkJc3VwZXIocmVwbyk7CiAJCXBhdGhzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJfQpAQCAtODksNyArODksNyBAQAogCSAqICAgICAgICAgICAgKHdpdGggPGNvZGU+LzwvY29kZT4gYXMgc2VwYXJhdG9yKQogCSAqIEByZXR1cm4gdGhpcyBjb21tYW5kCiAJICovCi0JcHVibGljIFN1Ym1vZHVsZUluaXRDb21tYW5kIGFkZFBhdGgoZmluYWwgU3RyaW5nIHBhdGgpIHsKKwlwdWJsaWMgU3VibW9kdWxlSW5pdENvbW1hbmQgYWRkUGF0aChTdHJpbmcgcGF0aCkgewogCQlwYXRocy5hZGQocGF0aCk7CiAJCXJldHVybiB0aGlzOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N1Ym1vZHVsZVN0YXR1c0NvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N1Ym1vZHVsZVN0YXR1c0NvbW1hbmQuamF2YQppbmRleCA5N2FlNjY4Li4wNjA2YzViIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdWJtb2R1bGVTdGF0dXNDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3VibW9kdWxlU3RhdHVzQ29tbWFuZC5qYXZhCkBAIC03Nyw3ICs3Nyw3IEBACiAJICogQHBhcmFtIHJlcG8KIAkgKiAgICAgICAgICAgIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnl9IG9iamVjdC4KIAkgKi8KLQlwdWJsaWMgU3VibW9kdWxlU3RhdHVzQ29tbWFuZChmaW5hbCBSZXBvc2l0b3J5IHJlcG8pIHsKKwlwdWJsaWMgU3VibW9kdWxlU3RhdHVzQ29tbWFuZChSZXBvc2l0b3J5IHJlcG8pIHsKIAkJc3VwZXIocmVwbyk7CiAJCXBhdGhzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJfQpAQCAtODksNyArODksNyBAQAogCSAqICAgICAgICAgICAgKHdpdGggPGNvZGU+LzwvY29kZT4gYXMgc2VwYXJhdG9yKQogCSAqIEByZXR1cm4gdGhpcyBjb21tYW5kCiAJICovCi0JcHVibGljIFN1Ym1vZHVsZVN0YXR1c0NvbW1hbmQgYWRkUGF0aChmaW5hbCBTdHJpbmcgcGF0aCkgeworCXB1YmxpYyBTdWJtb2R1bGVTdGF0dXNDb21tYW5kIGFkZFBhdGgoU3RyaW5nIHBhdGgpIHsKIAkJcGF0aHMuYWRkKHBhdGgpOwogCQlyZXR1cm4gdGhpczsKIAl9CkBAIC0xMzAsMTYgKzEzMCwxNCBAQAogCQkJCQlpZCk7CiAKIAkJLy8gUmVwb3J0IHVuaW5pdGlhbGl6ZWQgaWYgbm8gc3VibW9kdWxlIHJlcG9zaXRvcnkKLQkJUmVwb3NpdG9yeSBzdWJSZXBvID0gZ2VuZXJhdG9yLmdldFJlcG9zaXRvcnkoKTsKLQkJaWYgKHN1YlJlcG8gPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3VibW9kdWxlU3RhdHVzKFN1Ym1vZHVsZVN0YXR1c1R5cGUuVU5JTklUSUFMSVpFRCwgcGF0aCwKLQkJCQkJaWQpOworCQlPYmplY3RJZCBoZWFkSWQgPSBudWxsOworCQl0cnkgKFJlcG9zaXRvcnkgc3ViUmVwbyA9IGdlbmVyYXRvci5nZXRSZXBvc2l0b3J5KCkpIHsKKwkJCWlmIChzdWJSZXBvID09IG51bGwpIHsKKwkJCQlyZXR1cm4gbmV3IFN1Ym1vZHVsZVN0YXR1cyhTdWJtb2R1bGVTdGF0dXNUeXBlLlVOSU5JVElBTElaRUQsCisJCQkJCQlwYXRoLCBpZCk7CisJCQl9CiAKLQkJT2JqZWN0SWQgaGVhZElkOwotCQl0cnkgewogCQkJaGVhZElkID0gc3ViUmVwby5yZXNvbHZlKENvbnN0YW50cy5IRUFEKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXN1YlJlcG8uY2xvc2UoKTsKIAkJfQogCiAJCS8vIFJlcG9ydCB1bmluaXRpYWxpemVkIGlmIG5vIEhFQUQgY29tbWl0IGluIHN1Ym1vZHVsZSByZXBvc2l0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdWJtb2R1bGVTeW5jQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3VibW9kdWxlU3luY0NvbW1hbmQuamF2YQppbmRleCBkMjJkODIwLi43Y2Y0YjczIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdWJtb2R1bGVTeW5jQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N1Ym1vZHVsZVN5bmNDb21tYW5kLmphdmEKQEAgLTc5LDcgKzc5LDcgQEAKIAkgKiBAcGFyYW0gcmVwbwogCSAqICAgICAgICAgICAgYSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeX0gb2JqZWN0LgogCSAqLwotCXB1YmxpYyBTdWJtb2R1bGVTeW5jQ29tbWFuZChmaW5hbCBSZXBvc2l0b3J5IHJlcG8pIHsKKwlwdWJsaWMgU3VibW9kdWxlU3luY0NvbW1hbmQoUmVwb3NpdG9yeSByZXBvKSB7CiAJCXN1cGVyKHJlcG8pOwogCQlwYXRocyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCX0KQEAgLTkxLDcgKzkxLDcgQEAKIAkgKiAgICAgICAgICAgICh3aXRoIDxjb2RlPi88L2NvZGU+IGFzIHNlcGFyYXRvcikKIAkgKiBAcmV0dXJuIHRoaXMgY29tbWFuZAogCSAqLwotCXB1YmxpYyBTdWJtb2R1bGVTeW5jQ29tbWFuZCBhZGRQYXRoKGZpbmFsIFN0cmluZyBwYXRoKSB7CisJcHVibGljIFN1Ym1vZHVsZVN5bmNDb21tYW5kIGFkZFBhdGgoU3RyaW5nIHBhdGgpIHsKIAkJcGF0aHMuYWRkKHBhdGgpOwogCQlyZXR1cm4gdGhpczsKIAl9CkBAIC0xMDQsNyArMTA0LDcgQEAKIAkgKiBAcmV0dXJuIHNob3J0ZW5lZCBicmFuY2ggbmFtZSwgbnVsbCBvbiBmYWlsdXJlcwogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SGVhZEJyYW5jaChmaW5hbCBSZXBvc2l0b3J5IHN1YlJlcG8pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJvdGVjdGVkIFN0cmluZyBnZXRIZWFkQnJhbmNoKFJlcG9zaXRvcnkgc3ViUmVwbykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJUmVmIGhlYWQgPSBzdWJSZXBvLmV4YWN0UmVmKENvbnN0YW50cy5IRUFEKTsKIAkJaWYgKGhlYWQgIT0gbnVsbCAmJiBoZWFkLmlzU3ltYm9saWMoKSkKIAkJCXJldHVybiBSZXBvc2l0b3J5LnNob3J0ZW5SZWZOYW1lKGhlYWQuZ2V0TGVhZigpLmdldE5hbWUoKSk7CkBAIC0xMzIsMzAgKzEzMiwzMSBAQAogCQkJCQkJcGF0aCwgQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfVVJMLCByZW1vdGVVcmwpOwogCQkJCXN5bmNlZC5wdXQocGF0aCwgcmVtb3RlVXJsKTsKIAotCQkJCVJlcG9zaXRvcnkgc3ViUmVwbyA9IGdlbmVyYXRvci5nZXRSZXBvc2l0b3J5KCk7Ci0JCQkJaWYgKHN1YlJlcG8gPT0gbnVsbCkKLQkJCQkJY29udGludWU7CisJCQkJdHJ5IChSZXBvc2l0b3J5IHN1YlJlcG8gPSBnZW5lcmF0b3IuZ2V0UmVwb3NpdG9yeSgpKSB7CisJCQkJCWlmIChzdWJSZXBvID09IG51bGwpIHsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CiAKLQkJCQlTdG9yZWRDb25maWcgc3ViQ29uZmlnOwotCQkJCVN0cmluZyBicmFuY2g7Ci0JCQkJdHJ5IHsKKwkJCQkJU3RvcmVkQ29uZmlnIHN1YkNvbmZpZzsKKwkJCQkJU3RyaW5nIGJyYW5jaDsKKwogCQkJCQlzdWJDb25maWcgPSBzdWJSZXBvLmdldENvbmZpZygpOwogCQkJCQkvLyBHZXQgbmFtZSBvZiByZW1vdGUgYXNzb2NpYXRlZCB3aXRoIGN1cnJlbnQgYnJhbmNoIGFuZAogCQkJCQkvLyBmYWxsIGJhY2sgdG8gZGVmYXVsdCByZW1vdGUgbmFtZSBhcyBsYXN0IHJlc29ydAogCQkJCQlicmFuY2ggPSBnZXRIZWFkQnJhbmNoKHN1YlJlcG8pOwogCQkJCQlTdHJpbmcgcmVtb3RlID0gbnVsbDsKLQkJCQkJaWYgKGJyYW5jaCAhPSBudWxsKQorCQkJCQlpZiAoYnJhbmNoICE9IG51bGwpIHsKIAkJCQkJCXJlbW90ZSA9IHN1YkNvbmZpZy5nZXRTdHJpbmcoCiAJCQkJCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfQlJBTkNIX1NFQ1RJT04sIGJyYW5jaCwKIAkJCQkJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfUkVNT1RFKTsKLQkJCQkJaWYgKHJlbW90ZSA9PSBudWxsKQorCQkJCQl9CisJCQkJCWlmIChyZW1vdGUgPT0gbnVsbCkgewogCQkJCQkJcmVtb3RlID0gQ29uc3RhbnRzLkRFRkFVTFRfUkVNT1RFX05BTUU7CisJCQkJCX0KIAogCQkJCQlzdWJDb25maWcuc2V0U3RyaW5nKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfUkVNT1RFX1NFQ1RJT04sCiAJCQkJCQkJcmVtb3RlLCBDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9VUkwsIHJlbW90ZVVybCk7CiAJCQkJCXN1YkNvbmZpZy5zYXZlKCk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJc3ViUmVwby5jbG9zZSgpOwogCQkJCX0KIAkJCX0KIAkJCWlmICghc3luY2VkLmlzRW1wdHkoKSkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N1Ym1vZHVsZVVwZGF0ZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N1Ym1vZHVsZVVwZGF0ZUNvbW1hbmQuamF2YQppbmRleCAzMzYyZDQ2Li4zOThmMjFlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdWJtb2R1bGVVcGRhdGVDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3VibW9kdWxlVXBkYXRlQ29tbWFuZC5qYXZhCkBAIC0xMDMsNyArMTAzLDcgQEAKIAkgKiBAcGFyYW0gcmVwbwogCSAqICAgICAgICAgICAgYSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeX0gb2JqZWN0LgogCSAqLwotCXB1YmxpYyBTdWJtb2R1bGVVcGRhdGVDb21tYW5kKGZpbmFsIFJlcG9zaXRvcnkgcmVwbykgeworCXB1YmxpYyBTdWJtb2R1bGVVcGRhdGVDb21tYW5kKFJlcG9zaXRvcnkgcmVwbykgewogCQlzdXBlcihyZXBvKTsKIAkJcGF0aHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAl9CkBAIC0xMzIsNyArMTMyLDcgQEAKIAkgKiBAcmV0dXJuIHRoaXMgY29tbWFuZAogCSAqIEBzaW5jZSA0LjkKIAkgKi8KLQlwdWJsaWMgU3VibW9kdWxlVXBkYXRlQ29tbWFuZCBzZXRGZXRjaChmaW5hbCBib29sZWFuIGZldGNoKSB7CisJcHVibGljIFN1Ym1vZHVsZVVwZGF0ZUNvbW1hbmQgc2V0RmV0Y2goYm9vbGVhbiBmZXRjaCkgewogCQl0aGlzLmZldGNoID0gZmV0Y2g7CiAJCXJldHVybiB0aGlzOwogCX0KQEAgLTE0NCwxMSArMTQ0LDQzIEBACiAJICogICAgICAgICAgICAod2l0aCA8Y29kZT4vPC9jb2RlPiBhcyBzZXBhcmF0b3IpCiAJICogQHJldHVybiB0aGlzIGNvbW1hbmQKIAkgKi8KLQlwdWJsaWMgU3VibW9kdWxlVXBkYXRlQ29tbWFuZCBhZGRQYXRoKGZpbmFsIFN0cmluZyBwYXRoKSB7CisJcHVibGljIFN1Ym1vZHVsZVVwZGF0ZUNvbW1hbmQgYWRkUGF0aChTdHJpbmcgcGF0aCkgewogCQlwYXRocy5hZGQocGF0aCk7CiAJCXJldHVybiB0aGlzOwogCX0KIAorCXByaXZhdGUgUmVwb3NpdG9yeSBnZXRPckNsb25lU3VibW9kdWxlKFN1Ym1vZHVsZVdhbGsgZ2VuZXJhdG9yLCBTdHJpbmcgdXJsKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBHaXRBUElFeGNlcHRpb24geworCQlSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSBnZW5lcmF0b3IuZ2V0UmVwb3NpdG9yeSgpOworCQlpZiAocmVwb3NpdG9yeSA9PSBudWxsKSB7CisJCQlpZiAoY2FsbGJhY2sgIT0gbnVsbCkgeworCQkJCWNhbGxiYWNrLmNsb25pbmdTdWJtb2R1bGUoZ2VuZXJhdG9yLmdldFBhdGgoKSk7CisJCQl9CisJCQlDbG9uZUNvbW1hbmQgY2xvbmUgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCk7CisJCQljb25maWd1cmUoY2xvbmUpOworCQkJY2xvbmUuc2V0VVJJKHVybCk7CisJCQljbG9uZS5zZXREaXJlY3RvcnkoZ2VuZXJhdG9yLmdldERpcmVjdG9yeSgpKTsKKwkJCWNsb25lLnNldEdpdERpcigKKwkJCQkJbmV3IEZpbGUobmV3IEZpbGUocmVwby5nZXREaXJlY3RvcnkoKSwgQ29uc3RhbnRzLk1PRFVMRVMpLAorCQkJCQkJCWdlbmVyYXRvci5nZXRQYXRoKCkpKTsKKwkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKKwkJCQljbG9uZS5zZXRQcm9ncmVzc01vbml0b3IobW9uaXRvcik7CisJCQl9CisJCQlyZXBvc2l0b3J5ID0gY2xvbmUuY2FsbCgpLmdldFJlcG9zaXRvcnkoKTsKKwkJfSBlbHNlIGlmICh0aGlzLmZldGNoKSB7CisJCQlpZiAoZmV0Y2hDYWxsYmFjayAhPSBudWxsKSB7CisJCQkJZmV0Y2hDYWxsYmFjay5mZXRjaGluZ1N1Ym1vZHVsZShnZW5lcmF0b3IuZ2V0UGF0aCgpKTsKKwkJCX0KKwkJCUZldGNoQ29tbWFuZCBmZXRjaENvbW1hbmQgPSBHaXQud3JhcChyZXBvc2l0b3J5KS5mZXRjaCgpOworCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgeworCQkJCWZldGNoQ29tbWFuZC5zZXRQcm9ncmVzc01vbml0b3IobW9uaXRvcik7CisJCQl9CisJCQljb25maWd1cmUoZmV0Y2hDb21tYW5kKTsKKwkJCWZldGNoQ29tbWFuZC5jYWxsKCk7CisJCX0KKwkJcmV0dXJuIHJlcG9zaXRvcnk7CisJfQorCiAJLyoqCiAJICoge0Bpbmhlcml0RG9jfQogCSAqCkBAIC0xNzUsMzQgKzIwNyw4IEBACiAJCQkJaWYgKHVybCA9PSBudWxsKQogCQkJCQljb250aW51ZTsKIAotCQkJCVJlcG9zaXRvcnkgc3VibW9kdWxlUmVwbyA9IGdlbmVyYXRvci5nZXRSZXBvc2l0b3J5KCk7Ci0JCQkJLy8gQ2xvbmUgcmVwb3NpdG9yeSBpZiBub3QgcHJlc2VudAotCQkJCWlmIChzdWJtb2R1bGVSZXBvID09IG51bGwpIHsKLQkJCQkJaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLQkJCQkJCWNhbGxiYWNrLmNsb25pbmdTdWJtb2R1bGUoZ2VuZXJhdG9yLmdldFBhdGgoKSk7Ci0JCQkJCX0KLQkJCQkJQ2xvbmVDb21tYW5kIGNsb25lID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpOwotCQkJCQljb25maWd1cmUoY2xvbmUpOwotCQkJCQljbG9uZS5zZXRVUkkodXJsKTsKLQkJCQkJY2xvbmUuc2V0RGlyZWN0b3J5KGdlbmVyYXRvci5nZXREaXJlY3RvcnkoKSk7Ci0JCQkJCWNsb25lLnNldEdpdERpcihuZXcgRmlsZShuZXcgRmlsZShyZXBvLmdldERpcmVjdG9yeSgpLAotCQkJCQkJCUNvbnN0YW50cy5NT0RVTEVTKSwgZ2VuZXJhdG9yLmdldFBhdGgoKSkpOwotCQkJCQlpZiAobW9uaXRvciAhPSBudWxsKQotCQkJCQkJY2xvbmUuc2V0UHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IpOwotCQkJCQlzdWJtb2R1bGVSZXBvID0gY2xvbmUuY2FsbCgpLmdldFJlcG9zaXRvcnkoKTsKLQkJCQl9IGVsc2UgaWYgKHRoaXMuZmV0Y2gpIHsKLQkJCQkJaWYgKGZldGNoQ2FsbGJhY2sgIT0gbnVsbCkgewotCQkJCQkJZmV0Y2hDYWxsYmFjay5mZXRjaGluZ1N1Ym1vZHVsZShnZW5lcmF0b3IuZ2V0UGF0aCgpKTsKLQkJCQkJfQotCQkJCQlGZXRjaENvbW1hbmQgZmV0Y2hDb21tYW5kID0gR2l0LndyYXAoc3VibW9kdWxlUmVwbykuZmV0Y2goKTsKLQkJCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCQkJZmV0Y2hDb21tYW5kLnNldFByb2dyZXNzTW9uaXRvcihtb25pdG9yKTsKLQkJCQkJfQotCQkJCQljb25maWd1cmUoZmV0Y2hDb21tYW5kKTsKLQkJCQkJZmV0Y2hDb21tYW5kLmNhbGwoKTsKLQkJCQl9Ci0KLQkJCQl0cnkgKFJldldhbGsgd2FsayA9IG5ldyBSZXZXYWxrKHN1Ym1vZHVsZVJlcG8pKSB7CisJCQkJdHJ5IChSZXBvc2l0b3J5IHN1Ym1vZHVsZVJlcG8gPSBnZXRPckNsb25lU3VibW9kdWxlKGdlbmVyYXRvciwKKwkJCQkJCXVybCk7IFJldldhbGsgd2FsayA9IG5ldyBSZXZXYWxrKHN1Ym1vZHVsZVJlcG8pKSB7CiAJCQkJCVJldkNvbW1pdCBjb21taXQgPSB3YWxrCiAJCQkJCQkJLnBhcnNlQ29tbWl0KGdlbmVyYXRvci5nZXRPYmplY3RJZCgpKTsKIApAQCAtMjM3LDggKzI0Myw2IEBACiAJCQkJCQkJCQlnZW5lcmF0b3IuZ2V0UGF0aCgpKTsKIAkJCQkJCX0KIAkJCQkJfQotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXN1Ym1vZHVsZVJlcG8uY2xvc2UoKTsKIAkJCQl9CiAJCQkJdXBkYXRlZC5hZGQoZ2VuZXJhdG9yLmdldFBhdGgoKSk7CiAJCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9UcmFuc3BvcnRDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9UcmFuc3BvcnRDb21tYW5kLmphdmEKaW5kZXggOWM5MTUzNy4uZDM0YmI1ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvVHJhbnNwb3J0Q29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1RyYW5zcG9ydENvbW1hbmQuamF2YQpAQCAtODAsNyArODAsNyBAQAogCSAqCiAJICogQHBhcmFtIHJlcG8gYSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeX0gb2JqZWN0LgogCSAqLwotCXByb3RlY3RlZCBUcmFuc3BvcnRDb21tYW5kKGZpbmFsIFJlcG9zaXRvcnkgcmVwbykgeworCXByb3RlY3RlZCBUcmFuc3BvcnRDb21tYW5kKFJlcG9zaXRvcnkgcmVwbykgewogCQlzdXBlcihyZXBvKTsKIAkJc2V0Q3JlZGVudGlhbHNQcm92aWRlcihDcmVkZW50aWFsc1Byb3ZpZGVyLmdldERlZmF1bHQoKSk7CiAJfQpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAJICogICAgICAgICAgICBhIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5UcmFuc3BvcnR9IG9iamVjdC4KIAkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQogCSAqLwotCXByb3RlY3RlZCBDIGNvbmZpZ3VyZShmaW5hbCBUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisJcHJvdGVjdGVkIEMgY29uZmlndXJlKFRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKIAkJaWYgKGNyZWRlbnRpYWxzUHJvdmlkZXIgIT0gbnVsbCkKIAkJCXRyYW5zcG9ydC5zZXRDcmVkZW50aWFsc1Byb3ZpZGVyKGNyZWRlbnRpYWxzUHJvdmlkZXIpOwogCQl0cmFuc3BvcnQuc2V0VGltZW91dCh0aW1lb3V0KTsKQEAgLTE2NCw3ICsxNjQsNyBAQAogCSAqICAgICAgICAgICAgYSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5hcGkuVHJhbnNwb3J0Q29tbWFuZH0gb2JqZWN0LgogCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CiAJICovCi0JcHJvdGVjdGVkIEMgY29uZmlndXJlKGZpbmFsIFRyYW5zcG9ydENvbW1hbmQgY2hpbGRDb21tYW5kKSB7CisJcHJvdGVjdGVkIEMgY29uZmlndXJlKFRyYW5zcG9ydENvbW1hbmQgY2hpbGRDb21tYW5kKSB7CiAJCWNoaWxkQ29tbWFuZC5zZXRDcmVkZW50aWFsc1Byb3ZpZGVyKGNyZWRlbnRpYWxzUHJvdmlkZXIpOwogCQljaGlsZENvbW1hbmQuc2V0VGltZW91dCh0aW1lb3V0KTsKIAkJY2hpbGRDb21tYW5kLnNldFRyYW5zcG9ydENvbmZpZ0NhbGxiYWNrKHRyYW5zcG9ydENvbmZpZ0NhbGxiYWNrKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL2Vycm9ycy9BYm9ydGVkQnlIb29rRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9lcnJvcnMvQWJvcnRlZEJ5SG9va0V4Y2VwdGlvbi5qYXZhCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL2Vycm9ycy9FbXRweUNvbW1pdEV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvZXJyb3JzL0VtcHR5Q29tbWl0RXhjZXB0aW9uLmphdmEKc2ltaWxhcml0eSBpbmRleCA4OCUKcmVuYW1lIGZyb20gb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvZXJyb3JzL0VtdHB5Q29tbWl0RXhjZXB0aW9uLmphdmEKcmVuYW1lIHRvIG9yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL2Vycm9ycy9FbXB0eUNvbW1pdEV4Y2VwdGlvbi5qYXZhCmluZGV4IGVhMGU3MTguLjg3ZTFhNmEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL2Vycm9ycy9FbXRweUNvbW1pdEV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL2Vycm9ycy9FbXB0eUNvbW1pdEV4Y2VwdGlvbi5qYXZhCkBAIC00MCwzMCArNDAsMzAgQEAKIC8qKgogICogRXhjZXB0aW9uIHRocm93biB3aGVuIGEgbmV3bHkgY3JlYXRlZCBjb21taXQgZG9lcyBub3QgY29udGFpbiBhbnkgY2hhbmdlcwogICoKLSAqIEBzaW5jZSA0LjIKKyAqIEBzaW5jZSA1LjAKICAqLwotcHVibGljIGNsYXNzIEVtdHB5Q29tbWl0RXhjZXB0aW9uIGV4dGVuZHMgR2l0QVBJRXhjZXB0aW9uIHsgLy8gVE9ETzogQ29ycmVjdCBzcGVsbGluZyBvZiB0aGlzIGNsYXNzIG5hbWUgaW4gNS4wCitwdWJsaWMgY2xhc3MgRW1wdHlDb21taXRFeGNlcHRpb24gZXh0ZW5kcyBHaXRBUElFeGNlcHRpb24gewogCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwogCiAJLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEVtdHB5Q29tbWl0RXhjZXB0aW9uCisJICogQ29uc3RydWN0b3IgZm9yIEVtcHR5Q29tbWl0RXhjZXB0aW9uCiAJICoKIAkgKiBAcGFyYW0gbWVzc2FnZQogCSAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQogCSAqIEBwYXJhbSBjYXVzZQogCSAqICAgICAgICAgICAgYSB7QGxpbmsgamF2YS5sYW5nLlRocm93YWJsZX0KIAkgKi8KLQlwdWJsaWMgRW10cHlDb21taXRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgeworCXB1YmxpYyBFbXB0eUNvbW1pdEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7CiAJCXN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKIAl9CiAKIAkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRW10cHlDb21taXRFeGNlcHRpb24uCisJICogQ29uc3RydWN0b3IgZm9yIEVtcHR5Q29tbWl0RXhjZXB0aW9uLgogCSAqCiAJICogQHBhcmFtIG1lc3NhZ2UKIAkgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKIAkgKi8KLQlwdWJsaWMgRW10cHlDb21taXRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKwlwdWJsaWMgRW1wdHlDb21taXRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKIAkJc3VwZXIobWVzc2FnZSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvZXJyb3JzL1N0YXNoQXBwbHlGYWlsdXJlRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9lcnJvcnMvU3Rhc2hBcHBseUZhaWx1cmVFeGNlcHRpb24uamF2YQppbmRleCA1MTdiNTEyLi5iMTJjMDMyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9lcnJvcnMvU3Rhc2hBcHBseUZhaWx1cmVFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9lcnJvcnMvU3Rhc2hBcHBseUZhaWx1cmVFeGNlcHRpb24uamF2YQpAQCAtMjYsNyArMjYsNyBAQAogCSAqIEBwYXJhbSBtZXNzYWdlCiAJICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCiAJICovCi0JcHVibGljIFN0YXNoQXBwbHlGYWlsdXJlRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7CisJcHVibGljIFN0YXNoQXBwbHlGYWlsdXJlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CiAJCXN1cGVyKG1lc3NhZ2UpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ibGFtZS9SZXZlcnNlV2Fsay5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ibGFtZS9SZXZlcnNlV2Fsay5qYXZhCmluZGV4IDJlYjMxM2YuLjEwNjczNzggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYmxhbWUvUmV2ZXJzZVdhbGsuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2JsYW1lL1JldmVyc2VXYWxrLmphdmEKQEAgLTEwOCw3ICsxMDgsNyBAQAogCQkJcmV0dXJuIGNoaWxkcmVuLmxlbmd0aDsKIAkJfQogCi0JCVJldmVyc2VDb21taXQgZ2V0Q2hpbGQoZmluYWwgaW50IG50aCkgeworCQlSZXZlcnNlQ29tbWl0IGdldENoaWxkKGludCBudGgpIHsKIAkJCXJldHVybiBjaGlsZHJlbltudGhdOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0RpZmZDb25maWcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9EaWZmQ29uZmlnLmphdmEKaW5kZXggMDYzY2VmZi4uMjFkY2E2YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0RpZmZDb25maWcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvRGlmZkNvbmZpZy5qYXZhCkBAIC03Niw3ICs3Niw3IEBACiAKIAlwcml2YXRlIGZpbmFsIGludCByZW5hbWVMaW1pdDsKIAotCXByaXZhdGUgRGlmZkNvbmZpZyhmaW5hbCBDb25maWcgcmMpIHsKKwlwcml2YXRlIERpZmZDb25maWcoQ29uZmlnIHJjKSB7CiAJCW5vUHJlZml4ID0gcmMuZ2V0Qm9vbGVhbihDb25maWdDb25zdGFudHMuQ09ORklHX0RJRkZfU0VDVElPTiwKIAkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9OT1BSRUZJWCwgZmFsc2UpOwogCQlyZW5hbWVEZXRlY3Rpb25UeXBlID0gcGFyc2VSZW5hbWVEZXRlY3Rpb25UeXBlKHJjLmdldFN0cmluZygKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9EaWZmRm9ybWF0dGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvRGlmZkZvcm1hdHRlci5qYXZhCmluZGV4IDJlMjliODEuLjdhYWE1MDAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9EaWZmRm9ybWF0dGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0RpZmZGb3JtYXR0ZXIuamF2YQpAQCAtMjIyLDcgKzIyMiw3IEBACiAJICogICAgICAgICAgICBtb2RpZmljYXRpb24gYW5kIGFmdGVyIHRoZSBsYXN0IG1vZGlmaWNhdGlvbiB3aXRoaW4gYSBodW5rIG9mCiAJICogICAgICAgICAgICB0aGUgbW9kaWZpZWQgZmlsZS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZXh0KGZpbmFsIGludCBsaW5lQ291bnQpIHsKKwlwdWJsaWMgdm9pZCBzZXRDb250ZXh0KGludCBsaW5lQ291bnQpIHsKIAkJaWYgKGxpbmVDb3VudCA8IDApCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAogCQkJCQlKR2l0VGV4dC5nZXQoKS5jb250ZXh0TXVzdEJlTm9uTmVnYXRpdmUpOwpAQCAtMjM1LDcgKzIzNSw3IEBACiAJICogQHBhcmFtIGNvdW50CiAJICogICAgICAgICAgICBudW1iZXIgb2YgZGlnaXRzIHRvIHNob3cgaW4gYW4gT2JqZWN0SWQuCiAJICovCi0JcHVibGljIHZvaWQgc2V0QWJicmV2aWF0aW9uTGVuZ3RoKGZpbmFsIGludCBjb3VudCkgeworCXB1YmxpYyB2b2lkIHNldEFiYnJldmlhdGlvbkxlbmd0aChpbnQgY291bnQpIHsKIAkJaWYgKGNvdW50IDwgMCkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCiAJCQkJCUpHaXRUZXh0LmdldCgpLmFiYnJldmlhdGlvbkxlbmd0aE11c3RCZU5vbk5lZ2F0aXZlKTsKQEAgLTc0Miw3ICs3NDIsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHdyaXRpbmcgdG8gdGhlIHN1cHBsaWVkIHN0cmVhbSBmYWlsZWQuCiAJICovCi0JcHVibGljIHZvaWQgZm9ybWF0KGZpbmFsIEZpbGVIZWFkZXIgaGVhZCwgZmluYWwgUmF3VGV4dCBhLCBmaW5hbCBSYXdUZXh0IGIpCisJcHVibGljIHZvaWQgZm9ybWF0KEZpbGVIZWFkZXIgaGVhZCwgUmF3VGV4dCBhLCBSYXdUZXh0IGIpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQkvLyBSZXVzZSB0aGUgZXhpc3RpbmcgRmlsZUhlYWRlciBhcy1pcyBieSBibGluZGx5IGNvcHlpbmcgaXRzCiAJCS8vIGhlYWRlciBsaW5lcywgYnV0IGF2b2lkaW5nIGl0cyBodW5rcy4gSW5zdGVhZCB3ZSByZWNyZWF0ZQpAQCAtNzY4LDcgKzc2OCw3IEBACiAJICogICAgICAgICAgICB0aGUgdGV4dCBCIHdoaWNoIHdhcyBjb21wYXJlZAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqLwotCXB1YmxpYyB2b2lkIGZvcm1hdChmaW5hbCBFZGl0TGlzdCBlZGl0cywgZmluYWwgUmF3VGV4dCBhLCBmaW5hbCBSYXdUZXh0IGIpCisJcHVibGljIHZvaWQgZm9ybWF0KEVkaXRMaXN0IGVkaXRzLCBSYXdUZXh0IGEsIFJhd1RleHQgYikKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZvciAoaW50IGN1cklkeCA9IDA7IGN1cklkeCA8IGVkaXRzLnNpemUoKTspIHsKIAkJCUVkaXQgY3VyRWRpdCA9IGVkaXRzLmdldChjdXJJZHgpOwpAQCAtODE2LDEyICs4MTYsMTIgQEAKIAkgKiAgICAgICAgICAgIHRoZSBsaW5lIG51bWJlciB3aXRoaW4gdGV4dAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqLwotCXByb3RlY3RlZCB2b2lkIHdyaXRlQ29udGV4dExpbmUoZmluYWwgUmF3VGV4dCB0ZXh0LCBmaW5hbCBpbnQgbGluZSkKKwlwcm90ZWN0ZWQgdm9pZCB3cml0ZUNvbnRleHRMaW5lKFJhd1RleHQgdGV4dCwgaW50IGxpbmUpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl3cml0ZUxpbmUoJyAnLCB0ZXh0LCBsaW5lKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRW5kT2ZMaW5lTWlzc2luZyhmaW5hbCBSYXdUZXh0IHRleHQsIGZpbmFsIGludCBsaW5lKSB7CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0VuZE9mTGluZU1pc3NpbmcoUmF3VGV4dCB0ZXh0LCBpbnQgbGluZSkgewogCQlyZXR1cm4gbGluZSArIDEgPT0gdGV4dC5zaXplKCkgJiYgdGV4dC5pc01pc3NpbmdOZXdsaW5lQXRFbmQoKTsKIAl9CiAKQEAgLTgzNCw3ICs4MzQsNyBAQAogCSAqICAgICAgICAgICAgdGhlIGxpbmUgbnVtYmVyIHdpdGhpbiB0ZXh0CiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgd3JpdGVBZGRlZExpbmUoZmluYWwgUmF3VGV4dCB0ZXh0LCBmaW5hbCBpbnQgbGluZSkKKwlwcm90ZWN0ZWQgdm9pZCB3cml0ZUFkZGVkTGluZShSYXdUZXh0IHRleHQsIGludCBsaW5lKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJd3JpdGVMaW5lKCcrJywgdGV4dCwgbGluZSk7CiAJfQpAQCAtODQ4LDcgKzg0OCw3IEBACiAJICogICAgICAgICAgICB0aGUgbGluZSBudW1iZXIgd2l0aGluIHRleHQKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZVJlbW92ZWRMaW5lKGZpbmFsIFJhd1RleHQgdGV4dCwgZmluYWwgaW50IGxpbmUpCisJcHJvdGVjdGVkIHZvaWQgd3JpdGVSZW1vdmVkTGluZShSYXdUZXh0IHRleHQsIGludCBsaW5lKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJd3JpdGVMaW5lKCctJywgdGV4dCwgbGluZSk7CiAJfQpAQCAtODc4LDcgKzg3OCw3IEBACiAJCW91dC53cml0ZSgnXG4nKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgd3JpdGVSYW5nZShmaW5hbCBjaGFyIHByZWZpeCwgZmluYWwgaW50IGJlZ2luLCBmaW5hbCBpbnQgY250KQorCXByaXZhdGUgdm9pZCB3cml0ZVJhbmdlKGNoYXIgcHJlZml4LCBpbnQgYmVnaW4sIGludCBjbnQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlvdXQud3JpdGUoJyAnKTsKIAkJb3V0LndyaXRlKHByZWZpeCk7CkBAIC0xMjEzLDcgKzEyMTMsNyBAQAogCQlvLndyaXRlKGVuY29kZSgiKysrICIgKyBuZXdwICsgIlxuIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAl9CiAKLQlwcml2YXRlIGludCBmaW5kQ29tYmluZWRFbmQoZmluYWwgTGlzdDxFZGl0PiBlZGl0cywgZmluYWwgaW50IGkpIHsKKwlwcml2YXRlIGludCBmaW5kQ29tYmluZWRFbmQoTGlzdDxFZGl0PiBlZGl0cywgaW50IGkpIHsKIAkJaW50IGVuZCA9IGkgKyAxOwogCQl3aGlsZSAoZW5kIDwgZWRpdHMuc2l6ZSgpCiAJCQkJJiYgKGNvbWJpbmVBKGVkaXRzLCBlbmQpIHx8IGNvbWJpbmVCKGVkaXRzLCBlbmQpKSkKQEAgLTEyMjEsMTUgKzEyMjEsMTUgQEAKIAkJcmV0dXJuIGVuZCAtIDE7CiAJfQogCi0JcHJpdmF0ZSBib29sZWFuIGNvbWJpbmVBKGZpbmFsIExpc3Q8RWRpdD4gZSwgZmluYWwgaW50IGkpIHsKKwlwcml2YXRlIGJvb2xlYW4gY29tYmluZUEoTGlzdDxFZGl0PiBlLCBpbnQgaSkgewogCQlyZXR1cm4gZS5nZXQoaSkuZ2V0QmVnaW5BKCkgLSBlLmdldChpIC0gMSkuZ2V0RW5kQSgpIDw9IDIgKiBjb250ZXh0OwogCX0KIAotCXByaXZhdGUgYm9vbGVhbiBjb21iaW5lQihmaW5hbCBMaXN0PEVkaXQ+IGUsIGZpbmFsIGludCBpKSB7CisJcHJpdmF0ZSBib29sZWFuIGNvbWJpbmVCKExpc3Q8RWRpdD4gZSwgaW50IGkpIHsKIAkJcmV0dXJuIGUuZ2V0KGkpLmdldEJlZ2luQigpIC0gZS5nZXQoaSAtIDEpLmdldEVuZEIoKSA8PSAyICogY29udGV4dDsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGVuZChmaW5hbCBFZGl0IGVkaXQsIGZpbmFsIGludCBhLCBmaW5hbCBpbnQgYikgeworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZW5kKEVkaXQgZWRpdCwgaW50IGEsIGludCBiKSB7CiAJCXJldHVybiBlZGl0LmdldEVuZEEoKSA8PSBhICYmIGVkaXQuZ2V0RW5kQigpIDw9IGI7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0VkaXQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9FZGl0LmphdmEKaW5kZXggNzc1ZDExYS4uNWM4NzZlOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0VkaXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvRWRpdC5qYXZhCkBAIC05NCw3ICs5NCw3IEBACiAJICogQHBhcmFtIGJzCiAJICogICAgICAgICAgICBiZWdpbkI6IHN0YXJ0IGFuZCBlbmQgb2YgcmVnaW9uIGluIHNlcXVlbmNlIEI7IDAgYmFzZWQuCiAJICovCi0JcHVibGljIEVkaXQoZmluYWwgaW50IGFzLCBmaW5hbCBpbnQgYnMpIHsKKwlwdWJsaWMgRWRpdChpbnQgYXMsIGludCBicykgewogCQl0aGlzKGFzLCBhcywgYnMsIGJzKTsKIAl9CiAKQEAgLTExMCw3ICsxMTAsNyBAQAogCSAqIEBwYXJhbSBiZQogCSAqICAgICAgICAgICAgZW5kQjogZW5kIG9mIHJlZ2lvbiBpbiBzZXF1ZW5jZSBCOyBtdXN0IGJlICZndDsgPSBicy4KIAkgKi8KLQlwdWJsaWMgRWRpdChmaW5hbCBpbnQgYXMsIGZpbmFsIGludCBhZSwgZmluYWwgaW50IGJzLCBmaW5hbCBpbnQgYmUpIHsKKwlwdWJsaWMgRWRpdChpbnQgYXMsIGludCBhZSwgaW50IGJzLCBpbnQgYmUpIHsKIAkJYmVnaW5BID0gYXM7CiAJCWVuZEEgPSBhZTsKIApAQCAtMjc5LDcgKzI3OSw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3QgbykgeworCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewogCQlpZiAobyBpbnN0YW5jZW9mIEVkaXQpIHsKIAkJCWZpbmFsIEVkaXQgZSA9IChFZGl0KSBvOwogCQkJcmV0dXJuIHRoaXMuYmVnaW5BID09IGUuYmVnaW5BICYmIHRoaXMuZW5kQSA9PSBlLmVuZEEKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9IaXN0b2dyYW1EaWZmSW5kZXguamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9IaXN0b2dyYW1EaWZmSW5kZXguamF2YQppbmRleCAwNGM3OWZjLi4zZjgxM2Q4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvSGlzdG9ncmFtRGlmZkluZGV4LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0hpc3RvZ3JhbURpZmZJbmRleC5qYXZhCkBAIC0yMzAsNyArMjMwLDcgQEAKIAkJcmV0dXJuIHRydWU7CiAJfQogCi0JcHJpdmF0ZSBpbnQgdHJ5TG9uZ2VzdENvbW1vblNlcXVlbmNlKGZpbmFsIGludCBiUHRyKSB7CisJcHJpdmF0ZSBpbnQgdHJ5TG9uZ2VzdENvbW1vblNlcXVlbmNlKGludCBiUHRyKSB7CiAJCWludCBiTmV4dCA9IGJQdHIgKyAxOwogCQlpbnQgcklkeCA9IHRhYmxlW2hhc2goYiwgYlB0cildOwogCQlmb3IgKGxvbmcgcmVjOyBySWR4ICE9IDA7IHJJZHggPSByZWNOZXh0KHJlYykpIHsKQEAgLTMyOCw3ICszMjgsNyBAQAogCQlyZXR1cm4gKChpbnQpIHJlYykgJiBSRUNfQ05UX01BU0s7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgaW50IHRhYmxlQml0cyhmaW5hbCBpbnQgc3opIHsKKwlwcml2YXRlIHN0YXRpYyBpbnQgdGFibGVCaXRzKGludCBzeikgewogCQlpbnQgYml0cyA9IDMxIC0gSW50ZWdlci5udW1iZXJPZkxlYWRpbmdaZXJvcyhzeik7CiAJCWlmIChiaXRzID09IDApCiAJCQliaXRzID0gMTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9NeWVyc0RpZmYuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9NeWVyc0RpZmYuamF2YQppbmRleCA2NDZmMjY0Li5jYWFmZmUzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvTXllcnNEaWZmLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL015ZXJzRGlmZi5qYXZhCkBAIC0zNTksNyArMzU5LDcgQEAKIAkJCWFic3RyYWN0IGludCBnZXRMZWZ0KGludCB4KTsKIAkJCWFic3RyYWN0IGludCBnZXRSaWdodChpbnQgeCk7CiAJCQlhYnN0cmFjdCBib29sZWFuIGlzQmV0dGVyKGludCBsZWZ0LCBpbnQgcmlnaHQpOwotCQkJYWJzdHJhY3Qgdm9pZCBhZGp1c3RNaW5NYXhLKGZpbmFsIGludCBrLCBmaW5hbCBpbnQgeCk7CisJCQlhYnN0cmFjdCB2b2lkIGFkanVzdE1pbk1heEsoaW50IGssIGludCB4KTsKIAkJCWFic3RyYWN0IGJvb2xlYW4gbWVldHMoaW50IGQsIGludCBrLCBpbnQgeCwgbG9uZyBzbmFrZSk7CiAKIAkJCWZpbmFsIGxvbmcgbmV3U25ha2UoaW50IGssIGludCB4KSB7CkBAIC00NjksMjIgKzQ2OSwyMiBAQAogCQkJfQogCiAJCQlAT3ZlcnJpZGUKLQkJCWZpbmFsIGludCBnZXRMZWZ0KGZpbmFsIGludCB4KSB7CisJCQlmaW5hbCBpbnQgZ2V0TGVmdChpbnQgeCkgewogCQkJCXJldHVybiB4OwogCQkJfQogCiAJCQlAT3ZlcnJpZGUKLQkJCWZpbmFsIGludCBnZXRSaWdodChmaW5hbCBpbnQgeCkgeworCQkJZmluYWwgaW50IGdldFJpZ2h0KGludCB4KSB7CiAJCQkJcmV0dXJuIHggKyAxOwogCQkJfQogCiAJCQlAT3ZlcnJpZGUKLQkJCWZpbmFsIGJvb2xlYW4gaXNCZXR0ZXIoZmluYWwgaW50IGxlZnQsIGZpbmFsIGludCByaWdodCkgeworCQkJZmluYWwgYm9vbGVhbiBpc0JldHRlcihpbnQgbGVmdCwgaW50IHJpZ2h0KSB7CiAJCQkJcmV0dXJuIGxlZnQgPiByaWdodDsKIAkJCX0KIAogCQkJQE92ZXJyaWRlCi0JCQlmaW5hbCB2b2lkIGFkanVzdE1pbk1heEsoZmluYWwgaW50IGssIGZpbmFsIGludCB4KSB7CisJCQlmaW5hbCB2b2lkIGFkanVzdE1pbk1heEsoaW50IGssIGludCB4KSB7CiAJCQkJaWYgKHggPj0gZW5kQSB8fCBrICsgeCA+PSBlbmRCKSB7CiAJCQkJCWlmIChrID4gYmFja3dhcmQubWlkZGxlSykKIAkJCQkJCW1heEsgPSBrOwpAQCAtNTE3LDIyICs1MTcsMjIgQEAKIAkJCX0KIAogCQkJQE92ZXJyaWRlCi0JCQlmaW5hbCBpbnQgZ2V0TGVmdChmaW5hbCBpbnQgeCkgeworCQkJZmluYWwgaW50IGdldExlZnQoaW50IHgpIHsKIAkJCQlyZXR1cm4geCAtIDE7CiAJCQl9CiAKIAkJCUBPdmVycmlkZQotCQkJZmluYWwgaW50IGdldFJpZ2h0KGZpbmFsIGludCB4KSB7CisJCQlmaW5hbCBpbnQgZ2V0UmlnaHQoaW50IHgpIHsKIAkJCQlyZXR1cm4geDsKIAkJCX0KIAogCQkJQE92ZXJyaWRlCi0JCQlmaW5hbCBib29sZWFuIGlzQmV0dGVyKGZpbmFsIGludCBsZWZ0LCBmaW5hbCBpbnQgcmlnaHQpIHsKKwkJCWZpbmFsIGJvb2xlYW4gaXNCZXR0ZXIoaW50IGxlZnQsIGludCByaWdodCkgewogCQkJCXJldHVybiBsZWZ0IDwgcmlnaHQ7CiAJCQl9CiAKIAkJCUBPdmVycmlkZQotCQkJZmluYWwgdm9pZCBhZGp1c3RNaW5NYXhLKGZpbmFsIGludCBrLCBmaW5hbCBpbnQgeCkgeworCQkJZmluYWwgdm9pZCBhZGp1c3RNaW5NYXhLKGludCBrLCBpbnQgeCkgewogCQkJCWlmICh4IDw9IGJlZ2luQSB8fCBrICsgeCA8PSBiZWdpbkIpIHsKIAkJCQkJaWYgKGsgPiBmb3J3YXJkLm1pZGRsZUspCiAJCQkJCQltYXhLID0gazsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9SYXdUZXh0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvUmF3VGV4dC5qYXZhCmluZGV4IGVjODhjZTQuLmJkNDFkOTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9SYXdUZXh0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1Jhd1RleHQuamF2YQpAQCAtODgsMTIgKzg4LDI5IEBACiAJICogVGhlIGVudGlyZSBhcnJheSAoaW5kZXhlcyAwIHRocm91Z2ggbGVuZ3RoLTEpIGlzIHVzZWQgYXMgdGhlIGNvbnRlbnQuCiAJICoKIAkgKiBAcGFyYW0gaW5wdXQKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZW50IGFycmF5LiBUaGUgYXJyYXkgaXMgbmV2ZXIgbW9kaWZpZWQsIHNvIHBhc3NpbmcKLQkgKiAgICAgICAgICAgIHRocm91Z2ggY2FjaGVkIGFycmF5cyBpcyBzYWZlLgorCSAqICAgICAgICAgICAgdGhlIGNvbnRlbnQgYXJyYXkuIFRoZSBvYmplY3QgcmV0YWlucyBhIHJlZmVyZW5jZSB0byB0aGlzCisJICogICAgICAgICAgICBhcnJheSwgc28gaXQgc2hvdWxkIGJlIGltbXV0YWJsZS4KIAkgKi8KLQlwdWJsaWMgUmF3VGV4dChmaW5hbCBieXRlW10gaW5wdXQpIHsKKwlwdWJsaWMgUmF3VGV4dChieXRlW10gaW5wdXQpIHsKKwkJdGhpcyhpbnB1dCwgUmF3UGFyc2VVdGlscy5saW5lTWFwKGlucHV0LCAwLCBpbnB1dC5sZW5ndGgpKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgc2VxdWVuY2UgZnJvbSB0aGUgZXhpc3RpbmcgY29udGVudCBieXRlIGFycmF5IGFuZCB0aGUgbGluZQorCSAqIG1hcCBpbmRpY2F0aW5nIGxpbmUgYm91bmRhcmllcy4KKwkgKgorCSAqIEBwYXJhbSBpbnB1dAorCSAqICAgICAgICAgICAgdGhlIGNvbnRlbnQgYXJyYXkuIFRoZSBvYmplY3QgcmV0YWlucyBhIHJlZmVyZW5jZSB0byB0aGlzCisJICogICAgICAgICAgICBhcnJheSwgc28gaXQgc2hvdWxkIGJlIGltbXV0YWJsZS4KKwkgKiBAcGFyYW0gbGluZU1hcAorCSAqICAgICAgICAgICAgYW4gYXJyYXkgd2l0aCAxLWJhc2VkIG9mZnNldHMgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGxpbmUuCisJICogICAgICAgICAgICBUaGUgZmlyc3QgYW5kIGxhc3QgZW50cmllcyBzaG91bGQgYmUge0BsaW5rIEludGVnZXIjTUlOX1ZBTFVFfQorCSAqICAgICAgICAgICAgYW5kIGFuIG9mZnNldCBvbmUgcGFzdCB0aGUgZW5kIG9mIHRoZSBsYXN0IGxpbmUsIHJlc3BlY3RpdmVseS4KKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIFJhd1RleHQoYnl0ZVtdIGlucHV0LCBJbnRMaXN0IGxpbmVNYXApIHsKIAkJY29udGVudCA9IGlucHV0OwotCQlsaW5lcyA9IFJhd1BhcnNlVXRpbHMubGluZU1hcChjb250ZW50LCAwLCBjb250ZW50Lmxlbmd0aCk7CisJCWxpbmVzID0gbGluZU1hcDsKIAl9CiAKIAkvKioKQEAgLTE0Nyw3ICsxNjQsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBzdHJlYW0gd3JpdGUgb3BlcmF0aW9uIGZhaWxlZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCB3cml0ZUxpbmUoZmluYWwgT3V0cHV0U3RyZWFtIG91dCwgZmluYWwgaW50IGkpCisJcHVibGljIHZvaWQgd3JpdGVMaW5lKE91dHB1dFN0cmVhbSBvdXQsIGludCBpKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaW50IHN0YXJ0ID0gZ2V0U3RhcnQoaSk7CiAJCWludCBlbmQgPSBnZXRFbmQoaSk7CkBAIC0yMjEsMTEgKzIzOCwxMSBAQAogCQlyZXR1cm4gUmF3UGFyc2VVdGlscy5kZWNvZGUoY29udGVudCwgc3RhcnQsIGVuZCk7CiAJfQogCi0JcHJpdmF0ZSBpbnQgZ2V0U3RhcnQoZmluYWwgaW50IGkpIHsKKwlwcml2YXRlIGludCBnZXRTdGFydChpbnQgaSkgewogCQlyZXR1cm4gbGluZXMuZ2V0KGkgKyAxKTsKIAl9CiAKLQlwcml2YXRlIGludCBnZXRFbmQoZmluYWwgaW50IGkpIHsKKwlwcml2YXRlIGludCBnZXRFbmQoaW50IGkpIHsKIAkJcmV0dXJuIGxpbmVzLmdldChpICsgMik7CiAJfQogCkBAIC0zMjUsNyArMzQyLDggQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBpZiB0aGUgaW5wdXQgY291bGQgbm90IGJlIHJlYWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBSYXdUZXh0IGxvYWQoT2JqZWN0TG9hZGVyIGxkciwgaW50IHRocmVzaG9sZCkgdGhyb3dzIElPRXhjZXB0aW9uLCBCaW5hcnlCbG9iRXhjZXB0aW9uIHsKKwlwdWJsaWMgc3RhdGljIFJhd1RleHQgbG9hZChPYmplY3RMb2FkZXIgbGRyLCBpbnQgdGhyZXNob2xkKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBCaW5hcnlCbG9iRXhjZXB0aW9uIHsKIAkJbG9uZyBzeiA9IGxkci5nZXRTaXplKCk7CiAKIAkJaWYgKHN6ID4gdGhyZXNob2xkKSB7CkBAIC0zNjksNyArMzg3LDcgQEAKIAogCQkJU3lzdGVtLmFycmF5Y29weShoZWFkLCAwLCBkYXRhLCAwLCBoZWFkLmxlbmd0aCk7CiAJCQlJTy5yZWFkRnVsbHkoc3RyZWFtLCBkYXRhLCBvZmYsIChpbnQpIChzei1vZmYpKTsKLQkJCXJldHVybiBuZXcgUmF3VGV4dChkYXRhKTsKKwkJCXJldHVybiBuZXcgUmF3VGV4dChkYXRhLCBSYXdQYXJzZVV0aWxzLmxpbmVNYXBPckJpbmFyeShkYXRhLCAwLCAoaW50KSBzeikpOwogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1Jhd1RleHRDb21wYXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvUmF3VGV4dENvbXBhcmF0b3IuamF2YQppbmRleCBlZDJlZWJiLi4xZTY4YzJmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvUmF3VGV4dENvbXBhcmF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvUmF3VGV4dENvbXBhcmF0b3IuamF2YQpAQCAtNzcsNyArNzcsNyBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBpbnQgaGFzaFJlZ2lvbihmaW5hbCBieXRlW10gcmF3LCBpbnQgcHRyLCBmaW5hbCBpbnQgZW5kKSB7CisJCXByb3RlY3RlZCBpbnQgaGFzaFJlZ2lvbihieXRlW10gcmF3LCBpbnQgcHRyLCBpbnQgZW5kKSB7CiAJCQlpbnQgaGFzaCA9IDUzODE7CiAJCQlmb3IgKDsgcHRyIDwgZW5kOyBwdHIrKykKIAkJCQloYXNoID0gKChoYXNoIDw8IDUpICsgaGFzaCkgKyAocmF3W3B0cl0gJiAweGZmKTsKQEAgLTE2NCw3ICsxNjQsNyBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBpbnQgaGFzaFJlZ2lvbihmaW5hbCBieXRlW10gcmF3LCBpbnQgcHRyLCBpbnQgZW5kKSB7CisJCXByb3RlY3RlZCBpbnQgaGFzaFJlZ2lvbihieXRlW10gcmF3LCBpbnQgcHRyLCBpbnQgZW5kKSB7CiAJCQlpbnQgaGFzaCA9IDUzODE7CiAJCQlwdHIgPSB0cmltTGVhZGluZ1doaXRlc3BhY2UocmF3LCBwdHIsIGVuZCk7CiAJCQlmb3IgKDsgcHRyIDwgZW5kOyBwdHIrKykKQEAgLTE5OSw3ICsxOTksNyBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBpbnQgaGFzaFJlZ2lvbihmaW5hbCBieXRlW10gcmF3LCBpbnQgcHRyLCBpbnQgZW5kKSB7CisJCXByb3RlY3RlZCBpbnQgaGFzaFJlZ2lvbihieXRlW10gcmF3LCBpbnQgcHRyLCBpbnQgZW5kKSB7CiAJCQlpbnQgaGFzaCA9IDUzODE7CiAJCQllbmQgPSB0cmltVHJhaWxpbmdXaGl0ZXNwYWNlKHJhdywgcHRyLCBlbmQpOwogCQkJZm9yICg7IHB0ciA8IGVuZDsgcHRyKyspCkBAIC0yNDQsNyArMjQ0LDcgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgaW50IGhhc2hSZWdpb24oZmluYWwgYnl0ZVtdIHJhdywgaW50IHB0ciwgaW50IGVuZCkgeworCQlwcm90ZWN0ZWQgaW50IGhhc2hSZWdpb24oYnl0ZVtdIHJhdywgaW50IHB0ciwgaW50IGVuZCkgewogCQkJaW50IGhhc2ggPSA1MzgxOwogCQkJZW5kID0gdHJpbVRyYWlsaW5nV2hpdGVzcGFjZShyYXcsIHB0ciwgZW5kKTsKIAkJCXdoaWxlIChwdHIgPCBlbmQpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9TaW1pbGFyaXR5SW5kZXguamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9TaW1pbGFyaXR5SW5kZXguamF2YQppbmRleCA4YjRkMmVjLi41ODk3ZmZiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvU2ltaWxhcml0eUluZGV4LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1NpbWlsYXJpdHlJbmRleC5qYXZhCkBAIC0xNDcsMjMgKzE0NywxNyBAQAogCiAJcHJpdmF0ZSB2b2lkIGhhc2hMYXJnZU9iamVjdChPYmplY3RMb2FkZXIgb2JqKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAJCQlUYWJsZUZ1bGxFeGNlcHRpb24gewotCQlPYmplY3RTdHJlYW0gaW4xID0gb2JqLm9wZW5TdHJlYW0oKTsKIAkJYm9vbGVhbiB0ZXh0OwotCQl0cnkgeworCQl0cnkgKE9iamVjdFN0cmVhbSBpbjEgPSBvYmoub3BlblN0cmVhbSgpKSB7CiAJCQl0ZXh0ID0gIVJhd1RleHQuaXNCaW5hcnkoaW4xKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWluMS5jbG9zZSgpOwogCQl9CiAKLQkJT2JqZWN0U3RyZWFtIGluMiA9IG9iai5vcGVuU3RyZWFtKCk7Ci0JCXRyeSB7CisJCXRyeSAoT2JqZWN0U3RyZWFtIGluMiA9IG9iai5vcGVuU3RyZWFtKCkpIHsKIAkJCWhhc2goaW4yLCBpbjIuZ2V0U2l6ZSgpLCB0ZXh0KTsKLQkJfSBmaW5hbGx5IHsKLQkJCWluMi5jbG9zZSgpOwogCQl9CiAJfQogCi0Jdm9pZCBoYXNoKGJ5dGVbXSByYXcsIGludCBwdHIsIGZpbmFsIGludCBlbmQpIHRocm93cyBUYWJsZUZ1bGxFeGNlcHRpb24geworCXZvaWQgaGFzaChieXRlW10gcmF3LCBpbnQgcHRyLCBpbnQgZW5kKSB0aHJvd3MgVGFibGVGdWxsRXhjZXB0aW9uIHsKIAkJZmluYWwgYm9vbGVhbiB0ZXh0ID0gIVJhd1RleHQuaXNCaW5hcnkocmF3KTsKIAkJaGFzaGVkQ250ID0gMDsKIAkJd2hpbGUgKHB0ciA8IGVuZCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9CYXNlRGlyQ2FjaGVFZGl0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvQmFzZURpckNhY2hlRWRpdG9yLmphdmEKaW5kZXggMDIyOGY0ZC4uYWEyMjlmNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9CYXNlRGlyQ2FjaGVFZGl0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0Jhc2VEaXJDYWNoZUVkaXRvci5qYXZhCkBAIC04NSw3ICs4NSw3IEBACiAJICogICAgICAgICAgICBlc3RpbWF0ZWQgbnVtYmVyIG9mIGVudHJpZXMgdGhlIGVkaXRvciB3aWxsIGhhdmUgdXBvbgogCSAqICAgICAgICAgICAgY29tcGxldGlvbi4gVGhpcyBzaXplcyB0aGUgaW5pdGlhbCBlbnRyeSB0YWJsZS4KIAkgKi8KLQlwcm90ZWN0ZWQgQmFzZURpckNhY2hlRWRpdG9yKGZpbmFsIERpckNhY2hlIGRjLCBmaW5hbCBpbnQgZWNudCkgeworCXByb3RlY3RlZCBCYXNlRGlyQ2FjaGVFZGl0b3IoRGlyQ2FjaGUgZGMsIGludCBlY250KSB7CiAJCWNhY2hlID0gZGM7CiAJCWVudHJpZXMgPSBuZXcgRGlyQ2FjaGVFbnRyeVtlY250XTsKIAl9CkBAIC0xMTEsNyArMTExLDcgQEAKIAkgKiBAcGFyYW0gbmV3RW50cnkKIAkgKiAgICAgICAgICAgIHRoZSBuZXcgZW50cnkgdG8gYWRkLgogCSAqLwotCXByb3RlY3RlZCB2b2lkIGZhc3RBZGQoZmluYWwgRGlyQ2FjaGVFbnRyeSBuZXdFbnRyeSkgeworCXByb3RlY3RlZCB2b2lkIGZhc3RBZGQoRGlyQ2FjaGVFbnRyeSBuZXdFbnRyeSkgewogCQlpZiAoZW50cmllcy5sZW5ndGggPT0gZW50cnlDbnQpIHsKIAkJCWZpbmFsIERpckNhY2hlRW50cnlbXSBuID0gbmV3IERpckNhY2hlRW50cnlbKGVudHJ5Q250ICsgMTYpICogMyAvIDJdOwogCQkJU3lzdGVtLmFycmF5Y29weShlbnRyaWVzLCAwLCBuLCAwLCBlbnRyeUNudCk7CkBAIC0xNDAsNyArMTQwLDcgQEAKIAkgKiBAcGFyYW0gY250CiAJICogICAgICAgICAgICBudW1iZXIgb2YgZW50cmllcyB0byBjb3B5LgogCSAqLwotCXByb3RlY3RlZCB2b2lkIGZhc3RLZWVwKGZpbmFsIGludCBwb3MsIGludCBjbnQpIHsKKwlwcm90ZWN0ZWQgdm9pZCBmYXN0S2VlcChpbnQgcG9zLCBpbnQgY250KSB7CiAJCWlmIChlbnRyeUNudCArIGNudCA+IGVudHJpZXMubGVuZ3RoKSB7CiAJCQlmaW5hbCBpbnQgbTEgPSAoZW50cnlDbnQgKyAxNikgKiAzIC8gMjsKIAkJCWZpbmFsIGludCBtMiA9IGVudHJ5Q250ICsgY250OwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZS5qYXZhCmluZGV4IGNjNDMxZGIuLjE0NjUzZmUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlLmphdmEKQEAgLTQ1LDE2ICs0NSwxNiBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGU7CiAKK2ltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLklTT184ODU5XzE7CisKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkVPRkV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkRpZ2VzdE91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CkBAIC04Nyw2ICs4Nyw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLk11dGFibGVJbnRlZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5OQjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuVGVtcG9yYXJ5QnVmZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pby5TaWxlbnRGaWxlSW5wdXRTdHJlYW07CiAKIC8qKgogICogU3VwcG9ydCBmb3IgdGhlIEdpdCBkaXJjYWNoZSAoYWthIGluZGV4IGZpbGUpLgpAQCAtMTEyLDcgKzExMyw3IEBACiAKIAlzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxEaXJDYWNoZUVudHJ5PiBFTlRfQ01QID0gbmV3IENvbXBhcmF0b3I8RGlyQ2FjaGVFbnRyeT4oKSB7CiAJCUBPdmVycmlkZQotCQlwdWJsaWMgaW50IGNvbXBhcmUoZmluYWwgRGlyQ2FjaGVFbnRyeSBvMSwgZmluYWwgRGlyQ2FjaGVFbnRyeSBvMikgeworCQlwdWJsaWMgaW50IGNvbXBhcmUoRGlyQ2FjaGVFbnRyeSBvMSwgRGlyQ2FjaGVFbnRyeSBvMikgewogCQkJZmluYWwgaW50IGNyID0gY21wKG8xLCBvMik7CiAJCQlpZiAoY3IgIT0gMCkKIAkJCQlyZXR1cm4gY3I7CkBAIC0xMjAsMTEgKzEyMSwxMSBAQAogCQl9CiAJfTsKIAotCXN0YXRpYyBpbnQgY21wKGZpbmFsIERpckNhY2hlRW50cnkgYSwgZmluYWwgRGlyQ2FjaGVFbnRyeSBiKSB7CisJc3RhdGljIGludCBjbXAoRGlyQ2FjaGVFbnRyeSBhLCBEaXJDYWNoZUVudHJ5IGIpIHsKIAkJcmV0dXJuIGNtcChhLnBhdGgsIGEucGF0aC5sZW5ndGgsIGIpOwogCX0KIAotCXN0YXRpYyBpbnQgY21wKGZpbmFsIGJ5dGVbXSBhUGF0aCwgZmluYWwgaW50IGFMZW4sIGZpbmFsIERpckNhY2hlRW50cnkgYikgeworCXN0YXRpYyBpbnQgY21wKGJ5dGVbXSBhUGF0aCwgaW50IGFMZW4sIERpckNhY2hlRW50cnkgYikgewogCQlyZXR1cm4gY21wKGFQYXRoLCBhTGVuLCBiLnBhdGgsIGIucGF0aC5sZW5ndGgpOwogCX0KIApAQCAtMTg4LDcgKzE4OSw3IEBACiAJICogICAgICAgICAgICAgdGhlIGluZGV4IGZpbGUgaXMgdXNpbmcgYSBmb3JtYXQgb3IgZXh0ZW5zaW9uIHRoYXQgdGhpcwogCSAqICAgICAgICAgICAgIGxpYnJhcnkgZG9lcyBub3Qgc3VwcG9ydC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIERpckNhY2hlIHJlYWQoZmluYWwgUmVwb3NpdG9yeSByZXBvc2l0b3J5KQorCXB1YmxpYyBzdGF0aWMgRGlyQ2FjaGUgcmVhZChSZXBvc2l0b3J5IHJlcG9zaXRvcnkpCiAJCQl0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlmaW5hbCBEaXJDYWNoZSBjID0gcmVhZChyZXBvc2l0b3J5LmdldEluZGV4RmlsZSgpLCByZXBvc2l0b3J5LmdldEZTKCkpOwogCQljLnJlcG9zaXRvcnkgPSByZXBvc2l0b3J5OwpAQCAtMjE1LDcgKzIxNiw3IEBACiAJICogICAgICAgICAgICAgdGhlIGluZGV4IGZpbGUgaXMgdXNpbmcgYSBmb3JtYXQgb3IgZXh0ZW5zaW9uIHRoYXQgdGhpcwogCSAqICAgICAgICAgICAgIGxpYnJhcnkgZG9lcyBub3Qgc3VwcG9ydC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIERpckNhY2hlIHJlYWQoZmluYWwgRmlsZSBpbmRleExvY2F0aW9uLCBmaW5hbCBGUyBmcykKKwlwdWJsaWMgc3RhdGljIERpckNhY2hlIHJlYWQoRmlsZSBpbmRleExvY2F0aW9uLCBGUyBmcykKIAkJCXRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIERpckNhY2hlIGMgPSBuZXcgRGlyQ2FjaGUoaW5kZXhMb2NhdGlvbiwgZnMpOwogCQljLnJlYWQoKTsKQEAgLTI0NCw3ICsyNDUsNyBAQAogCSAqICAgICAgICAgICAgIHRoZSBpbmRleCBmaWxlIGlzIHVzaW5nIGEgZm9ybWF0IG9yIGV4dGVuc2lvbiB0aGF0IHRoaXMKIAkgKiAgICAgICAgICAgICBsaWJyYXJ5IGRvZXMgbm90IHN1cHBvcnQuCiAJICovCi0JcHVibGljIHN0YXRpYyBEaXJDYWNoZSBsb2NrKGZpbmFsIEZpbGUgaW5kZXhMb2NhdGlvbiwgZmluYWwgRlMgZnMpCisJcHVibGljIHN0YXRpYyBEaXJDYWNoZSBsb2NrKEZpbGUgaW5kZXhMb2NhdGlvbiwgRlMgZnMpCiAJCQl0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlmaW5hbCBEaXJDYWNoZSBjID0gbmV3IERpckNhY2hlKGluZGV4TG9jYXRpb24sIGZzKTsKIAkJaWYgKCFjLmxvY2soKSkKQEAgLTM3Miw3ICszNzMsNyBAQAogCSAqICAgICAgICAgICAgdGhlIGZpbGUgc3lzdGVtIGFic3RyYWN0aW9uIHdoaWNoIHdpbGwgYmUgbmVjZXNzYXJ5IHRvIHBlcmZvcm0KIAkgKiAgICAgICAgICAgIGNlcnRhaW4gZmlsZSBzeXN0ZW0gb3BlcmF0aW9ucy4KIAkgKi8KLQlwdWJsaWMgRGlyQ2FjaGUoZmluYWwgRmlsZSBpbmRleExvY2F0aW9uLCBmaW5hbCBGUyBmcykgeworCXB1YmxpYyBEaXJDYWNoZShGaWxlIGluZGV4TG9jYXRpb24sIEZTIGZzKSB7CiAJCWxpdmVGaWxlID0gaW5kZXhMb2NhdGlvbjsKIAkJY2xlYXIoKTsKIAl9CkBAIC00MDMsNyArNDA0LDcgQEAKIAkJcmV0dXJuIG5ldyBEaXJDYWNoZUVkaXRvcih0aGlzLCBlbnRyeUNudCArIDE2KTsKIAl9CiAKLQl2b2lkIHJlcGxhY2UoZmluYWwgRGlyQ2FjaGVFbnRyeVtdIGUsIGZpbmFsIGludCBjbnQpIHsKKwl2b2lkIHJlcGxhY2UoRGlyQ2FjaGVFbnRyeVtdIGUsIGludCBjbnQpIHsKIAkJc29ydGVkRW50cmllcyA9IGU7CiAJCWVudHJ5Q250ID0gY250OwogCQl0cmVlID0gbnVsbDsKQEAgLTQyOSwxOCArNDMwLDEwIEBACiAJCWlmICghbGl2ZUZpbGUuZXhpc3RzKCkpCiAJCQljbGVhcigpOwogCQllbHNlIGlmIChzbmFwc2hvdCA9PSBudWxsIHx8IHNuYXBzaG90LmlzTW9kaWZpZWQobGl2ZUZpbGUpKSB7Ci0JCQl0cnkgewotCQkJCWZpbmFsIEZpbGVJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obGl2ZUZpbGUpOwotCQkJCXRyeSB7Ci0JCQkJCWNsZWFyKCk7Ci0JCQkJCXJlYWRGcm9tKGluU3RyZWFtKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQl0cnkgewotCQkJCQkJaW5TdHJlYW0uY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXJyMikgewotCQkJCQkJLy8gSWdub3JlIGFueSBjbG9zZSBmYWlsdXJlcy4KLQkJCQkJfQotCQkJCX0KKwkJCXRyeSAoU2lsZW50RmlsZUlucHV0U3RyZWFtIGluU3RyZWFtID0gbmV3IFNpbGVudEZpbGVJbnB1dFN0cmVhbSgKKwkJCQkJbGl2ZUZpbGUpKSB7CisJCQkJY2xlYXIoKTsKKwkJCQlyZWFkRnJvbShpblN0cmVhbSk7CiAJCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkgewogCQkJCWlmIChsaXZlRmlsZS5leGlzdHMoKSkgewogCQkJCQkvLyBQYW5pYzogdGhlIGluZGV4IGZpbGUgZXhpc3RzIGJ1dCB3ZSBjYW4ndCByZWFkIGl0CkBAIC00ODAsNyArNDczLDcgQEAKIAkJcmVhZEluZGV4Q2hlY2tzdW0gPSBOT19DSEVDS1NVTTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgcmVhZEZyb20oZmluYWwgSW5wdXRTdHJlYW0gaW5TdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwKKwlwcml2YXRlIHZvaWQgcmVhZEZyb20oSW5wdXRTdHJlYW0gaW5TdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwKIAkJCUNvcnJ1cHRPYmplY3RFeGNlcHRpb24gewogCQlmaW5hbCBCdWZmZXJlZElucHV0U3RyZWFtIGluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oaW5TdHJlYW0pOwogCQlmaW5hbCBNZXNzYWdlRGlnZXN0IG1kID0gQ29uc3RhbnRzLm5ld01lc3NhZ2VEaWdlc3QoKTsKQEAgLTU4OCwxMiArNTgxLDExIEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0RXh0ZW5zaW9uTmFtZShmaW5hbCBieXRlW10gaGRyKQotCQkJdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotCQlyZXR1cm4gIiciICsgbmV3IFN0cmluZyhoZHIsIDAsIDQsICJJU08tODg1OS0xIikgKyAiJyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdEV4dGVuc2lvbk5hbWUoYnl0ZVtdIGhkcikgeworCQlyZXR1cm4gIiciICsgbmV3IFN0cmluZyhoZHIsIDAsIDQsIElTT184ODU5XzEpICsgIiciOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzX0RJUkMoZmluYWwgYnl0ZVtdIGhkcikgeworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNfRElSQyhieXRlW10gaGRyKSB7CiAJCWlmIChoZHIubGVuZ3RoIDwgU0lHX0RJUkMubGVuZ3RoKQogCQkJcmV0dXJuIGZhbHNlOwogCQlmb3IgKGludCBpID0gMDsgaSA8IFNJR19ESVJDLmxlbmd0aDsgaSsrKQpAQCAtNjU2LDcgKzY0OCw3IEBACiAJCX0KIAl9CiAKLQl2b2lkIHdyaXRlVG8oRmlsZSBkaXIsIGZpbmFsIE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwl2b2lkIHdyaXRlVG8oRmlsZSBkaXIsIE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgTWVzc2FnZURpZ2VzdCBmb290ID0gQ29uc3RhbnRzLm5ld01lc3NhZ2VEaWdlc3QoKTsKIAkJZmluYWwgRGlnZXN0T3V0cHV0U3RyZWFtIGRvcyA9IG5ldyBEaWdlc3RPdXRwdXRTdHJlYW0ob3MsIGZvb3QpOwogCkBAIC03MTAsNiArNzAyLDggQEAKIAkJfQogCiAJCWlmICh3cml0ZVRyZWUpIHsKKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIEV4cGxpY2l0bHkgY2xvc2VkIGluIHRyeSBibG9jaywgYW5kCisJCQkJCQkJCQkJCS8vIGRlc3Ryb3llZCBpbiBmaW5hbGx5CiAJCQlUZW1wb3JhcnlCdWZmZXIgYmIgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkxvY2FsRmlsZShkaXIsIDUgPDwgMjApOwogCQkJdHJ5IHsKIAkJCQl0cmVlLndyaXRlKHRtcCwgYmIpOwpAQCAtNzQzLDE2ICs3MzcsMTggQEAKIAkJZmluYWwgTG9ja0ZpbGUgdG1wID0gbXlMb2NrOwogCQlyZXF1aXJlTG9ja2VkKHRtcCk7CiAJCW15TG9jayA9IG51bGw7Ci0JCWlmICghdG1wLmNvbW1pdCgpKQorCQlpZiAoIXRtcC5jb21taXQoKSkgewogCQkJcmV0dXJuIGZhbHNlOworCQl9CiAJCXNuYXBzaG90ID0gdG1wLmdldENvbW1pdFNuYXBzaG90KCk7CiAJCWlmIChpbmRleENoYW5nZWRMaXN0ZW5lciAhPSBudWxsCi0JCQkJJiYgIUFycmF5cy5lcXVhbHMocmVhZEluZGV4Q2hlY2tzdW0sIHdyaXRlSW5kZXhDaGVja3N1bSkpCi0JCQlpbmRleENoYW5nZWRMaXN0ZW5lci5vbkluZGV4Q2hhbmdlZChuZXcgSW5kZXhDaGFuZ2VkRXZlbnQoKSk7CisJCQkJJiYgIUFycmF5cy5lcXVhbHMocmVhZEluZGV4Q2hlY2tzdW0sIHdyaXRlSW5kZXhDaGVja3N1bSkpIHsKKwkJCWluZGV4Q2hhbmdlZExpc3RlbmVyLm9uSW5kZXhDaGFuZ2VkKG5ldyBJbmRleENoYW5nZWRFdmVudCh0cnVlKSk7CisJCX0KIAkJcmV0dXJuIHRydWU7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHJlcXVpcmVMb2NrZWQoZmluYWwgTG9ja0ZpbGUgdG1wKSB7CisJcHJpdmF0ZSB2b2lkIHJlcXVpcmVMb2NrZWQoTG9ja0ZpbGUgdG1wKSB7CiAJCWlmIChsaXZlRmlsZSA9PSBudWxsKQogCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS5kaXJDYWNoZUlzTm90TG9ja2VkKTsKIAkJaWYgKHRtcCA9PSBudWxsKQpAQCAtNzgzLDcgKzc3OSw3IEBACiAJICogICAgICAgICB0aGUgaW5kZXg7IHBhc3MgdG8ge0BsaW5rICNnZXRFbnRyeShpbnQpfSB0byBvYnRhaW4gdGhlIGVudHJ5CiAJICogICAgICAgICBpbmZvcm1hdGlvbi4gSWYgJmx0OyAwIHRoZSBlbnRyeSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgaW5kZXguCiAJICovCi0JcHVibGljIGludCBmaW5kRW50cnkoZmluYWwgU3RyaW5nIHBhdGgpIHsKKwlwdWJsaWMgaW50IGZpbmRFbnRyeShTdHJpbmcgcGF0aCkgewogCQlmaW5hbCBieXRlW10gcCA9IENvbnN0YW50cy5lbmNvZGUocGF0aCk7CiAJCXJldHVybiBmaW5kRW50cnkocCwgcC5sZW5ndGgpOwogCX0KQEAgLTgzOSw3ICs4MzUsNyBAQAogCSAqICAgICAgICAgICAgZW50cnkgcG9zaXRpb24gb2YgdGhlIHBhdGggdGhhdCBzaG91bGQgYmUgc2tpcHBlZC4KIAkgKiBAcmV0dXJuIHBvc2l0aW9uIG9mIHRoZSBuZXh0IGVudHJ5IHdob3NlIHBhdGggaXMgYWZ0ZXIgdGhlIGlucHV0LgogCSAqLwotCXB1YmxpYyBpbnQgbmV4dEVudHJ5KGZpbmFsIGludCBwb3NpdGlvbikgeworCXB1YmxpYyBpbnQgbmV4dEVudHJ5KGludCBwb3NpdGlvbikgewogCQlEaXJDYWNoZUVudHJ5IGxhc3QgPSBzb3J0ZWRFbnRyaWVzW3Bvc2l0aW9uXTsKIAkJaW50IG5leHRJZHggPSBwb3NpdGlvbiArIDE7CiAJCXdoaWxlIChuZXh0SWR4IDwgZW50cnlDbnQpIHsKQEAgLTg1Miw3ICs4NDgsNyBAQAogCQlyZXR1cm4gbmV4dElkeDsKIAl9CiAKLQlpbnQgbmV4dEVudHJ5KGZpbmFsIGJ5dGVbXSBwLCBmaW5hbCBpbnQgcExlbiwgaW50IG5leHRJZHgpIHsKKwlpbnQgbmV4dEVudHJ5KGJ5dGVbXSBwLCBpbnQgcExlbiwgaW50IG5leHRJZHgpIHsKIAkJd2hpbGUgKG5leHRJZHggPCBlbnRyeUNudCkgewogCQkJZmluYWwgRGlyQ2FjaGVFbnRyeSBuZXh0ID0gc29ydGVkRW50cmllc1tuZXh0SWR4XTsKIAkJCWlmICghRGlyQ2FjaGVUcmVlLnBlcShwLCBuZXh0LnBhdGgsIHBMZW4pKQpAQCAtODg2LDcgKzg4Miw3IEBACiAJICogICAgICAgICAgICBwb3NpdGlvbiBvZiB0aGUgZW50cnkgdG8gZ2V0LgogCSAqIEByZXR1cm4gdGhlIGVudHJ5IGF0IHBvc2l0aW9uIDxjb2RlPmk8L2NvZGU+LgogCSAqLwotCXB1YmxpYyBEaXJDYWNoZUVudHJ5IGdldEVudHJ5KGZpbmFsIGludCBpKSB7CisJcHVibGljIERpckNhY2hlRW50cnkgZ2V0RW50cnkoaW50IGkpIHsKIAkJcmV0dXJuIHNvcnRlZEVudHJpZXNbaV07CiAJfQogCkBAIC04OTcsNyArODkzLDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBwYXRoIHRvIHNlYXJjaCBmb3IuCiAJICogQHJldHVybiB0aGUgZW50cnkgZm9yIHRoZSBnaXZlbiA8Y29kZT5wYXRoPC9jb2RlPi4KIAkgKi8KLQlwdWJsaWMgRGlyQ2FjaGVFbnRyeSBnZXRFbnRyeShmaW5hbCBTdHJpbmcgcGF0aCkgeworCXB1YmxpYyBEaXJDYWNoZUVudHJ5IGdldEVudHJ5KFN0cmluZyBwYXRoKSB7CiAJCWZpbmFsIGludCBpID0gZmluZEVudHJ5KHBhdGgpOwogCQlyZXR1cm4gaSA8IDAgPyBudWxsIDogc29ydGVkRW50cmllc1tpXTsKIAl9CkBAIC05NDYsNyArOTQyLDcgQEAKIAkgKiBAcmV0dXJuIHRoZSBjYWNoZSB0cmVlOyBudWxsIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgY2FjaGUgdHJlZSBhdmFpbGFibGUKIAkgKiAgICAgICAgIGFuZCA8Y29kZT5idWlsZDwvY29kZT4gd2FzIGZhbHNlLgogCSAqLwotCXB1YmxpYyBEaXJDYWNoZVRyZWUgZ2V0Q2FjaGVUcmVlKGZpbmFsIGJvb2xlYW4gYnVpbGQpIHsKKwlwdWJsaWMgRGlyQ2FjaGVUcmVlIGdldENhY2hlVHJlZShib29sZWFuIGJ1aWxkKSB7CiAJCWlmIChidWlsZCkgewogCQkJaWYgKHRyZWUgPT0gbnVsbCkKIAkJCQl0cmVlID0gbmV3IERpckNhY2hlVHJlZSgpOwpAQCAtOTcyLDcgKzk2OCw3IEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgYW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCB3cml0aW5nIHRvIHRoZSBvYmplY3Qgc3RvcmUuCiAJICovCi0JcHVibGljIE9iamVjdElkIHdyaXRlVHJlZShmaW5hbCBPYmplY3RJbnNlcnRlciBvdykKKwlwdWJsaWMgT2JqZWN0SWQgd3JpdGVUcmVlKE9iamVjdEluc2VydGVyIG93KQogCQkJdGhyb3dzIFVubWVyZ2VkUGF0aEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gZ2V0Q2FjaGVUcmVlKHRydWUpLndyaXRlVHJlZShzb3J0ZWRFbnRyaWVzLCAwLCAwLCBvdyk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUJ1aWxkSXRlcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVCdWlsZEl0ZXJhdG9yLmphdmEKaW5kZXggNmUzNjgyYS4uZTgwNTQ0ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUJ1aWxkSXRlcmF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlQnVpbGRJdGVyYXRvci5qYXZhCkBAIC05Niw3ICs5Niw3IEBACiAJICogICAgICAgICAgICB0aGUgY2FjaGUgYnVpbGRlciBmb3IgdGhlIGNhY2hlIHRvIHdhbGsuIFRoZSBjYWNoZSBtdXN0IGJlCiAJICogICAgICAgICAgICBhbHJlYWR5IGxvYWRlZCBpbnRvIG1lbW9yeS4KIAkgKi8KLQlwdWJsaWMgRGlyQ2FjaGVCdWlsZEl0ZXJhdG9yKGZpbmFsIERpckNhY2hlQnVpbGRlciBkY2IpIHsKKwlwdWJsaWMgRGlyQ2FjaGVCdWlsZEl0ZXJhdG9yKERpckNhY2hlQnVpbGRlciBkY2IpIHsKIAkJc3VwZXIoZGNiLmdldERpckNhY2hlKCkpOwogCQlidWlsZGVyID0gZGNiOwogCX0KQEAgLTEwOSw3ICsxMDksNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgQWJzdHJhY3RUcmVlSXRlcmF0b3IgY3JlYXRlU3VidHJlZUl0ZXJhdG9yKGZpbmFsIE9iamVjdFJlYWRlciByZWFkZXIpCisJcHVibGljIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGNyZWF0ZVN1YnRyZWVJdGVyYXRvcihPYmplY3RSZWFkZXIgcmVhZGVyKQogCQkJdGhyb3dzIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJaWYgKGN1cnJlbnRTdWJ0cmVlID09IG51bGwpCiAJCQl0aHJvdyBuZXcgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbihnZXRFbnRyeU9iamVjdElkKCksCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlQnVpbGRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUJ1aWxkZXIuamF2YQppbmRleCAyZmY3YmI5Li5jNWZmOWFjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlQnVpbGRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVCdWlsZGVyLmphdmEKQEAgLTgzLDcgKzgzLDcgQEAKIAkgKiAgICAgICAgICAgIGVzdGltYXRlZCBudW1iZXIgb2YgZW50cmllcyB0aGUgYnVpbGRlciB3aWxsIGhhdmUgdXBvbgogCSAqICAgICAgICAgICAgY29tcGxldGlvbi4gVGhpcyBzaXplcyB0aGUgaW5pdGlhbCBlbnRyeSB0YWJsZS4KIAkgKi8KLQlwcm90ZWN0ZWQgRGlyQ2FjaGVCdWlsZGVyKGZpbmFsIERpckNhY2hlIGRjLCBmaW5hbCBpbnQgZWNudCkgeworCXByb3RlY3RlZCBEaXJDYWNoZUJ1aWxkZXIoRGlyQ2FjaGUgZGMsIGludCBlY250KSB7CiAJCXN1cGVyKGRjLCBlY250KTsKIAl9CiAKQEAgLTEwMiw3ICsxMDIsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIElmIHRoZSBGaWxlTW9kZSBvZiB0aGUgZW50cnkgd2FzIG5vdCBzZXQgYnkgdGhlIGNhbGxlci4KIAkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoZmluYWwgRGlyQ2FjaGVFbnRyeSBuZXdFbnRyeSkgeworCXB1YmxpYyB2b2lkIGFkZChEaXJDYWNoZUVudHJ5IG5ld0VudHJ5KSB7CiAJCWlmIChuZXdFbnRyeS5nZXRSYXdNb2RlKCkgPT0gMCkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCiAJCQkJCUpHaXRUZXh0LmdldCgpLmZpbGVNb2RlTm90U2V0Rm9yUGF0aCwKQEAgLTEzMSw3ICsxMzEsNyBAQAogCSAqIEBwYXJhbSBjbnQKIAkgKiAgICAgICAgICAgIG51bWJlciBvZiBlbnRyaWVzIHRvIGNvcHkuCiAJICovCi0JcHVibGljIHZvaWQga2VlcChmaW5hbCBpbnQgcG9zLCBpbnQgY250KSB7CisJcHVibGljIHZvaWQga2VlcChpbnQgcG9zLCBpbnQgY250KSB7CiAJCWJlZm9yZUFkZChjYWNoZS5nZXRFbnRyeShwb3MpKTsKIAkJZmFzdEtlZXAocG9zLCBjbnQpOwogCX0KQEAgLTIyNyw3ICsyMjcsNyBAQAogCQlyZXBsYWNlKCk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGJlZm9yZUFkZChmaW5hbCBEaXJDYWNoZUVudHJ5IG5ld0VudHJ5KSB7CisJcHJpdmF0ZSB2b2lkIGJlZm9yZUFkZChEaXJDYWNoZUVudHJ5IG5ld0VudHJ5KSB7CiAJCWlmIChzb3J0ZWQgJiYgZW50cnlDbnQgPiAwKSB7CiAJCQlmaW5hbCBEaXJDYWNoZUVudHJ5IGxhc3RFbnRyeSA9IGVudHJpZXNbZW50cnlDbnQgLSAxXTsKIAkJCWZpbmFsIGludCBjciA9IERpckNhY2hlLmNtcChsYXN0RW50cnksIG5ld0VudHJ5KTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVFZGl0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVFZGl0b3IuamF2YQppbmRleCAzMGUzYTNjLi43NGJhOTdmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlRWRpdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUVkaXRvci5qYXZhCkBAIC03Nyw3ICs3Nyw3IEBACiBwdWJsaWMgY2xhc3MgRGlyQ2FjaGVFZGl0b3IgZXh0ZW5kcyBCYXNlRGlyQ2FjaGVFZGl0b3IgewogCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8UGF0aEVkaXQ+IEVESVRfQ01QID0gbmV3IENvbXBhcmF0b3I8UGF0aEVkaXQ+KCkgewogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGludCBjb21wYXJlKGZpbmFsIFBhdGhFZGl0IG8xLCBmaW5hbCBQYXRoRWRpdCBvMikgeworCQlwdWJsaWMgaW50IGNvbXBhcmUoUGF0aEVkaXQgbzEsIFBhdGhFZGl0IG8yKSB7CiAJCQlmaW5hbCBieXRlW10gYSA9IG8xLnBhdGg7CiAJCQlmaW5hbCBieXRlW10gYiA9IG8yLnBhdGg7CiAJCQlyZXR1cm4gY21wKGEsIGEubGVuZ3RoLCBiLCBiLmxlbmd0aCk7CkBAIC05Niw3ICs5Niw3IEBACiAJICogICAgICAgICAgICBlc3RpbWF0ZWQgbnVtYmVyIG9mIGVudHJpZXMgdGhlIGVkaXRvciB3aWxsIGhhdmUgdXBvbgogCSAqICAgICAgICAgICAgY29tcGxldGlvbi4gVGhpcyBzaXplcyB0aGUgaW5pdGlhbCBlbnRyeSB0YWJsZS4KIAkgKi8KLQlwcm90ZWN0ZWQgRGlyQ2FjaGVFZGl0b3IoZmluYWwgRGlyQ2FjaGUgZGMsIGZpbmFsIGludCBlY250KSB7CisJcHJvdGVjdGVkIERpckNhY2hlRWRpdG9yKERpckNhY2hlIGRjLCBpbnQgZWNudCkgewogCQlzdXBlcihkYywgZWNudCk7CiAJCWVkaXRzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJfQpAQCAtMTExLDcgKzExMSw3IEBACiAJICogQHBhcmFtIGVkaXQKIAkgKiAgICAgICAgICAgIGFub3RoZXIgZWRpdCBjb21tYW5kLgogCSAqLwotCXB1YmxpYyB2b2lkIGFkZChmaW5hbCBQYXRoRWRpdCBlZGl0KSB7CisJcHVibGljIHZvaWQgYWRkKFBhdGhFZGl0IGVkaXQpIHsKIAkJZWRpdHMuYWRkKGVkaXQpOwogCX0KIApAQCAtMzA0LDcgKzMwNCw3IEBACiAJCSAqIEBwYXJhbSBlbnRyeVBhdGgKIAkJICogICAgICAgICAgICBwYXRoIG9mIHRoZSBmaWxlIHdpdGhpbiB0aGUgcmVwb3NpdG9yeS4KIAkJICovCi0JCXB1YmxpYyBQYXRoRWRpdChmaW5hbCBTdHJpbmcgZW50cnlQYXRoKSB7CisJCXB1YmxpYyBQYXRoRWRpdChTdHJpbmcgZW50cnlQYXRoKSB7CiAJCQlwYXRoID0gQ29uc3RhbnRzLmVuY29kZShlbnRyeVBhdGgpOwogCQl9CiAKQEAgLTMxOSw3ICszMTksNyBAQAogCQkgKiAgICAgICAgICAgIGVudHJ5IGluc3RhbmNlIHRvIG1hdGNoIHBhdGggb2YuIE9ubHkgdGhlIHBhdGggb2YgdGhpcwogCQkgKiAgICAgICAgICAgIGVudHJ5IGlzIGFjdHVhbGx5IGNvbnNpZGVyZWQgZHVyaW5nIGNvbW1hbmQgZXZhbHVhdGlvbi4KIAkJICovCi0JCXB1YmxpYyBQYXRoRWRpdChmaW5hbCBEaXJDYWNoZUVudHJ5IGVudCkgeworCQlwdWJsaWMgUGF0aEVkaXQoRGlyQ2FjaGVFbnRyeSBlbnQpIHsKIAkJCXBhdGggPSBlbnQucGF0aDsKIAkJfQogCkBAIC0zNzQsNyArMzc0LDcgQEAKIAkJICogQHBhcmFtIGVudHJ5UGF0aAogCQkgKiAgICAgICAgICAgIHBhdGggb2YgdGhlIGZpbGUgd2l0aGluIHRoZSByZXBvc2l0b3J5LgogCQkgKi8KLQkJcHVibGljIERlbGV0ZVBhdGgoZmluYWwgU3RyaW5nIGVudHJ5UGF0aCkgeworCQlwdWJsaWMgRGVsZXRlUGF0aChTdHJpbmcgZW50cnlQYXRoKSB7CiAJCQlzdXBlcihlbnRyeVBhdGgpOwogCQl9CiAKQEAgLTM4NSwxMiArMzg1LDEyIEBACiAJCSAqICAgICAgICAgICAgZW50cnkgaW5zdGFuY2UgdG8gcmVtb3ZlLiBPbmx5IHRoZSBwYXRoIG9mIHRoaXMgZW50cnkgaXMKIAkJICogICAgICAgICAgICBhY3R1YWxseSBjb25zaWRlcmVkIGR1cmluZyBjb21tYW5kIGV2YWx1YXRpb24uCiAJCSAqLwotCQlwdWJsaWMgRGVsZXRlUGF0aChmaW5hbCBEaXJDYWNoZUVudHJ5IGVudCkgeworCQlwdWJsaWMgRGVsZXRlUGF0aChEaXJDYWNoZUVudHJ5IGVudCkgewogCQkJc3VwZXIoZW50KTsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBhcHBseShmaW5hbCBEaXJDYWNoZUVudHJ5IGVudCkgeworCQlwdWJsaWMgdm9pZCBhcHBseShEaXJDYWNoZUVudHJ5IGVudCkgewogCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLm5vQXBwbHlJbkRlbGV0ZSk7CiAJCX0KIAl9CkBAIC00NDAsNyArNDQwLDcgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBhcHBseShmaW5hbCBEaXJDYWNoZUVudHJ5IGVudCkgeworCQlwdWJsaWMgdm9pZCBhcHBseShEaXJDYWNoZUVudHJ5IGVudCkgewogCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLm5vQXBwbHlJbkRlbGV0ZSk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlRW50cnkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVFbnRyeS5qYXZhCmluZGV4IDdjMDNjNjQuLmZlZTlmNTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVFbnRyeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVFbnRyeS5qYXZhCkBAIC0yMjcsNyArMjI3LDcgQEAKIAkgKiAgICAgICAgICAgICAiXDAiLiBUaGVzZSBzZXF1ZW5jZXMgYXJlIG5vdCBwZXJtaXR0ZWQgaW4gYSBnaXQgdHJlZSBvYmplY3QKIAkgKiAgICAgICAgICAgICBvciBEaXJDYWNoZSBmaWxlLgogCSAqLwotCXB1YmxpYyBEaXJDYWNoZUVudHJ5KGZpbmFsIFN0cmluZyBuZXdQYXRoKSB7CisJcHVibGljIERpckNhY2hlRW50cnkoU3RyaW5nIG5ld1BhdGgpIHsKIAkJdGhpcyhDb25zdGFudHMuZW5jb2RlKG5ld1BhdGgpLCBTVEFHRV8wKTsKIAl9CiAKQEAgLTI0NCw3ICsyNDQsNyBAQAogCSAqICAgICAgICAgICAgIG9yIERpckNhY2hlIGZpbGUuICBPciBpZiB7QGNvZGUgc3RhZ2V9IGlzIG91dHNpZGUgb2YgdGhlCiAJICogICAgICAgICAgICAgcmFuZ2UgMC4uMywgaW5jbHVzaXZlLgogCSAqLwotCXB1YmxpYyBEaXJDYWNoZUVudHJ5KGZpbmFsIFN0cmluZyBuZXdQYXRoLCBmaW5hbCBpbnQgc3RhZ2UpIHsKKwlwdWJsaWMgRGlyQ2FjaGVFbnRyeShTdHJpbmcgbmV3UGF0aCwgaW50IHN0YWdlKSB7CiAJCXRoaXMoQ29uc3RhbnRzLmVuY29kZShuZXdQYXRoKSwgc3RhZ2UpOwogCX0KIApAQCAtMjU4LDcgKzI1OCw3IEBACiAJICogICAgICAgICAgICAgIlwwIi4gVGhlc2Ugc2VxdWVuY2VzIGFyZSBub3QgcGVybWl0dGVkIGluIGEgZ2l0IHRyZWUgb2JqZWN0CiAJICogICAgICAgICAgICAgb3IgRGlyQ2FjaGUgZmlsZS4KIAkgKi8KLQlwdWJsaWMgRGlyQ2FjaGVFbnRyeShmaW5hbCBieXRlW10gbmV3UGF0aCkgeworCXB1YmxpYyBEaXJDYWNoZUVudHJ5KGJ5dGVbXSBuZXdQYXRoKSB7CiAJCXRoaXMobmV3UGF0aCwgU1RBR0VfMCk7CiAJfQogCkBAIC0yNzYsNyArMjc2LDcgQEAKIAkgKiAgICAgICAgICAgICByYW5nZSAwLi4zLCBpbmNsdXNpdmUuCiAJICovCiAJQFN1cHByZXNzV2FybmluZ3MoImJveGluZyIpCi0JcHVibGljIERpckNhY2hlRW50cnkoYnl0ZVtdIHBhdGgsIGZpbmFsIGludCBzdGFnZSkgeworCXB1YmxpYyBEaXJDYWNoZUVudHJ5KGJ5dGVbXSBwYXRoLCBpbnQgc3RhZ2UpIHsKIAkJY2hlY2tQYXRoKHBhdGgpOwogCQlpZiAoc3RhZ2UgPCAwIHx8IDMgPCBzdGFnZSkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCkBAIC0zMTIsNyArMzEyLDcgQEAKIAkJU3lzdGVtLmFycmF5Y29weShzcmMuaW5mbywgc3JjLmluZm9PZmZzZXQsIGluZm8sIDAsIElORk9fTEVOKTsKIAl9CiAKLQl2b2lkIHdyaXRlKGZpbmFsIE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwl2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgaW50IGxlbiA9IGlzRXh0ZW5kZWQoKSA/IElORk9fTEVOX0VYVEVOREVEIDogSU5GT19MRU47CiAJCWZpbmFsIGludCBwYXRoTGVuID0gcGF0aC5sZW5ndGg7CiAJCW9zLndyaXRlKGluZm8sIGluZm9PZmZzZXQsIGxlbik7CkBAIC0zNDMsNyArMzQzLDcgQEAKIAkgKiAgICAgICAgICAgIG5hbm9zZWNvbmRzIGNvbXBvbmVudCBvZiB0aGUgaW5kZXgncyBsYXN0IG1vZGlmaWVkIHRpbWUuCiAJICogQHJldHVybiB0cnVlIGlmIGV4dHJhIGNhcmVmdWwgY2hlY2tzIHNob3VsZCBiZSB1c2VkLgogCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIG1pZ2h0QmVSYWNpbHlDbGVhbihmaW5hbCBpbnQgc211ZGdlX3MsIGZpbmFsIGludCBzbXVkZ2VfbnMpIHsKKwlwdWJsaWMgZmluYWwgYm9vbGVhbiBtaWdodEJlUmFjaWx5Q2xlYW4oaW50IHNtdWRnZV9zLCBpbnQgc211ZGdlX25zKSB7CiAJCS8vIElmIHRoZSBpbmRleCBoYXMgYSBtb2RpZmljYXRpb24gdGltZSB0aGVuIGl0IGNhbWUgZnJvbSBkaXNrCiAJCS8vIGFuZCB3YXMgbm90IGdlbmVyYXRlZCBmcm9tIHNjcmF0Y2ggaW4gbWVtb3J5LiBJbiBzdWNoIGNhc2VzCiAJCS8vIHRoZSBlbnRyeSBpcyAncmFjaWx5IGNsZWFuJyBpZiB0aGUgZW50cnkncyBjYWNoZWQgbW9kaWZpY2F0aW9uCkBAIC00MjAsNyArNDIwLDcgQEAKIAkgKiAgICAgICAgICAgIHRydWUgdG8gaWdub3JlIGFwcGFyZW50IG1vZGlmaWNhdGlvbnM7IGZhbHNlIHRvIGxvb2sgYXQgbGFzdAogCSAqICAgICAgICAgICAgbW9kaWZpZWQgdG8gZGV0ZWN0IGZpbGUgbW9kaWZpY2F0aW9ucy4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBc3N1bWVWYWxpZChmaW5hbCBib29sZWFuIGFzc3VtZSkgeworCXB1YmxpYyB2b2lkIHNldEFzc3VtZVZhbGlkKGJvb2xlYW4gYXNzdW1lKSB7CiAJCWlmIChhc3N1bWUpCiAJCQlpbmZvW2luZm9PZmZzZXQgKyBQX0ZMQUdTXSB8PSBBU1NVTUVfVkFMSUQ7CiAJCWVsc2UKQEAgLTUxOCw3ICs1MTgsNyBAQAogCSAqICAgICAgICAgICAgIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5GaWxlTW9kZSNUUkVFfSwgb3IgYW55IG90aGVyIHR5cGUKIAkgKiAgICAgICAgICAgICBjb2RlIG5vdCBwZXJtaXR0ZWQgaW4gYSB0cmVlIG9iamVjdC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWxlTW9kZShmaW5hbCBGaWxlTW9kZSBtb2RlKSB7CisJcHVibGljIHZvaWQgc2V0RmlsZU1vZGUoRmlsZU1vZGUgbW9kZSkgewogCQlzd2l0Y2ggKG1vZGUuZ2V0Qml0cygpICYgRmlsZU1vZGUuVFlQRV9NQVNLKSB7CiAJCWNhc2UgRmlsZU1vZGUuVFlQRV9NSVNTSU5HOgogCQljYXNlIEZpbGVNb2RlLlRZUEVfVFJFRToKQEAgLTU0OCw3ICs1NDgsNyBAQAogCSAqIEBwYXJhbSB3aGVuCiAJICogICAgICAgICAgICBuZXcgY2FjaGVkIGNyZWF0aW9uIHRpbWUgb2YgdGhlIGZpbGUsIGluIG1pbGxpc2Vjb25kcy4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDcmVhdGlvblRpbWUoZmluYWwgbG9uZyB3aGVuKSB7CisJcHVibGljIHZvaWQgc2V0Q3JlYXRpb25UaW1lKGxvbmcgd2hlbikgewogCQllbmNvZGVUUyhQX0NUSU1FLCB3aGVuKTsKIAl9CiAKQEAgLTU3Miw3ICs1NzIsNyBAQAogCSAqIEBwYXJhbSB3aGVuCiAJICogICAgICAgICAgICBuZXcgY2FjaGVkIG1vZGlmaWNhdGlvbiBkYXRlIG9mIHRoZSBmaWxlLCBpbiBtaWxsaXNlY29uZHMuCiAJICovCi0JcHVibGljIHZvaWQgc2V0TGFzdE1vZGlmaWVkKGZpbmFsIGxvbmcgd2hlbikgeworCXB1YmxpYyB2b2lkIHNldExhc3RNb2RpZmllZChsb25nIHdoZW4pIHsKIAkJZW5jb2RlVFMoUF9NVElNRSwgd2hlbik7CiAJfQogCkBAIC02MDQsNyArNjA0LDcgQEAKIAkgKiAgICAgICAgICAgIG5ldyBjYWNoZWQgc2l6ZSBvZiB0aGUgZmlsZSwgYXMgYnl0ZXMuIElmIHRoZSBmaWxlIGlzIGxhcmdlcgogCSAqICAgICAgICAgICAgdGhhbiAyRywgY2FzdCBpdCB0byAoaW50KSBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZW5ndGgoZmluYWwgaW50IHN6KSB7CisJcHVibGljIHZvaWQgc2V0TGVuZ3RoKGludCBzeikgewogCQlOQi5lbmNvZGVJbnQzMihpbmZvLCBpbmZvT2Zmc2V0ICsgUF9TSVpFLCBzeik7CiAJfQogCkBAIC02MTQsNyArNjE0LDcgQEAKIAkgKiBAcGFyYW0gc3oKIAkgKiAgICAgICAgICAgIG5ldyBjYWNoZWQgc2l6ZSBvZiB0aGUgZmlsZSwgYXMgYnl0ZXMuCiAJICovCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKGZpbmFsIGxvbmcgc3opIHsKKwlwdWJsaWMgdm9pZCBzZXRMZW5ndGgobG9uZyBzeikgewogCQlzZXRMZW5ndGgoKGludCkgc3opOwogCX0KIApAQCAtNjM4LDcgKzYzOCw3IEBACiAJICogICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQjemVyb0lkKCl9IHRvIHJlbW92ZSB0aGUKIAkgKiAgICAgICAgICAgIGN1cnJlbnQgaWRlbnRpZmllci4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3RJZChmaW5hbCBBbnlPYmplY3RJZCBpZCkgeworCXB1YmxpYyB2b2lkIHNldE9iamVjdElkKEFueU9iamVjdElkIGlkKSB7CiAJCWlkLmNvcHlSYXdUbyhpZEJ1ZmZlcigpLCBpZE9mZnNldCgpKTsKIAl9CiAKQEAgLTY1MSw3ICs2NTEsNyBAQAogCSAqIEBwYXJhbSBwCiAJICogICAgICAgICAgICBwb3NpdGlvbiB0byByZWFkIHRoZSBmaXJzdCBieXRlIG9mIGRhdGEgZnJvbS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3RJZEZyb21SYXcoZmluYWwgYnl0ZVtdIGJzLCBmaW5hbCBpbnQgcCkgeworCXB1YmxpYyB2b2lkIHNldE9iamVjdElkRnJvbVJhdyhieXRlW10gYnMsIGludCBwKSB7CiAJCWZpbmFsIGludCBuID0gQ29uc3RhbnRzLk9CSkVDVF9JRF9MRU5HVEg7CiAJCVN5c3RlbS5hcnJheWNvcHkoYnMsIHAsIGlkQnVmZmVyKCksIGlkT2Zmc2V0KCksIG4pOwogCX0KQEAgLTcwNCw3ICs3MDQsNyBAQAogCSAqIEBwYXJhbSBzcmMKIAkgKiAgICAgICAgICAgIHRoZSBlbnRyeSB0byBjb3B5IE9iamVjdElkIGFuZCBtZXRhIGZpZWxkcyBmcm9tLgogCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlNZXRhRGF0YShmaW5hbCBEaXJDYWNoZUVudHJ5IHNyYykgeworCXB1YmxpYyB2b2lkIGNvcHlNZXRhRGF0YShEaXJDYWNoZUVudHJ5IHNyYykgewogCQljb3B5TWV0YURhdGEoc3JjLCBmYWxzZSk7CiAJfQogCkBAIC03MTksNyArNzE5LDcgQEAKIAkgKiBAcGFyYW0ga2VlcFN0YWdlCiAJICogICAgICAgICAgICBpZiB0cnVlLCB0aGUgc3RhZ2UgYXR0cmlidXRlIHdpbGwgbm90IGJlIGNvcGllZAogCSAqLwotCXZvaWQgY29weU1ldGFEYXRhKGZpbmFsIERpckNhY2hlRW50cnkgc3JjLCBib29sZWFuIGtlZXBTdGFnZSkgeworCXZvaWQgY29weU1ldGFEYXRhKERpckNhY2hlRW50cnkgc3JjLCBib29sZWFuIGtlZXBTdGFnZSkgewogCQlpbnQgb3JpZ2ZsYWdzID0gTkIuZGVjb2RlVUludDE2KGluZm8sIGluZm9PZmZzZXQgKyBQX0ZMQUdTKTsKIAkJaW50IG5ld2ZsYWdzID0gTkIuZGVjb2RlVUludDE2KHNyYy5pbmZvLCBzcmMuaW5mb09mZnNldCArIFBfRkxBR1MpOwogCQlTeXN0ZW0uYXJyYXljb3B5KHNyYy5pbmZvLCBzcmMuaW5mb09mZnNldCwgaW5mbywgaW5mb09mZnNldCwgSU5GT19MRU4pOwpAQCAtNzQxLDE0ICs3NDEsMTQgQEAKIAkJcmV0dXJuIChpbmZvW2luZm9PZmZzZXQgKyBQX0ZMQUdTXSAmIEVYVEVOREVEKSAhPSAwOwogCX0KIAotCXByaXZhdGUgbG9uZyBkZWNvZGVUUyhmaW5hbCBpbnQgcElkeCkgeworCXByaXZhdGUgbG9uZyBkZWNvZGVUUyhpbnQgcElkeCkgewogCQlmaW5hbCBpbnQgYmFzZSA9IGluZm9PZmZzZXQgKyBwSWR4OwogCQlmaW5hbCBpbnQgc2VjID0gTkIuZGVjb2RlSW50MzIoaW5mbywgYmFzZSk7CiAJCWZpbmFsIGludCBtcyA9IE5CLmRlY29kZUludDMyKGluZm8sIGJhc2UgKyA0KSAvIDEwMDAwMDA7CiAJCXJldHVybiAxMDAwTCAqIHNlYyArIG1zOwogCX0KIAotCXByaXZhdGUgdm9pZCBlbmNvZGVUUyhmaW5hbCBpbnQgcElkeCwgZmluYWwgbG9uZyB3aGVuKSB7CisJcHJpdmF0ZSB2b2lkIGVuY29kZVRTKGludCBwSWR4LCBsb25nIHdoZW4pIHsKIAkJZmluYWwgaW50IGJhc2UgPSBpbmZvT2Zmc2V0ICsgcElkeDsKIAkJTkIuZW5jb2RlSW50MzIoaW5mbywgYmFzZSwgKGludCkgKHdoZW4gLyAxMDAwKSk7CiAJCU5CLmVuY29kZUludDMyKGluZm8sIGJhc2UgKyA0LCAoKGludCkgKHdoZW4gJSAxMDAwKSkgKiAxMDAwMDAwKTsKQEAgLTc3MSw3ICs3NzEsNyBAQAogCQl9CiAJfQogCi0Jc3RhdGljIFN0cmluZyB0b1N0cmluZyhmaW5hbCBieXRlW10gcGF0aCkgeworCXN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoYnl0ZVtdIHBhdGgpIHsKIAkJcmV0dXJuIENvbnN0YW50cy5DSEFSU0VULmRlY29kZShCeXRlQnVmZmVyLndyYXAocGF0aCkpLnRvU3RyaW5nKCk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlSXRlcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVJdGVyYXRvci5qYXZhCmluZGV4IGQ3NjgyMTYuLjE5YzkxNmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVJdGVyYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVJdGVyYXRvci5qYXZhCkBAIC0xMTQsNyArMTE0LDcgQEAKIAkgKiBAcGFyYW0gZGMKIAkgKiAgICAgICAgICAgIHRoZSBjYWNoZSB0byB3YWxrLiBJdCBtdXN0IGJlIGFscmVhZHkgbG9hZGVkIGludG8gbWVtb3J5LgogCSAqLwotCXB1YmxpYyBEaXJDYWNoZUl0ZXJhdG9yKGZpbmFsIERpckNhY2hlIGRjKSB7CisJcHVibGljIERpckNhY2hlSXRlcmF0b3IoRGlyQ2FjaGUgZGMpIHsKIAkJY2FjaGUgPSBkYzsKIAkJdHJlZSA9IGRjLmdldENhY2hlVHJlZSh0cnVlKTsKIAkJdHJlZVN0YXJ0ID0gMDsKQEAgLTEyNCw3ICsxMjQsNyBAQAogCQkJcGFyc2VFbnRyeSgpOwogCX0KIAotCURpckNhY2hlSXRlcmF0b3IoZmluYWwgRGlyQ2FjaGVJdGVyYXRvciBwLCBmaW5hbCBEaXJDYWNoZVRyZWUgZGN0KSB7CisJRGlyQ2FjaGVJdGVyYXRvcihEaXJDYWNoZUl0ZXJhdG9yIHAsIERpckNhY2hlVHJlZSBkY3QpIHsKIAkJc3VwZXIocCwgcC5wYXRoLCBwLnBhdGhMZW4gKyAxKTsKIAkJY2FjaGUgPSBwLmNhY2hlOwogCQl0cmVlID0gZGN0OwpAQCAtMTM3LDcgKzEzNyw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBBYnN0cmFjdFRyZWVJdGVyYXRvciBjcmVhdGVTdWJ0cmVlSXRlcmF0b3IoZmluYWwgT2JqZWN0UmVhZGVyIHJlYWRlcikKKwlwdWJsaWMgQWJzdHJhY3RUcmVlSXRlcmF0b3IgY3JlYXRlU3VidHJlZUl0ZXJhdG9yKE9iamVjdFJlYWRlciByZWFkZXIpCiAJCQl0aHJvd3MgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlpZiAoY3VycmVudFN1YnRyZWUgPT0gbnVsbCkKIAkJCXRocm93IG5ldyBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uKGdldEVudHJ5T2JqZWN0SWQoKSwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVUcmVlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlVHJlZS5qYXZhCmluZGV4IGRjODI1ZDQuLmI2MDVmM2MgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVUcmVlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZVRyZWUuamF2YQpAQCAtODIsNyArODIsNyBAQAogCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxEaXJDYWNoZVRyZWU+IFRSRUVfQ01QID0gbmV3IENvbXBhcmF0b3I8RGlyQ2FjaGVUcmVlPigpIHsKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBpbnQgY29tcGFyZShmaW5hbCBEaXJDYWNoZVRyZWUgbzEsIGZpbmFsIERpckNhY2hlVHJlZSBvMikgeworCQlwdWJsaWMgaW50IGNvbXBhcmUoRGlyQ2FjaGVUcmVlIG8xLCBEaXJDYWNoZVRyZWUgbzIpIHsKIAkJCWZpbmFsIGJ5dGVbXSBhID0gbzEuZW5jb2RlZE5hbWU7CiAJCQlmaW5hbCBieXRlW10gYiA9IG8yLmVuY29kZWROYW1lOwogCQkJZmluYWwgaW50IGFMZW4gPSBhLmxlbmd0aDsKQEAgLTE4NSw3ICsxODUsNyBAQAogCQljaGlsZENudCA9IHN1YmNudDsKIAl9CiAKLQl2b2lkIHdyaXRlKGZpbmFsIGJ5dGVbXSB0bXAsIGZpbmFsIE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwl2b2lkIHdyaXRlKGJ5dGVbXSB0bXAsIE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaW50IHB0ciA9IHRtcC5sZW5ndGg7CiAJCXRtcFstLXB0cl0gPSAnXG4nOwogCQlwdHIgPSBSYXdQYXJzZVV0aWxzLmZvcm1hdEJhc2UxMCh0bXAsIHB0ciwgY2hpbGRDbnQpOwpAQCAtMjQ4LDcgKzI0OCw3IEBACiAJICogICAgICAgICAgICBpbmRleCBvZiB0aGUgY2hpbGQgdG8gb2J0YWluLgogCSAqIEByZXR1cm4gdGhlIGNoaWxkIHRyZWUuCiAJICovCi0JcHVibGljIERpckNhY2hlVHJlZSBnZXRDaGlsZChmaW5hbCBpbnQgaSkgeworCXB1YmxpYyBEaXJDYWNoZVRyZWUgZ2V0Q2hpbGQoaW50IGkpIHsKIAkJcmV0dXJuIGNoaWxkcmVuW2ldOwogCX0KIApAQCAtMzg5LDcgKzM4OSw3IEBACiAJCXJldHVybiBzaXplOwogCX0KIAotCXByaXZhdGUgdm9pZCBhcHBlbmROYW1lKGZpbmFsIFN0cmluZ0J1aWxkZXIgcikgeworCXByaXZhdGUgdm9pZCBhcHBlbmROYW1lKFN0cmluZ0J1aWxkZXIgcikgewogCQlpZiAocGFyZW50ICE9IG51bGwpIHsKIAkJCXBhcmVudC5hcHBlbmROYW1lKHIpOwogCQkJci5hcHBlbmQoZ2V0TmFtZVN0cmluZygpKTsKQEAgLTQwNCw3ICs0MDQsNyBAQAogCQlyZXR1cm4gZW5jb2RlZE5hbWUubGVuZ3RoOwogCX0KIAotCWZpbmFsIGJvb2xlYW4gY29udGFpbnMoZmluYWwgYnl0ZVtdIGEsIGludCBhT2ZmLCBmaW5hbCBpbnQgYUxlbikgeworCWZpbmFsIGJvb2xlYW4gY29udGFpbnMoYnl0ZVtdIGEsIGludCBhT2ZmLCBpbnQgYUxlbikgewogCQlmaW5hbCBieXRlW10gZSA9IGVuY29kZWROYW1lOwogCQlmaW5hbCBpbnQgZUxlbiA9IGUubGVuZ3RoOwogCQlmb3IgKGludCBlT2ZmID0gMDsgZU9mZiA8IGVMZW4gJiYgYU9mZiA8IGFMZW47IGVPZmYrKywgYU9mZisrKQpAQCAtNTAzLDcgKzUwMyw3IEBACiAJCQlyZW1vdmVDaGlsZChjaGlsZENudCAtIDEpOwogCX0KIAotCXByaXZhdGUgdm9pZCBpbnNlcnRDaGlsZChmaW5hbCBpbnQgc3RJZHgsIGZpbmFsIERpckNhY2hlVHJlZSBzdCkgeworCXByaXZhdGUgdm9pZCBpbnNlcnRDaGlsZChpbnQgc3RJZHgsIERpckNhY2hlVHJlZSBzdCkgewogCQlmaW5hbCBEaXJDYWNoZVRyZWVbXSBjID0gY2hpbGRyZW47CiAJCWlmIChjaGlsZENudCArIDEgPD0gYy5sZW5ndGgpIHsKIAkJCWlmIChzdElkeCA8IGNoaWxkQ250KQpAQCAtNTI0LDE0ICs1MjQsMTQgQEAKIAkJY2hpbGRDbnQrKzsKIAl9CiAKLQlwcml2YXRlIHZvaWQgcmVtb3ZlQ2hpbGQoZmluYWwgaW50IHN0SWR4KSB7CisJcHJpdmF0ZSB2b2lkIHJlbW92ZUNoaWxkKGludCBzdElkeCkgewogCQlmaW5hbCBpbnQgbiA9IC0tY2hpbGRDbnQ7CiAJCWlmIChzdElkeCA8IG4pCiAJCQlTeXN0ZW0uYXJyYXljb3B5KGNoaWxkcmVuLCBzdElkeCArIDEsIGNoaWxkcmVuLCBzdElkeCwgbiAtIHN0SWR4KTsKIAkJY2hpbGRyZW5bbl0gPSBudWxsOwogCX0KIAotCXN0YXRpYyBib29sZWFuIHBlcShmaW5hbCBieXRlW10gYSwgZmluYWwgYnl0ZVtdIGIsIGludCBhTGVuKSB7CisJc3RhdGljIGJvb2xlYW4gcGVxKGJ5dGVbXSBhLCBieXRlW10gYiwgaW50IGFMZW4pIHsKIAkJaWYgKGIubGVuZ3RoIDwgYUxlbikKIAkJCXJldHVybiBmYWxzZTsKIAkJZm9yIChhTGVuLS07IGFMZW4gPj0gMDsgYUxlbi0tKQpAQCAtNTQwLDcgKzU0MCw3IEBACiAJCXJldHVybiB0cnVlOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGludCBuYW1lY21wKGZpbmFsIGJ5dGVbXSBhLCBpbnQgYVBvcywgZmluYWwgRGlyQ2FjaGVUcmVlIGN0KSB7CisJcHJpdmF0ZSBzdGF0aWMgaW50IG5hbWVjbXAoYnl0ZVtdIGEsIGludCBhUG9zLCBEaXJDYWNoZVRyZWUgY3QpIHsKIAkJaWYgKGN0ID09IG51bGwpCiAJCQlyZXR1cm4gLTE7CiAJCWZpbmFsIGJ5dGVbXSBiID0gY3QuZW5jb2RlZE5hbWU7CkBAIC01NTcsNyArNTU3LDcgQEAKIAkJcmV0dXJuIGFMZW4gLSBiTGVuOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGludCBzbGFzaChmaW5hbCBieXRlW10gYSwgaW50IGFQb3MpIHsKKwlwcml2YXRlIHN0YXRpYyBpbnQgc2xhc2goYnl0ZVtdIGEsIGludCBhUG9zKSB7CiAJCWZpbmFsIGludCBhTGVuID0gYS5sZW5ndGg7CiAJCWZvciAoOyBhUG9zIDwgYUxlbjsgYVBvcysrKQogCQkJaWYgKGFbYVBvc10gPT0gJy8nKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvQ29tcG91bmRFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0NvbXBvdW5kRXhjZXB0aW9uLmphdmEKaW5kZXggNjJmZjk5MC4uMWRmNzBlMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvQ29tcG91bmRFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Db21wb3VuZEV4Y2VwdGlvbi5qYXZhCkBAIC01NiwxMCArNTYsMTAgQEAKIHB1YmxpYyBjbGFzcyBDb21wb3VuZEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0KGZpbmFsIENvbGxlY3Rpb248VGhyb3dhYmxlPiBjYXVzZXMpIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0KENvbGxlY3Rpb248VGhyb3dhYmxlPiBjYXVzZXMpIHsKIAkJZmluYWwgU3RyaW5nQnVpbGRlciBtc2cgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQltc2cuYXBwZW5kKEpHaXRUZXh0LmdldCgpLmZhaWx1cmVEdWVUb09uZU9mVGhlRm9sbG93aW5nKTsKLQkJZm9yIChmaW5hbCBUaHJvd2FibGUgYyA6IGNhdXNlcykgeworCQlmb3IgKFRocm93YWJsZSBjIDogY2F1c2VzKSB7CiAJCQltc2cuYXBwZW5kKCIgICIpOyAvLyROT04tTkxTLTEkCiAJCQltc2cuYXBwZW5kKGMuZ2V0TWVzc2FnZSgpKTsKIAkJCW1zZy5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKQEAgLTc1LDcgKzc1LDcgQEAKIAkgKiBAcGFyYW0gd2h5CiAJICogICAgICAgICAgICBUd28gb3IgbW9yZSBleGNlcHRpb25zIHRoYXQgbWF5IGhhdmUgYmVlbiB0aGUgcHJvYmxlbS4KIAkgKi8KLQlwdWJsaWMgQ29tcG91bmRFeGNlcHRpb24oZmluYWwgQ29sbGVjdGlvbjxUaHJvd2FibGU+IHdoeSkgeworCXB1YmxpYyBDb21wb3VuZEV4Y2VwdGlvbihDb2xsZWN0aW9uPFRocm93YWJsZT4gd2h5KSB7CiAJCXN1cGVyKGZvcm1hdCh3aHkpKTsKIAkJY2F1c2VMaXN0ID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChuZXcgQXJyYXlMaXN0PD4od2h5KSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvQ29uZmlnSW52YWxpZEV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvQ29uZmlnSW52YWxpZEV4Y2VwdGlvbi5qYXZhCmluZGV4IGE3ZTFkMDIuLjI0ZjQzY2YgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0NvbmZpZ0ludmFsaWRFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Db25maWdJbnZhbGlkRXhjZXB0aW9uLmphdmEKQEAgLTU1LDcgKzU1LDcgQEAKIAkgKiBAcGFyYW0gbWVzc2FnZQogCSAqICAgICAgICAgICAgd2h5IHRoZSBjb25maWd1cmF0aW9uIGlzIGludmFsaWQuCiAJICovCi0JcHVibGljIENvbmZpZ0ludmFsaWRFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKwlwdWJsaWMgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewogCQlzdXBlcihtZXNzYWdlKTsKIAl9CiAKQEAgLTY3LDcgKzY3LDcgQEAKIAkgKiBAcGFyYW0gY2F1c2UKIAkgKiAgICAgICAgICAgIHJvb3QgY2F1c2Ugb2YgdGhlIGVycm9yLgogCSAqLwotCXB1YmxpYyBDb25maWdJbnZhbGlkRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBUaHJvd2FibGUgY2F1c2UpIHsKKwlwdWJsaWMgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7CiAJCXN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9FbnRyeUV4aXN0c0V4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvRW50cnlFeGlzdHNFeGNlcHRpb24uamF2YQppbmRleCA4ZGQwZDUzLi5iOTdkMjM3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9FbnRyeUV4aXN0c0V4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0VudHJ5RXhpc3RzRXhjZXB0aW9uLmphdmEKQEAgLTYxLDcgKzYxLDcgQEAKIAkgKgogCSAqIEBwYXJhbSBuYW1lIHdvcmtkaXIgcmVsYXRpdmUgZmlsZSBuYW1lCiAJICovCi0JcHVibGljIEVudHJ5RXhpc3RzRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBuYW1lKSB7CisJcHVibGljIEVudHJ5RXhpc3RzRXhjZXB0aW9uKFN0cmluZyBuYW1lKSB7CiAJCXN1cGVyKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnRyZWVFbnRyeUFscmVhZHlFeGlzdHMsIG5hbWUpKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9JbGxlZ2FsVG9kb0ZpbGVNb2RpZmljYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0lsbGVnYWxUb2RvRmlsZU1vZGlmaWNhdGlvbi5qYXZhCmluZGV4IGE2NDcxMjEuLjc4NWNiOTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0lsbGVnYWxUb2RvRmlsZU1vZGlmaWNhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0lsbGVnYWxUb2RvRmlsZU1vZGlmaWNhdGlvbi5qYXZhCkBAIC01Niw3ICs1Niw3IEBACiAJICogQHBhcmFtIG1zZwogCSAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQogCSAqLwotCXB1YmxpYyBJbGxlZ2FsVG9kb0ZpbGVNb2RpZmljYXRpb24oZmluYWwgU3RyaW5nIG1zZykgeworCXB1YmxpYyBJbGxlZ2FsVG9kb0ZpbGVNb2RpZmljYXRpb24oU3RyaW5nIG1zZykgewogCQlzdXBlcihtc2cpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0luY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0luY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24uamF2YQppbmRleCA3YmEzYTAwLi41YWJkMGMzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9JbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbi5qYXZhCkBAIC03MCw3ICs3MCw3IEBACiAJICogQHBhcmFtIGlkIFNIQS0xCiAJICogQHBhcmFtIHR5cGUgb2JqZWN0IHR5cGUKIAkgKi8KLQlwdWJsaWMgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbihmaW5hbCBPYmplY3RJZCBpZCwgZmluYWwgU3RyaW5nIHR5cGUpIHsKKwlwdWJsaWMgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbihPYmplY3RJZCBpZCwgU3RyaW5nIHR5cGUpIHsKIAkJc3VwZXIoTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkub2JqZWN0SXNOb3RBLCBpZC5uYW1lKCksIHR5cGUpKTsKIAl9CiAKQEAgLTgyLDcgKzgyLDcgQEAKIAkgKiBAcGFyYW0gaWQgU0hBLTEKIAkgKiBAcGFyYW0gdHlwZSBvYmplY3QgdHlwZQogCSAqLwotCXB1YmxpYyBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uKGZpbmFsIE9iamVjdElkIGlkLCBmaW5hbCBpbnQgdHlwZSkgeworCXB1YmxpYyBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uKE9iamVjdElkIGlkLCBpbnQgdHlwZSkgewogCQl0aGlzKGlkLCBDb25zdGFudHMudHlwZVN0cmluZyh0eXBlKSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvSW5kZXhSZWFkRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9JbmRleFJlYWRFeGNlcHRpb24uamF2YQppbmRleCA3MGY2NTBkLi5lMDdkMzA4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9JbmRleFJlYWRFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9JbmRleFJlYWRFeGNlcHRpb24uamF2YQpAQCAtNjMsNyArNjMsNyBAQAogCSAqIEBwYXJhbSBzCiAJICogICAgICAgICAgICBtZXNzYWdlCiAJICovCi0JcHVibGljIEluZGV4UmVhZEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgcykgeworCXB1YmxpYyBJbmRleFJlYWRFeGNlcHRpb24oU3RyaW5nIHMpIHsKIAkJc3VwZXIocyk7CiAJfQogCkBAIC03NSw3ICs3NSw3IEBACiAJICogQHBhcmFtIGNhdXNlCiAJICogICAgICAgICAgICByb290IGNhdXNlIGV4Y2VwdGlvbgogCSAqLwotCXB1YmxpYyBJbmRleFJlYWRFeGNlcHRpb24oZmluYWwgU3RyaW5nIHMsIGZpbmFsIFRocm93YWJsZSBjYXVzZSkgeworCXB1YmxpYyBJbmRleFJlYWRFeGNlcHRpb24oU3RyaW5nIHMsIFRocm93YWJsZSBjYXVzZSkgewogCQlzdXBlcihzKTsKIAkJaW5pdENhdXNlKGNhdXNlKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9JbmRleFdyaXRlRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9JbmRleFdyaXRlRXhjZXB0aW9uLmphdmEKaW5kZXggZGUxOWMwNi4uMzRmZDdhOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvSW5kZXhXcml0ZUV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0luZGV4V3JpdGVFeGNlcHRpb24uamF2YQpAQCAtNjAsNyArNjAsNyBAQAogCSAqCiAJICogQHBhcmFtIHMgbWVzc2FnZQogCSAqLwotCXB1YmxpYyBJbmRleFdyaXRlRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBzKSB7CisJcHVibGljIEluZGV4V3JpdGVFeGNlcHRpb24oU3RyaW5nIHMpIHsKIAkJc3VwZXIocyk7CiAJfQogCkBAIC03MCw3ICs3MCw3IEBACiAJICogQHBhcmFtIHMgbWVzc2FnZQogCSAqIEBwYXJhbSBjYXVzZSByb290IGNhdXNlIGV4Y2VwdGlvbgogCSAqLwotCXB1YmxpYyBJbmRleFdyaXRlRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBzLCBmaW5hbCBUaHJvd2FibGUgY2F1c2UpIHsKKwlwdWJsaWMgSW5kZXhXcml0ZUV4Y2VwdGlvbihTdHJpbmcgcywgVGhyb3dhYmxlIGNhdXNlKSB7CiAJCXN1cGVyKHMpOwogCQlpbml0Q2F1c2UoY2F1c2UpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL01pc3NpbmdCdW5kbGVQcmVyZXF1aXNpdGVFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL01pc3NpbmdCdW5kbGVQcmVyZXF1aXNpdGVFeGNlcHRpb24uamF2YQppbmRleCAwOWJiNGE5Li5iMzdkMjBkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9NaXNzaW5nQnVuZGxlUHJlcmVxdWlzaXRlRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTWlzc2luZ0J1bmRsZVByZXJlcXVpc2l0ZUV4Y2VwdGlvbi5qYXZhCkBAIC01NiwxMCArNTYsMTAgQEAKIHB1YmxpYyBjbGFzcyBNaXNzaW5nQnVuZGxlUHJlcmVxdWlzaXRlRXhjZXB0aW9uIGV4dGVuZHMgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXQoZmluYWwgTWFwPE9iamVjdElkLCBTdHJpbmc+IG1pc3NpbmdDb21taXRzKSB7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdChNYXA8T2JqZWN0SWQsIFN0cmluZz4gbWlzc2luZ0NvbW1pdHMpIHsKIAkJZmluYWwgU3RyaW5nQnVpbGRlciByID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJci5hcHBlbmQoSkdpdFRleHQuZ2V0KCkubWlzc2luZ1ByZXJlcXVpc2l0ZUNvbW1pdHMpOwotCQlmb3IgKGZpbmFsIE1hcC5FbnRyeTxPYmplY3RJZCwgU3RyaW5nPiBlIDogbWlzc2luZ0NvbW1pdHMuZW50cnlTZXQoKSkgeworCQlmb3IgKE1hcC5FbnRyeTxPYmplY3RJZCwgU3RyaW5nPiBlIDogbWlzc2luZ0NvbW1pdHMuZW50cnlTZXQoKSkgewogCQkJci5hcHBlbmQoIlxuICAiKTsgLy8kTk9OLU5MUy0xJAogCQkJci5hcHBlbmQoZS5nZXRLZXkoKS5uYW1lKCkpOwogCQkJaWYgKGUuZ2V0VmFsdWUoKSAhPSBudWxsKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTWlzc2luZ09iamVjdEV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTWlzc2luZ09iamVjdEV4Y2VwdGlvbi5qYXZhCmluZGV4IGY2YWEwOTIuLmM2YzQ3ZjkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL01pc3NpbmdPYmplY3RFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9NaXNzaW5nT2JqZWN0RXhjZXB0aW9uLmphdmEKQEAgLTY5LDcgKzY5LDcgQEAKIAkgKiBAcGFyYW0gaWQgU0hBLTEKIAkgKiBAcGFyYW0gdHlwZSBvYmplY3QgdHlwZQogCSAqLwotCXB1YmxpYyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uKGZpbmFsIE9iamVjdElkIGlkLCBmaW5hbCBTdHJpbmcgdHlwZSkgeworCXB1YmxpYyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uKE9iamVjdElkIGlkLCBTdHJpbmcgdHlwZSkgewogCQlzdXBlcihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5taXNzaW5nT2JqZWN0LCB0eXBlLCBpZC5uYW1lKCkpKTsKIAkJbWlzc2luZyA9IGlkLmNvcHkoKTsKIAl9CkBAIC04MSw3ICs4MSw3IEBACiAJICogQHBhcmFtIGlkIFNIQS0xCiAJICogQHBhcmFtIHR5cGUgb2JqZWN0IHR5cGUKIAkgKi8KLQlwdWJsaWMgTWlzc2luZ09iamVjdEV4Y2VwdGlvbihmaW5hbCBPYmplY3RJZCBpZCwgZmluYWwgaW50IHR5cGUpIHsKKwlwdWJsaWMgTWlzc2luZ09iamVjdEV4Y2VwdGlvbihPYmplY3RJZCBpZCwgaW50IHR5cGUpIHsKIAkJdGhpcyhpZCwgQ29uc3RhbnRzLnR5cGVTdHJpbmcodHlwZSkpOwogCX0KIApAQCAtOTQsNyArOTQsNyBAQAogCSAqIEBwYXJhbSB0eXBlCiAJICogICAgICAgICAgICBvYmplY3QgdHlwZQogCSAqLwotCXB1YmxpYyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uKGZpbmFsIEFiYnJldmlhdGVkT2JqZWN0SWQgaWQsIGZpbmFsIGludCB0eXBlKSB7CisJcHVibGljIE1pc3NpbmdPYmplY3RFeGNlcHRpb24oQWJicmV2aWF0ZWRPYmplY3RJZCBpZCwgaW50IHR5cGUpIHsKIAkJc3VwZXIoTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkubWlzc2luZ09iamVjdCwgQ29uc3RhbnRzCiAJCQkJLnR5cGVTdHJpbmcodHlwZSksIGlkLm5hbWUoKSkpOwogCQltaXNzaW5nID0gbnVsbDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL05vUGFja1NpZ25hdHVyZUV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTm9QYWNrU2lnbmF0dXJlRXhjZXB0aW9uLmphdmEKaW5kZXggMjhlOTc4OC4uOGMyZTg3MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTm9QYWNrU2lnbmF0dXJlRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTm9QYWNrU2lnbmF0dXJlRXhjZXB0aW9uLmphdmEKQEAgLTYwLDcgKzYwLDcgQEAKIAkgKiBAcGFyYW0gd2h5CiAJICogICAgICAgICAgICBkZXNjcmlwdGlvbiBvZiB0aGUgdHlwZSBvZiBlcnJvci4KIAkgKi8KLQlwdWJsaWMgTm9QYWNrU2lnbmF0dXJlRXhjZXB0aW9uKGZpbmFsIFN0cmluZyB3aHkpIHsKKwlwdWJsaWMgTm9QYWNrU2lnbmF0dXJlRXhjZXB0aW9uKFN0cmluZyB3aHkpIHsKIAkJc3VwZXIod2h5KTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Ob1JlbW90ZVJlcG9zaXRvcnlFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL05vUmVtb3RlUmVwb3NpdG9yeUV4Y2VwdGlvbi5qYXZhCmluZGV4IGZlMDczZDUuLjUyNDk2OGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL05vUmVtb3RlUmVwb3NpdG9yeUV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL05vUmVtb3RlUmVwb3NpdG9yeUV4Y2VwdGlvbi5qYXZhCkBAIC01OSw3ICs1OSw3IEBACiAJICogQHBhcmFtIHMKIAkgKiAgICAgICAgICAgIG1lc3NhZ2UKIAkgKi8KLQlwdWJsaWMgTm9SZW1vdGVSZXBvc2l0b3J5RXhjZXB0aW9uKGZpbmFsIFVSSWlzaCB1cmksIGZpbmFsIFN0cmluZyBzKSB7CisJcHVibGljIE5vUmVtb3RlUmVwb3NpdG9yeUV4Y2VwdGlvbihVUklpc2ggdXJpLCBTdHJpbmcgcykgewogCQlzdXBlcih1cmksIHMpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL05vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKaW5kZXggMTI0NjgwZS4uMTE0ZTY2MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKQEAgLTU4LDcgKzU4LDcgQEAKIAkgKgogCSAqIEBwYXJhbSBzIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgaXNzdWUKIAkgKi8KLQlwdWJsaWMgTm90U3VwcG9ydGVkRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBzKSB7CisJcHVibGljIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbihTdHJpbmcgcykgewogCQlzdXBlcihzKTsKIAl9CiAKQEAgLTcwLDcgKzcwLDcgQEAKIAkgKiBAcGFyYW0gd2h5CiAJICogICAgICAgICAgICBhIGxvd2VyIGxldmVsIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGlzc3VlLgogCSAqLwotCXB1YmxpYyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oZmluYWwgU3RyaW5nIHMsIGZpbmFsIFRocm93YWJsZSB3aHkpIHsKKwlwdWJsaWMgTm90U3VwcG9ydGVkRXhjZXB0aW9uKFN0cmluZyBzLCBUaHJvd2FibGUgd2h5KSB7CiAJCXN1cGVyKHMpOwogCQlpbml0Q2F1c2Uod2h5KTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9PYmplY3RXcml0aW5nRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9PYmplY3RXcml0aW5nRXhjZXB0aW9uLmphdmEKaW5kZXggOGFmMTk5MS4uYmJlZTQyZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvT2JqZWN0V3JpdGluZ0V4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL09iamVjdFdyaXRpbmdFeGNlcHRpb24uamF2YQpAQCAtNTgsNyArNTgsNyBAQAogCSAqCiAJICogQHBhcmFtIHMgbWVzc2FnZQogCSAqLwotCXB1YmxpYyBPYmplY3RXcml0aW5nRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBzKSB7CisJcHVibGljIE9iamVjdFdyaXRpbmdFeGNlcHRpb24oU3RyaW5nIHMpIHsKIAkJc3VwZXIocyk7CiAJfQogCkBAIC02OCw3ICs2OCw3IEBACiAJICogQHBhcmFtIHMgbWVzc2FnZQogCSAqIEBwYXJhbSBjYXVzZSByb290IGNhdXNlIGV4Y2VwdGlvbgogCSAqLwotCXB1YmxpYyBPYmplY3RXcml0aW5nRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBzLCBmaW5hbCBUaHJvd2FibGUgY2F1c2UpIHsKKwlwdWJsaWMgT2JqZWN0V3JpdGluZ0V4Y2VwdGlvbihTdHJpbmcgcywgVGhyb3dhYmxlIGNhdXNlKSB7CiAJCXN1cGVyKHMpOwogCQlpbml0Q2F1c2UoY2F1c2UpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1BhY2tJbnZhbGlkRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9QYWNrSW52YWxpZEV4Y2VwdGlvbi5qYXZhCmluZGV4IDk4ODZlMTUuLmE4M2RlMDYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1BhY2tJbnZhbGlkRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvUGFja0ludmFsaWRFeGNlcHRpb24uamF2YQpAQCAtNjEsNyArNjEsNyBAQAogCSAqIEBwYXJhbSBwYXRoCiAJICogICAgICAgICAgICBwYXRoIG9mIHRoZSBpbnZhbGlkIHBhY2sgZmlsZS4KIAkgKi8KLQlwdWJsaWMgUGFja0ludmFsaWRFeGNlcHRpb24oZmluYWwgRmlsZSBwYXRoKSB7CisJcHVibGljIFBhY2tJbnZhbGlkRXhjZXB0aW9uKEZpbGUgcGF0aCkgewogCQl0aGlzKHBhdGguZ2V0QWJzb2x1dGVQYXRoKCkpOwogCX0KIApAQCAtNzEsNyArNzEsNyBAQAogCSAqIEBwYXJhbSBwYXRoCiAJICogICAgICAgICAgICBwYXRoIG9mIHRoZSBpbnZhbGlkIHBhY2sgZmlsZS4KIAkgKi8KLQlwdWJsaWMgUGFja0ludmFsaWRFeGNlcHRpb24oZmluYWwgU3RyaW5nIHBhdGgpIHsKKwlwdWJsaWMgUGFja0ludmFsaWRFeGNlcHRpb24oU3RyaW5nIHBhdGgpIHsKIAkJc3VwZXIoTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkucGFja0ZpbGVJbnZhbGlkLCBwYXRoKSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvUGFja01pc21hdGNoRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9QYWNrTWlzbWF0Y2hFeGNlcHRpb24uamF2YQppbmRleCA1YjlhNGI5Li5lYTFlNjViIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9QYWNrTWlzbWF0Y2hFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9QYWNrTWlzbWF0Y2hFeGNlcHRpb24uamF2YQpAQCAtNTcsNyArNTcsNyBAQAogCSAqIEBwYXJhbSB3aHkKIAkgKiAgICAgICAgICAgIGRlc2NyaXB0aW9uIG9mIHRoZSB0eXBlIG9mIGVycm9yLgogCSAqLwotCXB1YmxpYyBQYWNrTWlzbWF0Y2hFeGNlcHRpb24oZmluYWwgU3RyaW5nIHdoeSkgeworCXB1YmxpYyBQYWNrTWlzbWF0Y2hFeGNlcHRpb24oU3RyaW5nIHdoeSkgewogCQlzdXBlcih3aHkpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1BhY2tQcm90b2NvbEV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvUGFja1Byb3RvY29sRXhjZXB0aW9uLmphdmEKaW5kZXggNDRiYzE2NC4uZGQxMzc0MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvUGFja1Byb3RvY29sRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvUGFja1Byb3RvY29sRXhjZXB0aW9uLmphdmEKQEAgLTYyLDcgKzYyLDcgQEAKIAkgKiBAcGFyYW0gcwogCSAqICAgICAgICAgICAgbWVzc2FnZSwgd2hpY2ggbWF5IGJlIHNob3duIHRvIGFuIGVuZC11c2VyLgogCSAqLwotCXB1YmxpYyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oZmluYWwgVVJJaXNoIHVyaSwgZmluYWwgU3RyaW5nIHMpIHsKKwlwdWJsaWMgUGFja1Byb3RvY29sRXhjZXB0aW9uKFVSSWlzaCB1cmksIFN0cmluZyBzKSB7CiAJCXN1cGVyKHVyaSArICI6ICIgKyBzKTsgLy8kTk9OLU5MUy0xJAogCX0KIApAQCAtODgsNyArODgsNyBAQAogCSAqIEBwYXJhbSBzCiAJICogICAgICAgICAgICBtZXNzYWdlLCB3aGljaCBtYXkgYmUgc2hvd24gdG8gYW4gZW5kLXVzZXIuCiAJICovCi0JcHVibGljIFBhY2tQcm90b2NvbEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgcykgeworCXB1YmxpYyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oU3RyaW5nIHMpIHsKIAkJc3VwZXIocyk7CiAJfQogCkBAIC0xMDAsNyArMTAwLDcgQEAKIAkgKiBAcGFyYW0gY2F1c2UKIAkgKiAgICAgICAgICAgIHJvb3QgY2F1c2UgZXhjZXB0aW9uCiAJICovCi0JcHVibGljIFBhY2tQcm90b2NvbEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgcywgZmluYWwgVGhyb3dhYmxlIGNhdXNlKSB7CisJcHVibGljIFBhY2tQcm90b2NvbEV4Y2VwdGlvbihTdHJpbmcgcywgVGhyb3dhYmxlIGNhdXNlKSB7CiAJCXN1cGVyKHMpOwogCQlpbml0Q2F1c2UoY2F1c2UpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1JlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uLmphdmEKaW5kZXggYWFiYjQ2YS4uMDRmZDhlYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uLmphdmEKQEAgLTYwLDcgKzYwLDcgQEAKIAkgKiBAcGFyYW0gbG9jYXRpb24KIAkgKiAgICAgICAgICAgIGRlc2NyaXB0aW9uIG9mIHRoZSByZXBvc2l0b3J5IG5vdCBmb3VuZCwgdXN1YWxseSBmaWxlIHBhdGguCiAJICovCi0JcHVibGljIFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbihmaW5hbCBGaWxlIGxvY2F0aW9uKSB7CisJcHVibGljIFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbihGaWxlIGxvY2F0aW9uKSB7CiAJCXRoaXMobG9jYXRpb24uZ2V0UGF0aCgpKTsKIAl9CiAKQEAgLTcyLDcgKzcyLDcgQEAKIAkgKiBAcGFyYW0gd2h5CiAJICogICAgICAgICAgICB3aHkgdGhlIHJlcG9zaXRvcnkgZG9lcyBub3QgZXhpc3QuCiAJICovCi0JcHVibGljIFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbihmaW5hbCBGaWxlIGxvY2F0aW9uLCBUaHJvd2FibGUgd2h5KSB7CisJcHVibGljIFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbihGaWxlIGxvY2F0aW9uLCBUaHJvd2FibGUgd2h5KSB7CiAJCXRoaXMobG9jYXRpb24uZ2V0UGF0aCgpLCB3aHkpOwogCX0KIApAQCAtODIsNyArODIsNyBAQAogCSAqIEBwYXJhbSBsb2NhdGlvbgogCSAqICAgICAgICAgICAgZGVzY3JpcHRpb24gb2YgdGhlIHJlcG9zaXRvcnkgbm90IGZvdW5kLCB1c3VhbGx5IGZpbGUgcGF0aC4KIAkgKi8KLQlwdWJsaWMgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBsb2NhdGlvbikgeworCXB1YmxpYyBSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24oU3RyaW5nIGxvY2F0aW9uKSB7CiAJCXN1cGVyKG1lc3NhZ2UobG9jYXRpb24pKTsKIAl9CiAKQEAgLTk4LDcgKzk4LDcgQEAKIAkJc3VwZXIobWVzc2FnZShsb2NhdGlvbiksIHdoeSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1lc3NhZ2UoZmluYWwgU3RyaW5nIGxvY2F0aW9uKSB7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1lc3NhZ2UoU3RyaW5nIGxvY2F0aW9uKSB7CiAJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5yZXBvc2l0b3J5Tm90Rm91bmQsIGxvY2F0aW9uKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9SZXZXYWxrRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9SZXZXYWxrRXhjZXB0aW9uLmphdmEKaW5kZXggODI2NTRlOC4uZjY4NTJiNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvUmV2V2Fsa0V4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1JldldhbGtFeGNlcHRpb24uamF2YQpAQCAtNjUsNyArNjUsNyBAQAogCSAqIEBwYXJhbSBjYXVzZQogCSAqICAgICAgICAgICAgdGhlIGNoZWNrZWQgZXhjZXB0aW9uIHRoYXQgZGVzY3JpYmVzIHdoeSB0aGUgd2FsayBmYWlsZWQuCiAJICovCi0JcHVibGljIFJldldhbGtFeGNlcHRpb24oZmluYWwgVGhyb3dhYmxlIGNhdXNlKSB7CisJcHVibGljIFJldldhbGtFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7CiAJCXN1cGVyKEpHaXRUZXh0LmdldCgpLndhbGtGYWlsdXJlLCBjYXVzZSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvU3RvcmVkT2JqZWN0UmVwcmVzZW50YXRpb25Ob3RBdmFpbGFibGVFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1N0b3JlZE9iamVjdFJlcHJlc2VudGF0aW9uTm90QXZhaWxhYmxlRXhjZXB0aW9uLmphdmEKaW5kZXggOGZhMTRjNy4uNjExZmQ2NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvU3RvcmVkT2JqZWN0UmVwcmVzZW50YXRpb25Ob3RBdmFpbGFibGVFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9TdG9yZWRPYmplY3RSZXByZXNlbnRhdGlvbk5vdEF2YWlsYWJsZUV4Y2VwdGlvbi5qYXZhCkBAIC01NiwyMSArNTYsNiBAQAogCSAqCiAJICogQHBhcmFtIG90cAogCSAqICAgICAgICAgICAgdGhlIG9iamVjdCB3aG9zZSBjdXJyZW50IHJlcHJlc2VudGF0aW9uIGlzIG5vIGxvbmdlciBwcmVzZW50LgotCSAqIEBkZXByZWNhdGVkIHVzZQotCSAqICAgICAgICAgICAgIHtAbGluayAjU3RvcmVkT2JqZWN0UmVwcmVzZW50YXRpb25Ob3RBdmFpbGFibGVFeGNlcHRpb24oT2JqZWN0VG9QYWNrLCBUaHJvd2FibGUpfQotCSAqICAgICAgICAgICAgIGluc3RlYWQuCi0JICogQHNpbmNlIDMuMAotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIFN0b3JlZE9iamVjdFJlcHJlc2VudGF0aW9uTm90QXZhaWxhYmxlRXhjZXB0aW9uKE9iamVjdFRvUGFjayBvdHApIHsKLQkJLy8gRG8gbm90aGluZy4KLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gZXJyb3IgZm9yIGFuIG9iamVjdC4KLQkgKgotCSAqIEBwYXJhbSBvdHAKLQkgKiAgICAgICAgICAgIHRoZSBvYmplY3Qgd2hvc2UgY3VycmVudCByZXByZXNlbnRhdGlvbiBpcyBubyBsb25nZXIgcHJlc2VudC4KIAkgKiBAcGFyYW0gY2F1c2UKIAkgKiAgICAgICAgICAgIGNhdXNlCiAJICogQHNpbmNlIDQuMTAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1N5bWxpbmtzTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9TeW1saW5rc05vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhCmluZGV4IDYwZDdhYTAuLmRjNTljOGMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1N5bWxpbmtzTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvU3ltbGlua3NOb3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YQpAQCAtNTgsNyArNTgsNyBAQAogCSAqCiAJICogQHBhcmFtIHMgbmFtZSBvZiBsaW5rIGluIHRyZWUgb3Igd29ya2RpcgogCSAqLwotCXB1YmxpYyBTeW1saW5rc05vdFN1cHBvcnRlZEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgcykgeworCXB1YmxpYyBTeW1saW5rc05vdFN1cHBvcnRlZEV4Y2VwdGlvbihTdHJpbmcgcykgewogCQlzdXBlcihzKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9UcmFuc3BvcnRFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1RyYW5zcG9ydEV4Y2VwdGlvbi5qYXZhCmluZGV4IDg2ZGVhODIuLjVmZWNmMGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1RyYW5zcG9ydEV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1RyYW5zcG9ydEV4Y2VwdGlvbi5qYXZhCkBAIC02NCw3ICs2NCw3IEBACiAJICogQHBhcmFtIHMKIAkgKiAgICAgICAgICAgIG1lc3NhZ2UKIAkgKi8KLQlwdWJsaWMgVHJhbnNwb3J0RXhjZXB0aW9uKGZpbmFsIFVSSWlzaCB1cmksIGZpbmFsIFN0cmluZyBzKSB7CisJcHVibGljIFRyYW5zcG9ydEV4Y2VwdGlvbihVUklpc2ggdXJpLCBTdHJpbmcgcykgewogCQlzdXBlcih1cmkuc2V0UGFzcyhudWxsKSArICI6ICIgKyBzKTsgLy8kTk9OLU5MUy0xJAogCX0KIApAQCAtOTAsNyArOTAsNyBAQAogCSAqIEBwYXJhbSBzCiAJICogICAgICAgICAgICBtZXNzYWdlCiAJICovCi0JcHVibGljIFRyYW5zcG9ydEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgcykgeworCXB1YmxpYyBUcmFuc3BvcnRFeGNlcHRpb24oU3RyaW5nIHMpIHsKIAkJc3VwZXIocyk7CiAJfQogCkBAIC0xMDIsNyArMTAyLDcgQEAKIAkgKiBAcGFyYW0gY2F1c2UKIAkgKiAgICAgICAgICAgIHJvb3QgY2F1c2UgZXhjZXB0aW9uCiAJICovCi0JcHVibGljIFRyYW5zcG9ydEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgcywgZmluYWwgVGhyb3dhYmxlIGNhdXNlKSB7CisJcHVibGljIFRyYW5zcG9ydEV4Y2VwdGlvbihTdHJpbmcgcywgVGhyb3dhYmxlIGNhdXNlKSB7CiAJCXN1cGVyKHMpOwogCQlpbml0Q2F1c2UoY2F1c2UpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1VubWVyZ2VkUGF0aEV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvVW5tZXJnZWRQYXRoRXhjZXB0aW9uLmphdmEKaW5kZXggNGZjNTM0Yi4uNmRlOTE1MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvVW5tZXJnZWRQYXRoRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvVW5tZXJnZWRQYXRoRXhjZXB0aW9uLmphdmEKQEAgLTYzLDcgKzYzLDcgQEAKIAkgKiBAcGFyYW0gZGNlCiAJICogICAgICAgICAgICB0aGUgZmlyc3Qgbm9uLXplcm8gc3RhZ2Ugb2YgdGhlIHVubWVyZ2VkIHBhdGguCiAJICovCi0JcHVibGljIFVubWVyZ2VkUGF0aEV4Y2VwdGlvbihmaW5hbCBEaXJDYWNoZUVudHJ5IGRjZSkgeworCXB1YmxpYyBVbm1lcmdlZFBhdGhFeGNlcHRpb24oRGlyQ2FjaGVFbnRyeSBkY2UpIHsKIAkJc3VwZXIoTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkudW5tZXJnZWRQYXRoLCBkY2UuZ2V0UGF0aFN0cmluZygpKSk7CiAJCWVudHJ5ID0gZGNlOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1Vuc3VwcG9ydGVkQ3JlZGVudGlhbEl0ZW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1Vuc3VwcG9ydGVkQ3JlZGVudGlhbEl0ZW0uamF2YQppbmRleCA4OGMyZWY2Li45YmFiNjg3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9VbnN1cHBvcnRlZENyZWRlbnRpYWxJdGVtLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvVW5zdXBwb3J0ZWRDcmVkZW50aWFsSXRlbS5qYXZhCkBAIC02Miw3ICs2Miw3IEBACiAJICogQHBhcmFtIHMKIAkgKiAgICAgICAgICAgIG1lc3NhZ2UKIAkgKi8KLQlwdWJsaWMgVW5zdXBwb3J0ZWRDcmVkZW50aWFsSXRlbShmaW5hbCBVUklpc2ggdXJpLCBmaW5hbCBTdHJpbmcgcykgeworCXB1YmxpYyBVbnN1cHBvcnRlZENyZWRlbnRpYWxJdGVtKFVSSWlzaCB1cmksIFN0cmluZyBzKSB7CiAJCXN1cGVyKHVyaS5zZXRQYXNzKG51bGwpICsgIjogIiArIHMpOyAvLyROT04tTkxTLTEkCiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvVW5zdXBwb3J0ZWRQYWNrSW5kZXhWZXJzaW9uRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9VbnN1cHBvcnRlZFBhY2tJbmRleFZlcnNpb25FeGNlcHRpb24uamF2YQppbmRleCAwYjdjY2Y1Li4wYTRmZWYxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9VbnN1cHBvcnRlZFBhY2tJbmRleFZlcnNpb25FeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9VbnN1cHBvcnRlZFBhY2tJbmRleFZlcnNpb25FeGNlcHRpb24uamF2YQpAQCAtNjIsNyArNjIsNyBAQAogCSAqIEBwYXJhbSB2ZXJzaW9uCiAJICogICAgICAgICAgICBwYWNrIGluZGV4IHZlcnNpb24KIAkgKi8KLQlwdWJsaWMgVW5zdXBwb3J0ZWRQYWNrSW5kZXhWZXJzaW9uRXhjZXB0aW9uKGZpbmFsIGludCB2ZXJzaW9uKSB7CisJcHVibGljIFVuc3VwcG9ydGVkUGFja0luZGV4VmVyc2lvbkV4Y2VwdGlvbihpbnQgdmVyc2lvbikgewogCQlzdXBlcihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS51bnN1cHBvcnRlZFBhY2tJbmRleFZlcnNpb24sCiAJCQkJSW50ZWdlci52YWx1ZU9mKHZlcnNpb24pKSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvVW5zdXBwb3J0ZWRQYWNrVmVyc2lvbkV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvVW5zdXBwb3J0ZWRQYWNrVmVyc2lvbkV4Y2VwdGlvbi5qYXZhCmluZGV4IDIzNjExODYuLmNiZjhmM2EgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1Vuc3VwcG9ydGVkUGFja1ZlcnNpb25FeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9VbnN1cHBvcnRlZFBhY2tWZXJzaW9uRXhjZXB0aW9uLmphdmEKQEAgLTYyLDcgKzYyLDcgQEAKIAkgKiBAcGFyYW0gdmVyc2lvbgogCSAqICAgICAgICAgICAgcGFjayB2ZXJzaW9uCiAJICovCi0JcHVibGljIFVuc3VwcG9ydGVkUGFja1ZlcnNpb25FeGNlcHRpb24oZmluYWwgbG9uZyB2ZXJzaW9uKSB7CisJcHVibGljIFVuc3VwcG9ydGVkUGFja1ZlcnNpb25FeGNlcHRpb24obG9uZyB2ZXJzaW9uKSB7CiAJCXN1cGVyKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnVuc3VwcG9ydGVkUGFja1ZlcnNpb24sCiAJCQkJTG9uZy52YWx1ZU9mKHZlcnNpb24pKSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ldmVudHMvSW5kZXhDaGFuZ2VkRXZlbnQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXZlbnRzL0luZGV4Q2hhbmdlZEV2ZW50LmphdmEKaW5kZXggNjQ3ZWM4YS4uZGNjZTg2YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ldmVudHMvSW5kZXhDaGFuZ2VkRXZlbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2V2ZW50cy9JbmRleENoYW5nZWRFdmVudC5qYXZhCkBAIC00Nyw2ICs0NywyOCBAQAogICogRGVzY3JpYmVzIGEgY2hhbmdlIHRvIG9uZSBvciBtb3JlIHBhdGhzIGluIHRoZSBpbmRleCBmaWxlLgogICovCiBwdWJsaWMgY2xhc3MgSW5kZXhDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBSZXBvc2l0b3J5RXZlbnQ8SW5kZXhDaGFuZ2VkTGlzdGVuZXI+IHsKKwlwcml2YXRlIGJvb2xlYW4gaW50ZXJuYWw7CisKKwkvKioKKwkgKiBOb3RpZnkgdGhhdCB0aGUgaW5kZXggY2hhbmdlZAorCSAqCisJICogQHBhcmFtIGludGVybmFsCisJICogICAgICAgICAgICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGluZGV4IHdhcyBjaGFuZ2VkIGJ5IHRoZSBzYW1lCisJICogICAgICAgICAgICAgICAgICAgICBKR2l0IHByb2Nlc3MKKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIEluZGV4Q2hhbmdlZEV2ZW50KGJvb2xlYW4gaW50ZXJuYWwpIHsKKwkJdGhpcy5pbnRlcm5hbCA9IGludGVybmFsOworCX0KKworCS8qKgorCSAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBpbmRleCB3YXMgY2hhbmdlZCBieSB0aGUgc2FtZSBKR2l0IHByb2Nlc3MKKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIGJvb2xlYW4gaXNJbnRlcm5hbCgpIHsKKwkJcmV0dXJuIGludGVybmFsOworCX0KKwogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCiAJcHVibGljIENsYXNzPEluZGV4Q2hhbmdlZExpc3RlbmVyPiBnZXRMaXN0ZW5lclR5cGUoKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ZubWF0Y2gvQ2hhcmFjdGVySGVhZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9mbm1hdGNoL0NoYXJhY3RlckhlYWQuamF2YQppbmRleCA5OGFlZTBlLi43MDM5YzNkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ZubWF0Y2gvQ2hhcmFjdGVySGVhZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZm5tYXRjaC9DaGFyYWN0ZXJIZWFkLmphdmEKQEAgLTUzLDE0ICs1MywxNCBAQAogCSAqIEBwYXJhbSBleHBlY3RlZENoYXJhY3RlcgogCSAqICAgICAgICAgICAgZXhwZWN0ZWQge0Bjb2RlIGNoYXJ9CiAJICovCi0JcHJvdGVjdGVkIENoYXJhY3RlckhlYWQoZmluYWwgY2hhciBleHBlY3RlZENoYXJhY3RlcikgeworCXByb3RlY3RlZCBDaGFyYWN0ZXJIZWFkKGNoYXIgZXhwZWN0ZWRDaGFyYWN0ZXIpIHsKIAkJc3VwZXIoZmFsc2UpOwogCQl0aGlzLmV4cGVjdGVkQ2hhcmFjdGVyID0gZXhwZWN0ZWRDaGFyYWN0ZXI7CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBtYXRjaGVzKGZpbmFsIGNoYXIgYykgeworCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIG1hdGNoZXMoY2hhciBjKSB7CiAJCXJldHVybiBjID09IGV4cGVjdGVkQ2hhcmFjdGVyOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9mbm1hdGNoL0ZpbGVOYW1lTWF0Y2hlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9mbm1hdGNoL0ZpbGVOYW1lTWF0Y2hlci5qYXZhCmluZGV4IDU2NjMwMzkuLmJmY2M1ODAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZm5tYXRjaC9GaWxlTmFtZU1hdGNoZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ZubWF0Y2gvRmlsZU5hbWVNYXRjaGVyLmphdmEKQEAgLTEwNSw3ICsxMDUsNyBAQAogCSAqIEBwYXJhbSBoZWFkc1N0YXJ0VmFsdWUKIAkgKiAgICAgICAgICAgIG11c3QgYmUgYSBsaXN0IHdoaWNoIHdpbGwgbmV2ZXIgYmUgbW9kaWZpZWQuCiAJICovCi0JcHJpdmF0ZSBGaWxlTmFtZU1hdGNoZXIoZmluYWwgTGlzdDxIZWFkPiBoZWFkc1N0YXJ0VmFsdWUpIHsKKwlwcml2YXRlIEZpbGVOYW1lTWF0Y2hlcihMaXN0PEhlYWQ+IGhlYWRzU3RhcnRWYWx1ZSkgewogCQl0aGlzKGhlYWRzU3RhcnRWYWx1ZSwgaGVhZHNTdGFydFZhbHVlKTsKIAl9CiAKQEAgLTMxNSw3ICszMTUsNyBAQAogCSAqIEBwYXJhbSBjIG5ldyBjaGFyYWN0ZXIgdG8gYXBwZW5kCiAJICogQHJldHVybiB0cnVlIHRvIGNvbnRpbnVlLCBmYWxzZSBpZiB0aGUgbWF0Y2hlciBjYW4gc3RvcCBhcHBlbmRpbmcKIAkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZXh0ZW5kU3RyaW5nVG9NYXRjaEJ5T25lQ2hhcmFjdGVyKGZpbmFsIGNoYXIgYykgeworCXByaXZhdGUgYm9vbGVhbiBleHRlbmRTdHJpbmdUb01hdGNoQnlPbmVDaGFyYWN0ZXIoY2hhciBjKSB7CiAJCWZpbmFsIExpc3Q8SGVhZD4gbmV3SGVhZHMgPSBsaXN0Rm9yTG9jYWxVc2VhZ2U7CiAJCW5ld0hlYWRzLmNsZWFyKCk7CiAJCUxpc3Q8SGVhZD4gbGFzdEFkZGVkSGVhZHMgPSBudWxsOwpAQCAtMzU3LDcgKzM1Nyw3IEBACiAJICogICAgICAgICAgICBleHRlbmRzIHRoZSBzdHJpbmcgd2hpY2ggaXMgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBwYXR0ZXJucyBvZgogCSAqICAgICAgICAgICAgdGhpcyBjbGFzcy4KIAkgKi8KLQlwdWJsaWMgdm9pZCBhcHBlbmQoZmluYWwgU3RyaW5nIHN0cmluZ1RvTWF0Y2gpIHsKKwlwdWJsaWMgdm9pZCBhcHBlbmQoU3RyaW5nIHN0cmluZ1RvTWF0Y2gpIHsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmdUb01hdGNoLmxlbmd0aCgpOyBpKyspIHsKIAkJCWZpbmFsIGNoYXIgYyA9IHN0cmluZ1RvTWF0Y2guY2hhckF0KGkpOwogCQkJaWYgKCFleHRlbmRTdHJpbmdUb01hdGNoQnlPbmVDaGFyYWN0ZXIoYykpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ZubWF0Y2gvR3JvdXBIZWFkLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ZubWF0Y2gvR3JvdXBIZWFkLmphdmEKaW5kZXggOTY1ZDkwMC4uMWRjNTkzMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9mbm1hdGNoL0dyb3VwSGVhZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZm5tYXRjaC9Hcm91cEhlYWQuamF2YQpAQCAtNjEsNyArNjEsNyBAQAogCiAJcHJpdmF0ZSBmaW5hbCBib29sZWFuIGludmVyc2U7CiAKLQlHcm91cEhlYWQoU3RyaW5nIHBhdHRlcm4sIGZpbmFsIFN0cmluZyB3aG9sZVBhdHRlcm4pCisJR3JvdXBIZWFkKFN0cmluZyBwYXR0ZXJuLCBTdHJpbmcgd2hvbGVQYXR0ZXJuKQogCQkJdGhyb3dzIEludmFsaWRQYXR0ZXJuRXhjZXB0aW9uIHsKIAkJc3VwZXIoZmFsc2UpOwogCQl0aGlzLmNoYXJhY3RlckNsYXNzZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKQEAgLTEzMiw3ICsxMzIsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBtYXRjaGVzKGZpbmFsIGNoYXIgYykgeworCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIG1hdGNoZXMoY2hhciBjKSB7CiAJCWZvciAoQ2hhcmFjdGVyUGF0dGVybiBwYXR0ZXJuIDogY2hhcmFjdGVyQ2xhc3NlcykgewogCQkJaWYgKHBhdHRlcm4ubWF0Y2hlcyhjKSkgewogCQkJCXJldHVybiAhaW52ZXJzZTsKQEAgLTIxNCw3ICsyMTQsNyBAQAogCXByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIE9uZUNoYXJhY3RlclBhdHRlcm4gaW1wbGVtZW50cyBDaGFyYWN0ZXJQYXR0ZXJuIHsKIAkJcHJpdmF0ZSBjaGFyIGV4cGVjdGVkQ2hhcmFjdGVyOwogCi0JCU9uZUNoYXJhY3RlclBhdHRlcm4oZmluYWwgY2hhciBjKSB7CisJCU9uZUNoYXJhY3RlclBhdHRlcm4oY2hhciBjKSB7CiAJCQl0aGlzLmV4cGVjdGVkQ2hhcmFjdGVyID0gYzsKIAkJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ZubWF0Y2gvUmVzdHJpY3RlZFdpbGRDYXJkSGVhZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9mbm1hdGNoL1Jlc3RyaWN0ZWRXaWxkQ2FyZEhlYWQuamF2YQppbmRleCBjMTMyZTI4Li40NWU2ZWQyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ZubWF0Y2gvUmVzdHJpY3RlZFdpbGRDYXJkSGVhZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZm5tYXRjaC9SZXN0cmljdGVkV2lsZENhcmRIZWFkLmphdmEKQEAgLTQ3LDE0ICs0NywxNCBAQAogZmluYWwgY2xhc3MgUmVzdHJpY3RlZFdpbGRDYXJkSGVhZCBleHRlbmRzIEFic3RyYWN0SGVhZCB7CiAJcHJpdmF0ZSBmaW5hbCBjaGFyIGV4Y2x1ZGVkQ2hhcmFjdGVyOwogCi0JUmVzdHJpY3RlZFdpbGRDYXJkSGVhZChmaW5hbCBjaGFyIGV4Y2x1ZGVkQ2hhcmFjdGVyLCBmaW5hbCBib29sZWFuIHN0YXIpIHsKKwlSZXN0cmljdGVkV2lsZENhcmRIZWFkKGNoYXIgZXhjbHVkZWRDaGFyYWN0ZXIsIGJvb2xlYW4gc3RhcikgewogCQlzdXBlcihzdGFyKTsKIAkJdGhpcy5leGNsdWRlZENoYXJhY3RlciA9IGV4Y2x1ZGVkQ2hhcmFjdGVyOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gbWF0Y2hlcyhmaW5hbCBjaGFyIGMpIHsKKwlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBtYXRjaGVzKGNoYXIgYykgewogCQlyZXR1cm4gYyAhPSBleGNsdWRlZENoYXJhY3RlcjsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZm5tYXRjaC9XaWxkQ2FyZEhlYWQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZm5tYXRjaC9XaWxkQ2FyZEhlYWQuamF2YQppbmRleCBjODA2ZTIzLi4wNzM2MmFhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ZubWF0Y2gvV2lsZENhcmRIZWFkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9mbm1hdGNoL1dpbGRDYXJkSGVhZC5qYXZhCkBAIC01MSw3ICs1MSw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIG1hdGNoZXMoZmluYWwgY2hhciBjKSB7CisJcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gbWF0Y2hlcyhjaGFyIGMpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlcG9Db21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVwb0NvbW1hbmQuamF2YQppbmRleCA4YjhkZjg3Li44MGZkM2NmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVwb0NvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVwb0NvbW1hbmQuamF2YQpAQCAtNDEzLDcgKzQxMyw3IEBACiAJICogICAgICAgICAgICBhIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Qcm9ncmVzc01vbml0b3J9CiAJICogQHJldHVybiB0aGlzIGNvbW1hbmQKIAkgKi8KLQlwdWJsaWMgUmVwb0NvbW1hbmQgc2V0UHJvZ3Jlc3NNb25pdG9yKGZpbmFsIFByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJcHVibGljIFJlcG9Db21tYW5kIHNldFByb2dyZXNzTW9uaXRvcihQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewogCQl0aGlzLm1vbml0b3IgPSBtb25pdG9yOwogCQlyZXR1cm4gdGhpczsKIAl9CkBAIC00NDgsNyArNDQ4LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBhdXRob3IncyB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuUGVyc29uSWRlbnR9CiAJICogQHJldHVybiB0aGlzIGNvbW1hbmQKIAkgKi8KLQlwdWJsaWMgUmVwb0NvbW1hbmQgc2V0QXV0aG9yKGZpbmFsIFBlcnNvbklkZW50IGF1dGhvcikgeworCXB1YmxpYyBSZXBvQ29tbWFuZCBzZXRBdXRob3IoUGVyc29uSWRlbnQgYXV0aG9yKSB7CiAJCXRoaXMuYXV0aG9yID0gYXV0aG9yOwogCQlyZXR1cm4gdGhpczsKIAl9CkBAIC00NjMsNyArNDYzLDcgQEAKIAkgKiAgICAgICAgICAgIG9iamVjdC4KIAkgKiBAcmV0dXJuIHRoaXMgY29tbWFuZAogCSAqLwotCXB1YmxpYyBSZXBvQ29tbWFuZCBzZXRSZW1vdGVSZWFkZXIoZmluYWwgUmVtb3RlUmVhZGVyIGNhbGxiYWNrKSB7CisJcHVibGljIFJlcG9Db21tYW5kIHNldFJlbW90ZVJlYWRlcihSZW1vdGVSZWFkZXIgY2FsbGJhY2spIHsKIAkJdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrOwogCQlyZXR1cm4gdGhpczsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVwb1Byb2plY3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvUHJvamVjdC5qYXZhCmluZGV4IGU4Mjc2MTIuLjdiYTgzYzcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvUHJvamVjdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvUHJvamVjdC5qYXZhCkBAIC0xMzEsMTggKzEzMSwxMCBAQAogCQkJRmlsZSBzcmNGaWxlID0gbmV3IEZpbGUocmVwby5nZXRXb3JrVHJlZSgpLAogCQkJCQlwYXRoICsgIi8iICsgc3JjKTsgLy8kTk9OLU5MUy0xJAogCQkJRmlsZSBkZXN0RmlsZSA9IG5ldyBGaWxlKHJlcG8uZ2V0V29ya1RyZWUoKSwgZGVzdCk7Ci0JCQlGaWxlSW5wdXRTdHJlYW0gaW5wdXQgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNyY0ZpbGUpOwotCQkJdHJ5IHsKLQkJCQlGaWxlT3V0cHV0U3RyZWFtIG91dHB1dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3RGaWxlKTsKLQkJCQl0cnkgewotCQkJCQlGaWxlQ2hhbm5lbCBjaGFubmVsID0gaW5wdXQuZ2V0Q2hhbm5lbCgpOwotCQkJCQlvdXRwdXQuZ2V0Q2hhbm5lbCgpLnRyYW5zZmVyRnJvbSgKLQkJCQkJCQljaGFubmVsLCAwLCBjaGFubmVsLnNpemUoKSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJb3V0cHV0LmNsb3NlKCk7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlpbnB1dC5jbG9zZSgpOworCQkJdHJ5IChGaWxlSW5wdXRTdHJlYW0gaW5wdXQgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNyY0ZpbGUpOworCQkJCQlGaWxlT3V0cHV0U3RyZWFtIG91dHB1dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3RGaWxlKSkgeworCQkJCUZpbGVDaGFubmVsIGNoYW5uZWwgPSBpbnB1dC5nZXRDaGFubmVsKCk7CisJCQkJb3V0cHV0LmdldENoYW5uZWwoKS50cmFuc2ZlckZyb20oY2hhbm5lbCwgMCwgY2hhbm5lbC5zaXplKCkpOwogCQkJfQogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ob29rcy9HaXRIb29rLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2hvb2tzL0dpdEhvb2suamF2YQppbmRleCBhZDQzZTJjLi44YTYxZDFiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2hvb2tzL0dpdEhvb2suamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2hvb2tzL0dpdEhvb2suamF2YQpAQCAtNDIsNyArNDIsNyBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaG9va3M7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0xNTgsNyArMTU4LDcgQEAKIAkJUHJpbnRTdHJlYW0gaG9va0VyclJlZGlyZWN0ID0gbnVsbDsKIAkJdHJ5IHsKIAkJCWhvb2tFcnJSZWRpcmVjdCA9IG5ldyBQcmludFN0cmVhbShlcnJvckJ5dGVBcnJheSwgZmFsc2UsCi0JCQkJCVVURl84Lm5hbWUoKSk7CisJCQkJCUNIQVJTRVQubmFtZSgpKTsKIAkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CiAJCQkvLyBVVEYtOCBpcyBndWFyYW50ZWVkIHRvIGJlIGF2YWlsYWJsZQogCQl9CkBAIC0xNjcsNyArMTY3LDcgQEAKIAkJCQlob29rRXJyUmVkaXJlY3QsIGdldFN0ZGluQXJncygpKTsKIAkJaWYgKHJlc3VsdC5pc0V4ZWN1dGVkV2l0aEVycm9yKCkpIHsKIAkJCXRocm93IG5ldyBBYm9ydGVkQnlIb29rRXhjZXB0aW9uKAotCQkJCQluZXcgU3RyaW5nKGVycm9yQnl0ZUFycmF5LnRvQnl0ZUFycmF5KCksIFVURl84KSwKKwkJCQkJbmV3IFN0cmluZyhlcnJvckJ5dGVBcnJheS50b0J5dGVBcnJheSgpLCBDSEFSU0VUKSwKIAkJCQkJZ2V0SG9va05hbWUoKSwgcmVzdWx0LmdldEV4aXRDb2RlKCkpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ob29rcy9Ib29rcy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ob29rcy9Ib29rcy5qYXZhCmluZGV4IDc5Mzk1ZWQuLmI4MDFkNjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaG9va3MvSG9va3MuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2hvb2tzL0hvb2tzLmphdmEKQEAgLTExNSw3ICsxMTUsMTEgQEAKIAkJCQkJb3V0cHV0U3RyZWFtKTsKIAkJCWlmIChob29rICE9IG51bGwpIHsKIAkJCQlpZiAoaG9vay5pc05hdGl2ZUhvb2tQcmVzZW50KCkpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0CisJCQkJCVByaW50U3RyZWFtIHBzID0gb3V0cHV0U3RyZWFtOworCQkJCQlpZiAocHMgPT0gbnVsbCkgeworCQkJCQkJcHMgPSBTeXN0ZW0ub3V0OworCQkJCQl9CisJCQkJCXBzLnByaW50bG4oTWVzc2FnZUZvcm1hdAogCQkJCQkJCS5mb3JtYXQoSkdpdFRleHQuZ2V0KCkubGZzSG9va0NvbmZsaWN0LCByZXBvKSk7CiAJCQkJfQogCQkJCXJldHVybiBob29rOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pZ25vcmUvSWdub3JlTm9kZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pZ25vcmUvSWdub3JlTm9kZS5qYXZhCmluZGV4IDEyMjRkZjQuLmQ1NzBmZGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaWdub3JlL0lnbm9yZU5vZGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2lnbm9yZS9JZ25vcmVOb2RlLmphdmEKQEAgLTE2MywzNSArMTYzLDYgQEAKIAkgKiAgICAgICAgICAgICh1c2VzICcvJyBhbmQgbm90ICdcJykuCiAJICogQHBhcmFtIGlzRGlyZWN0b3J5CiAJICogICAgICAgICAgICB0cnVlIGlmIHRoZSB0YXJnZXQgaXRlbSBpcyBhIGRpcmVjdG9yeS4KLQkgKiBAcGFyYW0gbmVnYXRlRmlyc3RNYXRjaAotCSAqICAgICAgICAgICAgdHJ1ZSBpZiB0aGUgZmlyc3QgbWF0Y2ggc2hvdWxkIGJlIG5lZ2F0ZWQKLQkgKiBAZGVwcmVjYXRlZCBuZWdhdGVGaXJzdE1hdGNoIGlzIG5vdCBob25vcmVkIGFueW1vcmUKLQkgKiBAcmV0dXJuIHN0YXR1cyBvZiB0aGUgcGF0aC4KLQkgKiBAc2luY2UgMy42Ci0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgTWF0Y2hSZXN1bHQgaXNJZ25vcmVkKFN0cmluZyBlbnRyeVBhdGgsIGJvb2xlYW4gaXNEaXJlY3RvcnksCi0JCQlib29sZWFuIG5lZ2F0ZUZpcnN0TWF0Y2gpIHsKLQkJZmluYWwgQm9vbGVhbiByZXN1bHQgPSBjaGVja0lnbm9yZWQoZW50cnlQYXRoLCBpc0RpcmVjdG9yeSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5lZ2F0ZUZpcnN0TWF0Y2gKLQkJCQkJPyBNYXRjaFJlc3VsdC5DSEVDS19QQVJFTlRfTkVHQVRFX0ZJUlNUX01BVENICi0JCQkJCTogTWF0Y2hSZXN1bHQuQ0hFQ0tfUEFSRU5UOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdC5ib29sZWFuVmFsdWUoKSA/IE1hdGNoUmVzdWx0LklHTk9SRUQKLQkJCQk6IE1hdGNoUmVzdWx0Lk5PVF9JR05PUkVEOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZSBpZiBhbiBlbnRyeSBwYXRoIG1hdGNoZXMgYW4gaWdub3JlIHJ1bGUuCi0JICoKLQkgKiBAcGFyYW0gZW50cnlQYXRoCi0JICogICAgICAgICAgICB0aGUgcGF0aCB0byB0ZXN0LiBUaGUgcGF0aCBtdXN0IGJlIHJlbGF0aXZlIHRvIHRoaXMgaWdub3JlCi0JICogICAgICAgICAgICBub2RlJ3Mgb3duIHJlcG9zaXRvcnkgcGF0aCwgYW5kIGluIHJlcG9zaXRvcnkgcGF0aCBmb3JtYXQKLQkgKiAgICAgICAgICAgICh1c2VzICcvJyBhbmQgbm90ICdcJykuCi0JICogQHBhcmFtIGlzRGlyZWN0b3J5Ci0JICogICAgICAgICAgICB0cnVlIGlmIHRoZSB0YXJnZXQgaXRlbSBpcyBhIGRpcmVjdG9yeS4KIAkgKiBAcmV0dXJuIEJvb2xlYW4uVFJVRSwgaWYgdGhlIGVudHJ5IGlzIGlnbm9yZWQ7IEJvb2xlYW4uRkFMU0UsIGlmIHRoZQogCSAqICAgICAgICAgZW50cnkgaXMgZm9yY2VkIHRvIGJlIG5vdCBpZ25vcmVkIChuZWdhdGVkIG1hdGNoKTsgb3IgbnVsbCwgaWYKIAkgKiAgICAgICAgIHVuZGV0ZXJtaW5lZApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9KR2l0VGV4dC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9KR2l0VGV4dC5qYXZhCmluZGV4IDZmMzA2YjguLjk0YjRlMDMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvSkdpdFRleHQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL0pHaXRUZXh0LmphdmEKQEAgLTI4Nyw2ICsyODcsOCBAQAogCS8qKiovIHB1YmxpYyBTdHJpbmcgY3JlZGVudGlhbFVzZXJuYW1lOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgZGFlbW9uQWxyZWFkeVJ1bm5pbmc7CiAJLyoqKi8gcHVibGljIFN0cmluZyBkYXlzQWdvOworCS8qKiovIHB1YmxpYyBTdHJpbmcgZGVlcGVuTm90V2l0aERlZXBlbjsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGRlZXBlblNpbmNlV2l0aERlZXBlbjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGRlbGV0ZUJyYW5jaFVuZXhwZWN0ZWRSZXN1bHQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyBkZWxldGVGaWxlRmFpbGVkOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgZGVsZXRlUmVxdWlyZXNaZXJvTmV3SWQ7CkBAIC0zNzIsNiArMzc0LDcgQEAKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGZpbGVNb2RlTm90U2V0Rm9yUGF0aDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGZpbHRlckV4ZWN1dGlvbkZhaWxlZDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGZpbHRlckV4ZWN1dGlvbkZhaWxlZFJjOworCS8qKiovIHB1YmxpYyBTdHJpbmcgZmlsdGVyUmVxdWlyZXNDYXBhYmlsaXR5OwogCS8qKiovIHB1YmxpYyBTdHJpbmcgZmluZGluZ0dhcmJhZ2U7CiAJLyoqKi8gcHVibGljIFN0cmluZyBmbGFnSXNEaXNwb3NlZDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGZsYWdOb3RGcm9tVGhpczsKQEAgLTQyMyw2ICs0MjYsNyBAQAogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW52YWxpZERlcHRoOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW52YWxpZEVuY3J5cHRpb247CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkRXhwYW5kV2lsZGNhcmQ7CisJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkRmlsdGVyOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW52YWxpZEdpdGRpclJlZjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWRHaXRUeXBlOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW52YWxpZElkOwpAQCAtNDU2LDYgKzQ2MCw3IEBACiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkU3lzdGVtUHJvcGVydHk7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkVGFnT3B0aW9uOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW52YWxpZFRpbWVvdXQ7CisJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkVGltZXN0YW1wOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW52YWxpZFRpbWVVbml0VmFsdWUyOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW52YWxpZFRpbWVVbml0VmFsdWUzOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW52YWxpZFRyZWVaZXJvTGVuZ3RoTmFtZTsKQEAgLTY4OCw2ICs2OTMsNyBAQAogCS8qKiovIHB1YmxpYyBTdHJpbmcgc291cmNlUmVmRG9lc250UmVzb2x2ZVRvQW55T2JqZWN0OwogCS8qKiovIHB1YmxpYyBTdHJpbmcgc291cmNlUmVmTm90U3BlY2lmaWVkRm9yUmVmc3BlYzsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHNxdWFzaENvbW1pdE5vdFVwZGF0aW5nSEVBRDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHNzaENvbW1hbmRGYWlsZWQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyBzc2hVc2VyTmFtZUVycm9yOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgc3NsRmFpbHVyZUV4Y2VwdGlvbk1lc3NhZ2U7CiAJLyoqKi8gcHVibGljIFN0cmluZyBzc2xGYWlsdXJlSW5mbzsKQEAgLTczMCw2ICs3MzYsNyBAQAogCS8qKiovIHB1YmxpYyBTdHJpbmcgdGltZUlzVW5jZXJ0YWluOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgdGltZXJBbHJlYWR5VGVybWluYXRlZDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHRvb01hbnlDb21tYW5kczsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHRvb01hbnlGaWx0ZXJzOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgdG9vTWFueUluY2x1ZGVSZWN1cnNpb25zOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgdG9wb2xvZ2ljYWxTb3J0UmVxdWlyZWQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyB0cmFuc3BvcnRFeGNlcHRpb25CYWRSZWY7CkBAIC03NzEsNiArNzc4LDcgQEAKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHVuZXhwZWN0ZWRFb2ZJblBhY2s7CiAJLyoqKi8gcHVibGljIFN0cmluZyB1bmV4cGVjdGVkSHVua1RyYWlsZXI7CiAJLyoqKi8gcHVibGljIFN0cmluZyB1bmV4cGVjdGVkT2RkUmVzdWx0OworCS8qKiovIHB1YmxpYyBTdHJpbmcgdW5leHBlY3RlZFBhY2tldExpbmU7CiAJLyoqKi8gcHVibGljIFN0cmluZyB1bmV4cGVjdGVkUmVmUmVwb3J0OwogCS8qKiovIHB1YmxpYyBTdHJpbmcgdW5leHBlY3RlZFJlcG9ydExpbmU7CiAJLyoqKi8gcHVibGljIFN0cmluZyB1bmV4cGVjdGVkUmVwb3J0TGluZTI7CkBAIC03ODUsNiArNzkzLDcgQEAKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHVua25vd25PYmplY3RUeXBlMjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHVua25vd25SZXBvc2l0b3J5Rm9ybWF0OwogCS8qKiovIHB1YmxpYyBTdHJpbmcgdW5rbm93blJlcG9zaXRvcnlGb3JtYXQyOworCS8qKiovIHB1YmxpYyBTdHJpbmcgdW5rbm93blRyYW5zcG9ydENvbW1hbmQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyB1bmtub3duWmxpYkVycm9yOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgdW5sb2NrTG9ja0ZpbGVGYWlsZWQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyB1bm1lcmdlZFBhdGg7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2tldGNoL0tldGNoU3lzdGVtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2tldGNoL0tldGNoU3lzdGVtLmphdmEKaW5kZXggMTkwOGQ2Yy4uZDFkNGY2NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9rZXRjaC9LZXRjaFN5c3RlbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwva2V0Y2gvS2V0Y2hTeXN0ZW0uamF2YQpAQCAtMjYwLDcgKzI2MCw3IEBACiAJICogQHRocm93cyBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBhIGZvbGxvd2VyIGNvbmZpZ3VyYXRpb24gY29udGFpbnMgYW4gdW5zdXBwb3J0ZWQgVVJJLgogCSAqLwotCXB1YmxpYyBLZXRjaExlYWRlciBjcmVhdGVMZWFkZXIoZmluYWwgUmVwb3NpdG9yeSByZXBvKQorCXB1YmxpYyBLZXRjaExlYWRlciBjcmVhdGVMZWFkZXIoUmVwb3NpdG9yeSByZXBvKQogCQkJdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CiAJCUtldGNoTGVhZGVyIGxlYWRlciA9IG5ldyBLZXRjaExlYWRlcih0aGlzKSB7CiAJCQlAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwva2V0Y2gvTG9jYWxSZXBsaWNhLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2tldGNoL0xvY2FsUmVwbGljYS5qYXZhCmluZGV4IDljMzdhOTAuLjdkZGRlNjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwva2V0Y2gvTG9jYWxSZXBsaWNhLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9rZXRjaC9Mb2NhbFJlcGxpY2EuamF2YQpAQCAtMTIyLDcgKzEyMiw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHN0YXJ0UHVzaChmaW5hbCBSZXBsaWNhUHVzaFJlcXVlc3QgcmVxKSB7CisJcHJvdGVjdGVkIHZvaWQgc3RhcnRQdXNoKFJlcGxpY2FQdXNoUmVxdWVzdCByZXEpIHsKIAkJZ2V0U3lzdGVtKCkuZ2V0RXhlY3V0b3IoKS5leGVjdXRlKG5ldyBSdW5uYWJsZSgpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgcnVuKCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9rZXRjaC9SZW1vdGVHaXRSZXBsaWNhLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2tldGNoL1JlbW90ZUdpdFJlcGxpY2EuamF2YQppbmRleCA2NzRkYTFmLi5iNjEyNzRlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2tldGNoL1JlbW90ZUdpdFJlcGxpY2EuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2tldGNoL1JlbW90ZUdpdFJlcGxpY2EuamF2YQpAQCAtMTM4LDcgKzEzOCw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHN0YXJ0UHVzaChmaW5hbCBSZXBsaWNhUHVzaFJlcXVlc3QgcmVxKSB7CisJcHJvdGVjdGVkIHZvaWQgc3RhcnRQdXNoKFJlcGxpY2FQdXNoUmVxdWVzdCByZXEpIHsKIAkJZ2V0U3lzdGVtKCkuZ2V0RXhlY3V0b3IoKS5leGVjdXRlKG5ldyBSdW5uYWJsZSgpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgcnVuKCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNCbG9ja0NhY2hlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0Jsb2NrQ2FjaGUuamF2YQppbmRleCAxNGRjODBmLi40Njg3OTUyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0Jsb2NrQ2FjaGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0Jsb2NrQ2FjaGUuamF2YQpAQCAtMTgxLDcgKzE4MSw3IEBACiAJcHJpdmF0ZSBSZWYgY2xvY2tIYW5kOwogCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBEZnNCbG9ja0NhY2hlKGZpbmFsIERmc0Jsb2NrQ2FjaGVDb25maWcgY2ZnKSB7CisJcHJpdmF0ZSBEZnNCbG9ja0NhY2hlKERmc0Jsb2NrQ2FjaGVDb25maWcgY2ZnKSB7CiAJCXRhYmxlU2l6ZSA9IHRhYmxlU2l6ZShjZmcpOwogCQlpZiAodGFibGVTaXplIDwgMSkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkudFNpemVNdXN0QmVHcmVhdGVyT3JFcXVhbDEpOwpAQCAtMzMwLDcgKzMzMCw3IEBACiAJCXJldHVybiBibG9ja1NpemU7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgaW50IHRhYmxlU2l6ZShmaW5hbCBEZnNCbG9ja0NhY2hlQ29uZmlnIGNmZykgeworCXByaXZhdGUgc3RhdGljIGludCB0YWJsZVNpemUoRGZzQmxvY2tDYWNoZUNvbmZpZyBjZmcpIHsKIAkJZmluYWwgaW50IHdzeiA9IGNmZy5nZXRCbG9ja1NpemUoKTsKIAkJZmluYWwgbG9uZyBsaW1pdCA9IGNmZy5nZXRCbG9ja0xpbWl0KCk7CiAJCWlmICh3c3ogPD0gMCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzQmxvY2tDYWNoZUNvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNCbG9ja0NhY2hlQ29uZmlnLmphdmEKaW5kZXggY2Q3OTAxYi4uZGQ3Y2I4OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNCbG9ja0NhY2hlQ29uZmlnLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNCbG9ja0NhY2hlQ29uZmlnLmphdmEKQEAgLTEwNiw3ICsxMDYsNyBAQAogCSAqICAgICAgICAgICAgcGFjayBmaWxlIGRhdGE7IG11c3QgYmUgcG9zaXRpdmUuCiAJICogQHJldHVybiB7QGNvZGUgdGhpc30KIAkgKi8KLQlwdWJsaWMgRGZzQmxvY2tDYWNoZUNvbmZpZyBzZXRCbG9ja0xpbWl0KGZpbmFsIGxvbmcgbmV3TGltaXQpIHsKKwlwdWJsaWMgRGZzQmxvY2tDYWNoZUNvbmZpZyBzZXRCbG9ja0xpbWl0KGxvbmcgbmV3TGltaXQpIHsKIAkJaWYgKG5ld0xpbWl0IDw9IDApIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCiAJCQkJCUpHaXRUZXh0LmdldCgpLmJsb2NrTGltaXROb3RQb3NpdGl2ZSwKQEAgLTEzNSw3ICsxMzUsNyBAQAogCSAqICAgICAgICAgICAgVGhlIHZhbHVlIG11c3QgYmUgYSBwb3dlciBvZiAyLgogCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CiAJICovCi0JcHVibGljIERmc0Jsb2NrQ2FjaGVDb25maWcgc2V0QmxvY2tTaXplKGZpbmFsIGludCBuZXdTaXplKSB7CisJcHVibGljIERmc0Jsb2NrQ2FjaGVDb25maWcgc2V0QmxvY2tTaXplKGludCBuZXdTaXplKSB7CiAJCWludCBzaXplID0gTWF0aC5tYXgoNTEyLCBuZXdTaXplKTsKIAkJaWYgKChzaXplICYgKHNpemUgLSAxKSkgIT0gMCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKQEAgLTIwNiw3ICsyMDYsNyBAQAogCSAqICAgICAgICAgICAgY29uZmlndXJhdGlvbiB0byByZWFkIHByb3BlcnRpZXMgZnJvbS4KIAkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQogCSAqLwotCXB1YmxpYyBEZnNCbG9ja0NhY2hlQ29uZmlnIGZyb21Db25maWcoZmluYWwgQ29uZmlnIHJjKSB7CisJcHVibGljIERmc0Jsb2NrQ2FjaGVDb25maWcgZnJvbUNvbmZpZyhDb25maWcgcmMpIHsKIAkJbG9uZyBjZmdCbG9ja0xpbWl0ID0gcmMuZ2V0TG9uZygKIAkJCQlDT05GSUdfQ09SRV9TRUNUSU9OLAogCQkJCUNPTkZJR19ERlNfU0VDVElPTiwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzR2FyYmFnZUNvbGxlY3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNHYXJiYWdlQ29sbGVjdG9yLmphdmEKaW5kZXggNjk5ODlhNC4uY2ExMWZiOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNHYXJiYWdlQ29sbGVjdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNHYXJiYWdlQ29sbGVjdG9yLmphdmEKQEAgLTQwMyw3ICs0MDMsNyBAQAogCX0KIAogCXByaXZhdGUgQ29sbGVjdGlvbjxSZWY+IGdldEFsbFJlZnMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlDb2xsZWN0aW9uPFJlZj4gcmVmcyA9IHJlZmRiLmdldFJlZnMoUmVmRGF0YWJhc2UuQUxMKS52YWx1ZXMoKTsKKwkJQ29sbGVjdGlvbjxSZWY+IHJlZnMgPSByZWZkYi5nZXRSZWZzKCk7CiAJCUxpc3Q8UmVmPiBhZGRsID0gcmVmZGIuZ2V0QWRkaXRpb25hbFJlZnMoKTsKIAkJaWYgKCFhZGRsLmlzRW1wdHkoKSkgewogCQkJTGlzdDxSZWY+IGFsbCA9IG5ldyBBcnJheUxpc3Q8PihyZWZzLnNpemUoKSArIGFkZGwuc2l6ZSgpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzSW5zZXJ0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzSW5zZXJ0ZXIuamF2YQppbmRleCBlYjBhNTI3Li4wZDllMmMxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0luc2VydGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNJbnNlcnRlci5qYXZhCkBAIC02OCw2ICs2OCw3IEBACiBpbXBvcnQgamF2YS51dGlsLnppcC5JbmZsYXRlcjsKIGltcG9ydCBqYXZhLnV0aWwuemlwLkluZmxhdGVySW5wdXRTdHJlYW07CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zLk51bGxhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkNvcnJ1cHRPYmplY3RFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5MYXJnZU9iamVjdEV4Y2VwdGlvbjsKQEAgLTMwOSw2ICszMTAsMTUgQEAKIAkJQ29sbGVjdGlvbnMuc29ydChvYmplY3RMaXN0KTsKIAl9CiAKKwlATnVsbGFibGUKKwlwcml2YXRlIFRlbXBvcmFyeUJ1ZmZlci5IZWFwIG1heWJlR2V0VGVtcG9yYXJ5QnVmZmVyKAorCQkJTGlzdDxQYWNrZWRPYmplY3RJbmZvPiBsaXN0KSB7CisJCWlmIChsaXN0LnNpemUoKSA8PSA1ODAwMCkgeworCQkJcmV0dXJuIG5ldyBUZW1wb3JhcnlCdWZmZXIuSGVhcCgyIDw8IDIwKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKIAlQYWNrSW5kZXggd3JpdGVQYWNrSW5kZXgoRGZzUGFja0Rlc2NyaXB0aW9uIHBhY2ssIGJ5dGVbXSBwYWNrSGFzaCwKIAkJCUxpc3Q8UGFja2VkT2JqZWN0SW5mbz4gbGlzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcGFjay5zZXRJbmRleFZlcnNpb24oSU5ERVhfVkVSU0lPTik7CkBAIC0zMTcsMjcgKzMyNywyMCBAQAogCQkvLyBJZiB0aGVyZSBhcmUgbGVzcyB0aGFuIDU4LDAwMCBvYmplY3RzLCB0aGUgZW50aXJlIGluZGV4IGZpdHMgaW4gdW5kZXIKIAkJLy8gMiBNaUIuIENhbGxlcnMgd2lsbCBwcm9iYWJseSBuZWVkIHRoZSBpbmRleCBpbW1lZGlhdGVseSwgc28gYnVmZmVyCiAJCS8vIHRoZSBpbmRleCBpbiBwcm9jZXNzIGFuZCBsb2FkIGZyb20gdGhlIGJ1ZmZlci4KLQkJVGVtcG9yYXJ5QnVmZmVyLkhlYXAgYnVmID0gbnVsbDsKIAkJUGFja0luZGV4IHBhY2tJbmRleCA9IG51bGw7Ci0JCWlmIChsaXN0LnNpemUoKSA8PSA1ODAwMCkgewotCQkJYnVmID0gbmV3IFRlbXBvcmFyeUJ1ZmZlci5IZWFwKDIgPDwgMjApOwotCQkJaW5kZXgoYnVmLCBwYWNrSGFzaCwgbGlzdCk7Ci0JCQlwYWNrSW5kZXggPSBQYWNrSW5kZXgucmVhZChidWYub3BlbklucHV0U3RyZWFtKCkpOwotCQl9Ci0KLQkJdHJ5IChEZnNPdXRwdXRTdHJlYW0gb3MgPSBkYi53cml0ZUZpbGUocGFjaywgSU5ERVgpKSB7Ci0JCQlDb3VudGluZ091dHB1dFN0cmVhbSBjbnQgPSBuZXcgQ291bnRpbmdPdXRwdXRTdHJlYW0ob3MpOwotCQkJaWYgKGJ1ZiAhPSBudWxsKQorCQl0cnkgKFRlbXBvcmFyeUJ1ZmZlci5IZWFwIGJ1ZiA9IG1heWJlR2V0VGVtcG9yYXJ5QnVmZmVyKGxpc3QpOworCQkJCURmc091dHB1dFN0cmVhbSBvcyA9IGRiLndyaXRlRmlsZShwYWNrLCBJTkRFWCk7CisJCQkJQ291bnRpbmdPdXRwdXRTdHJlYW0gY250ID0gbmV3IENvdW50aW5nT3V0cHV0U3RyZWFtKG9zKSkgeworCQkJaWYgKGJ1ZiAhPSBudWxsKSB7CisJCQkJaW5kZXgoYnVmLCBwYWNrSGFzaCwgbGlzdCk7CisJCQkJcGFja0luZGV4ID0gUGFja0luZGV4LnJlYWQoYnVmLm9wZW5JbnB1dFN0cmVhbSgpKTsKIAkJCQlidWYud3JpdGVUbyhjbnQsIG51bGwpOwotCQkJZWxzZQorCQkJfSBlbHNlIHsKIAkJCQlpbmRleChjbnQsIHBhY2tIYXNoLCBsaXN0KTsKKwkJCX0KIAkJCXBhY2suYWRkRmlsZUV4dChJTkRFWCk7CiAJCQlwYWNrLnNldEJsb2NrU2l6ZShJTkRFWCwgb3MuYmxvY2tTaXplKCkpOwogCQkJcGFjay5zZXRGaWxlU2l6ZShJTkRFWCwgY250LmdldENvdW50KCkpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGJ1ZiAhPSBudWxsKSB7Ci0JCQkJYnVmLmNsb3NlKCk7Ci0JCQl9CiAJCX0KIAkJcmV0dXJuIHBhY2tJbmRleDsKIAl9CkBAIC00MDMsNyArNDA2LDcgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQloZHJCdWZbMF0gPSAoYnl0ZSkgYjsKIAkJCXdyaXRlKGhkckJ1ZiwgMCwgMSk7CiAJCX0KQEAgLTY2Niw2ICs2NjksNyBAQAogCiAJCUBPdmVycmlkZQogCQlwdWJsaWMgT2JqZWN0U3RyZWFtIG9wZW5TdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gRXhwbGljaXRseSBjbG9zZWQgYmVsb3cKIAkJCWZpbmFsIERmc1JlYWRlciBjdHggPSBkYi5uZXdSZWFkZXIoKTsKIAkJCWlmIChzcmNQYWNrICE9IHBhY2tLZXkpIHsKIAkJCQl0cnkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNPYmpEYXRhYmFzZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNPYmpEYXRhYmFzZS5qYXZhCmluZGV4IDQyYjFhNDcuLmNhNTRlZTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzT2JqRGF0YWJhc2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc09iakRhdGFiYXNlLmphdmEKQEAgLTQ5Nyw3ICs0OTcsNyBAQAogCQl9IHdoaWxlICghcGFja0xpc3QuY29tcGFyZUFuZFNldChvLCBuKSk7CiAJfQogCi0JUGFja0xpc3Qgc2NhblBhY2tzKGZpbmFsIFBhY2tMaXN0IG9yaWdpbmFsKSB0aHJvd3MgSU9FeGNlcHRpb24geworCVBhY2tMaXN0IHNjYW5QYWNrcyhQYWNrTGlzdCBvcmlnaW5hbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJUGFja0xpc3QgbywgbjsKIAkJc3luY2hyb25pemVkIChwYWNrTGlzdCkgewogCQkJZG8gewpAQCAtNTQ2LDcgKzU0Niw3IEBACiAJCQl9CiAJCX0KIAotCQlpZiAobmV3UGFja3MuaXNFbXB0eSgpKQorCQlpZiAobmV3UGFja3MuaXNFbXB0eSgpICYmIG5ld1JlZnRhYmxlcy5pc0VtcHR5KCkpCiAJCQlyZXR1cm4gbmV3IFBhY2tMaXN0SW1wbChOT19QQUNLUy5wYWNrcywgTk9fUEFDS1MucmVmdGFibGVzKTsKIAkJaWYgKCFmb3VuZE5ldykgewogCQkJb2xkLmNsZWFyRGlydHkoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzT2JqZWN0VG9QYWNrLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc09iamVjdFRvUGFjay5qYXZhCmluZGV4IDNhMDRkNzAuLjVmNGRlZTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzT2JqZWN0VG9QYWNrLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNPYmplY3RUb1BhY2suamF2YQpAQCAtNjAsNyArNjAsNyBAQAogCS8qKiBMZW5ndGggb2YgdGhlIGRhdGEgc2VjdGlvbiBvZiB0aGUgb2JqZWN0LiAqLwogCWxvbmcgbGVuZ3RoOwogCi0JRGZzT2JqZWN0VG9QYWNrKEFueU9iamVjdElkIHNyYywgZmluYWwgaW50IHR5cGUpIHsKKwlEZnNPYmplY3RUb1BhY2soQW55T2JqZWN0SWQgc3JjLCBpbnQgdHlwZSkgewogCQlzdXBlcihzcmMsIHR5cGUpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNQYWNrQ29tcGFjdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1BhY2tDb21wYWN0b3IuamF2YQppbmRleCBhYjc2MzMyLi5iNDNiOWIxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1BhY2tDb21wYWN0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1BhY2tDb21wYWN0b3IuamF2YQpAQCAtMjY4LDggKzI2OCw3IEBACiAJCXBjLnNldFJldXNlRGVsdGFzKHRydWUpOwogCQlwYy5zZXRSZXVzZU9iamVjdHModHJ1ZSk7CiAKLQkJUGFja1dyaXRlciBwdyA9IG5ldyBQYWNrV3JpdGVyKHBjLCBjdHgpOwotCQl0cnkgeworCQl0cnkgKFBhY2tXcml0ZXIgcHcgPSBuZXcgUGFja1dyaXRlcihwYywgY3R4KSkgewogCQkJcHcuc2V0RGVsdGFCYXNlQXNPZmZzZXQodHJ1ZSk7CiAJCQlwdy5zZXRSZXVzZURlbHRhQ29tbWl0cyhmYWxzZSk7CiAKQEAgLTI4NSw4ICsyODQsNiBAQAogCQkJCXdyaXRlSW5kZXgob2JqZGIsIG91dERlc2MsIHB3KTsKIAogCQkJCVBhY2tTdGF0aXN0aWNzIHN0YXRzID0gcHcuZ2V0U3RhdGlzdGljcygpOwotCQkJCXB3LmNsb3NlKCk7Ci0JCQkJcHcgPSBudWxsOwogCiAJCQkJb3V0RGVzYy5zZXRQYWNrU3RhdHMoc3RhdHMpOwogCQkJCW5ld1N0YXRzID0gc3RhdHM7CkBAIC0yOTYsMTAgKzI5Myw2IEBACiAJCQkJCW9iamRiLnJvbGxiYWNrUGFjayhDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG91dERlc2MpKTsKIAkJCQl9CiAJCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAocHcgIT0gbnVsbCkgewotCQkJCXB3LmNsb3NlKCk7Ci0JCQl9CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzUGFja0ZpbGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzUGFja0ZpbGUuamF2YQppbmRleCA3ZTM2MDQyLi4wNWI4ZjYxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1BhY2tGaWxlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNQYWNrRmlsZS5qYXZhCkBAIC0yMDksOCArMjA5LDcgQEAKIAkJCXRyeSB7CiAJCQkJY3R4LnN0YXRzLnJlYWRJZHgrKzsKIAkJCQlsb25nIHN0YXJ0ID0gU3lzdGVtLm5hbm9UaW1lKCk7Ci0JCQkJUmVhZGFibGVDaGFubmVsIHJjID0gY3R4LmRiLm9wZW5GaWxlKGRlc2MsIElOREVYKTsKLQkJCQl0cnkgeworCQkJCXRyeSAoUmVhZGFibGVDaGFubmVsIHJjID0gY3R4LmRiLm9wZW5GaWxlKGRlc2MsIElOREVYKSkgewogCQkJCQlJbnB1dFN0cmVhbSBpbiA9IENoYW5uZWxzLm5ld0lucHV0U3RyZWFtKHJjKTsKIAkJCQkJaW50IHdhbnRTaXplID0gODE5MjsKIAkJCQkJaW50IGJzID0gcmMuYmxvY2tTaXplKCk7CkBAIC0yMjEsNyArMjIwLDYgQEAKIAkJCQkJaWR4ID0gUGFja0luZGV4LnJlYWQobmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oaW4sIGJzKSk7CiAJCQkJCWN0eC5zdGF0cy5yZWFkSWR4Qnl0ZXMgKz0gcmMucG9zaXRpb24oKTsKIAkJCQl9IGZpbmFsbHkgewotCQkJCQlyYy5jbG9zZSgpOwogCQkJCQljdHguc3RhdHMucmVhZElkeE1pY3JvcyArPSBlbGFwc2VkTWljcm9zKHN0YXJ0KTsKIAkJCQl9CiAJCQl9IGNhdGNoIChFT0ZFeGNlcHRpb24gZSkgewpAQCAtMjc2LDEwICsyNzQsOSBAQAogCiAJCQlsb25nIHNpemU7CiAJCQlQYWNrQml0bWFwSW5kZXggaWR4OwotCQkJdHJ5IHsKLQkJCQljdHguc3RhdHMucmVhZEJpdG1hcCsrOwotCQkJCWxvbmcgc3RhcnQgPSBTeXN0ZW0ubmFub1RpbWUoKTsKLQkJCQlSZWFkYWJsZUNoYW5uZWwgcmMgPSBjdHguZGIub3BlbkZpbGUoZGVzYywgQklUTUFQX0lOREVYKTsKKwkJCWN0eC5zdGF0cy5yZWFkQml0bWFwKys7CisJCQlsb25nIHN0YXJ0ID0gU3lzdGVtLm5hbm9UaW1lKCk7CisJCQl0cnkgKFJlYWRhYmxlQ2hhbm5lbCByYyA9IGN0eC5kYi5vcGVuRmlsZShkZXNjLCBCSVRNQVBfSU5ERVgpKSB7CiAJCQkJdHJ5IHsKIAkJCQkJSW5wdXRTdHJlYW0gaW4gPSBDaGFubmVscy5uZXdJbnB1dFN0cmVhbShyYyk7CiAJCQkJCWludCB3YW50U2l6ZSA9IDgxOTI7CkBAIC0yOTMsNyArMjkwLDYgQEAKIAkJCQkJCQlpbiwgaWR4KGN0eCksIGdldFJldmVyc2VJZHgoY3R4KSk7CiAJCQkJfSBmaW5hbGx5IHsKIAkJCQkJc2l6ZSA9IHJjLnBvc2l0aW9uKCk7Ci0JCQkJCXJjLmNsb3NlKCk7CiAJCQkJCWN0eC5zdGF0cy5yZWFkSWR4Qnl0ZXMgKz0gc2l6ZTsKIAkJCQkJY3R4LnN0YXRzLnJlYWRJZHhNaWNyb3MgKz0gZWxhcHNlZE1pY3JvcyhzdGFydCk7CiAJCQkJfQpAQCAtNDQzLDYgKzQzOSw3IEBACiAKIAlwcml2YXRlIHZvaWQgY29weVBhY2tUaHJvdWdoQ2FjaGUoUGFja091dHB1dFN0cmVhbSBvdXQsIERmc1JlYWRlciBjdHgpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBFeHBsaWNpdGx5IGNsb3NlZCBpbiBmaW5hbGx5IGJsb2NrCiAJCVJlYWRhYmxlQ2hhbm5lbCByYyA9IG51bGw7CiAJCXRyeSB7CiAJCQlsb25nIHBvc2l0aW9uID0gMTI7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1JlYWRlck9wdGlvbnMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzUmVhZGVyT3B0aW9ucy5qYXZhCmluZGV4IGJmMTRkMTguLjJlYTVjMzkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzUmVhZGVyT3B0aW9ucy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzUmVhZGVyT3B0aW9ucy5qYXZhCkBAIC0xMTUsNyArMTE1LDcgQEAKIAkgKiAgICAgICAgICAgIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RTdHJlYW19LgogCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CiAJICovCi0JcHVibGljIERmc1JlYWRlck9wdGlvbnMgc2V0U3RyZWFtRmlsZVRocmVzaG9sZChmaW5hbCBpbnQgbmV3TGltaXQpIHsKKwlwdWJsaWMgRGZzUmVhZGVyT3B0aW9ucyBzZXRTdHJlYW1GaWxlVGhyZXNob2xkKGludCBuZXdMaW1pdCkgewogCQlzdHJlYW1GaWxlVGhyZXNob2xkID0gTWF0aC5tYXgoMCwgbmV3TGltaXQpOwogCQlyZXR1cm4gdGhpczsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1JlcG9zaXRvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzUmVwb3NpdG9yeS5qYXZhCmluZGV4IDE5NzY4MTYuLjUxNjllOTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzUmVwb3NpdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzUmVwb3NpdG9yeS5qYXZhCkBAIC0xMzMsNyArMTMzLDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5SW5kZXhDaGFuZ2VkKCkgeworCXB1YmxpYyB2b2lkIG5vdGlmeUluZGV4Q2hhbmdlZChib29sZWFuIGludGVybmFsKSB7CiAJCS8vIERvIG5vdCBzZW5kIG5vdGlmaWNhdGlvbnMuCiAJCS8vIFRoZXJlIGlzIG5vIGluZGV4LCBhcyB0aGVyZSBpcyBubyB3b3JraW5nIHRyZWUuCiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNTdHJlYW1LZXkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzU3RyZWFtS2V5LmphdmEKaW5kZXggODc5M2Q4My4uYzExZjY5NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNTdHJlYW1LZXkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1N0cmVhbUtleS5qYXZhCkBAIC00Myw3ICs0Myw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIApAQCAtNjcsNyArNjcsNyBAQAogCSAqLwogCXB1YmxpYyBzdGF0aWMgRGZzU3RyZWFtS2V5IG9mKERmc1JlcG9zaXRvcnlEZXNjcmlwdGlvbiByZXBvLCBTdHJpbmcgbmFtZSwKIAkJCUBOdWxsYWJsZSBQYWNrRXh0IGV4dCkgewotCQlyZXR1cm4gbmV3IEJ5dGVBcnJheURmc1N0cmVhbUtleShyZXBvLCBuYW1lLmdldEJ5dGVzKFVURl84KSwgZXh0KTsKKwkJcmV0dXJuIG5ldyBCeXRlQXJyYXlEZnNTdHJlYW1LZXkocmVwbywgbmFtZS5nZXRCeXRlcyhDSEFSU0VUKSwgZXh0KTsKIAl9CiAKIAlmaW5hbCBpbnQgaGFzaDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvTGFyZ2VQYWNrZWRXaG9sZU9iamVjdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9MYXJnZVBhY2tlZFdob2xlT2JqZWN0LmphdmEKaW5kZXggZmEyYzUyOS4uMzdkOGQxYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9MYXJnZVBhY2tlZFdob2xlT2JqZWN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9MYXJnZVBhY2tlZFdob2xlT2JqZWN0LmphdmEKQEAgLTEwNCwzMSArMTA0LDM0IEBACiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0U3RyZWFtIG9wZW5TdHJlYW0oKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlQYWNrSW5wdXRTdHJlYW0gcGFja0luOworCQkvLyBjdHggaXMgY2xvc2VkIGJ5IFBhY2tJbnB1dFN0cmVhbSwgb3IgZXhwbGljaXRseSBpbiB0aGUgZmluYWxseSBibG9jaworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQogCQlEZnNSZWFkZXIgY3R4ID0gZGIubmV3UmVhZGVyKCk7Ci0JCUlucHV0U3RyZWFtIGluOwogCQl0cnkgewotCQkJaW4gPSBuZXcgUGFja0lucHV0U3RyZWFtKHBhY2ssIG9iamVjdE9mZnNldCArIGhlYWRlckxlbmd0aCwgY3R4KTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gcGFja0dvbmUpIHsKLQkJCS8vIElmIHRoZSBwYWNrIGZpbGUgY2Fubm90IGJlIHBpbm5lZCBpbnRvIHRoZSBjdXJzb3IsIGl0Ci0JCQkvLyBwcm9iYWJseSB3YXMgcmVwYWNrZWQgcmVjZW50bHkuIEdvIGZpbmQgdGhlIG9iamVjdAotCQkJLy8gYWdhaW4gYW5kIG9wZW4gdGhlIHN0cmVhbSBmcm9tIHRoYXQgbG9jYXRpb24gaW5zdGVhZC4KLQkJCS8vCiAJCQl0cnkgeworCQkJCXBhY2tJbiA9IG5ldyBQYWNrSW5wdXRTdHJlYW0oCisJCQkJCQlwYWNrLCBvYmplY3RPZmZzZXQgKyBoZWFkZXJMZW5ndGgsIGN0eCk7CisJCQkJY3R4ID0gbnVsbDsgLy8gb3duZWQgYnkgcGFja0luCisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBwYWNrR29uZSkgeworCQkJCS8vIElmIHRoZSBwYWNrIGZpbGUgY2Fubm90IGJlIHBpbm5lZCBpbnRvIHRoZSBjdXJzb3IsIGl0CisJCQkJLy8gcHJvYmFibHkgd2FzIHJlcGFja2VkIHJlY2VudGx5LiBHbyBmaW5kIHRoZSBvYmplY3QKKwkJCQkvLyBhZ2FpbiBhbmQgb3BlbiB0aGUgc3RyZWFtIGZyb20gdGhhdCBsb2NhdGlvbiBpbnN0ZWFkLgogCQkJCU9iamVjdElkIG9iaiA9IHBhY2suZ2V0UmV2ZXJzZUlkeChjdHgpLmZpbmRPYmplY3Qob2JqZWN0T2Zmc2V0KTsKIAkJCQlyZXR1cm4gY3R4Lm9wZW4ob2JqLCB0eXBlKS5vcGVuU3RyZWFtKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWN0eC5jbG9zZSgpOwogCQkJfQogCQl9IGZpbmFsbHkgewotCQkJY3R4LmNsb3NlKCk7CisJCQlpZiAoY3R4ICE9IG51bGwpIHsKKwkJCQljdHguY2xvc2UoKTsKKwkJCX0KIAkJfQogCiAJCS8vIEFsaWduIGJ1ZmZlciB0byBpbmZsYXRlciBzaXplLCBhdCBhIGxhcmdlciB0aGFuIGRlZmF1bHQgYmxvY2suCiAJCS8vIFRoaXMgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIGNvbnRleHQgc3dpdGNoZXMgZnJvbSB0aGUKIAkJLy8gY2FsbGVyIGRvd24gaW50byB0aGUgcGFjayBzdHJlYW0gaW5mbGF0aW9uLgogCQlpbnQgYnVmc3ogPSA4MTkyOwotCQlpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKAotCQkJCW5ldyBJbmZsYXRlcklucHV0U3RyZWFtKGluLCBjdHguaW5mbGF0ZXIoKSwgYnVmc3opLAorCQlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKAorCQkJCW5ldyBJbmZsYXRlcklucHV0U3RyZWFtKHBhY2tJbiwgcGFja0luLmN0eC5pbmZsYXRlcigpLCBidWZzeiksCiAJCQkJYnVmc3opOwogCQlyZXR1cm4gbmV3IE9iamVjdFN0cmVhbS5GaWx0ZXIodHlwZSwgc2l6ZSwgaW4pOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvUGFja0lucHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL1BhY2tJbnB1dFN0cmVhbS5qYXZhCmluZGV4IGQ4ODAxMWMuLmI4NTlkOWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvUGFja0lucHV0U3RyZWFtLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9QYWNrSW5wdXRTdHJlYW0uamF2YQpAQCAtNDcsNyArNDcsNyBAQAogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiAKIGZpbmFsIGNsYXNzIFBhY2tJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKLQlwcml2YXRlIGZpbmFsIERmc1JlYWRlciBjdHg7CisJZmluYWwgRGZzUmVhZGVyIGN0eDsKIAogCXByaXZhdGUgZmluYWwgRGZzUGFja0ZpbGUgcGFjazsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQml0bWFwSW5kZXhJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9CaXRtYXBJbmRleEltcGwuamF2YQppbmRleCA2YWRlNDM4Li4xZGE0MzA0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9CaXRtYXBJbmRleEltcGwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9CaXRtYXBJbmRleEltcGwuamF2YQpAQCAtMjEzLDIyICsyMTMsNiBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGFkZChBbnlPYmplY3RJZCBvYmplY3RJZCwgaW50IHR5cGUpIHsKLQkJCWludCBwb3NpdGlvbiA9IGJpdG1hcEluZGV4LmZpbmRPckluc2VydChvYmplY3RJZCwgdHlwZSk7Ci0JCQlpZiAoYml0c2V0LmNvbnRhaW5zKHBvc2l0aW9uKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCUJpdG1hcCBlbnRyeSA9IGJpdG1hcEluZGV4LmdldEJpdG1hcChvYmplY3RJZCk7Ci0JCQlpZiAoZW50cnkgIT0gbnVsbCkgewotCQkJCW9yKGVudHJ5KTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCWJpdHNldC5zZXQocG9zaXRpb24pOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKIAkJcHVibGljIGJvb2xlYW4gY29udGFpbnMoQW55T2JqZWN0SWQgb2JqZWN0SWQpIHsKIAkJCWludCBwb3NpdGlvbiA9IGJpdG1hcEluZGV4LmZpbmRQb3NpdGlvbihvYmplY3RJZCk7CiAJCQlyZXR1cm4gMCA8PSBwb3NpdGlvbiAmJiBiaXRzZXQuY29udGFpbnMocG9zaXRpb24pOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQnl0ZUFycmF5V2luZG93LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9CeXRlQXJyYXlXaW5kb3cuamF2YQppbmRleCAzMzhkZjRhLi5jNmZkZWIwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9CeXRlQXJyYXlXaW5kb3cuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9CeXRlQXJyYXlXaW5kb3cuamF2YQpAQCAtNTgsMTQgKzU4LDE0IEBACiBmaW5hbCBjbGFzcyBCeXRlQXJyYXlXaW5kb3cgZXh0ZW5kcyBCeXRlV2luZG93IHsKIAlwcml2YXRlIGZpbmFsIGJ5dGVbXSBhcnJheTsKIAotCUJ5dGVBcnJheVdpbmRvdyhmaW5hbCBQYWNrRmlsZSBwYWNrLCBmaW5hbCBsb25nIG8sIGZpbmFsIGJ5dGVbXSBiKSB7CisJQnl0ZUFycmF5V2luZG93KFBhY2tGaWxlIHBhY2ssIGxvbmcgbywgYnl0ZVtdIGIpIHsKIAkJc3VwZXIocGFjaywgbywgYi5sZW5ndGgpOwogCQlhcnJheSA9IGI7CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgaW50IGNvcHkoZmluYWwgaW50IHAsIGZpbmFsIGJ5dGVbXSBiLCBmaW5hbCBpbnQgbywgaW50IG4pIHsKKwlwcm90ZWN0ZWQgaW50IGNvcHkoaW50IHAsIGJ5dGVbXSBiLCBpbnQgbywgaW50IG4pIHsKIAkJbiA9IE1hdGgubWluKGFycmF5Lmxlbmd0aCAtIHAsIG4pOwogCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBwLCBiLCBvLCBuKTsKIAkJcmV0dXJuIG47CkBAIC03Myw3ICs3Myw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCBpbnQgc2V0SW5wdXQoZmluYWwgaW50IHBvcywgZmluYWwgSW5mbGF0ZXIgaW5mKQorCXByb3RlY3RlZCBpbnQgc2V0SW5wdXQoaW50IHBvcywgSW5mbGF0ZXIgaW5mKQogCQkJdGhyb3dzIERhdGFGb3JtYXRFeGNlcHRpb24gewogCQlpbnQgbiA9IGFycmF5Lmxlbmd0aCAtIHBvczsKIAkJaW5mLnNldElucHV0KGFycmF5LCBwb3MsIG4pOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQnl0ZUJ1ZmZlcldpbmRvdy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQnl0ZUJ1ZmZlcldpbmRvdy5qYXZhCmluZGV4IDRkY2YxMzMuLjhlNzkwNGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0J5dGVCdWZmZXJXaW5kb3cuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9CeXRlQnVmZmVyV2luZG93LmphdmEKQEAgLTYwLDE0ICs2MCwxNCBAQAogZmluYWwgY2xhc3MgQnl0ZUJ1ZmZlcldpbmRvdyBleHRlbmRzIEJ5dGVXaW5kb3cgewogCXByaXZhdGUgZmluYWwgQnl0ZUJ1ZmZlciBidWZmZXI7CiAKLQlCeXRlQnVmZmVyV2luZG93KGZpbmFsIFBhY2tGaWxlIHBhY2ssIGZpbmFsIGxvbmcgbywgZmluYWwgQnl0ZUJ1ZmZlciBiKSB7CisJQnl0ZUJ1ZmZlcldpbmRvdyhQYWNrRmlsZSBwYWNrLCBsb25nIG8sIEJ5dGVCdWZmZXIgYikgewogCQlzdXBlcihwYWNrLCBvLCBiLmNhcGFjaXR5KCkpOwogCQlidWZmZXIgPSBiOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGludCBjb3B5KGZpbmFsIGludCBwLCBmaW5hbCBieXRlW10gYiwgZmluYWwgaW50IG8sIGludCBuKSB7CisJcHJvdGVjdGVkIGludCBjb3B5KGludCBwLCBieXRlW10gYiwgaW50IG8sIGludCBuKSB7CiAJCWZpbmFsIEJ5dGVCdWZmZXIgcyA9IGJ1ZmZlci5zbGljZSgpOwogCQlzLnBvc2l0aW9uKHApOwogCQluID0gTWF0aC5taW4ocy5yZW1haW5pbmcoKSwgbik7CkBAIC05Miw3ICs5Miw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCBpbnQgc2V0SW5wdXQoZmluYWwgaW50IHBvcywgZmluYWwgSW5mbGF0ZXIgaW5mKQorCXByb3RlY3RlZCBpbnQgc2V0SW5wdXQoaW50IHBvcywgSW5mbGF0ZXIgaW5mKQogCQkJdGhyb3dzIERhdGFGb3JtYXRFeGNlcHRpb24gewogCQlmaW5hbCBCeXRlQnVmZmVyIHMgPSBidWZmZXIuc2xpY2UoKTsKIAkJcy5wb3NpdGlvbihwb3MpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQnl0ZVdpbmRvdy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQnl0ZVdpbmRvdy5qYXZhCmluZGV4IDc5NjNjZWEuLjYwMDczZjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0J5dGVXaW5kb3cuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9CeXRlV2luZG93LmphdmEKQEAgLTc2LDcgKzc2LDcgQEAKIAkgKiBAcGFyYW0gbgogCSAqICAgICAgICAgICAgc2l6ZSBvZiB0aGUgYnl0ZSB3aW5kb3cKIAkgKi8KLQlwcm90ZWN0ZWQgQnl0ZVdpbmRvdyhmaW5hbCBQYWNrRmlsZSBwLCBmaW5hbCBsb25nIHMsIGZpbmFsIGludCBuKSB7CisJcHJvdGVjdGVkIEJ5dGVXaW5kb3coUGFja0ZpbGUgcCwgbG9uZyBzLCBpbnQgbikgewogCQlwYWNrID0gcDsKIAkJc3RhcnQgPSBzOwogCQllbmQgPSBzdGFydCArIG47CkBAIC04Niw3ICs4Niw3IEBACiAJCXJldHVybiAoaW50KSAoZW5kIC0gc3RhcnQpOwogCX0KIAotCWZpbmFsIGJvb2xlYW4gY29udGFpbnMoZmluYWwgUGFja0ZpbGUgbmVlZGVkRmlsZSwgZmluYWwgbG9uZyBuZWVkZWRQb3MpIHsKKwlmaW5hbCBib29sZWFuIGNvbnRhaW5zKFBhY2tGaWxlIG5lZWRlZEZpbGUsIGxvbmcgbmVlZGVkUG9zKSB7CiAJCXJldHVybiBwYWNrID09IG5lZWRlZEZpbGUgJiYgc3RhcnQgPD0gbmVlZGVkUG9zICYmIG5lZWRlZFBvcyA8IGVuZDsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0NhY2hlZE9iamVjdERpcmVjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQ2FjaGVkT2JqZWN0RGlyZWN0b3J5LmphdmEKaW5kZXggZTgxMGFlMC4uN2Y3ZWNjMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQ2FjaGVkT2JqZWN0RGlyZWN0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQ2FjaGVkT2JqZWN0RGlyZWN0b3J5LmphdmEKQEAgLTE4MSwxMSArMTgxLDExIEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGhhcyhmaW5hbCBBbnlPYmplY3RJZCBvYmplY3RJZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgYm9vbGVhbiBoYXMoQW55T2JqZWN0SWQgb2JqZWN0SWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBoYXMob2JqZWN0SWQsIG51bGwpOwogCX0KIAotCXByaXZhdGUgYm9vbGVhbiBoYXMoZmluYWwgQW55T2JqZWN0SWQgb2JqZWN0SWQsIFNldDxBbHRlcm5hdGVIYW5kbGUuSWQ+IHNraXBzKQorCXByaXZhdGUgYm9vbGVhbiBoYXMoQW55T2JqZWN0SWQgb2JqZWN0SWQsIFNldDxBbHRlcm5hdGVIYW5kbGUuSWQ+IHNraXBzKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKHVucGFja2VkT2JqZWN0cy5jb250YWlucyhvYmplY3RJZCkpIHsKIAkJCXJldHVybiB0cnVlOwpAQCAtMjA1LDcgKzIwNSw3IEBACiAJfQogCiAJQE92ZXJyaWRlCi0JT2JqZWN0TG9hZGVyIG9wZW5PYmplY3QoZmluYWwgV2luZG93Q3Vyc29yIGN1cnMsIGZpbmFsIEFueU9iamVjdElkIG9iamVjdElkKQorCU9iamVjdExvYWRlciBvcGVuT2JqZWN0KFdpbmRvd0N1cnNvciBjdXJzLCBBbnlPYmplY3RJZCBvYmplY3RJZCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBvcGVuT2JqZWN0KGN1cnMsIG9iamVjdElkLCBudWxsKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9EZWx0YUJhc2VDYWNoZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRGVsdGFCYXNlQ2FjaGUuamF2YQppbmRleCBiMzk3OTg5Li5lZDczZTcyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9EZWx0YUJhc2VDYWNoZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0RlbHRhQmFzZUNhY2hlLmphdmEKQEAgLTUyLDcgKzUyLDcgQEAKIAogCXN0YXRpYyBmaW5hbCBTb2Z0UmVmZXJlbmNlPEVudHJ5PiBERUFEOwogCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGhhc2goZmluYWwgbG9uZyBwb3NpdGlvbikgeworCXByaXZhdGUgc3RhdGljIGludCBoYXNoKGxvbmcgcG9zaXRpb24pIHsKIAkJcmV0dXJuICgoKGludCkgcG9zaXRpb24pIDw8IDIyKSA+Pj4gMjI7CiAJfQogCkBAIC04Miw3ICs4Miw3IEBACiAJCWNhY2hlID0gbmV3IFNsb3RbQ0FDSEVfU1pdOwogCX0KIAotCUVudHJ5IGdldChmaW5hbCBQYWNrRmlsZSBwYWNrLCBmaW5hbCBsb25nIHBvc2l0aW9uKSB7CisJRW50cnkgZ2V0KFBhY2tGaWxlIHBhY2ssIGxvbmcgcG9zaXRpb24pIHsKIAkJU2xvdCBlID0gY2FjaGVbaGFzaChwb3NpdGlvbildOwogCQlpZiAoZSA9PSBudWxsKQogCQkJcmV0dXJuIG51bGw7CkBAIC0xMzYsNyArMTM2LDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBtb3ZlVG9IZWFkKGZpbmFsIFNsb3QgZSkgeworCXByaXZhdGUgdm9pZCBtb3ZlVG9IZWFkKFNsb3QgZSkgewogCQl1bmxpbmsoZSk7CiAJCWUubHJ1UHJldiA9IG51bGw7CiAJCWUubHJ1TmV4dCA9IGxydUhlYWQ7CkBAIC0xNDcsNyArMTQ3LDcgQEAKIAkJbHJ1SGVhZCA9IGU7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHVubGluayhmaW5hbCBTbG90IGUpIHsKKwlwcml2YXRlIHZvaWQgdW5saW5rKFNsb3QgZSkgewogCQlmaW5hbCBTbG90IHByZXYgPSBlLmxydVByZXY7CiAJCWZpbmFsIFNsb3QgbmV4dCA9IGUubHJ1TmV4dDsKIAkJaWYgKHByZXYgIT0gbnVsbCkKQEAgLTE1Niw3ICsxNTYsNyBAQAogCQkJbmV4dC5scnVQcmV2ID0gcHJldjsKIAl9CiAKLQlwcml2YXRlIHZvaWQgY2xlYXJFbnRyeShmaW5hbCBTbG90IGUpIHsKKwlwcml2YXRlIHZvaWQgY2xlYXJFbnRyeShTbG90IGUpIHsKIAkJb3BlbkJ5dGVDb3VudCAtPSBlLnN6OwogCQllLnByb3ZpZGVyID0gbnVsbDsKIAkJZS5kYXRhID0gREVBRDsKQEAgLTE2OCw3ICsxNjgsNyBAQAogCiAJCWZpbmFsIGludCB0eXBlOwogCi0JCUVudHJ5KGZpbmFsIGJ5dGVbXSBhRGF0YSwgZmluYWwgaW50IGFUeXBlKSB7CisJCUVudHJ5KGJ5dGVbXSBhRGF0YSwgaW50IGFUeXBlKSB7CiAJCQlkYXRhID0gYURhdGE7CiAJCQl0eXBlID0gYVR5cGU7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0ZpbGVSZXBvc2l0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlUmVwb3NpdG9yeS5qYXZhCmluZGV4IDliODIyMTAuLmQwMjg4OGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0ZpbGVSZXBvc2l0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRmlsZVJlcG9zaXRvcnkuamF2YQpAQCAtNDYsOCArNDYsNiBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlOwogCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZkRhdGFiYXNlLkFMTDsKLQogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKQEAgLTEyNSw2ICsxMjMsMTAgQEAKIAlwcml2YXRlIGZpbmFsIEZpbGVCYXNlZENvbmZpZyByZXBvQ29uZmlnOwogCXByaXZhdGUgZmluYWwgUmVmRGF0YWJhc2UgcmVmczsKIAlwcml2YXRlIGZpbmFsIE9iamVjdERpcmVjdG9yeSBvYmplY3REYXRhYmFzZTsKKworCXByaXZhdGUgZmluYWwgT2JqZWN0IHNuYXBzaG90TG9jayA9IG5ldyBPYmplY3QoKTsKKworCS8vIHByb3RlY3RlZCBieSBzbmFwc2hvdExvY2sKIAlwcml2YXRlIEZpbGVTbmFwc2hvdCBzbmFwc2hvdDsKIAogCS8qKgpAQCAtMTQ3LDcgKzE0OSw3IEBACiAJICogICAgICAgICAgICAgYWNjZXNzZWQuCiAJICogQHNlZSBGaWxlUmVwb3NpdG9yeUJ1aWxkZXIKIAkgKi8KLQlwdWJsaWMgRmlsZVJlcG9zaXRvcnkoZmluYWwgRmlsZSBnaXREaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIEZpbGVSZXBvc2l0b3J5KEZpbGUgZ2l0RGlyKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0aGlzKG5ldyBGaWxlUmVwb3NpdG9yeUJ1aWxkZXIoKS5zZXRHaXREaXIoZ2l0RGlyKS5zZXR1cCgpKTsKIAl9CiAKQEAgLTE2MSw3ICsxNjMsNyBAQAogCSAqICAgICAgICAgICAgIGFjY2Vzc2VkLgogCSAqIEBzZWUgRmlsZVJlcG9zaXRvcnlCdWlsZGVyCiAJICovCi0JcHVibGljIEZpbGVSZXBvc2l0b3J5KGZpbmFsIFN0cmluZyBnaXREaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIEZpbGVSZXBvc2l0b3J5KFN0cmluZyBnaXREaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRoaXMobmV3IEZpbGUoZ2l0RGlyKSk7CiAJfQogCkBAIC0xNzQsNyArMTc2LDcgQEAKIAkgKiAgICAgICAgICAgICB0aGUgdXNlciBjb25maWd1cmF0aW9uIGZpbGUgb3IgcmVwb3NpdG9yeSBjb25maWd1cmF0aW9uIGZpbGUKIAkgKiAgICAgICAgICAgICBjYW5ub3QgYmUgYWNjZXNzZWQuCiAJICovCi0JcHVibGljIEZpbGVSZXBvc2l0b3J5KGZpbmFsIEJhc2VSZXBvc2l0b3J5QnVpbGRlciBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBGaWxlUmVwb3NpdG9yeShCYXNlUmVwb3NpdG9yeUJ1aWxkZXIgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJc3VwZXIob3B0aW9ucyk7CiAKIAkJaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHlPck51bGwoU3lzdGVtUmVhZGVyLmdldEluc3RhbmNlKCkuZ2V0ZW52KApAQCAtMjQwLDggKzI0Miw5IEBACiAJCQkJCQlMb25nLnZhbHVlT2YocmVwb3NpdG9yeUZvcm1hdFZlcnNpb24pKSk7CiAJCX0KIAotCQlpZiAoIWlzQmFyZSgpKQorCQlpZiAoIWlzQmFyZSgpKSB7CiAJCQlzbmFwc2hvdCA9IEZpbGVTbmFwc2hvdC5zYXZlKGdldEluZGV4RmlsZSgpKTsKKwkJfQogCX0KIAogCXByaXZhdGUgdm9pZCBsb2FkU3lzdGVtQ29uZmlnKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTUzMSwzNCArNTM0LDQzIEBACiAJICogICAgICAgICAgICAgaW5kZXggZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkLCByZWFkLCBvciBpcyBub3QgcmVjb2duaXplZCBhcwogCSAqICAgICAgICAgICAgIGEgR2l0IHBhY2sgZmlsZSBpbmRleC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBvcGVuUGFjayhmaW5hbCBGaWxlIHBhY2spIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgb3BlblBhY2soRmlsZSBwYWNrKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlvYmplY3REYXRhYmFzZS5vcGVuUGFjayhwYWNrKTsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNjYW5Gb3JSZXBvQ2hhbmdlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhBTEwpOyAvLyBUaGlzIHdpbGwgbG9vayBmb3IgY2hhbmdlcyB0byByZWZzCisJCWdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpOyAvLyBUaGlzIHdpbGwgbG9vayBmb3IgY2hhbmdlcyB0byByZWZzCiAJCWRldGVjdEluZGV4Q2hhbmdlcygpOwogCX0KIAogCS8qKiBEZXRlY3QgaW5kZXggY2hhbmdlcy4gKi8KIAlwcml2YXRlIHZvaWQgZGV0ZWN0SW5kZXhDaGFuZ2VzKCkgewotCQlpZiAoaXNCYXJlKCkpCisJCWlmIChpc0JhcmUoKSkgewogCQkJcmV0dXJuOworCQl9CiAKIAkJRmlsZSBpbmRleEZpbGUgPSBnZXRJbmRleEZpbGUoKTsKLQkJaWYgKHNuYXBzaG90ID09IG51bGwpCi0JCQlzbmFwc2hvdCA9IEZpbGVTbmFwc2hvdC5zYXZlKGluZGV4RmlsZSk7Ci0JCWVsc2UgaWYgKHNuYXBzaG90LmlzTW9kaWZpZWQoaW5kZXhGaWxlKSkKLQkJCW5vdGlmeUluZGV4Q2hhbmdlZCgpOworCQlzeW5jaHJvbml6ZWQgKHNuYXBzaG90TG9jaykgeworCQkJaWYgKHNuYXBzaG90ID09IG51bGwpIHsKKwkJCQlzbmFwc2hvdCA9IEZpbGVTbmFwc2hvdC5zYXZlKGluZGV4RmlsZSk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJaWYgKCFzbmFwc2hvdC5pc01vZGlmaWVkKGluZGV4RmlsZSkpIHsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJbm90aWZ5SW5kZXhDaGFuZ2VkKGZhbHNlKTsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUluZGV4Q2hhbmdlZCgpIHsKLQkJc25hcHNob3QgPSBGaWxlU25hcHNob3Quc2F2ZShnZXRJbmRleEZpbGUoKSk7Ci0JCWZpcmVFdmVudChuZXcgSW5kZXhDaGFuZ2VkRXZlbnQoKSk7CisJcHVibGljIHZvaWQgbm90aWZ5SW5kZXhDaGFuZ2VkKGJvb2xlYW4gaW50ZXJuYWwpIHsKKwkJc3luY2hyb25pemVkIChzbmFwc2hvdExvY2spIHsKKwkJCXNuYXBzaG90ID0gRmlsZVNuYXBzaG90LnNhdmUoZ2V0SW5kZXhGaWxlKCkpOworCQl9CisJCWZpcmVFdmVudChuZXcgSW5kZXhDaGFuZ2VkRXZlbnQoaW50ZXJuYWwpKTsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRmlsZVNuYXBzaG90LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlU25hcHNob3QuamF2YQppbmRleCAyMTY1YWEyLi4xMGFkYzZjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlU25hcHNob3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlU25hcHNob3QuamF2YQpAQCAtMjM5LDcgKzIzOSw3IEBACiAJCQkJKyAiLCByZWFkOiAiICsgZi5mb3JtYXQobmV3IERhdGUobGFzdFJlYWQpKSArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJfQogCi0JcHJpdmF0ZSBib29sZWFuIG5vdFJhY3lDbGVhbihmaW5hbCBsb25nIHJlYWQpIHsKKwlwcml2YXRlIGJvb2xlYW4gbm90UmFjeUNsZWFuKGxvbmcgcmVhZCkgewogCQkvLyBUaGUgbGFzdCBtb2RpZmllZCB0aW1lIGdyYW51bGFyaXR5IG9mIEZBVCBmaWxlc3lzdGVtcyBpcyAyIHNlY29uZHMuCiAJCS8vIFVzaW5nIDIuNSBzZWNvbmRzIGhlcmUgcHJvdmlkZXMgYSByZWFzb25hYmx5IGhpZ2ggYXNzdXJhbmNlIHRoYXQKIAkJLy8gYSBtb2RpZmljYXRpb24gd2FzIG5vdCBtaXNzZWQuCkBAIC0yNDcsNyArMjQ3LDcgQEAKIAkJcmV0dXJuIHJlYWQgLSBsYXN0TW9kaWZpZWQgPiAyNTAwOwogCX0KIAotCXByaXZhdGUgYm9vbGVhbiBpc01vZGlmaWVkKGZpbmFsIGxvbmcgY3Vyckxhc3RNb2RpZmllZCkgeworCXByaXZhdGUgYm9vbGVhbiBpc01vZGlmaWVkKGxvbmcgY3Vyckxhc3RNb2RpZmllZCkgewogCQkvLyBBbnkgZGlmZmVyZW5jZSBpbmRpY2F0ZXMgdGhlIHBhdGggd2FzIG1vZGlmaWVkLgogCQkvLwogCQlpZiAobGFzdE1vZGlmaWVkICE9IGN1cnJMYXN0TW9kaWZpZWQpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9HQy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvR0MuamF2YQppbmRleCBhZDQxZDk4Li4wZWNmYjI4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9HQy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0dDLmphdmEKQEAgLTc2OSw3ICs3NjksOCBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqLwogCXB1YmxpYyB2b2lkIHBhY2tSZWZzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQ29sbGVjdGlvbjxSZWY+IHJlZnMgPSByZXBvLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhDb25zdGFudHMuUl9SRUZTKS52YWx1ZXMoKTsKKwkJQ29sbGVjdGlvbjxSZWY+IHJlZnMgPSByZXBvLmdldFJlZkRhdGFiYXNlKCkKKwkJCQkuZ2V0UmVmc0J5UHJlZml4KENvbnN0YW50cy5SX1JFRlMpOwogCQlMaXN0PFN0cmluZz4gcmVmc1RvQmVQYWNrZWQgPSBuZXcgQXJyYXlMaXN0PD4ocmVmcy5zaXplKCkpOwogCQlwbS5iZWdpblRhc2soSkdpdFRleHQuZ2V0KCkucGFja1JlZnMsIHJlZnMuc2l6ZSgpKTsKIAkJdHJ5IHsKQEAgLTgzNSw3ICs4MzYsNyBAQAogCQl9CiAKIAkJTGlzdDxPYmplY3RJZFNldD4gZXhjbHVkZWQgPSBuZXcgTGlua2VkTGlzdDw+KCk7Ci0JCWZvciAoZmluYWwgUGFja0ZpbGUgZiA6IHJlcG8uZ2V0T2JqZWN0RGF0YWJhc2UoKS5nZXRQYWNrcygpKSB7CisJCWZvciAoUGFja0ZpbGUgZiA6IHJlcG8uZ2V0T2JqZWN0RGF0YWJhc2UoKS5nZXRQYWNrcygpKSB7CiAJCQljaGVja0NhbmNlbGxlZCgpOwogCQkJaWYgKGYuc2hvdWxkQmVLZXB0KCkpCiAJCQkJZXhjbHVkZWQuYWRkKGYuZ2V0SW5kZXgoKSk7CkBAIC05OTgsNiArOTk5LDkgQEAKIAlwcml2YXRlIHZvaWQgZGVsZXRlVGVtcFBhY2tzSWR4KCkgewogCQlQYXRoIHBhY2tEaXIgPSByZXBvLmdldE9iamVjdERhdGFiYXNlKCkuZ2V0UGFja0RpcmVjdG9yeSgpLnRvUGF0aCgpOwogCQlJbnN0YW50IHRocmVzaG9sZCA9IEluc3RhbnQubm93KCkubWludXMoMSwgQ2hyb25vVW5pdC5EQVlTKTsKKwkJaWYgKCFGaWxlcy5leGlzdHMocGFja0RpcikpIHsKKwkJCXJldHVybjsKKwkJfQogCQl0cnkgKERpcmVjdG9yeVN0cmVhbTxQYXRoPiBzdHJlYW0gPQogCQkJCUZpbGVzLm5ld0RpcmVjdG9yeVN0cmVhbShwYWNrRGlyLCAiZ2NfKl90bXAiKSkgeyAvLyROT04tTkxTLTEkCiAJCQlzdHJlYW0uZm9yRWFjaCh0IC0+IHsKQEAgLTEwNTksNyArMTA2Myw3IEBACiAJICovCiAJcHJpdmF0ZSBDb2xsZWN0aW9uPFJlZj4gZ2V0QWxsUmVmcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCVJlZkRhdGFiYXNlIHJlZmRiID0gcmVwby5nZXRSZWZEYXRhYmFzZSgpOwotCQlDb2xsZWN0aW9uPFJlZj4gcmVmcyA9IHJlZmRiLmdldFJlZnMoUmVmRGF0YWJhc2UuQUxMKS52YWx1ZXMoKTsKKwkJQ29sbGVjdGlvbjxSZWY+IHJlZnMgPSByZWZkYi5nZXRSZWZzKCk7CiAJCUxpc3Q8UmVmPiBhZGRsID0gcmVmZGIuZ2V0QWRkaXRpb25hbFJlZnMoKTsKIAkJaWYgKCFhZGRsLmlzRW1wdHkoKSkgewogCQkJTGlzdDxSZWY+IGFsbCA9IG5ldyBBcnJheUxpc3Q8PihyZWZzLnNpemUoKSArIGFkZGwuc2l6ZSgpKTsKQEAgLTEzNjcsNyArMTM3MSw3IEBACiAJCX0KIAogCQlSZWZEYXRhYmFzZSByZWZEYiA9IHJlcG8uZ2V0UmVmRGF0YWJhc2UoKTsKLQkJZm9yIChSZWYgciA6IHJlZkRiLmdldFJlZnMoUmVmRGF0YWJhc2UuQUxMKS52YWx1ZXMoKSkgeworCQlmb3IgKFJlZiByIDogcmVmRGIuZ2V0UmVmcygpKSB7CiAJCQlTdG9yYWdlIHN0b3JhZ2UgPSByLmdldFN0b3JhZ2UoKTsKIAkJCWlmIChzdG9yYWdlID09IFN0b3JhZ2UuTE9PU0UgfHwgc3RvcmFnZSA9PSBTdG9yYWdlLkxPT1NFX1BBQ0tFRCkKIAkJCQlyZXQubnVtYmVyT2ZMb29zZVJlZnMrKzsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0djTG9nLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9HY0xvZy5qYXZhCmluZGV4IDgyNDU4YzEuLjBlNTg3Y2UgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0djTG9nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvR2NMb2cuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTE3MSw2ICsxNzEsNiBAQAogCQlpZiAoY29udGVudC5sZW5ndGgoKSA+IDApIHsKIAkJCW5vbkVtcHR5ID0gdHJ1ZTsKIAkJfQotCQlsb2NrLndyaXRlKGNvbnRlbnQuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJbG9jay53cml0ZShjb250ZW50LmdldEJ5dGVzKENIQVJTRVQpKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9MYXp5T2JqZWN0SWRTZXRGaWxlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9MYXp5T2JqZWN0SWRTZXRGaWxlLmphdmEKaW5kZXggM2QwZTljNy4uYzgyZDUyZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvTGF6eU9iamVjdElkU2V0RmlsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0xhenlPYmplY3RJZFNldEZpbGUuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTg2LDcgKzg2LDcgQEAKIAlwcml2YXRlIE9iamVjdElkT3duZXJNYXA8RW50cnk+IGxvYWQoKSB7CiAJCU9iamVjdElkT3duZXJNYXA8RW50cnk+IHIgPSBuZXcgT2JqZWN0SWRPd25lck1hcDw+KCk7CiAJCXRyeSAoRmlsZUlucHV0U3RyZWFtIGZpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc3JjKTsKLQkJCQlSZWFkZXIgcmluID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGZpbiwgVVRGXzgpOworCQkJCVJlYWRlciByaW4gPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoZmluLCBDSEFSU0VUKTsKIAkJCQlCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihyaW4pKSB7CiAJCQlNdXRhYmxlT2JqZWN0SWQgaWQgPSBuZXcgTXV0YWJsZU9iamVjdElkKCk7CiAJCQlmb3IgKFN0cmluZyBsaW5lOyAobGluZSA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGw7KSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9Mb2NhbE9iamVjdFRvUGFjay5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvTG9jYWxPYmplY3RUb1BhY2suamF2YQppbmRleCA1NWVlYjk1Li5lZDVjYmZjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9Mb2NhbE9iamVjdFRvUGFjay5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0xvY2FsT2JqZWN0VG9QYWNrLmphdmEKQEAgLTU4LDcgKzU4LDcgQEAKIAkvKiogTGVuZ3RoIG9mIHRoZSBkYXRhIHNlY3Rpb24gb2YgdGhlIG9iamVjdC4gKi8KIAlsb25nIGxlbmd0aDsKIAotCUxvY2FsT2JqZWN0VG9QYWNrKEFueU9iamVjdElkIHNyYywgZmluYWwgaW50IHR5cGUpIHsKKwlMb2NhbE9iamVjdFRvUGFjayhBbnlPYmplY3RJZCBzcmMsIGludCB0eXBlKSB7CiAJCXN1cGVyKHNyYywgdHlwZSk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9Mb2NrRmlsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvTG9ja0ZpbGUuamF2YQppbmRleCA5YmVmZTJhLi5iODBjNThjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9Mb2NrRmlsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0xvY2tGaWxlLmphdmEKQEAgLTkzLDcgKzkzLDcgQEAKIAkgKiAgICAgICAgICAgIGEge0BsaW5rIGphdmEuaW8uRmlsZX0gb2JqZWN0LgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB1bmxvY2tlZCwgZmFsc2UgaWYgdW5sb2NraW5nIGZhaWxlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB1bmxvY2soZmluYWwgRmlsZSBmaWxlKSB7CisJcHVibGljIHN0YXRpYyBib29sZWFuIHVubG9jayhGaWxlIGZpbGUpIHsKIAkJZmluYWwgRmlsZSBsb2NrRmlsZSA9IGdldExvY2tGaWxlKGZpbGUpOwogCQlmaW5hbCBpbnQgZmxhZ3MgPSBGaWxlVXRpbHMuUkVUUlkgfCBGaWxlVXRpbHMuU0tJUF9NSVNTSU5HOwogCQl0cnkgewpAQCAtMTQ0LDI2ICsxNDQsOCBAQAogCSAqCiAJICogQHBhcmFtIGYKIAkgKiAgICAgICAgICAgIHRoZSBmaWxlIHRoYXQgd2lsbCBiZSBsb2NrZWQuCi0JICogQHBhcmFtIGZzCi0JICogICAgICAgICAgICB0aGUgZmlsZSBzeXN0ZW0gYWJzdHJhY3Rpb24gd2hpY2ggd2lsbCBiZSBuZWNlc3NhcnkgdG8gcGVyZm9ybQotCSAqICAgICAgICAgICAgY2VydGFpbiBmaWxlIHN5c3RlbSBvcGVyYXRpb25zLgotCSAqIEBkZXByZWNhdGVkIHVzZQotCSAqICAgICAgICAgICAgIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZS5Mb2NrRmlsZSNMb2NrRmlsZShGaWxlKX0KLQkgKiAgICAgICAgICAgICBpbnN0ZWFkCiAJICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgTG9ja0ZpbGUoZmluYWwgRmlsZSBmLCBmaW5hbCBGUyBmcykgewotCQlyZWYgPSBmOwotCQlsY2sgPSBnZXRMb2NrRmlsZShyZWYpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBsb2NrIGZvciBhbnkgZmlsZS4KLQkgKgotCSAqIEBwYXJhbSBmCi0JICogICAgICAgICAgICB0aGUgZmlsZSB0aGF0IHdpbGwgYmUgbG9ja2VkLgotCSAqLwotCXB1YmxpYyBMb2NrRmlsZShmaW5hbCBGaWxlIGYpIHsKKwlwdWJsaWMgTG9ja0ZpbGUoRmlsZSBmKSB7CiAJCXJlZiA9IGY7CiAJCWxjayA9IGdldExvY2tGaWxlKHJlZik7CiAJfQpAQCAtMjgyLDcgKzI2NCw3IEBACiAJICogICAgICAgICAgICAgdGhlIHRlbXBvcmFyeSBmaWxlIGNvdWxkIG5vdCBiZSB3cml0dGVuLiBUaGUgbG9jayBpcyByZWxlYXNlZAogCSAqICAgICAgICAgICAgIGJlZm9yZSB0aHJvd2luZyB0aGUgdW5kZXJseWluZyBleGNlcHRpb24gdG8gdGhlIGNhbGxlci4KIAkgKi8KLQlwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBPYmplY3RJZCBpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCB3cml0ZShPYmplY3RJZCBpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW0NvbnN0YW50cy5PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSCArIDFdOwogCQlpZC5jb3B5VG8oYnVmLCAwKTsKIAkJYnVmW0NvbnN0YW50cy5PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSF0gPSAnXG4nOwpAQCAtMzAzLDcgKzI4NSw3IEBACiAJICogICAgICAgICAgICAgdGhlIHRlbXBvcmFyeSBmaWxlIGNvdWxkIG5vdCBiZSB3cml0dGVuLiBUaGUgbG9jayBpcyByZWxlYXNlZAogCSAqICAgICAgICAgICAgIGJlZm9yZSB0aHJvd2luZyB0aGUgdW5kZXJseWluZyBleGNlcHRpb24gdG8gdGhlIGNhbGxlci4KIAkgKi8KLQlwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBieXRlW10gY29udGVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gY29udGVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmVxdWlyZUxvY2soKTsKIAkJdHJ5IHsKIAkJCWlmIChmc3luYykgewpAQCAtMzQ5LDE4ICszMzEsMTggQEAKIAogCQlyZXR1cm4gbmV3IE91dHB1dFN0cmVhbSgpIHsKIAkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd3JpdGUoZmluYWwgYnl0ZVtdIGIsIGZpbmFsIGludCBvLCBmaW5hbCBpbnQgbikKKwkJCXB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBiLCBpbnQgbywgaW50IG4pCiAJCQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJb3V0LndyaXRlKGIsIG8sIG4pOwogCQkJfQogCiAJCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdyaXRlKGZpbmFsIGJ5dGVbXSBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJb3V0LndyaXRlKGIpOwogCQkJfQogCiAJCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdyaXRlKGZpbmFsIGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJb3V0LndyaXRlKGIpOwogCQkJfQogCkBAIC00MDAsNyArMzgyLDcgQEAKIAkgKiBAcGFyYW0gb24KIAkgKiAgICAgICAgICAgIHRydWUgaWYgdGhlIGNvbW1pdCBtZXRob2QgbXVzdCByZW1lbWJlciB0aGUgbW9kaWZpY2F0aW9uIHRpbWUuCiAJICovCi0JcHVibGljIHZvaWQgc2V0TmVlZFN0YXRJbmZvcm1hdGlvbihmaW5hbCBib29sZWFuIG9uKSB7CisJcHVibGljIHZvaWQgc2V0TmVlZFN0YXRJbmZvcm1hdGlvbihib29sZWFuIG9uKSB7CiAJCXNldE5lZWRTbmFwc2hvdChvbik7CiAJfQogCkBAIC00MTEsNyArMzkzLDcgQEAKIAkgKiBAcGFyYW0gb24KIAkgKiAgICAgICAgICAgIHRydWUgaWYgdGhlIGNvbW1pdCBtZXRob2QgbXVzdCByZW1lbWJlciB0aGUgRmlsZVNuYXBzaG90LgogCSAqLwotCXB1YmxpYyB2b2lkIHNldE5lZWRTbmFwc2hvdChmaW5hbCBib29sZWFuIG9uKSB7CisJcHVibGljIHZvaWQgc2V0TmVlZFNuYXBzaG90KGJvb2xlYW4gb24pIHsKIAkJbmVlZFNuYXBzaG90ID0gb247CiAJfQogCkBAIC00MjEsNyArNDAzLDcgQEAKIAkgKiBAcGFyYW0gb24KIAkgKiAgICAgICAgICAgIHRydWUgaWYgZGlydHkgZGF0YSBzaG91bGQgYmUgZm9yY2VkIHRvIHRoZSBkcml2ZS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGU3luYyhmaW5hbCBib29sZWFuIG9uKSB7CisJcHVibGljIHZvaWQgc2V0RlN5bmMoYm9vbGVhbiBvbikgewogCQlmc3luYyA9IG9uOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvT2JqZWN0RGlyZWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9PYmplY3REaXJlY3RvcnkuamF2YQppbmRleCA5MmI1M2FkLi41MWM1NzAyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9PYmplY3REaXJlY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9PYmplY3REaXJlY3RvcnkuamF2YQpAQCAtMjU3LDcgKzI1Nyw3IEBACiAJCS8vIEZ1bGx5IGNsb3NlIGFsbCBsb2FkZWQgYWx0ZXJuYXRlcyBhbmQgY2xlYXIgdGhlIGFsdGVybmF0ZSBsaXN0LgogCQlBbHRlcm5hdGVIYW5kbGVbXSBhbHQgPSBhbHRlcm5hdGVzLmdldCgpOwogCQlpZiAoYWx0ICE9IG51bGwgJiYgYWx0ZXJuYXRlcy5jb21wYXJlQW5kU2V0KGFsdCwgbnVsbCkpIHsKLQkJCWZvcihmaW5hbCBBbHRlcm5hdGVIYW5kbGUgb2QgOiBhbHQpCisJCQlmb3IoQWx0ZXJuYXRlSGFuZGxlIG9kIDogYWx0KQogCQkJCW9kLmNsb3NlKCk7CiAJCX0KIAl9CkBAIC0yNzgsNyArMjc4LDcgQEAKIAkgKiBBZGQgYSBzaW5nbGUgZXhpc3RpbmcgcGFjayB0byB0aGUgbGlzdCBvZiBhdmFpbGFibGUgcGFjayBmaWxlcy4KIAkgKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgUGFja0ZpbGUgb3BlblBhY2soZmluYWwgRmlsZSBwYWNrKQorCXB1YmxpYyBQYWNrRmlsZSBvcGVuUGFjayhGaWxlIHBhY2spCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmcgcCA9IHBhY2suZ2V0TmFtZSgpOwogCQlpZiAocC5sZW5ndGgoKSAhPSA1MCB8fCAhcC5zdGFydHNXaXRoKCJwYWNrLSIpIHx8ICFwLmVuZHNXaXRoKCIucGFjayIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKQEAgLTYxOSw3ICs2MTksNyBAQAogCQkJV2luZG93Q3Vyc29yIGN1cnMsIFNldDxBbHRlcm5hdGVIYW5kbGUuSWQ+IHNraXBzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlQYWNrTGlzdCBwTGlzdCA9IHBhY2tMaXN0LmdldCgpOwogCQlTRUFSQ0g6IGZvciAoOzspIHsKLQkJCWZvciAoZmluYWwgUGFja0ZpbGUgcCA6IHBMaXN0LnBhY2tzKSB7CisJCQlmb3IgKFBhY2tGaWxlIHAgOiBwTGlzdC5wYWNrcykgewogCQkJCXRyeSB7CiAJCQkJCUxvY2FsT2JqZWN0UmVwcmVzZW50YXRpb24gcmVwID0gcC5yZXByZXNlbnRhdGlvbihjdXJzLCBvdHApOwogCQkJCQlwLnJlc2V0VHJhbnNpZW50RXJyb3JDb3VudCgpOwpAQCAtODE0LDcgKzgxNCw3IEBACiAJCXJldHVybiBzaGFsbG93Q29tbWl0c0lkczsKIAl9CiAKLQlwcml2YXRlIHZvaWQgaW5zZXJ0UGFjayhmaW5hbCBQYWNrRmlsZSBwZikgeworCXByaXZhdGUgdm9pZCBpbnNlcnRQYWNrKFBhY2tGaWxlIHBmKSB7CiAJCVBhY2tMaXN0IG8sIG47CiAJCWRvIHsKIAkJCW8gPSBwYWNrTGlzdC5nZXQoKTsKQEAgLTgzNyw3ICs4MzcsNyBAQAogCQl9IHdoaWxlICghcGFja0xpc3QuY29tcGFyZUFuZFNldChvLCBuKSk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVBhY2soZmluYWwgUGFja0ZpbGUgZGVhZFBhY2spIHsKKwlwcml2YXRlIHZvaWQgcmVtb3ZlUGFjayhQYWNrRmlsZSBkZWFkUGFjaykgewogCQlQYWNrTGlzdCBvLCBuOwogCQlkbyB7CiAJCQlvID0gcGFja0xpc3QuZ2V0KCk7CkBAIC04NTUsNyArODU1LDcgQEAKIAkJZGVhZFBhY2suY2xvc2UoKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBpbnQgaW5kZXhPZihmaW5hbCBQYWNrRmlsZVtdIGxpc3QsIGZpbmFsIFBhY2tGaWxlIHBhY2spIHsKKwlwcml2YXRlIHN0YXRpYyBpbnQgaW5kZXhPZihQYWNrRmlsZVtdIGxpc3QsIFBhY2tGaWxlIHBhY2spIHsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CiAJCQlpZiAobGlzdFtpXSA9PSBwYWNrKQogCQkJCXJldHVybiBpOwpAQCAtODYzLDcgKzg2Myw3IEBACiAJCXJldHVybiAtMTsKIAl9CiAKLQlwcml2YXRlIFBhY2tMaXN0IHNjYW5QYWNrcyhmaW5hbCBQYWNrTGlzdCBvcmlnaW5hbCkgeworCXByaXZhdGUgUGFja0xpc3Qgc2NhblBhY2tzKFBhY2tMaXN0IG9yaWdpbmFsKSB7CiAJCXN5bmNocm9uaXplZCAocGFja0xpc3QpIHsKIAkJCVBhY2tMaXN0IG8sIG47CiAJCQlkbyB7CkBAIC04ODIsMTMgKzg4MiwxMyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBQYWNrTGlzdCBzY2FuUGFja3NJbXBsKGZpbmFsIFBhY2tMaXN0IG9sZCkgeworCXByaXZhdGUgUGFja0xpc3Qgc2NhblBhY2tzSW1wbChQYWNrTGlzdCBvbGQpIHsKIAkJZmluYWwgTWFwPFN0cmluZywgUGFja0ZpbGU+IGZvclJldXNlID0gcmV1c2VNYXAob2xkKTsKIAkJZmluYWwgRmlsZVNuYXBzaG90IHNuYXBzaG90ID0gRmlsZVNuYXBzaG90LnNhdmUocGFja0RpcmVjdG9yeSk7CiAJCWZpbmFsIFNldDxTdHJpbmc+IG5hbWVzID0gbGlzdFBhY2tEaXJlY3RvcnkoKTsKIAkJZmluYWwgTGlzdDxQYWNrRmlsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8PihuYW1lcy5zaXplKCkgPj4gMik7CiAJCWJvb2xlYW4gZm91bmROZXcgPSBmYWxzZTsKLQkJZm9yIChmaW5hbCBTdHJpbmcgaW5kZXhOYW1lIDogbmFtZXMpIHsKKwkJZm9yIChTdHJpbmcgaW5kZXhOYW1lIDogbmFtZXMpIHsKIAkJCS8vIE11c3QgbWF0Y2ggInBhY2stWzAtOWEtZl17NDB9LmlkeCIgdG8gYmUgYW4gaW5kZXguCiAJCQkvLwogCQkJaWYgKGluZGV4TmFtZS5sZW5ndGgoKSAhPSA0OSB8fCAhaW5kZXhOYW1lLmVuZHNXaXRoKCIuaWR4IikpIC8vJE5PTi1OTFMtMSQKQEAgLTkzMSw3ICs5MzEsNyBAQAogCQkJcmV0dXJuIG9sZDsKIAkJfQogCi0JCWZvciAoZmluYWwgUGFja0ZpbGUgcCA6IGZvclJldXNlLnZhbHVlcygpKSB7CisJCWZvciAoUGFja0ZpbGUgcCA6IGZvclJldXNlLnZhbHVlcygpKSB7CiAJCQlwLmNsb3NlKCk7CiAJCX0KIApAQCAtOTQzLDkgKzk0Myw5IEBACiAJCXJldHVybiBuZXcgUGFja0xpc3Qoc25hcHNob3QsIHIpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFBhY2tGaWxlPiByZXVzZU1hcChmaW5hbCBQYWNrTGlzdCBvbGQpIHsKKwlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBQYWNrRmlsZT4gcmV1c2VNYXAoUGFja0xpc3Qgb2xkKSB7CiAJCWZpbmFsIE1hcDxTdHJpbmcsIFBhY2tGaWxlPiBmb3JSZXVzZSA9IG5ldyBIYXNoTWFwPD4oKTsKLQkJZm9yIChmaW5hbCBQYWNrRmlsZSBwIDogb2xkLnBhY2tzKSB7CisJCWZvciAoUGFja0ZpbGUgcCA6IG9sZC5wYWNrcykgewogCQkJaWYgKHAuaW52YWxpZCgpKSB7CiAJCQkJLy8gVGhlIHBhY2sgaW5zdGFuY2UgaXMgY29ycnVwdGVkLCBhbmQgY2Fubm90IGJlIHNhZmVseSB1c2VkCiAJCQkJLy8gYWdhaW4uIERvIG5vdCBpbmNsdWRlIGl0IGluIG91ciByZXVzZSBtYXAuCkBAIC05NzQsNyArOTc0LDcgQEAKIAkJaWYgKG5hbWVMaXN0ID09IG51bGwpCiAJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKIAkJZmluYWwgU2V0PFN0cmluZz4gbmFtZVNldCA9IG5ldyBIYXNoU2V0PD4obmFtZUxpc3QubGVuZ3RoIDw8IDEpOwotCQlmb3IgKGZpbmFsIFN0cmluZyBuYW1lIDogbmFtZUxpc3QpIHsKKwkJZm9yIChTdHJpbmcgbmFtZSA6IG5hbWVMaXN0KSB7CiAJCQlpZiAobmFtZS5zdGFydHNXaXRoKCJwYWNrLSIpKSAvLyROT04tTkxTLTEkCiAJCQkJbmFtZVNldC5hZGQobmFtZSk7CiAJCX0KQEAgLTEwMzMsMTIgKzEwMzMsMTIgQEAKIAkJcmV0dXJuIGwudG9BcnJheShuZXcgQWx0ZXJuYXRlSGFuZGxlW2wuc2l6ZSgpXSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgQnVmZmVyZWRSZWFkZXIgb3BlbihmaW5hbCBGaWxlIGYpCisJcHJpdmF0ZSBzdGF0aWMgQnVmZmVyZWRSZWFkZXIgb3BlbihGaWxlIGYpCiAJCQl0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKIAkJcmV0dXJuIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmKSk7CiAJfQogCi0JcHJpdmF0ZSBBbHRlcm5hdGVIYW5kbGUgb3BlbkFsdGVybmF0ZShmaW5hbCBTdHJpbmcgbG9jYXRpb24pCisJcHJpdmF0ZSBBbHRlcm5hdGVIYW5kbGUgb3BlbkFsdGVybmF0ZShTdHJpbmcgbG9jYXRpb24pCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBGaWxlIG9iamRpciA9IGZzLnJlc29sdmUob2JqZWN0cywgbG9jYXRpb24pOwogCQlyZXR1cm4gb3BlbkFsdGVybmF0ZShvYmpkaXIpOwpAQCAtMTA3Niw3ICsxMDc2LDcgQEAKIAkJLyoqIEFsbCBrbm93biBwYWNrcywgc29ydGVkIGJ5IHtAbGluayBQYWNrRmlsZSNTT1JUfS4gKi8KIAkJZmluYWwgUGFja0ZpbGVbXSBwYWNrczsKIAotCQlQYWNrTGlzdChmaW5hbCBGaWxlU25hcHNob3QgbW9uaXRvciwgZmluYWwgUGFja0ZpbGVbXSBwYWNrcykgeworCQlQYWNrTGlzdChGaWxlU25hcHNob3QgbW9uaXRvciwgUGFja0ZpbGVbXSBwYWNrcykgewogCQkJdGhpcy5zbmFwc2hvdCA9IG1vbml0b3I7CiAJCQl0aGlzLnBhY2tzID0gcGFja3M7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL09iamVjdERpcmVjdG9yeUluc2VydGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9PYmplY3REaXJlY3RvcnlJbnNlcnRlci5qYXZhCmluZGV4IGUwNmY3MjEuLmU1YTU0ZTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL09iamVjdERpcmVjdG9yeUluc2VydGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvT2JqZWN0RGlyZWN0b3J5SW5zZXJ0ZXIuamF2YQpAQCAtNzgsNyArNzgsNyBAQAogCiAJcHJpdmF0ZSBEZWZsYXRlciBkZWZsYXRlOwogCi0JT2JqZWN0RGlyZWN0b3J5SW5zZXJ0ZXIoZmluYWwgRmlsZU9iamVjdERhdGFiYXNlIGRlc3QsIGZpbmFsIENvbmZpZyBjZmcpIHsKKwlPYmplY3REaXJlY3RvcnlJbnNlcnRlcihGaWxlT2JqZWN0RGF0YWJhc2UgZGVzdCwgQ29uZmlnIGNmZykgewogCQlkYiA9IGRlc3Q7CiAJCWNvbmZpZyA9IGNmZy5nZXQoV3JpdGVDb25maWcuS0VZKTsKIAl9CkBAIC0xMTcsNyArMTE3LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdElkIGluc2VydChmaW5hbCBpbnQgdHlwZSwgbG9uZyBsZW4sIGZpbmFsIElucHV0U3RyZWFtIGlzKQorCXB1YmxpYyBPYmplY3RJZCBpbnNlcnQoaW50IHR5cGUsIGxvbmcgbGVuLCBJbnB1dFN0cmVhbSBpcykKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBpbnNlcnQodHlwZSwgbGVuLCBpcywgZmFsc2UpOwogCX0KQEAgLTI2Nyw3ICsyNjcsNyBAQAogCQl9CiAJfQogCi0Jdm9pZCB3cml0ZUhlYWRlcihPdXRwdXRTdHJlYW0gb3V0LCBmaW5hbCBpbnQgdHlwZSwgbG9uZyBsZW4pCisJdm9pZCB3cml0ZUhlYWRlcihPdXRwdXRTdHJlYW0gb3V0LCBpbnQgdHlwZSwgbG9uZyBsZW4pCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlvdXQud3JpdGUoQ29uc3RhbnRzLmVuY29kZWRUeXBlU3RyaW5nKHR5cGUpKTsKIAkJb3V0LndyaXRlKChieXRlKSAnICcpOwpAQCAtMjc5LDcgKzI3OSw3IEBACiAJCXJldHVybiBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJub3oiLCBudWxsLCBkYi5nZXREaXJlY3RvcnkoKSk7IC8vJE5PTi1OTFMtMSQKIAl9CiAKLQlEZWZsYXRlck91dHB1dFN0cmVhbSBjb21wcmVzcyhmaW5hbCBPdXRwdXRTdHJlYW0gb3V0KSB7CisJRGVmbGF0ZXJPdXRwdXRTdHJlYW0gY29tcHJlc3MoT3V0cHV0U3RyZWFtIG91dCkgewogCQlpZiAoZGVmbGF0ZSA9PSBudWxsKQogCQkJZGVmbGF0ZSA9IG5ldyBEZWZsYXRlcihjb25maWcuZ2V0Q29tcHJlc3Npb24oKSk7CiAJCWVsc2UKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL09iamVjdERpcmVjdG9yeVBhY2tQYXJzZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL09iamVjdERpcmVjdG9yeVBhY2tQYXJzZXIuamF2YQppbmRleCA1ZGNiYTYwLi4wY2VjMmQ1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9PYmplY3REaXJlY3RvcnlQYWNrUGFyc2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvT2JqZWN0RGlyZWN0b3J5UGFja1BhcnNlci5qYXZhCkBAIC0xNTMsNyArMTUzLDcgQEAKIAkgKiBAcGFyYW0gZW1wdHkKIAkgKiAgICAgICAgICAgIHRydWUgdG8gZW5hYmxlIGtlZXBpbmcgYW4gZW1wdHkgcGFjay4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRLZWVwRW1wdHkoZmluYWwgYm9vbGVhbiBlbXB0eSkgeworCXB1YmxpYyB2b2lkIHNldEtlZXBFbXB0eShib29sZWFuIGVtcHR5KSB7CiAJCWtlZXBFbXB0eSA9IGVtcHR5OwogCX0KIApAQCAtNDI5LDggKzQyOSw3IEBACiAKIAlwcml2YXRlIHZvaWQgd3JpdGVJZHgoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlMaXN0PFBhY2tlZE9iamVjdEluZm8+IGxpc3QgPSBnZXRTb3J0ZWRPYmplY3RMaXN0KG51bGwgLyogYnkgT2JqZWN0SWQgKi8pOwotCQlmaW5hbCBGaWxlT3V0cHV0U3RyZWFtIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odG1wSWR4KTsKLQkJdHJ5IHsKKwkJdHJ5IChGaWxlT3V0cHV0U3RyZWFtIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odG1wSWR4KSkgewogCQkJZmluYWwgUGFja0luZGV4V3JpdGVyIGl3OwogCQkJaWYgKGluZGV4VmVyc2lvbiA8PSAwKQogCQkJCWl3ID0gUGFja0luZGV4V3JpdGVyLmNyZWF0ZU9sZGVzdFBvc3NpYmxlKG9zLCBsaXN0KTsKQEAgLTQzOCwxMiArNDM3LDEwIEBACiAJCQkJaXcgPSBQYWNrSW5kZXhXcml0ZXIuY3JlYXRlVmVyc2lvbihvcywgaW5kZXhWZXJzaW9uKTsKIAkJCWl3LndyaXRlKGxpc3QsIHBhY2tIYXNoKTsKIAkJCW9zLmdldENoYW5uZWwoKS5mb3JjZSh0cnVlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW9zLmNsb3NlKCk7CiAJCX0KIAl9CiAKLQlwcml2YXRlIFBhY2tMb2NrIHJlbmFtZUFuZE9wZW5QYWNrKGZpbmFsIFN0cmluZyBsb2NrTWVzc2FnZSkKKwlwcml2YXRlIFBhY2tMb2NrIHJlbmFtZUFuZE9wZW5QYWNrKFN0cmluZyBsb2NrTWVzc2FnZSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmICgha2VlcEVtcHR5ICYmIGdldE9iamVjdENvdW50KCkgPT0gMCkgewogCQkJY2xlYW51cFRlbXBvcmFyeUZpbGVzKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrQml0bWFwSW5kZXguamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tCaXRtYXBJbmRleC5qYXZhCmluZGV4IDIxYTFjN2YuLjY3NzJlMmMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tCaXRtYXBJbmRleC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tCaXRtYXBJbmRleC5qYXZhCkBAIC00NCw3ICs0NCw2IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKQEAgLTUzLDYgKzUyLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkFueU9iamVjdElkOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pby5TaWxlbnRGaWxlSW5wdXRTdHJlYW07CiAKIGltcG9ydCBjb20uZ29vZ2xlY29kZS5qYXZhZXdhaC5FV0FIQ29tcHJlc3NlZEJpdG1hcDsKIApAQCAtOTMsMTkgKzkzLDE1IEBACiAJcHVibGljIHN0YXRpYyBQYWNrQml0bWFwSW5kZXggb3BlbigKIAkJCUZpbGUgaWR4RmlsZSwgUGFja0luZGV4IHBhY2tJbmRleCwgUGFja1JldmVyc2VJbmRleCByZXZlcnNlSW5kZXgpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmaW5hbCBGaWxlSW5wdXRTdHJlYW0gZmQgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGlkeEZpbGUpOwotCQl0cnkgewotCQkJcmV0dXJuIHJlYWQoZmQsIHBhY2tJbmRleCwgcmV2ZXJzZUluZGV4KTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdAotCQkJCQkuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnVucmVhZGFibGVQYWNrSW5kZXgsCi0JCQkJCQkJaWR4RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSksCi0JCQkJCWlvZSk7Ci0JCX0gZmluYWxseSB7CisJCXRyeSAoU2lsZW50RmlsZUlucHV0U3RyZWFtIGZkID0gbmV3IFNpbGVudEZpbGVJbnB1dFN0cmVhbSgKKwkJCQlpZHhGaWxlKSkgewogCQkJdHJ5IHsKLQkJCQlmZC5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXJyMikgewotCQkJCS8vIGlnbm9yZQorCQkJCXJldHVybiByZWFkKGZkLCBwYWNrSW5kZXgsIHJldmVyc2VJbmRleCk7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKwkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oCisJCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS51bnJlYWRhYmxlUGFja0luZGV4LAorCQkJCQkJCQlpZHhGaWxlLmdldEFic29sdXRlUGF0aCgpKSwKKwkJCQkJCWlvZSk7CiAJCQl9CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrRmlsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0ZpbGUuamF2YQppbmRleCBkNTIxOWM3Li43MWY2NGFlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrRmlsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tGaWxlLmphdmEKQEAgLTEwMyw3ICsxMDMsNyBAQAogCS8qKiBTb3J0cyBQYWNrRmlsZXMgdG8gYmUgbW9zdCByZWNlbnRseSBjcmVhdGVkIHRvIGxlYXN0IHJlY2VudGx5IGNyZWF0ZWQuICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPFBhY2tGaWxlPiBTT1JUID0gbmV3IENvbXBhcmF0b3I8UGFja0ZpbGU+KCkgewogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGludCBjb21wYXJlKGZpbmFsIFBhY2tGaWxlIGEsIGZpbmFsIFBhY2tGaWxlIGIpIHsKKwkJcHVibGljIGludCBjb21wYXJlKFBhY2tGaWxlIGEsIFBhY2tGaWxlIGIpIHsKIAkJCXJldHVybiBiLnBhY2tMYXN0TW9kaWZpZWQgLSBhLnBhY2tMYXN0TW9kaWZpZWQ7CiAJCX0KIAl9OwpAQCAtMTYyLDcgKzE2Miw3IEBACiAJICogQHBhcmFtIGV4dGVuc2lvbnMKIAkgKiAgICAgICAgICAgIGFkZGl0aW9uYWwgcGFjayBmaWxlIGV4dGVuc2lvbnMgd2l0aCB0aGUgc2FtZSBiYXNlIGFzIHRoZSBwYWNrCiAJICovCi0JcHVibGljIFBhY2tGaWxlKGZpbmFsIEZpbGUgcGFja0ZpbGUsIGludCBleHRlbnNpb25zKSB7CisJcHVibGljIFBhY2tGaWxlKEZpbGUgcGFja0ZpbGUsIGludCBleHRlbnNpb25zKSB7CiAJCXRoaXMucGFja0ZpbGUgPSBwYWNrRmlsZTsKIAkJdGhpcy5wYWNrTGFzdE1vZGlmaWVkID0gKGludCkgKHBhY2tGaWxlLmxhc3RNb2RpZmllZCgpID4+IDEwKTsKIAkJdGhpcy5leHRlbnNpb25zID0gZXh0ZW5zaW9uczsKQEAgLTI1MSw3ICsyNTEsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBpbmRleCBmaWxlIGNhbm5vdCBiZSBsb2FkZWQgaW50byBtZW1vcnkuCiAJICovCi0JcHVibGljIGJvb2xlYW4gaGFzT2JqZWN0KGZpbmFsIEFueU9iamVjdElkIGlkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBib29sZWFuIGhhc09iamVjdChBbnlPYmplY3RJZCBpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgbG9uZyBvZmZzZXQgPSBpZHgoKS5maW5kT2Zmc2V0KGlkKTsKIAkJcmV0dXJuIDAgPCBvZmZzZXQgJiYgIWlzQ29ycnVwdChvZmZzZXQpOwogCX0KQEAgLTI3OSw3ICsyNzksNyBAQAogCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgcGFjayBmaWxlIG9yIHRoZSBpbmRleCBjb3VsZCBub3QgYmUgcmVhZC4KIAkgKi8KLQlPYmplY3RMb2FkZXIgZ2V0KGZpbmFsIFdpbmRvd0N1cnNvciBjdXJzLCBmaW5hbCBBbnlPYmplY3RJZCBpZCkKKwlPYmplY3RMb2FkZXIgZ2V0KFdpbmRvd0N1cnNvciBjdXJzLCBBbnlPYmplY3RJZCBpZCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGxvbmcgb2Zmc2V0ID0gaWR4KCkuZmluZE9mZnNldChpZCk7CiAJCXJldHVybiAwIDwgb2Zmc2V0ICYmICFpc0NvcnJ1cHQob2Zmc2V0KSA/IGxvYWQoY3Vycywgb2Zmc2V0KSA6IG51bGw7CkBAIC0zNDQsNyArMzQ0LDcgQEAKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIGluZGV4IGZpbGUgY2Fubm90IGJlIGxvYWRlZCBpbnRvIG1lbW9yeS4KIAkgKi8KLQlPYmplY3RJZCBmaW5kT2JqZWN0Rm9yT2Zmc2V0KGZpbmFsIGxvbmcgb2Zmc2V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCU9iamVjdElkIGZpbmRPYmplY3RGb3JPZmZzZXQobG9uZyBvZmZzZXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBnZXRSZXZlcnNlSWR4KCkuZmluZE9iamVjdChvZmZzZXQpOwogCX0KIApAQCAtNjkyLDcgKzY5Miw3IEBACiAJCX0KIAl9CiAKLQlCeXRlQXJyYXlXaW5kb3cgcmVhZChmaW5hbCBsb25nIHBvcywgaW50IHNpemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJQnl0ZUFycmF5V2luZG93IHJlYWQobG9uZyBwb3MsIGludCBzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlzeW5jaHJvbml6ZWQgKHJlYWRMb2NrKSB7CiAJCQlpZiAobGVuZ3RoIDwgcG9zICsgc2l6ZSkKIAkJCQlzaXplID0gKGludCkgKGxlbmd0aCAtIHBvcyk7CkBAIC03MDMsNyArNzAzLDcgQEAKIAkJfQogCX0KIAotCUJ5dGVXaW5kb3cgbW1hcChmaW5hbCBsb25nIHBvcywgaW50IHNpemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJQnl0ZVdpbmRvdyBtbWFwKGxvbmcgcG9zLCBpbnQgc2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJc3luY2hyb25pemVkIChyZWFkTG9jaykgewogCQkJaWYgKGxlbmd0aCA8IHBvcyArIHNpemUpCiAJCQkJc2l6ZSA9IChpbnQpIChsZW5ndGggLSBwb3MpOwpAQCAtNzYwLDcgKzc2MCw3IEBACiAJCX0KIAl9CiAKLQlPYmplY3RMb2FkZXIgbG9hZChmaW5hbCBXaW5kb3dDdXJzb3IgY3VycywgbG9uZyBwb3MpCisJT2JqZWN0TG9hZGVyIGxvYWQoV2luZG93Q3Vyc29yIGN1cnMsIGxvbmcgcG9zKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBMYXJnZU9iamVjdEV4Y2VwdGlvbiB7CiAJCXRyeSB7CiAJCQlmaW5hbCBieXRlW10gaWIgPSBjdXJzLnRlbXBJZDsKQEAgLTk0OSw3ICs5NDksNyBAQAogCQlyZXR1cm4gaGRyOwogCX0KIAotCWludCBnZXRPYmplY3RUeXBlKGZpbmFsIFdpbmRvd0N1cnNvciBjdXJzLCBsb25nIHBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlpbnQgZ2V0T2JqZWN0VHlwZShXaW5kb3dDdXJzb3IgY3VycywgbG9uZyBwb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGJ5dGVbXSBpYiA9IGN1cnMudGVtcElkOwogCQlmb3IgKDs7KSB7CiAJCQlyZWFkRnVsbHkocG9zLCBpYiwgMCwgMjAsIGN1cnMpOwpAQCAtOTk2LDEzICs5OTYsMTMgQEAKIAkJfQogCX0KIAotCWxvbmcgZ2V0T2JqZWN0U2l6ZShmaW5hbCBXaW5kb3dDdXJzb3IgY3VycywgZmluYWwgQW55T2JqZWN0SWQgaWQpCisJbG9uZyBnZXRPYmplY3RTaXplKFdpbmRvd0N1cnNvciBjdXJzLCBBbnlPYmplY3RJZCBpZCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGxvbmcgb2Zmc2V0ID0gaWR4KCkuZmluZE9mZnNldChpZCk7CiAJCXJldHVybiAwIDwgb2Zmc2V0ID8gZ2V0T2JqZWN0U2l6ZShjdXJzLCBvZmZzZXQpIDogLTE7CiAJfQogCi0JbG9uZyBnZXRPYmplY3RTaXplKGZpbmFsIFdpbmRvd0N1cnNvciBjdXJzLCBmaW5hbCBsb25nIHBvcykKKwlsb25nIGdldE9iamVjdFNpemUoV2luZG93Q3Vyc29yIGN1cnMsIGxvbmcgcG9zKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgYnl0ZVtdIGliID0gY3Vycy50ZW1wSWQ7CiAJCXJlYWRGdWxseShwb3MsIGliLCAwLCAyMCwgY3Vycyk7CkBAIC0xMTAwLDcgKzExMDAsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBsb25nIGZpbmRFbmRPZmZzZXQoZmluYWwgbG9uZyBzdGFydE9mZnNldCkKKwlwcml2YXRlIGxvbmcgZmluZEVuZE9mZnNldChsb25nIHN0YXJ0T2Zmc2V0KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JydXB0T2JqZWN0RXhjZXB0aW9uIHsKIAkJZmluYWwgbG9uZyBtYXhPZmZzZXQgPSBsZW5ndGggLSAyMDsKIAkJcmV0dXJuIGdldFJldmVyc2VJZHgoKS5maW5kTmV4dE9mZnNldChzdGFydE9mZnNldCwgbWF4T2Zmc2V0KTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luZGV4LmphdmEKaW5kZXggYWNmZDljNC4uNzI2OTliMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luZGV4LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luZGV4LmphdmEKQEAgLTQ1LDcgKzQ1LDYgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwpAQCAtNjQsNiArNjMsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkU2V0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5JTzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuTkI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvLlNpbGVudEZpbGVJbnB1dFN0cmVhbTsKIAogLyoqCiAgKiBBY2Nlc3MgcGF0aCB0byBsb2NhdGUgb2JqZWN0cyBieSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWR9IGluIGEKQEAgLTk0LDIxICs5NCwxNSBAQAogCSAqICAgICAgICAgICAgIHRoZSBmaWxlIGV4aXN0cyBidXQgY291bGQgbm90IGJlIHJlYWQgZHVlIHRvIHNlY3VyaXR5IGVycm9ycywKIAkgKiAgICAgICAgICAgICB1bnJlY29nbml6ZWQgZGF0YSB2ZXJzaW9uLCBvciB1bmV4cGVjdGVkIGRhdGEgY29ycnVwdGlvbi4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFBhY2tJbmRleCBvcGVuKGZpbmFsIEZpbGUgaWR4RmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZmluYWwgRmlsZUlucHV0U3RyZWFtIGZkID0gbmV3IEZpbGVJbnB1dFN0cmVhbShpZHhGaWxlKTsKLQkJdHJ5IHsKLQkJCXJldHVybiByZWFkKGZkKTsKKwlwdWJsaWMgc3RhdGljIFBhY2tJbmRleCBvcGVuKEZpbGUgaWR4RmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdHJ5IChTaWxlbnRGaWxlSW5wdXRTdHJlYW0gZmQgPSBuZXcgU2lsZW50RmlsZUlucHV0U3RyZWFtKAorCQkJCWlkeEZpbGUpKSB7CisJCQkJcmV0dXJuIHJlYWQoZmQpOwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlRm9ybWF0Ci0JCQkJCS5mb3JtYXQoSkdpdFRleHQuZ2V0KCkudW5yZWFkYWJsZVBhY2tJbmRleCwKKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigKKwkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkudW5yZWFkYWJsZVBhY2tJbmRleCwKIAkJCQkJCQlpZHhGaWxlLmdldEFic29sdXRlUGF0aCgpKSwKIAkJCQkJaW9lKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJZmQuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGVycjIpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KIAkJfQogCX0KIApAQCAtMTQ1LDcgKzEzOSw3IEBACiAJCXJldHVybiBuZXcgUGFja0luZGV4VjEoZmQsIGhkcik7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1RPQyhmaW5hbCBieXRlW10gaCkgeworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUT0MoYnl0ZVtdIGgpIHsKIAkJZmluYWwgYnl0ZVtdIHRvYyA9IFBhY2tJbmRleFdyaXRlci5UT0M7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgdG9jLmxlbmd0aDsgaSsrKQogCQkJaWYgKGhbaV0gIT0gdG9jW2ldKQpAQCAtMTYzLDcgKzE1Nyw3IEBACiAJICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGxvb2sgZm9yLiBNdXN0IG5vdCBiZSBudWxsLgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGxpc3RlZCBpbiB0aGlzIGluZGV4OyBmYWxzZSBvdGhlcndpc2UuCiAJICovCi0JcHVibGljIGJvb2xlYW4gaGFzT2JqZWN0KGZpbmFsIEFueU9iamVjdElkIGlkKSB7CisJcHVibGljIGJvb2xlYW4gaGFzT2JqZWN0KEFueU9iamVjdElkIGlkKSB7CiAJCXJldHVybiBmaW5kT2Zmc2V0KGlkKSAhPSAtMTsKIAl9CiAKQEAgLTI0Nyw3ICsyNDEsNyBAQAogCSAqICAgICAgICAgICAgbmVnYXRpdmUsIGJ1dCBzdGlsbCB2YWxpZC4KIAkgKiBAcmV0dXJuIHRoZSBPYmplY3RJZCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgZW50cnkuCiAJICovCi0JcHVibGljIGZpbmFsIE9iamVjdElkIGdldE9iamVjdElkKGZpbmFsIGludCBudGhQb3NpdGlvbikgeworCXB1YmxpYyBmaW5hbCBPYmplY3RJZCBnZXRPYmplY3RJZChpbnQgbnRoUG9zaXRpb24pIHsKIAkJaWYgKG50aFBvc2l0aW9uID49IDApCiAJCQlyZXR1cm4gZ2V0T2JqZWN0SWQoKGxvbmcpIG50aFBvc2l0aW9uKTsKIAkJZmluYWwgaW50IHUzMSA9IG50aFBvc2l0aW9uID4+PiAxOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luZGV4VjEuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleFYxLmphdmEKaW5kZXggOGVhMzFlNC4uNDQ0NGRkNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luZGV4VjEuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrSW5kZXhWMS5qYXZhCkBAIC0xMTMsMTQgKzExMywxNCBAQAogCUBPdmVycmlkZQogCXB1YmxpYyBsb25nIGdldE9mZnNldDY0Q291bnQoKSB7CiAJCWxvbmcgbjY0ID0gMDsKLQkJZm9yIChmaW5hbCBNdXRhYmxlRW50cnkgZSA6IHRoaXMpIHsKKwkJZm9yIChNdXRhYmxlRW50cnkgZSA6IHRoaXMpIHsKIAkJCWlmIChlLmdldE9mZnNldCgpID49IEludGVnZXIuTUFYX1ZBTFVFKQogCQkJCW42NCsrOwogCQl9CiAJCXJldHVybiBuNjQ7CiAJfQogCi0JcHJpdmF0ZSBpbnQgZmluZExldmVsT25lKGZpbmFsIGxvbmcgbnRoUG9zaXRpb24pIHsKKwlwcml2YXRlIGludCBmaW5kTGV2ZWxPbmUobG9uZyBudGhQb3NpdGlvbikgewogCQlpbnQgbGV2ZWxPbmUgPSBBcnJheXMuYmluYXJ5U2VhcmNoKGlkeEhlYWRlciwgbnRoUG9zaXRpb24gKyAxKTsKIAkJaWYgKGxldmVsT25lID49IDApIHsKIAkJCS8vIElmIHdlIGhpdCB0aGUgYnVja2V0IGV4YWN0bHkgdGhlIGl0ZW0gaXMgaW4gdGhlIGJ1Y2tldCwgb3IKQEAgLTEzNywxNCArMTM3LDE0IEBACiAJCXJldHVybiBsZXZlbE9uZTsKIAl9CiAKLQlwcml2YXRlIGludCBnZXRMZXZlbFR3byhmaW5hbCBsb25nIG50aFBvc2l0aW9uLCBmaW5hbCBpbnQgbGV2ZWxPbmUpIHsKKwlwcml2YXRlIGludCBnZXRMZXZlbFR3byhsb25nIG50aFBvc2l0aW9uLCBpbnQgbGV2ZWxPbmUpIHsKIAkJZmluYWwgbG9uZyBiYXNlID0gbGV2ZWxPbmUgPiAwID8gaWR4SGVhZGVyW2xldmVsT25lIC0gMV0gOiAwOwogCQlyZXR1cm4gKGludCkgKG50aFBvc2l0aW9uIC0gYmFzZSk7CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0SWQgZ2V0T2JqZWN0SWQoZmluYWwgbG9uZyBudGhQb3NpdGlvbikgeworCXB1YmxpYyBPYmplY3RJZCBnZXRPYmplY3RJZChsb25nIG50aFBvc2l0aW9uKSB7CiAJCWZpbmFsIGludCBsZXZlbE9uZSA9IGZpbmRMZXZlbE9uZShudGhQb3NpdGlvbik7CiAJCWZpbmFsIGludCBwID0gZ2V0TGV2ZWxUd28obnRoUG9zaXRpb24sIGxldmVsT25lKTsKIAkJZmluYWwgaW50IGRhdGFJZHggPSBpZE9mZnNldChwKTsKQEAgLTE2MSw3ICsxNjEsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgbG9uZyBmaW5kT2Zmc2V0KGZpbmFsIEFueU9iamVjdElkIG9iaklkKSB7CisJcHVibGljIGxvbmcgZmluZE9mZnNldChBbnlPYmplY3RJZCBvYmpJZCkgewogCQlmaW5hbCBpbnQgbGV2ZWxPbmUgPSBvYmpJZC5nZXRGaXJzdEJ5dGUoKTsKIAkJYnl0ZVtdIGRhdGEgPSBpZHhkYXRhW2xldmVsT25lXTsKIAkJaWYgKGRhdGEgPT0gbnVsbCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleFYyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrSW5kZXhWMi5qYXZhCmluZGV4IDlmNjIwMWYuLmE5NjA2Y2YgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleFYyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luZGV4VjIuamF2YQpAQCAtMTc2LDcgKzE3Niw3IEBACiAJCXJldHVybiBvZmZzZXQ2NC5sZW5ndGggLyA4OwogCX0KIAotCXByaXZhdGUgaW50IGZpbmRMZXZlbE9uZShmaW5hbCBsb25nIG50aFBvc2l0aW9uKSB7CisJcHJpdmF0ZSBpbnQgZmluZExldmVsT25lKGxvbmcgbnRoUG9zaXRpb24pIHsKIAkJaW50IGxldmVsT25lID0gQXJyYXlzLmJpbmFyeVNlYXJjaChmYW5vdXRUYWJsZSwgbnRoUG9zaXRpb24gKyAxKTsKIAkJaWYgKGxldmVsT25lID49IDApIHsKIAkJCS8vIElmIHdlIGhpdCB0aGUgYnVja2V0IGV4YWN0bHkgdGhlIGl0ZW0gaXMgaW4gdGhlIGJ1Y2tldCwgb3IKQEAgLTE5MywxNCArMTkzLDE0IEBACiAJCXJldHVybiBsZXZlbE9uZTsKIAl9CiAKLQlwcml2YXRlIGludCBnZXRMZXZlbFR3byhmaW5hbCBsb25nIG50aFBvc2l0aW9uLCBmaW5hbCBpbnQgbGV2ZWxPbmUpIHsKKwlwcml2YXRlIGludCBnZXRMZXZlbFR3byhsb25nIG50aFBvc2l0aW9uLCBpbnQgbGV2ZWxPbmUpIHsKIAkJZmluYWwgbG9uZyBiYXNlID0gbGV2ZWxPbmUgPiAwID8gZmFub3V0VGFibGVbbGV2ZWxPbmUgLSAxXSA6IDA7CiAJCXJldHVybiAoaW50KSAobnRoUG9zaXRpb24gLSBiYXNlKTsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3RJZCBnZXRPYmplY3RJZChmaW5hbCBsb25nIG50aFBvc2l0aW9uKSB7CisJcHVibGljIE9iamVjdElkIGdldE9iamVjdElkKGxvbmcgbnRoUG9zaXRpb24pIHsKIAkJZmluYWwgaW50IGxldmVsT25lID0gZmluZExldmVsT25lKG50aFBvc2l0aW9uKTsKIAkJZmluYWwgaW50IHAgPSBnZXRMZXZlbFR3byhudGhQb3NpdGlvbiwgbGV2ZWxPbmUpOwogCQlmaW5hbCBpbnQgcDQgPSBwIDw8IDI7CkBAIC0yMDksNyArMjA5LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGxvbmcgZ2V0T2Zmc2V0KGZpbmFsIGxvbmcgbnRoUG9zaXRpb24pIHsKKwlwdWJsaWMgbG9uZyBnZXRPZmZzZXQobG9uZyBudGhQb3NpdGlvbikgewogCQlmaW5hbCBpbnQgbGV2ZWxPbmUgPSBmaW5kTGV2ZWxPbmUobnRoUG9zaXRpb24pOwogCQlmaW5hbCBpbnQgbGV2ZWxUd28gPSBnZXRMZXZlbFR3byhudGhQb3NpdGlvbiwgbGV2ZWxPbmUpOwogCQlyZXR1cm4gZ2V0T2Zmc2V0KGxldmVsT25lLCBsZXZlbFR3byk7CkBAIC0yMTcsNyArMjE3LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGxvbmcgZmluZE9mZnNldChmaW5hbCBBbnlPYmplY3RJZCBvYmpJZCkgeworCXB1YmxpYyBsb25nIGZpbmRPZmZzZXQoQW55T2JqZWN0SWQgb2JqSWQpIHsKIAkJZmluYWwgaW50IGxldmVsT25lID0gb2JqSWQuZ2V0Rmlyc3RCeXRlKCk7CiAJCWZpbmFsIGludCBsZXZlbFR3byA9IGJpbmFyeVNlYXJjaExldmVsVHdvKG9iaklkLCBsZXZlbE9uZSk7CiAJCWlmIChsZXZlbFR3byA9PSAtMSkKQEAgLTIyNSw3ICsyMjUsNyBAQAogCQlyZXR1cm4gZ2V0T2Zmc2V0KGxldmVsT25lLCBsZXZlbFR3byk7CiAJfQogCi0JcHJpdmF0ZSBsb25nIGdldE9mZnNldChmaW5hbCBpbnQgbGV2ZWxPbmUsIGZpbmFsIGludCBsZXZlbFR3bykgeworCXByaXZhdGUgbG9uZyBnZXRPZmZzZXQoaW50IGxldmVsT25lLCBpbnQgbGV2ZWxUd28pIHsKIAkJZmluYWwgbG9uZyBwID0gTkIuZGVjb2RlVUludDMyKG9mZnNldDMyW2xldmVsT25lXSwgbGV2ZWxUd28gPDwgMik7CiAJCWlmICgocCAmIElTX082NCkgIT0gMCkKIAkJCXJldHVybiBOQi5kZWNvZGVVSW50NjQob2Zmc2V0NjQsICg4ICogKGludCkgKHAgJiB+SVNfTzY0KSkpOwpAQCAtMjkwLDcgKzI5MCw3IEBACiAJCXJldHVybiAocCA8PCAyKSArIHA7IC8vIHAgKiA1CiAJfQogCi0JcHJpdmF0ZSBpbnQgYmluYXJ5U2VhcmNoTGV2ZWxUd28oZmluYWwgQW55T2JqZWN0SWQgb2JqSWQsIGZpbmFsIGludCBsZXZlbE9uZSkgeworCXByaXZhdGUgaW50IGJpbmFyeVNlYXJjaExldmVsVHdvKEFueU9iamVjdElkIG9iaklkLCBpbnQgbGV2ZWxPbmUpIHsKIAkJZmluYWwgaW50W10gZGF0YSA9IG5hbWVzW2xldmVsT25lXTsKIAkJaW50IGhpZ2ggPSBvZmZzZXQzMltsZXZlbE9uZV0ubGVuZ3RoID4+PiAyOwogCQlpZiAoaGlnaCA9PSAwKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luZGV4V3JpdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrSW5kZXhXcml0ZXIuamF2YQppbmRleCBiOTJmN2IyLi41NTNmN2M5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrSW5kZXhXcml0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrSW5kZXhXcml0ZXIuamF2YQpAQCAtMTIzLDcgKzEyMyw3IEBACiAJICovCiAJcHVibGljIHN0YXRpYyBpbnQgb2xkZXN0UG9zc2libGVGb3JtYXQoCiAJCQlmaW5hbCBMaXN0PD8gZXh0ZW5kcyBQYWNrZWRPYmplY3RJbmZvPiBvYmpzKSB7Ci0JCWZvciAoZmluYWwgUGFja2VkT2JqZWN0SW5mbyBvZSA6IG9ianMpIHsKKwkJZm9yIChQYWNrZWRPYmplY3RJbmZvIG9lIDogb2JqcykgewogCQkJaWYgKCFQYWNrSW5kZXhXcml0ZXJWMS5jYW5TdG9yZShvZSkpCiAJCQkJcmV0dXJuIDI7CiAJCX0KQEAgLTE4MCw3ICsxODAsNyBAQAogCSAqICAgICAgICAgICAgdGhlIHN0cmVhbSB0aGlzIGluc3RhbmNlIG91dHB1dHMgdG8uIElmIG5vdCBhbHJlYWR5IGJ1ZmZlcmVkCiAJICogICAgICAgICAgICBpdCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgd3JhcHBlZCBpbiBhIGJ1ZmZlcmVkIHN0cmVhbS4KIAkgKi8KLQlwcm90ZWN0ZWQgUGFja0luZGV4V3JpdGVyKGZpbmFsIE91dHB1dFN0cmVhbSBkc3QpIHsKKwlwcm90ZWN0ZWQgUGFja0luZGV4V3JpdGVyKE91dHB1dFN0cmVhbSBkc3QpIHsKIAkJb3V0ID0gbmV3IERpZ2VzdE91dHB1dFN0cmVhbShkc3QgaW5zdGFuY2VvZiBCdWZmZXJlZE91dHB1dFN0cmVhbSA/IGRzdAogCQkJCTogbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGRzdCksCiAJCQkJQ29uc3RhbnRzLm5ld01lc3NhZ2VEaWdlc3QoKSk7CkBAIC0yNTAsNyArMjUwLDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB3cml0aW5nIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgogCSAqLwotCXByb3RlY3RlZCB2b2lkIHdyaXRlVE9DKGZpbmFsIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCB2b2lkIHdyaXRlVE9DKGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlvdXQud3JpdGUoVE9DKTsKIAkJTkIuZW5jb2RlSW50MzIodG1wLCAwLCB2ZXJzaW9uKTsKIAkJb3V0LndyaXRlKHRtcCwgMCwgNCk7CkBAIC0yNjksMTEgKzI2OSwxMSBAQAogCSAqLwogCXByb3RlY3RlZCB2b2lkIHdyaXRlRmFuT3V0VGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBpbnRbXSBmYW5vdXQgPSBuZXcgaW50WzI1Nl07Ci0JCWZvciAoZmluYWwgUGFja2VkT2JqZWN0SW5mbyBwbyA6IGVudHJpZXMpCisJCWZvciAoUGFja2VkT2JqZWN0SW5mbyBwbyA6IGVudHJpZXMpCiAJCQlmYW5vdXRbcG8uZ2V0Rmlyc3RCeXRlKCkgJiAweGZmXSsrOwogCQlmb3IgKGludCBpID0gMTsgaSA8IDI1NjsgaSsrKQogCQkJZmFub3V0W2ldICs9IGZhbm91dFtpIC0gMV07Ci0JCWZvciAoZmluYWwgaW50IG4gOiBmYW5vdXQpIHsKKwkJZm9yIChpbnQgbiA6IGZhbm91dCkgewogCQkJTkIuZW5jb2RlSW50MzIodG1wLCAwLCBuKTsKIAkJCW91dC53cml0ZSh0bXAsIDAsIDQpOwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrSW5kZXhXcml0ZXJWMS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luZGV4V3JpdGVyVjEuamF2YQppbmRleCBmMjIwZTdhLi44NzdmN2M4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrSW5kZXhXcml0ZXJWMS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleFdyaXRlclYxLmphdmEKQEAgLTU4LDcgKzU4LDcgQEAKICAqIEBzZWUgUGFja0luZGV4VjEKICAqLwogY2xhc3MgUGFja0luZGV4V3JpdGVyVjEgZXh0ZW5kcyBQYWNrSW5kZXhXcml0ZXIgewotCXN0YXRpYyBib29sZWFuIGNhblN0b3JlKGZpbmFsIFBhY2tlZE9iamVjdEluZm8gb2UpIHsKKwlzdGF0aWMgYm9vbGVhbiBjYW5TdG9yZShQYWNrZWRPYmplY3RJbmZvIG9lKSB7CiAJCS8vIFdlIGFyZSBsaW1pdGVkIHRvIDQgR0IgcGVyIHBhY2sgYXMgb2Zmc2V0IGlzIDMyIGJpdCB1bnNpZ25lZCBpbnQuCiAJCS8vCiAJCXJldHVybiBvZS5nZXRPZmZzZXQoKSA+Pj4gMSA8IEludGVnZXIuTUFYX1ZBTFVFOwpAQCAtNzMsNyArNzMsNyBAQAogCXByb3RlY3RlZCB2b2lkIHdyaXRlSW1wbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXdyaXRlRmFuT3V0VGFibGUoKTsKIAotCQlmb3IgKGZpbmFsIFBhY2tlZE9iamVjdEluZm8gb2UgOiBlbnRyaWVzKSB7CisJCWZvciAoUGFja2VkT2JqZWN0SW5mbyBvZSA6IGVudHJpZXMpIHsKIAkJCWlmICghY2FuU3RvcmUob2UpKQogCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS5wYWNrVG9vTGFyZ2VGb3JJbmRleFZlcnNpb24xKTsKIAkJCU5CLmVuY29kZUludDMyKHRtcCwgMCwgKGludCkgb2UuZ2V0T2Zmc2V0KCkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luZGV4V3JpdGVyVjIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleFdyaXRlclYyLmphdmEKaW5kZXggYTE4Y2NhZi4uOTUwNWQzNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luZGV4V3JpdGVyVjIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrSW5kZXhXcml0ZXJWMi5qYXZhCkBAIC03NiwxMiArNzYsMTIgQEAKIAl9CiAKIAlwcml2YXRlIHZvaWQgd3JpdGVPYmplY3ROYW1lcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZvciAoZmluYWwgUGFja2VkT2JqZWN0SW5mbyBvZSA6IGVudHJpZXMpCisJCWZvciAoUGFja2VkT2JqZWN0SW5mbyBvZSA6IGVudHJpZXMpCiAJCQlvZS5jb3B5UmF3VG8ob3V0KTsKIAl9CiAKIAlwcml2YXRlIHZvaWQgd3JpdGVDUkNzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZm9yIChmaW5hbCBQYWNrZWRPYmplY3RJbmZvIG9lIDogZW50cmllcykgeworCQlmb3IgKFBhY2tlZE9iamVjdEluZm8gb2UgOiBlbnRyaWVzKSB7CiAJCQlOQi5lbmNvZGVJbnQzMih0bXAsIDAsIG9lLmdldENSQygpKTsKIAkJCW91dC53cml0ZSh0bXAsIDAsIDQpOwogCQl9CkBAIC04OSw3ICs4OSw3IEBACiAKIAlwcml2YXRlIHZvaWQgd3JpdGVPZmZzZXQzMigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWludCBvNjQgPSAwOwotCQlmb3IgKGZpbmFsIFBhY2tlZE9iamVjdEluZm8gb2UgOiBlbnRyaWVzKSB7CisJCWZvciAoUGFja2VkT2JqZWN0SW5mbyBvZSA6IGVudHJpZXMpIHsKIAkJCWZpbmFsIGxvbmcgbyA9IG9lLmdldE9mZnNldCgpOwogCQkJaWYgKG8gPD0gTUFYX09GRlNFVF8zMikKIAkJCQlOQi5lbmNvZGVJbnQzMih0bXAsIDAsIChpbnQpIG8pOwpAQCAtMTAwLDcgKzEwMCw3IEBACiAJfQogCiAJcHJpdmF0ZSB2b2lkIHdyaXRlT2Zmc2V0NjQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmb3IgKGZpbmFsIFBhY2tlZE9iamVjdEluZm8gb2UgOiBlbnRyaWVzKSB7CisJCWZvciAoUGFja2VkT2JqZWN0SW5mbyBvZSA6IGVudHJpZXMpIHsKIAkJCWZpbmFsIGxvbmcgbyA9IG9lLmdldE9mZnNldCgpOwogCQkJaWYgKE1BWF9PRkZTRVRfMzIgPCBvKSB7CiAJCQkJTkIuZW5jb2RlSW50NjQodG1wLCAwLCBvKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbnNlcnRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luc2VydGVyLmphdmEKaW5kZXggN2ZmMjY5Ni4uMGNlM2NjOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luc2VydGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luc2VydGVyLmphdmEKQEAgLTQzOCw3ICs0MzgsNyBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHdyaXRlKGZpbmFsIGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCWhkckJ1ZlswXSA9IChieXRlKSBiOwogCQkJd3JpdGUoaGRyQnVmLCAwLCAxKTsKIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0xvY2suamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tMb2NrLmphdmEKaW5kZXggODJmMGRhMS4uMGZiODkxMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0xvY2suamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrTG9jay5qYXZhCkBAIC02NSw3ICs2NSw3IEBACiAJICogQHBhcmFtIGZzCiAJICogICAgICAgICAgICB0aGUgZmlsZXN5c3RlbSBhYnN0cmFjdGlvbiB1c2VkIGJ5IHRoZSByZXBvc2l0b3J5LgogCSAqLwotCXB1YmxpYyBQYWNrTG9jayhmaW5hbCBGaWxlIHBhY2tGaWxlLCBmaW5hbCBGUyBmcykgeworCXB1YmxpYyBQYWNrTG9jayhGaWxlIHBhY2tGaWxlLCBGUyBmcykgewogCQlmaW5hbCBGaWxlIHAgPSBwYWNrRmlsZS5nZXRQYXJlbnRGaWxlKCk7CiAJCWZpbmFsIFN0cmluZyBuID0gcGFja0ZpbGUuZ2V0TmFtZSgpOwogCQlrZWVwRmlsZSA9IG5ldyBGaWxlKHAsIG4uc3Vic3RyaW5nKDAsIG4ubGVuZ3RoKCkgLSA1KSArICIua2VlcCIpOyAvLyROT04tTkxTLTEkCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrUmV2ZXJzZUluZGV4LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrUmV2ZXJzZUluZGV4LmphdmEKaW5kZXggOTQ0YWYyNi4uZGZlMjNiYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja1JldmVyc2VJbmRleC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tSZXZlcnNlSW5kZXguamF2YQpAQCAtODgsNyArODgsNyBAQAogCSAqIEBwYXJhbSBwYWNrSW5kZXgKIAkgKiAgICAgICAgICAgIGZvcndhcmQgaW5kZXggLSBlbnRyaWVzIHRvIChyZXZlcnNlKSBpbmRleC4KIAkgKi8KLQlwdWJsaWMgUGFja1JldmVyc2VJbmRleChmaW5hbCBQYWNrSW5kZXggcGFja0luZGV4KSB7CisJcHVibGljIFBhY2tSZXZlcnNlSW5kZXgoUGFja0luZGV4IHBhY2tJbmRleCkgewogCQlpbmRleCA9IHBhY2tJbmRleDsKIAogCQlmaW5hbCBsb25nIGNudCA9IGluZGV4LmdldE9iamVjdENvdW50KCk7CkBAIC0xMDcsNyArMTA3LDcgQEAKIAogCQlsb25nIG1heE9mZnNldCA9IDA7CiAJCWludCBpdGggPSAwOwotCQlmb3IgKGZpbmFsIE11dGFibGVFbnRyeSBtZSA6IGluZGV4KSB7CisJCWZvciAoTXV0YWJsZUVudHJ5IG1lIDogaW5kZXgpIHsKIAkJCWZpbmFsIGxvbmcgbyA9IG1lLmdldE9mZnNldCgpOwogCQkJb2Zmc2V0c0J5U2hhMVtpdGgrK10gPSBvOwogCQkJaWYgKG8gPiBtYXhPZmZzZXQpCkBAIC0xNTUsNyArMTU1LDcgQEAKIAkgKiAgICAgICAgICAgIHN0YXJ0IG9mZnNldCBvZiBvYmplY3QgdG8gZmluZC4KIAkgKiBAcmV0dXJuIG9iamVjdCBpZCBmb3IgdGhpcyBvZmZzZXQsIG9yIG51bGwgaWYgbm8gb2JqZWN0IHdhcyBmb3VuZC4KIAkgKi8KLQlwdWJsaWMgT2JqZWN0SWQgZmluZE9iamVjdChmaW5hbCBsb25nIG9mZnNldCkgeworCXB1YmxpYyBPYmplY3RJZCBmaW5kT2JqZWN0KGxvbmcgb2Zmc2V0KSB7CiAJCWZpbmFsIGludCBpdGggPSBiaW5hcnlTZWFyY2gob2Zmc2V0KTsKIAkJaWYgKGl0aCA8IDApCiAJCQlyZXR1cm4gbnVsbDsKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQ29ycnVwdE9iamVjdEV4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHdoZW4gdGhlcmUgaXMgbm8gb2JqZWN0IHdpdGggdGhlIHByb3ZpZGVkIG9mZnNldC4KIAkgKi8KLQlwdWJsaWMgbG9uZyBmaW5kTmV4dE9mZnNldChmaW5hbCBsb25nIG9mZnNldCwgZmluYWwgbG9uZyBtYXhPZmZzZXQpCisJcHVibGljIGxvbmcgZmluZE5leHRPZmZzZXQobG9uZyBvZmZzZXQsIGxvbmcgbWF4T2Zmc2V0KQogCQkJdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24gewogCQlmaW5hbCBpbnQgaXRoID0gYmluYXJ5U2VhcmNoKG9mZnNldCk7CiAJCWlmIChpdGggPCAwKQpAQCAtMTk1LDcgKzE5NSw3IEBACiAJCXJldHVybiBiaW5hcnlTZWFyY2gob2Zmc2V0KTsKIAl9CiAKLQlwcml2YXRlIGludCBiaW5hcnlTZWFyY2goZmluYWwgbG9uZyBvZmZzZXQpIHsKKwlwcml2YXRlIGludCBiaW5hcnlTZWFyY2gobG9uZyBvZmZzZXQpIHsKIAkJaW50IGJ1Y2tldCA9IChpbnQpIChvZmZzZXQgLyBidWNrZXRTaXplKTsKIAkJaW50IGxvdyA9IGJ1Y2tldCA9PSAwID8gMCA6IG9mZnNldEluZGV4W2J1Y2tldCAtIDFdOwogCQlpbnQgaGlnaCA9IG9mZnNldEluZGV4W2J1Y2tldF07CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZEaXJlY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZkRpcmVjdG9yeS5qYXZhCmluZGV4IDEwNmM4NGIuLjZhMThkZjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZkRpcmVjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZkRpcmVjdG9yeS5qYXZhCkBAIC0yMDksNyArMjA5LDcgQEAKIAogCXByaXZhdGUgTGlzdDxJbnRlZ2VyPiByZXRyeVNsZWVwTXMgPSBSRVRSWV9TTEVFUF9NUzsKIAotCVJlZkRpcmVjdG9yeShmaW5hbCBGaWxlUmVwb3NpdG9yeSBkYikgeworCVJlZkRpcmVjdG9yeShGaWxlUmVwb3NpdG9yeSBkYikgewogCQlmaW5hbCBGUyBmcyA9IGRiLmdldEZTKCk7CiAJCXBhcmVudCA9IGRiOwogCQlnaXREaXIgPSBkYi5nZXREaXJlY3RvcnkoKTsKQEAgLTM0Niw3ICszNDYsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVmIGdldFJlZihmaW5hbCBTdHJpbmcgbmVlZGxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBSZWYgZ2V0UmVmKFN0cmluZyBuZWVkbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIFJlZkxpc3Q8UmVmPiBwYWNrZWQgPSBnZXRQYWNrZWRSZWZzKCk7CiAJCVJlZiByZWYgPSBudWxsOwogCQlmb3IgKFN0cmluZyBwcmVmaXggOiBTRUFSQ0hfUEFUSCkgewpAQCAtNDM1LDcgKzQzNSw3IEBACiAKIAkJUmVmTGlzdC5CdWlsZGVyPExvb3NlUmVmPiBuZXdMb29zZTsKIAotCQlMb29zZVNjYW5uZXIoZmluYWwgUmVmTGlzdDxMb29zZVJlZj4gY3VyTG9vc2UpIHsKKwkJTG9vc2VTY2FubmVyKFJlZkxpc3Q8TG9vc2VSZWY+IGN1ckxvb3NlKSB7CiAJCQl0aGlzLmN1ckxvb3NlID0gY3VyTG9vc2U7CiAJCX0KIApAQCAtNTQ2LDcgKzU0Niw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBSZWYgcGVlbChmaW5hbCBSZWYgcmVmKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBSZWYgcGVlbChSZWYgcmVmKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBSZWYgbGVhZiA9IHJlZi5nZXRMZWFmKCk7CiAJCWlmIChsZWFmLmlzUGVlbGVkKCkgfHwgbGVhZi5nZXRPYmplY3RJZCgpID09IG51bGwpCiAJCQlyZXR1cm4gcmVmOwpAQCAtNTY4LDcgKzU2OCw3IEBACiAJCXJldHVybiByZWNyZWF0ZShyZWYsIG5ld0xlYWYpOwogCX0KIAotCXByaXZhdGUgT2JqZWN0SWRSZWYgZG9QZWVsKGZpbmFsIFJlZiBsZWFmKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKKwlwcml2YXRlIE9iamVjdElkUmVmIGRvUGVlbChSZWYgbGVhZikgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCQlJT0V4Y2VwdGlvbiB7CiAJCXRyeSAoUmV2V2FsayBydyA9IG5ldyBSZXZXYWxrKGdldFJlcG9zaXRvcnkoKSkpIHsKIAkJCVJldk9iamVjdCBvYmogPSBydy5wYXJzZUFueShsZWFmLmdldE9iamVjdElkKCkpOwpAQCAtNTgyLDcgKzU4Miw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBSZWYgcmVjcmVhdGUoZmluYWwgUmVmIG9sZCwgZmluYWwgT2JqZWN0SWRSZWYgbGVhZikgeworCXByaXZhdGUgc3RhdGljIFJlZiByZWNyZWF0ZShSZWYgb2xkLCBPYmplY3RJZFJlZiBsZWFmKSB7CiAJCWlmIChvbGQuaXNTeW1ib2xpYygpKSB7CiAJCQlSZWYgZHN0ID0gcmVjcmVhdGUob2xkLmdldFRhcmdldCgpLCBsZWFmKTsKIAkJCXJldHVybiBuZXcgU3ltYm9saWNSZWYob2xkLmdldE5hbWUoKSwgZHN0KTsKQEAgLTk3Miw3ICs5NzIsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBSZWZMaXN0PFJlZj4gcGFyc2VQYWNrZWRSZWZzKGZpbmFsIEJ1ZmZlcmVkUmVhZGVyIGJyKQorCXByaXZhdGUgUmVmTGlzdDxSZWY+IHBhcnNlUGFja2VkUmVmcyhCdWZmZXJlZFJlYWRlciBicikKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCVJlZkxpc3QuQnVpbGRlcjxSZWY+IGFsbCA9IG5ldyBSZWZMaXN0LkJ1aWxkZXI8PigpOwogCQlSZWYgbGFzdCA9IG51bGw7CkBAIC0xMDI0LDcgKzEwMjQsNyBAQAogCQlyZXR1cm4gYWxsLnRvUmVmTGlzdCgpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjb3B5KGZpbmFsIFN0cmluZyBzcmMsIGZpbmFsIGludCBvZmYsIGZpbmFsIGludCBlbmQpIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY29weShTdHJpbmcgc3JjLCBpbnQgb2ZmLCBpbnQgZW5kKSB7CiAJCS8vIERvbid0IHVzZSBzdWJzdHJpbmcgc2luY2UgaXQgY291bGQgbGVhdmUgYSByZWZlcmVuY2UgdG8gdGhlIG11Y2gKIAkJLy8gbGFyZ2VyIGV4aXN0aW5nIHN0cmluZy4gRm9yY2UgY29uc3RydWN0aW9uIG9mIGEgZnVsbCBuZXcgb2JqZWN0LgogCQlyZXR1cm4gbmV3IFN0cmluZ0J1aWxkZXIoZW5kIC0gb2ZmKS5hcHBlbmQoc3JjLCBvZmYsIGVuZCkudG9TdHJpbmcoKTsKQEAgLTExOTAsNyArMTE5MCw3IEBACiAJCXJldHVybiBuZXcgTG9vc2VVbnBlZWxlZChvdGhlclNuYXBzaG90LCBuYW1lLCBpZCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1N5bVJlZihmaW5hbCBieXRlW10gYnVmLCBpbnQgbikgeworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTeW1SZWYoYnl0ZVtdIGJ1ZiwgaW50IG4pIHsKIAkJaWYgKG4gPCA2KQogCQkJcmV0dXJuIGZhbHNlOwogCQlyZXR1cm4gLyoqL2J1ZlswXSA9PSAncicgLy8KQEAgLTEyNjMsMTggKzEyNjMsMTggQEAKIAkJcmV0dXJuIG5ldyBGaWxlKGdpdERpciwgbmFtZSk7CiAJfQogCi0Jc3RhdGljIGludCBsZXZlbHNJbihmaW5hbCBTdHJpbmcgbmFtZSkgeworCXN0YXRpYyBpbnQgbGV2ZWxzSW4oU3RyaW5nIG5hbWUpIHsKIAkJaW50IGNvdW50ID0gMDsKIAkJZm9yIChpbnQgcCA9IG5hbWUuaW5kZXhPZignLycpOyBwID49IDA7IHAgPSBuYW1lLmluZGV4T2YoJy8nLCBwICsgMSkpCiAJCQljb3VudCsrOwogCQlyZXR1cm4gY291bnQ7CiAJfQogCi0Jc3RhdGljIHZvaWQgZGVsZXRlKGZpbmFsIEZpbGUgZmlsZSwgZmluYWwgaW50IGRlcHRoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXN0YXRpYyB2b2lkIGRlbGV0ZShGaWxlIGZpbGUsIGludCBkZXB0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZGVsZXRlKGZpbGUsIGRlcHRoLCBudWxsKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGRlbGV0ZShmaW5hbCBGaWxlIGZpbGUsIGZpbmFsIGludCBkZXB0aCwgTG9ja0ZpbGUgckxjaykKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGRlbGV0ZShGaWxlIGZpbGUsIGludCBkZXB0aCwgTG9ja0ZpbGUgckxjaykKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmICghZmlsZS5kZWxldGUoKSAmJiBmaWxlLmlzRmlsZSgpKSB7CiAJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZEaXJlY3RvcnlSZW5hbWUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZkRpcmVjdG9yeVJlbmFtZS5qYXZhCmluZGV4IDIwMmU1MWYuLmVjN2VjNzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZkRpcmVjdG9yeVJlbmFtZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZkRpcmVjdG9yeVJlbmFtZS5qYXZhCkBAIC0xMDQsNyArMTA0LDcgQEAKIAkJb2JqSWQgPSBzb3VyY2UuZ2V0T2xkT2JqZWN0SWQoKTsKIAkJdXBkYXRlSEVBRCA9IG5lZWRUb1VwZGF0ZUhFQUQoKTsKIAkJdG1wID0gcmVmZGIubmV3VGVtcG9yYXJ5VXBkYXRlKCk7Ci0JCXRyeSAoZmluYWwgUmV2V2FsayBydyA9IG5ldyBSZXZXYWxrKHJlZmRiLmdldFJlcG9zaXRvcnkoKSkpIHsKKwkJdHJ5IChSZXZXYWxrIHJ3ID0gbmV3IFJldldhbGsocmVmZGIuZ2V0UmVwb3NpdG9yeSgpKSkgewogCQkJLy8gRmlyc3QgYmFja3VwIHRoZSBzb3VyY2Ugc28gaXRzIG5ldmVyIHVucmVhY2hhYmxlLgogCQkJdG1wLnNldE5ld09iamVjdElkKG9iaklkKTsKIAkJCXRtcC5zZXRGb3JjZVVwZGF0ZSh0cnVlKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZkRpcmVjdG9yeVVwZGF0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUmVmRGlyZWN0b3J5VXBkYXRlLmphdmEKaW5kZXggNGQ2YjI0NS4uNDVjZTYzNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUmVmRGlyZWN0b3J5VXBkYXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUmVmRGlyZWN0b3J5VXBkYXRlLmphdmEKQEAgLTYwLDcgKzYwLDcgQEAKIAlwcml2YXRlIGJvb2xlYW4gc2hvdWxkRGVyZWY7CiAJcHJpdmF0ZSBMb2NrRmlsZSBsb2NrOwogCi0JUmVmRGlyZWN0b3J5VXBkYXRlKGZpbmFsIFJlZkRpcmVjdG9yeSByLCBmaW5hbCBSZWYgcmVmKSB7CisJUmVmRGlyZWN0b3J5VXBkYXRlKFJlZkRpcmVjdG9yeSByLCBSZWYgcmVmKSB7CiAJCXN1cGVyKHJlZik7CiAJCWRhdGFiYXNlID0gcjsKIAl9CkBAIC0xMDYsNyArMTA2LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFJlc3VsdCBkb1VwZGF0ZShmaW5hbCBSZXN1bHQgc3RhdHVzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCBSZXN1bHQgZG9VcGRhdGUoUmVzdWx0IHN0YXR1cykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJV3JpdGVDb25maWcgd2MgPSBkYXRhYmFzZS5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCkKIAkJCQkuZ2V0KFdyaXRlQ29uZmlnLktFWSk7CiAKQEAgLTE0OCw3ICsxNDgsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUmVzdWx0IGRvRGVsZXRlKGZpbmFsIFJlc3VsdCBzdGF0dXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJvdGVjdGVkIFJlc3VsdCBkb0RlbGV0ZShSZXN1bHQgc3RhdHVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAoZ2V0UmVmKCkuZ2V0U3RvcmFnZSgpICE9IFJlZi5TdG9yYWdlLk5FVykKIAkJCWRhdGFiYXNlLmRlbGV0ZSh0aGlzKTsKIAkJcmV0dXJuIHN0YXR1czsKQEAgLTE1Niw3ICsxNTYsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUmVzdWx0IGRvTGluayhmaW5hbCBTdHJpbmcgdGFyZ2V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCBSZXN1bHQgZG9MaW5rKFN0cmluZyB0YXJnZXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCVdyaXRlQ29uZmlnIHdjID0gZGF0YWJhc2UuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpCiAJCQkJLmdldChXcml0ZUNvbmZpZy5LRVkpOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZsb2dXcml0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZmxvZ1dyaXRlci5qYXZhCmluZGV4IGZkNmI0MjcuLjEzMWY3MTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZmxvZ1dyaXRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZmxvZ1dyaXRlci5qYXZhCkBAIC0yMjAsNiArMjIwLDIyIEBACiAJCXJldHVybiBDb25zdGFudHMuZW5jb2RlKHIudG9TdHJpbmcoKSk7CiAJfQogCisJcHJpdmF0ZSBGaWxlT3V0cHV0U3RyZWFtIGdldEZpbGVPdXRwdXRTdHJlYW0oRmlsZSBsb2cpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlyZXR1cm4gbmV3IEZpbGVPdXRwdXRTdHJlYW0obG9nLCB0cnVlKTsKKwkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGVycikgeworCQkJRmlsZSBkaXIgPSBsb2cuZ2V0UGFyZW50RmlsZSgpOworCQkJaWYgKGRpci5leGlzdHMoKSkgeworCQkJCXRocm93IGVycjsKKwkJCX0KKwkJCWlmICghZGlyLm1rZGlycygpICYmICFkaXIuaXNEaXJlY3RvcnkoKSkgeworCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlRm9ybWF0CisJCQkJCQkuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmNhbm5vdENyZWF0ZURpcmVjdG9yeSwgZGlyKSk7CisJCQl9CisJCQlyZXR1cm4gbmV3IEZpbGVPdXRwdXRTdHJlYW0obG9nLCB0cnVlKTsKKwkJfQorCX0KKwogCXByaXZhdGUgUmVmbG9nV3JpdGVyIGxvZyhTdHJpbmcgcmVmTmFtZSwgYnl0ZVtdIHJlYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJRmlsZSBsb2cgPSByZWZkYi5sb2dGb3IocmVmTmFtZSk7CiAJCWJvb2xlYW4gd3JpdGUgPSBmb3JjZVdyaXRlCkBAIC0yMjksMjkgKzI0NSwxNyBAQAogCQkJcmV0dXJuIHRoaXM7CiAKIAkJV3JpdGVDb25maWcgd2MgPSByZWZkYi5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCkuZ2V0KFdyaXRlQ29uZmlnLktFWSk7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gb3V0OwotCQl0cnkgewotCQkJb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obG9nLCB0cnVlKTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGVycikgewotCQkJRmlsZSBkaXIgPSBsb2cuZ2V0UGFyZW50RmlsZSgpOwotCQkJaWYgKGRpci5leGlzdHMoKSkKLQkJCQl0aHJvdyBlcnI7Ci0JCQlpZiAoIWRpci5ta2RpcnMoKSAmJiAhZGlyLmlzRGlyZWN0b3J5KCkpCi0JCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJSkdpdFRleHQuZ2V0KCkuY2Fubm90Q3JlYXRlRGlyZWN0b3J5LCBkaXIpKTsKLQkJCW91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGxvZywgdHJ1ZSk7Ci0JCX0KLQkJdHJ5IHsKKwkJdHJ5IChGaWxlT3V0cHV0U3RyZWFtIG91dCA9IGdldEZpbGVPdXRwdXRTdHJlYW0obG9nKSkgewogCQkJaWYgKHdjLmdldEZTeW5jUmVmRmlsZXMoKSkgewogCQkJCUZpbGVDaGFubmVsIGZjID0gb3V0LmdldENoYW5uZWwoKTsKIAkJCQlCeXRlQnVmZmVyIGJ1ZiA9IEJ5dGVCdWZmZXIud3JhcChyZWMpOwotCQkJCXdoaWxlICgwIDwgYnVmLnJlbWFpbmluZygpKQorCQkJCXdoaWxlICgwIDwgYnVmLnJlbWFpbmluZygpKSB7CiAJCQkJCWZjLndyaXRlKGJ1Zik7CisJCQkJfQogCQkJCWZjLmZvcmNlKHRydWUpOwotCQkJfSBlbHNlCisJCQl9IGVsc2UgewogCQkJCW91dC53cml0ZShyZWMpOwotCQl9IGZpbmFsbHkgewotCQkJb3V0LmNsb3NlKCk7CisJCQl9CiAJCX0KIAkJcmV0dXJuIHRoaXM7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvVW5wYWNrZWRPYmplY3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1VucGFja2VkT2JqZWN0LmphdmEKaW5kZXggYWRiMDVlNC4uY2Y0NzRhZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvVW5wYWNrZWRPYmplY3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9VbnBhY2tlZE9iamVjdC5qYXZhCkBAIC0yNjYsNyArMjY2LDcgQEAKIAkJfQogCX0KIAotCXN0YXRpYyBib29sZWFuIGlzU3RhbmRhcmRGb3JtYXQoZmluYWwgYnl0ZVtdIGhkcikgeworCXN0YXRpYyBib29sZWFuIGlzU3RhbmRhcmRGb3JtYXQoYnl0ZVtdIGhkcikgewogCQkvKgogCQkgKiBXZSBtdXN0IGRldGVybWluZSBpZiB0aGUgYnVmZmVyIGNvbnRhaW5zIHRoZSBzdGFuZGFyZAogCQkgKiB6bGliLWRlZmxhdGVkIHN0cmVhbSBvciB0aGUgZXhwZXJpbWVudGFsIGZvcm1hdCBiYXNlZApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvV2luZG93Q2FjaGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1dpbmRvd0NhY2hlLmphdmEKaW5kZXggZTcxMjg0Zi4uOGNmMWQ0ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvV2luZG93Q2FjaGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9XaW5kb3dDYWNoZS5qYXZhCkBAIC0xNTcsNyArMTU3LDcgQEAKIAkgKiAgICAgICAgICAgICBzZXR0aW5ncywgdXN1YWxseSB0b28gbG93IG9mIGEgbGltaXQuCiAJICovCiAJQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVjb25maWd1cmUoZmluYWwgV2luZG93Q2FjaGVDb25maWcgY2ZnKSB7CisJcHVibGljIHN0YXRpYyB2b2lkIHJlY29uZmlndXJlKFdpbmRvd0NhY2hlQ29uZmlnIGNmZykgewogCQlmaW5hbCBXaW5kb3dDYWNoZSBuYyA9IG5ldyBXaW5kb3dDYWNoZShjZmcpOwogCQlmaW5hbCBXaW5kb3dDYWNoZSBvYyA9IGNhY2hlOwogCQlpZiAob2MgIT0gbnVsbCkKQEAgLTE3OCw3ICsxNzgsNyBAQAogCQlyZXR1cm4gY2FjaGU7CiAJfQogCi0Jc3RhdGljIGZpbmFsIEJ5dGVXaW5kb3cgZ2V0KGZpbmFsIFBhY2tGaWxlIHBhY2ssIGZpbmFsIGxvbmcgb2Zmc2V0KQorCXN0YXRpYyBmaW5hbCBCeXRlV2luZG93IGdldChQYWNrRmlsZSBwYWNrLCBsb25nIG9mZnNldCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIFdpbmRvd0NhY2hlIGMgPSBjYWNoZTsKIAkJZmluYWwgQnl0ZVdpbmRvdyByID0gYy5nZXRPckxvYWQocGFjaywgYy50b1N0YXJ0KG9mZnNldCkpOwpAQCAtMTkzLDcgKzE5Myw3IEBACiAJCXJldHVybiByOwogCX0KIAotCXN0YXRpYyBmaW5hbCB2b2lkIHB1cmdlKGZpbmFsIFBhY2tGaWxlIHBhY2spIHsKKwlzdGF0aWMgZmluYWwgdm9pZCBwdXJnZShQYWNrRmlsZSBwYWNrKSB7CiAJCWNhY2hlLnJlbW92ZUFsbChwYWNrKTsKIAl9CiAKQEAgLTIzMiw3ICsyMzIsNyBAQAogCiAJcHJpdmF0ZSBmaW5hbCBBdG9taWNMb25nIG9wZW5CeXRlczsKIAotCXByaXZhdGUgV2luZG93Q2FjaGUoZmluYWwgV2luZG93Q2FjaGVDb25maWcgY2ZnKSB7CisJcHJpdmF0ZSBXaW5kb3dDYWNoZShXaW5kb3dDYWNoZUNvbmZpZyBjZmcpIHsKIAkJdGFibGVTaXplID0gdGFibGVTaXplKGNmZyk7CiAJCWZpbmFsIGludCBsb2NrQ291bnQgPSBsb2NrQ291bnQoY2ZnKTsKIAkJaWYgKHRhYmxlU2l6ZSA8IDEpCkBAIC0yODYsMTEgKzI4NiwxMSBAQAogCQlyZXR1cm4gb3BlbkJ5dGVzLmdldCgpOwogCX0KIAotCXByaXZhdGUgaW50IGhhc2goZmluYWwgaW50IHBhY2tIYXNoLCBmaW5hbCBsb25nIG9mZikgeworCXByaXZhdGUgaW50IGhhc2goaW50IHBhY2tIYXNoLCBsb25nIG9mZikgewogCQlyZXR1cm4gcGFja0hhc2ggKyAoaW50KSAob2ZmID4+PiB3aW5kb3dTaXplU2hpZnQpOwogCX0KIAotCXByaXZhdGUgQnl0ZVdpbmRvdyBsb2FkKGZpbmFsIFBhY2tGaWxlIHBhY2ssIGZpbmFsIGxvbmcgb2Zmc2V0KQorCXByaXZhdGUgQnl0ZVdpbmRvdyBsb2FkKFBhY2tGaWxlIHBhY2ssIGxvbmcgb2Zmc2V0KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKHBhY2suYmVnaW5XaW5kb3dDYWNoZSgpKQogCQkJb3BlbkZpbGVzLmluY3JlbWVudEFuZEdldCgpOwpAQCAtMzEwLDE4ICszMTAsMTggQEAKIAkJfQogCX0KIAotCXByaXZhdGUgUmVmIGNyZWF0ZVJlZihmaW5hbCBQYWNrRmlsZSBwLCBmaW5hbCBsb25nIG8sIGZpbmFsIEJ5dGVXaW5kb3cgdikgeworCXByaXZhdGUgUmVmIGNyZWF0ZVJlZihQYWNrRmlsZSBwLCBsb25nIG8sIEJ5dGVXaW5kb3cgdikgewogCQlmaW5hbCBSZWYgcmVmID0gbmV3IFJlZihwLCBvLCB2LCBxdWV1ZSk7CiAJCW9wZW5CeXRlcy5hZGRBbmRHZXQocmVmLnNpemUpOwogCQlyZXR1cm4gcmVmOwogCX0KIAotCXByaXZhdGUgdm9pZCBjbGVhcihmaW5hbCBSZWYgcmVmKSB7CisJcHJpdmF0ZSB2b2lkIGNsZWFyKFJlZiByZWYpIHsKIAkJb3BlbkJ5dGVzLmFkZEFuZEdldCgtcmVmLnNpemUpOwogCQljbG9zZShyZWYucGFjayk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGNsb3NlKGZpbmFsIFBhY2tGaWxlIHBhY2spIHsKKwlwcml2YXRlIHZvaWQgY2xvc2UoUGFja0ZpbGUgcGFjaykgewogCQlpZiAocGFjay5lbmRXaW5kb3dDYWNoZSgpKQogCQkJb3BlbkZpbGVzLmRlY3JlbWVudEFuZEdldCgpOwogCX0KQEAgLTMzMCwxMSArMzMwLDExIEBACiAJCXJldHVybiBtYXhGaWxlcyA8IG9wZW5GaWxlcy5nZXQoKSB8fCBtYXhCeXRlcyA8IG9wZW5CeXRlcy5nZXQoKTsKIAl9CiAKLQlwcml2YXRlIGxvbmcgdG9TdGFydChmaW5hbCBsb25nIG9mZnNldCkgeworCXByaXZhdGUgbG9uZyB0b1N0YXJ0KGxvbmcgb2Zmc2V0KSB7CiAJCXJldHVybiAob2Zmc2V0ID4+PiB3aW5kb3dTaXplU2hpZnQpIDw8IHdpbmRvd1NpemVTaGlmdDsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBpbnQgdGFibGVTaXplKGZpbmFsIFdpbmRvd0NhY2hlQ29uZmlnIGNmZykgeworCXByaXZhdGUgc3RhdGljIGludCB0YWJsZVNpemUoV2luZG93Q2FjaGVDb25maWcgY2ZnKSB7CiAJCWZpbmFsIGludCB3c3ogPSBjZmcuZ2V0UGFja2VkR2l0V2luZG93U2l6ZSgpOwogCQlmaW5hbCBsb25nIGxpbWl0ID0gY2ZnLmdldFBhY2tlZEdpdExpbWl0KCk7CiAJCWlmICh3c3ogPD0gMCkKQEAgLTM0NCw3ICszNDQsNyBAQAogCQlyZXR1cm4gKGludCkgTWF0aC5taW4oNSAqIChsaW1pdCAvIHdzeikgLyAyLCAyMDAwMDAwMDAwKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBpbnQgbG9ja0NvdW50KGZpbmFsIFdpbmRvd0NhY2hlQ29uZmlnIGNmZykgeworCXByaXZhdGUgc3RhdGljIGludCBsb2NrQ291bnQoV2luZG93Q2FjaGVDb25maWcgY2ZnKSB7CiAJCXJldHVybiBNYXRoLm1heChjZmcuZ2V0UGFja2VkR2l0T3BlbkZpbGVzKCksIDMyKTsKIAl9CiAKQEAgLTM2MCw3ICszNjAsNyBAQAogCSAqICAgICAgICAgICAgIHRoZSBvYmplY3QgcmVmZXJlbmNlIHdhcyBub3QgaW4gdGhlIGNhY2hlIGFuZCBjb3VsZCBub3QgYmUKIAkgKiAgICAgICAgICAgICBvYnRhaW5lZCBieSB7QGxpbmsgI2xvYWQoUGFja0ZpbGUsIGxvbmcpfS4KIAkgKi8KLQlwcml2YXRlIEJ5dGVXaW5kb3cgZ2V0T3JMb2FkKGZpbmFsIFBhY2tGaWxlIHBhY2ssIGZpbmFsIGxvbmcgcG9zaXRpb24pCisJcHJpdmF0ZSBCeXRlV2luZG93IGdldE9yTG9hZChQYWNrRmlsZSBwYWNrLCBsb25nIHBvc2l0aW9uKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgaW50IHNsb3QgPSBzbG90KHBhY2ssIHBvc2l0aW9uKTsKIAkJZmluYWwgRW50cnkgZTEgPSB0YWJsZS5nZXQoc2xvdCk7CkBAIC0zOTksNyArMzk5LDcgQEAKIAkJcmV0dXJuIHY7CiAJfQogCi0JcHJpdmF0ZSBCeXRlV2luZG93IHNjYW4oRW50cnkgbiwgZmluYWwgUGFja0ZpbGUgcGFjaywgZmluYWwgbG9uZyBwb3NpdGlvbikgeworCXByaXZhdGUgQnl0ZVdpbmRvdyBzY2FuKEVudHJ5IG4sIFBhY2tGaWxlIHBhY2ssIGxvbmcgcG9zaXRpb24pIHsKIAkJZm9yICg7IG4gIT0gbnVsbDsgbiA9IG4ubmV4dCkgewogCQkJZmluYWwgUmVmIHIgPSBuLnJlZjsKIAkJCWlmIChyLnBhY2sgPT0gcGFjayAmJiByLnBvc2l0aW9uID09IHBvc2l0aW9uKSB7CkBAIC00MTUsNyArNDE1LDcgQEAKIAkJcmV0dXJuIG51bGw7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGhpdChmaW5hbCBSZWYgcikgeworCXByaXZhdGUgdm9pZCBoaXQoUmVmIHIpIHsKIAkJLy8gV2UgZG9uJ3QgbmVlZCB0byBiZSAxMDAlIGFjY3VyYXRlIGhlcmUuIEl0cyBzdWZmaWNpZW50IHRoYXQgYXQgbGVhc3QKIAkJLy8gb25lIHRocmVhZCBwZXJmb3JtcyB0aGUgaW5jcmVtZW50LiBBbnkgb3RoZXIgY29uY3VycmVudCBhY2Nlc3MgYXQKIAkJLy8gZXhhY3RseSB0aGUgc2FtZSB0aW1lIGNhbiBzaW1wbHkgdXNlIHRoZSBzYW1lIGNsb2NrIHZhbHVlLgpAQCAtNDg3LDcgKzQ4Nyw3IEBACiAJICogQHBhcmFtIHBhY2sKIAkgKiAgICAgICAgICAgIHRoZSBmaWxlIHRvIHB1cmdlIGFsbCBlbnRyaWVzIG9mLgogCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVBbGwoZmluYWwgUGFja0ZpbGUgcGFjaykgeworCXByaXZhdGUgdm9pZCByZW1vdmVBbGwoUGFja0ZpbGUgcGFjaykgewogCQlmb3IgKGludCBzID0gMDsgcyA8IHRhYmxlU2l6ZTsgcysrKSB7CiAJCQlmaW5hbCBFbnRyeSBlMSA9IHRhYmxlLmdldChzKTsKIAkJCWJvb2xlYW4gaGFzRGVhZCA9IGZhbHNlOwpAQCAtNTIxLDExICs1MjEsMTEgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgaW50IHNsb3QoZmluYWwgUGFja0ZpbGUgcGFjaywgZmluYWwgbG9uZyBwb3NpdGlvbikgeworCXByaXZhdGUgaW50IHNsb3QoUGFja0ZpbGUgcGFjaywgbG9uZyBwb3NpdGlvbikgewogCQlyZXR1cm4gKGhhc2gocGFjay5oYXNoLCBwb3NpdGlvbikgPj4+IDEpICUgdGFibGVTaXplOwogCX0KIAotCXByaXZhdGUgTG9jayBsb2NrKGZpbmFsIFBhY2tGaWxlIHBhY2ssIGZpbmFsIGxvbmcgcG9zaXRpb24pIHsKKwlwcml2YXRlIExvY2sgbG9jayhQYWNrRmlsZSBwYWNrLCBsb25nIHBvc2l0aW9uKSB7CiAJCXJldHVybiBsb2Nrc1soaGFzaChwYWNrLmhhc2gsIHBvc2l0aW9uKSA+Pj4gMSkgJSBsb2Nrcy5sZW5ndGhdOwogCX0KIApAQCAtNTU2LDcgKzU1Niw3IEBACiAJCSAqLwogCQl2b2xhdGlsZSBib29sZWFuIGRlYWQ7CiAKLQkJRW50cnkoZmluYWwgRW50cnkgbiwgZmluYWwgUmVmIHIpIHsKKwkJRW50cnkoRW50cnkgbiwgUmVmIHIpIHsKIAkJCW5leHQgPSBuOwogCQkJcmVmID0gcjsKIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvV2luZG93Q3Vyc29yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9XaW5kb3dDdXJzb3IuamF2YQppbmRleCA1NjliZmU4Li4wMTBjMTQyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9XaW5kb3dDdXJzb3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9XaW5kb3dDdXJzb3IuamF2YQpAQCAtMzQ3LDcgKzM0Nyw3IEBACiAJCQlpbmYucmVzZXQoKTsKIAl9CiAKLQl2b2lkIHBpbihmaW5hbCBQYWNrRmlsZSBwYWNrLCBmaW5hbCBsb25nIHBvc2l0aW9uKQorCXZvaWQgcGluKFBhY2tGaWxlIHBhY2ssIGxvbmcgcG9zaXRpb24pCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBCeXRlV2luZG93IHcgPSB3aW5kb3c7CiAJCWlmICh3ID09IG51bGwgfHwgIXcuY29udGFpbnMocGFjaywgcG9zaXRpb24pKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9Xcml0ZUNvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvV3JpdGVDb25maWcuamF2YQppbmRleCBkOWNiYmQ4Li4yMzA1NWVlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9Xcml0ZUNvbmZpZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1dyaXRlQ29uZmlnLmphdmEKQEAgLTU3LDcgKzU3LDcgQEAKIAogCXByaXZhdGUgZmluYWwgYm9vbGVhbiBmc3luY1JlZkZpbGVzOwogCi0JcHJpdmF0ZSBXcml0ZUNvbmZpZyhmaW5hbCBDb25maWcgcmMpIHsKKwlwcml2YXRlIFdyaXRlQ29uZmlnKENvbmZpZyByYykgewogCQljb21wcmVzc2lvbiA9IHJjLmdldChDb3JlQ29uZmlnLktFWSkuZ2V0Q29tcHJlc3Npb24oKTsKIAkJZnN5bmNPYmplY3RGaWxlcyA9IHJjLmdldEJvb2xlYW4oImNvcmUiLCAiZnN5bmNvYmplY3RmaWxlcyIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCWZzeW5jUmVmRmlsZXMgPSByYy5nZXRCb29sZWFuKCJjb3JlIiwgImZzeW5jcmVmZmlsZXMiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svQmluYXJ5RGVsdGEuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL0JpbmFyeURlbHRhLmphdmEKaW5kZXggMjU2NTkzMS4uYzdlNWFkNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svQmluYXJ5RGVsdGEuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9CaW5hcnlEZWx0YS5qYXZhCkBAIC02NCw3ICs2NCw3IEBACiAJICogICAgICAgICAgICB0aGUgZGVsdGEgc3RyZWFtLCBvciBhdCBsZWFzdCB0aGUgaGVhZGVyIG9mIGl0LgogCSAqIEByZXR1cm4gdGhlIGJhc2Ugb2JqZWN0J3Mgc2l6ZS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGxvbmcgZ2V0QmFzZVNpemUoZmluYWwgYnl0ZVtdIGRlbHRhKSB7CisJcHVibGljIHN0YXRpYyBsb25nIGdldEJhc2VTaXplKGJ5dGVbXSBkZWx0YSkgewogCQlpbnQgcCA9IDA7CiAJCWxvbmcgYmFzZUxlbiA9IDA7CiAJCWludCBjLCBzaGlmdCA9IDA7CkBAIC04Myw3ICs4Myw3IEBACiAJICogICAgICAgICAgICB0aGUgZGVsdGEgc3RyZWFtLCBvciBhdCBsZWFzdCB0aGUgaGVhZGVyIG9mIGl0LgogCSAqIEByZXR1cm4gdGhlIHJlc3VsdGluZyBvYmplY3QncyBzaXplLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgbG9uZyBnZXRSZXN1bHRTaXplKGZpbmFsIGJ5dGVbXSBkZWx0YSkgeworCXB1YmxpYyBzdGF0aWMgbG9uZyBnZXRSZXN1bHRTaXplKGJ5dGVbXSBkZWx0YSkgewogCQlpbnQgcCA9IDA7CiAKIAkJLy8gU2tpcCBsZW5ndGggb2YgdGhlIGJhc2Ugb2JqZWN0LgpAQCAtMTE0LDcgKzExNCw3IEBACiAJICogICAgICAgICAgICBhbm90aGVyLgogCSAqIEByZXR1cm4gcGF0Y2hlZCBiYXNlCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gYXBwbHkoZmluYWwgYnl0ZVtdIGJhc2UsIGZpbmFsIGJ5dGVbXSBkZWx0YSkgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIGFwcGx5KGJ5dGVbXSBiYXNlLCBieXRlW10gZGVsdGEpIHsKIAkJcmV0dXJuIGFwcGx5KGJhc2UsIGRlbHRhLCBudWxsKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL0RlbHRhSW5kZXhTY2FubmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9EZWx0YUluZGV4U2Nhbm5lci5qYXZhCmluZGV4IDk2OWQwMmIuLjk0NGE5ZTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL0RlbHRhSW5kZXhTY2FubmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svRGVsdGFJbmRleFNjYW5uZXIuamF2YQpAQCAtODksNyArODksNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHNjYW4oYnl0ZVtdIHJhdywgZmluYWwgaW50IGVuZCkgeworCXByaXZhdGUgdm9pZCBzY2FuKGJ5dGVbXSByYXcsIGludCBlbmQpIHsKIAkJLy8gV2Ugc2NhbiB0aGUgaW5wdXQgYmFja3dhcmRzLCBhbmQgYWx3YXlzIGluc2VydCBvbnRvIHRoZQogCQkvLyBmcm9udCBvZiB0aGUgY2hhaW4uIFRoaXMgZW5zdXJlcyB0aGF0IGNoYWlucyB3aWxsIGhhdmUgbG93ZXIKIAkJLy8gb2Zmc2V0cyBhdCB0aGUgZnJvbnQgb2YgdGhlIGNoYWluLCBhbGxvd2luZyB1cyB0byBwcmVmZXIgdGhlCkBAIC0xMjAsNyArMTIwLDcgQEAKIAkJfSB3aGlsZSAoMCA8PSBwdHIpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGludCB0YWJsZVNpemUoZmluYWwgaW50IHdvcnN0Q2FzZUJsb2NrQ250KSB7CisJcHJpdmF0ZSBzdGF0aWMgaW50IHRhYmxlU2l6ZShpbnQgd29yc3RDYXNlQmxvY2tDbnQpIHsKIAkJaW50IHNoaWZ0ID0gMzIgLSBJbnRlZ2VyLm51bWJlck9mTGVhZGluZ1plcm9zKHdvcnN0Q2FzZUJsb2NrQ250KTsKIAkJaW50IHN6ID0gMSA8PCAoc2hpZnQgLSAxKTsKIAkJaWYgKHN6IDwgd29yc3RDYXNlQmxvY2tDbnQpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9EZWx0YVdpbmRvdy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svRGVsdGFXaW5kb3cuamF2YQppbmRleCA3M2IyODVhLi5hMDQ3NTM0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9EZWx0YVdpbmRvdy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL0RlbHRhV2luZG93LmphdmEKQEAgLTI2Niw3ICsyNjYsNyBAQAogCQlkZWx0YUJ1ZiA9IG51bGw7CiAJfQogCi0JcHJpdmF0ZSBib29sZWFuIGRlbHRhKGZpbmFsIERlbHRhV2luZG93RW50cnkgc3JjKQorCXByaXZhdGUgYm9vbGVhbiBkZWx0YShEZWx0YVdpbmRvd0VudHJ5IHNyYykKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCS8vIElmIHRoZSBzaXplcyBhcmUgcmFkaWNhbGx5IGRpZmZlcmVudCwgdGhpcyBpcyBhIGJhZCBwYWlyaW5nLgogCQlpZiAocmVzLnNpemUoKSA8IHNyYy5zaXplKCkgPj4+IDQpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9PYmplY3RUb1BhY2suamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL09iamVjdFRvUGFjay5qYXZhCmluZGV4IGU4Yzc1MTAuLmEzMGJmOTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL09iamVjdFRvUGFjay5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL09iamVjdFRvUGFjay5qYXZhCkBAIC0xMDMsNyArMTAzLDcgQEAKIAkgKiBAcGFyYW0gdHlwZQogCSAqICAgICAgICAgICAgcmVhbCB0eXBlIGNvZGUgb2YgdGhlIG9iamVjdCwgbm90IGl0cyBpbi1wYWNrIHR5cGUuCiAJICovCi0JcHVibGljIE9iamVjdFRvUGFjayhBbnlPYmplY3RJZCBzcmMsIGZpbmFsIGludCB0eXBlKSB7CisJcHVibGljIE9iamVjdFRvUGFjayhBbnlPYmplY3RJZCBzcmMsIGludCB0eXBlKSB7CiAJCXN1cGVyKHNyYyk7CiAJCWZsYWdzID0gdHlwZSA8PCBUWVBFX1NISUZUOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL1BhY2tPdXRwdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL1BhY2tPdXRwdXRTdHJlYW0uamF2YQppbmRleCBmZDljMWEwLi43ZjM4YTdiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9QYWNrT3V0cHV0U3RyZWFtLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svUGFja091dHB1dFN0cmVhbS5qYXZhCkBAIC0xMDcsNyArMTA3LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGZpbmFsIHZvaWQgd3JpdGUoZmluYWwgaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIGZpbmFsIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWNvdW50Kys7CiAJCW91dC53cml0ZShiKTsKIAkJbWQudXBkYXRlKChieXRlKSBiKTsKQEAgLTExNSw3ICsxMTUsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgdm9pZCB3cml0ZShmaW5hbCBieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikKKwlwdWJsaWMgZmluYWwgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXdoaWxlICgwIDwgbGVuKSB7CiAJCQlmaW5hbCBpbnQgbiA9IE1hdGgubWluKGxlbiwgQllURVNfVE9fV1JJVEVfQkVGT1JFX0NBTkNFTF9DSEVDSyk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9QYWNrV3JpdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9QYWNrV3JpdGVyLmphdmEKaW5kZXggNDJkZjFhNi4uMzZkNmYwYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svUGFja1dyaXRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL1BhY2tXcml0ZXIuamF2YQpAQCAtMzAzLDYgKzMwMyw4IEBACiAKIAlwcml2YXRlIE9iamVjdENvdW50Q2FsbGJhY2sgY2FsbGJhY2s7CiAKKwlwcml2YXRlIGxvbmcgZmlsdGVyQmxvYkxpbWl0ID0gLTE7CisKIAkvKioKIAkgKiBDcmVhdGUgd3JpdGVyIGZvciBzcGVjaWZpZWQgcmVwb3NpdG9yeS4KIAkgKiA8cD4KQEAgLTMxMiw3ICszMTQsNyBAQAogCSAqIEBwYXJhbSByZXBvCiAJICogICAgICAgICAgICByZXBvc2l0b3J5IHdoZXJlIG9iamVjdHMgYXJlIHN0b3JlZC4KIAkgKi8KLQlwdWJsaWMgUGFja1dyaXRlcihmaW5hbCBSZXBvc2l0b3J5IHJlcG8pIHsKKwlwdWJsaWMgUGFja1dyaXRlcihSZXBvc2l0b3J5IHJlcG8pIHsKIAkJdGhpcyhyZXBvLCByZXBvLm5ld09iamVjdFJlYWRlcigpKTsKIAl9CiAKQEAgLTMyNSw3ICszMjcsNyBAQAogCSAqIEBwYXJhbSByZWFkZXIKIAkgKiAgICAgICAgICAgIHJlYWRlciB0byByZWFkIGZyb20gdGhlIHJlcG9zaXRvcnkgd2l0aC4KIAkgKi8KLQlwdWJsaWMgUGFja1dyaXRlcihmaW5hbCBPYmplY3RSZWFkZXIgcmVhZGVyKSB7CisJcHVibGljIFBhY2tXcml0ZXIoT2JqZWN0UmVhZGVyIHJlYWRlcikgewogCQl0aGlzKG5ldyBQYWNrQ29uZmlnKCksIHJlYWRlcik7CiAJfQogCkBAIC0zNDAsNyArMzQyLDcgQEAKIAkgKiBAcGFyYW0gcmVhZGVyCiAJICogICAgICAgICAgICByZWFkZXIgdG8gcmVhZCBmcm9tIHRoZSByZXBvc2l0b3J5IHdpdGguCiAJICovCi0JcHVibGljIFBhY2tXcml0ZXIoZmluYWwgUmVwb3NpdG9yeSByZXBvLCBmaW5hbCBPYmplY3RSZWFkZXIgcmVhZGVyKSB7CisJcHVibGljIFBhY2tXcml0ZXIoUmVwb3NpdG9yeSByZXBvLCBPYmplY3RSZWFkZXIgcmVhZGVyKSB7CiAJCXRoaXMobmV3IFBhY2tDb25maWcocmVwbyksIHJlYWRlcik7CiAJfQogCkBAIC0zNTUsNyArMzU3LDcgQEAKIAkgKiBAcGFyYW0gcmVhZGVyCiAJICogICAgICAgICAgICByZWFkZXIgdG8gcmVhZCBmcm9tIHRoZSByZXBvc2l0b3J5IHdpdGguCiAJICovCi0JcHVibGljIFBhY2tXcml0ZXIoZmluYWwgUGFja0NvbmZpZyBjb25maWcsIGZpbmFsIE9iamVjdFJlYWRlciByZWFkZXIpIHsKKwlwdWJsaWMgUGFja1dyaXRlcihQYWNrQ29uZmlnIGNvbmZpZywgT2JqZWN0UmVhZGVyIHJlYWRlcikgewogCQl0aGlzKGNvbmZpZywgcmVhZGVyLCBudWxsKTsKIAl9CiAKQEAgLTUxMCw3ICs1MTIsNyBAQAogCSAqICAgICAgICAgICAgZGV0ZXJtaW5lZCBieSBzZXQ7IHRoaXMga2luZCBvZiBwYWNrIGlzIHVzZWQgb25seSBmb3IKIAkgKiAgICAgICAgICAgIHRyYW5zcG9ydDsgdHJ1ZSAtIHRvIHByb2R1Y2UgdGhpbiBwYWNrLCBmYWxzZSAtIG90aGVyd2lzZS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaGluKGZpbmFsIGJvb2xlYW4gcGFja3RoaW4pIHsKKwlwdWJsaWMgdm9pZCBzZXRUaGluKGJvb2xlYW4gcGFja3RoaW4pIHsKIAkJdGhpbiA9IHBhY2t0aGluOwogCX0KIApAQCAtNjAxLDcgKzYwMyw3IEBACiAJICogICAgICAgICAgICBwYWNrOyBmYWxzZSBvdGhlcndpc2UgLSBub24gZXhpc3RpbmcgdW5pbnRlcmVzdGluZyBvYmplY3RzIG1heQogCSAqICAgICAgICAgICAgY2F1c2Uge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLk1pc3NpbmdPYmplY3RFeGNlcHRpb259CiAJICovCi0JcHVibGljIHZvaWQgc2V0SWdub3JlTWlzc2luZ1VuaW50ZXJlc3RpbmcoZmluYWwgYm9vbGVhbiBpZ25vcmUpIHsKKwlwdWJsaWMgdm9pZCBzZXRJZ25vcmVNaXNzaW5nVW5pbnRlcmVzdGluZyhib29sZWFuIGlnbm9yZSkgewogCQlpZ25vcmVNaXNzaW5nVW5pbnRlcmVzdGluZyA9IGlnbm9yZTsKIAl9CiAKQEAgLTYzOSw2ICs2NDEsMTQgQEAKIAl9CiAKIAkvKioKKwkgKiBAcGFyYW0gYnl0ZXMgZXhjbHVkZSBibG9icyBvZiBzaXplIGdyZWF0ZXIgdGhhbiB0aGlzCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyB2b2lkIHNldEZpbHRlckJsb2JMaW1pdChsb25nIGJ5dGVzKSB7CisJCWZpbHRlckJsb2JMaW1pdCA9IGJ5dGVzOworCX0KKworCS8qKgogCSAqIFJldHVybnMgb2JqZWN0cyBudW1iZXIgaW4gYSBwYWNrIGZpbGUgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGlzIHdyaXRlci4KIAkgKgogCSAqIEByZXR1cm4gbnVtYmVyIG9mIG9iamVjdHMgaW4gcGFjay4KQEAgLTkxNCw3ICs5MjQsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGEgY2FjaGVkIHBhY2sgY2Fubm90IGJlIGV4YW1pbmVkLgogCSAqLwotCXB1YmxpYyBib29sZWFuIHdpbGxJbmNsdWRlKGZpbmFsIEFueU9iamVjdElkIGlkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBib29sZWFuIHdpbGxJbmNsdWRlKEFueU9iamVjdElkIGlkKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlPYmplY3RUb1BhY2sgb2JqID0gb2JqZWN0c01hcC5nZXQoaWQpOwogCQlyZXR1cm4gb2JqICE9IG51bGwgJiYgIW9iai5pc0VkZ2UoKTsKIAl9CkBAIC05ODEsNyArOTkxLDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgaW5kZXggZGF0YSBjb3VsZCBub3QgYmUgd3JpdHRlbiB0byB0aGUgc3VwcGxpZWQgc3RyZWFtLgogCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlSW5kZXgoZmluYWwgT3V0cHV0U3RyZWFtIGluZGV4U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyB2b2lkIHdyaXRlSW5kZXgoT3V0cHV0U3RyZWFtIGluZGV4U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAoaXNJbmRleERpc2FibGVkKCkpCiAJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkuY2FjaGVkUGFja3NQcmV2ZW50c0luZGV4Q3JlYXRpb24pOwogCkBAIC0xMDAzLDcgKzEwMTMsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBpbmRleCBkYXRhIGNvdWxkIG5vdCBiZSB3cml0dGVuIHRvIHRoZSBzdXBwbGllZCBzdHJlYW0uCiAJICovCi0JcHVibGljIHZvaWQgd3JpdGVCaXRtYXBJbmRleChmaW5hbCBPdXRwdXRTdHJlYW0gYml0bWFwSW5kZXhTdHJlYW0pCisJcHVibGljIHZvaWQgd3JpdGVCaXRtYXBJbmRleChPdXRwdXRTdHJlYW0gYml0bWFwSW5kZXhTdHJlYW0pCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAod3JpdGVCaXRtYXBzID09IG51bGwpCiAJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkuYml0bWFwc011c3RCZVByZXBhcmVkKTsKQEAgLTE1MTYsNyArMTUyNiw3IEBACiAJCQkvLyBUaGUgY2FsbGVyIGdhdmUgdXMgYW4gZXhlY3V0b3IsIGJ1dCBpdCBtaWdodCBub3QgZG8KIAkJCS8vIGFzeW5jaHJvbm91cyBleGVjdXRpb24uICBXcmFwIGV2ZXJ5dGhpbmcgYW5kIGhvcGUgaXQKIAkJCS8vIGNhbiBzY2hlZHVsZSB0aGVzZSBmb3IgdXMuCi0JCQlmb3IgKGZpbmFsIERlbHRhVGFzayB0YXNrIDogdGFza0Jsb2NrLnRhc2tzKSB7CisJCQlmb3IgKERlbHRhVGFzayB0YXNrIDogdGFza0Jsb2NrLnRhc2tzKSB7CiAJCQkJZXhlY3V0b3IuZXhlY3V0ZShuZXcgUnVubmFibGUoKSB7CiAJCQkJCUBPdmVycmlkZQogCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CkBAIC0xNzIzLDcgKzE3MzMsNyBAQAogCQl0eXBlU3RhdHMuZGVsdGFCeXRlcyArPSBvdXQubGVuZ3RoKCkgLSBvdHAuZ2V0T2Zmc2V0KCk7CiAJfQogCi0JcHJpdmF0ZSBUZW1wb3JhcnlCdWZmZXIuSGVhcCBkZWx0YShmaW5hbCBPYmplY3RUb1BhY2sgb3RwKQorCXByaXZhdGUgVGVtcG9yYXJ5QnVmZmVyLkhlYXAgZGVsdGEoT2JqZWN0VG9QYWNrIG90cCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCURlbHRhSW5kZXggaW5kZXggPSBuZXcgRGVsdGFJbmRleChidWZmZXIob3RwLmdldERlbHRhQmFzZUlkKCkpKTsKIAkJYnl0ZVtdIHJlcyA9IGJ1ZmZlcihvdHApOwpAQCAtMTk2MCw3ICsxOTcwLDcgQEAKIAkJCQlieXRlW10gcGF0aEJ1ZiA9IHdhbGtlci5nZXRQYXRoQnVmZmVyKCk7CiAJCQkJaW50IHBhdGhMZW4gPSB3YWxrZXIuZ2V0UGF0aExlbmd0aCgpOwogCQkJCWJhc2VzLmFkZEJhc2Uoby5nZXRUeXBlKCksIHBhdGhCdWYsIHBhdGhMZW4sIHBhdGhIYXNoKTsKLQkJCQlhZGRPYmplY3QobywgcGF0aEhhc2gpOworCQkJCWZpbHRlckFuZEFkZE9iamVjdChvLCBvLmdldFR5cGUoKSwgcGF0aEhhc2gpOwogCQkJCWNvdW50aW5nTW9uaXRvci51cGRhdGUoMSk7CiAJCQl9CiAJCX0gZWxzZSB7CkBAIC0xOTcwLDcgKzE5ODAsNyBAQAogCQkJCQljb250aW51ZTsKIAkJCQlpZiAoZXhjbHVkZShvKSkKIAkJCQkJY29udGludWU7Ci0JCQkJYWRkT2JqZWN0KG8sIHdhbGtlci5nZXRQYXRoSGFzaENvZGUoKSk7CisJCQkJZmlsdGVyQW5kQWRkT2JqZWN0KG8sIG8uZ2V0VHlwZSgpLCB3YWxrZXIuZ2V0UGF0aEhhc2hDb2RlKCkpOwogCQkJCWNvdW50aW5nTW9uaXRvci51cGRhdGUoMSk7CiAJCQl9CiAJCX0KQEAgLTIwMDMsNyArMjAxMyw3IEBACiAJCQkJbmVlZEJpdG1hcC5yZW1vdmUob2JqZWN0SWQpOwogCQkJCWNvbnRpbnVlOwogCQkJfQotCQkJYWRkT2JqZWN0KG9iamVjdElkLCBvYmouZ2V0VHlwZSgpLCAwKTsKKwkJCWZpbHRlckFuZEFkZE9iamVjdChvYmplY3RJZCwgb2JqLmdldFR5cGUoKSwgMCk7CiAJCX0KIAogCQlpZiAodGhpbikKQEAgLTIwNDAsMTMgKzIwNTAsMTMgQEAKIAkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgb2JqZWN0IGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUuCiAJICovCi0JcHVibGljIHZvaWQgYWRkT2JqZWN0KGZpbmFsIFJldk9iamVjdCBvYmplY3QpCisJcHVibGljIHZvaWQgYWRkT2JqZWN0KFJldk9iamVjdCBvYmplY3QpCiAJCQl0aHJvd3MgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiB7CiAJCWlmICghZXhjbHVkZShvYmplY3QpKQogCQkJYWRkT2JqZWN0KG9iamVjdCwgMCk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGFkZE9iamVjdChmaW5hbCBSZXZPYmplY3Qgb2JqZWN0LCBmaW5hbCBpbnQgcGF0aEhhc2hDb2RlKSB7CisJcHJpdmF0ZSB2b2lkIGFkZE9iamVjdChSZXZPYmplY3Qgb2JqZWN0LCBpbnQgcGF0aEhhc2hDb2RlKSB7CiAJCWFkZE9iamVjdChvYmplY3QsIG9iamVjdC5nZXRUeXBlKCksIHBhdGhIYXNoQ29kZSk7CiAJfQogCkBAIC0yMDYyLDYgKzIwNzIsMjEgQEAKIAkJb2JqZWN0c01hcC5hZGQob3RwKTsKIAl9CiAKKwkvLyBBZGRzIHRoZSBnaXZlbiBvYmplY3QgYXMgYW4gb2JqZWN0IHRvIGJlIHBhY2tlZCwgZmlyc3QgcGVyZm9ybWluZworCS8vIGZpbHRlcmluZyBvbiBibG9icyBhdCBvciBleGNlZWRpbmcgYSBnaXZlbiBzaXplLgorCXByaXZhdGUgdm9pZCBmaWx0ZXJBbmRBZGRPYmplY3QoQE5vbk51bGwgQW55T2JqZWN0SWQgc3JjLCBpbnQgdHlwZSwKKwkJCWludCBwYXRoSGFzaENvZGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKwkJLy8gQ2hlY2sgaWYgdGhpcyBvYmplY3QgbmVlZHMgdG8gYmUgcmVqZWN0ZWQsIGRvaW5nIHRoZSBjaGVhcGVyCisJCS8vIGNoZWNrcyBmaXJzdC4KKwkJYm9vbGVhbiByZWplY3QgPSBmaWx0ZXJCbG9iTGltaXQgPj0gMCAmJgorCQkJdHlwZSA9PSBPQkpfQkxPQiAmJgorCQkJcmVhZGVyLmdldE9iamVjdFNpemUoc3JjLCBPQkpfQkxPQikgPiBmaWx0ZXJCbG9iTGltaXQ7CisJCWlmICghcmVqZWN0KSB7CisJCQlhZGRPYmplY3Qoc3JjLCB0eXBlLCBwYXRoSGFzaENvZGUpOworCQl9CisJfQorCiAJcHJpdmF0ZSBib29sZWFuIGV4Y2x1ZGUoQW55T2JqZWN0SWQgb2JqZWN0SWQpIHsKIAkJaWYgKGV4Y2x1ZGVJblBhY2tzID09IG51bGwpCiAJCQlyZXR1cm4gZmFsc2U7CkBAIC0yMjIzLDI5MCArMjI0OCw2IEBACiAJCXJldHVybiB0cnVlOwogCX0KIAotCS8qKgotCSAqIFN1bW1hcnkgb2YgaG93IFBhY2tXcml0ZXIgY3JlYXRlZCB0aGUgcGFjay4KLQkgKgotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgUGFja1N0YXRpc3RpY3N9IGluc3RlYWQuCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFN0YXRpc3RpY3MgewotCQkvKiogU3RhdGlzdGljcyBhYm91dCBhIHNpbmdsZSBjbGFzcyBvZiBvYmplY3QuICovCi0JCXB1YmxpYyBzdGF0aWMgY2xhc3MgT2JqZWN0VHlwZSB7Ci0JCQkvLyBBbGwgcmVxdWVzdHMgYXJlIGZvcndhcmRlZCB0byB0aGlzIG9iamVjdC4KLQkJCXByaXZhdGUgUGFja1N0YXRpc3RpY3MuT2JqZWN0VHlwZSBvYmplY3RUeXBlOwotCi0JCQkvKioKLQkJCSAqIFdyYXBzIGFuCi0JCQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLnBhY2suUGFja1N0YXRpc3RpY3MuT2JqZWN0VHlwZX0KLQkJCSAqIGluc3RhbmNlIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgQVBJLgotCQkJICoKLQkJCSAqIEBwYXJhbSB0eXBlCi0JCQkgKiAgICAgICAgICAgIHRoZSB3cmFwcGVkIGluc3RhbmNlCi0JCQkgKi8KLQkJCXB1YmxpYyBPYmplY3RUeXBlKFBhY2tTdGF0aXN0aWNzLk9iamVjdFR5cGUgdHlwZSkgewotCQkJCW9iamVjdFR5cGUgPSB0eXBlOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIEByZXR1cm4gdG90YWwgbnVtYmVyIG9mIG9iamVjdHMgb3V0cHV0LiBUaGlzIHRvdGFsIGluY2x1ZGVzIHRoZQotCQkJICogICAgICAgICB2YWx1ZSBvZiB7QGxpbmsgI2dldERlbHRhcygpfS4KLQkJCSAqLwotCQkJcHVibGljIGxvbmcgZ2V0T2JqZWN0cygpIHsKLQkJCQlyZXR1cm4gb2JqZWN0VHlwZS5nZXRPYmplY3RzKCk7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQHJldHVybiB0b3RhbCBudW1iZXIgb2YgZGVsdGFzIG91dHB1dC4gVGhpcyBtYXkgYmUgbG93ZXIgdGhhbiB0aGUKLQkJCSAqICAgICAgICAgYWN0dWFsIG51bWJlciBvZiBkZWx0YXMgaWYgYSBjYWNoZWQgcGFjayB3YXMgcmV1c2VkLgotCQkJICovCi0JCQlwdWJsaWMgbG9uZyBnZXREZWx0YXMoKSB7Ci0JCQkJcmV0dXJuIG9iamVjdFR5cGUuZ2V0RGVsdGFzKCk7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQHJldHVybiBudW1iZXIgb2Ygb2JqZWN0cyB3aG9zZSBleGlzdGluZyByZXByZXNlbnRhdGlvbiB3YXMKLQkJCSAqICAgICAgICAgcmV1c2VkIGluIHRoZSBvdXRwdXQuIFRoaXMgY291bnQgaW5jbHVkZXMKLQkJCSAqICAgICAgICAge0BsaW5rICNnZXRSZXVzZWREZWx0YXMoKX0uCi0JCQkgKi8KLQkJCXB1YmxpYyBsb25nIGdldFJldXNlZE9iamVjdHMoKSB7Ci0JCQkJcmV0dXJuIG9iamVjdFR5cGUuZ2V0UmV1c2VkT2JqZWN0cygpOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIEByZXR1cm4gbnVtYmVyIG9mIGRlbHRhcyB3aG9zZSBleGlzdGluZyByZXByZXNlbnRhdGlvbiB3YXMgcmV1c2VkCi0JCQkgKiAgICAgICAgIGluIHRoZSBvdXRwdXQsIGFzIHRoZWlyIGJhc2Ugb2JqZWN0IHdhcyBhbHNvIG91dHB1dCBvcgotCQkJICogICAgICAgICB3YXMgYXNzdW1lZCBwcmVzZW50IGZvciBhIHRoaW4gcGFjay4gVGhpcyBtYXkgYmUgbG93ZXIKLQkJCSAqICAgICAgICAgdGhhbiB0aGUgYWN0dWFsIG51bWJlciBvZiByZXVzZWQgZGVsdGFzIGlmIGEgY2FjaGVkIHBhY2sKLQkJCSAqICAgICAgICAgd2FzIHJldXNlZC4KLQkJCSAqLwotCQkJcHVibGljIGxvbmcgZ2V0UmV1c2VkRGVsdGFzKCkgewotCQkJCXJldHVybiBvYmplY3RUeXBlLmdldFJldXNlZERlbHRhcygpOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIEByZXR1cm4gdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uIFRoaXMgc2l6ZSBpbmNsdWRlcyB0aGUKLQkJCSAqICAgICAgICAgb2JqZWN0IGhlYWRlcnMgYXMgd2VsbCBhcyB0aGUgY29tcHJlc3NlZCBkYXRhLiBUaGlzIHNpemUKLQkJCSAqICAgICAgICAgYWxzbyBpbmNsdWRlcyBhbGwgb2Yge0BsaW5rICNnZXREZWx0YUJ5dGVzKCl9LgotCQkJICovCi0JCQlwdWJsaWMgbG9uZyBnZXRCeXRlcygpIHsKLQkJCQlyZXR1cm4gb2JqZWN0VHlwZS5nZXRCeXRlcygpOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIEByZXR1cm4gbnVtYmVyIG9mIGRlbHRhIGJ5dGVzIHdyaXR0ZW4uIFRoaXMgc2l6ZSBpbmNsdWRlcyB0aGUKLQkJCSAqICAgICAgICAgb2JqZWN0IGhlYWRlcnMgZm9yIHRoZSBkZWx0YSBvYmplY3RzLgotCQkJICovCi0JCQlwdWJsaWMgbG9uZyBnZXREZWx0YUJ5dGVzKCkgewotCQkJCXJldHVybiBvYmplY3RUeXBlLmdldERlbHRhQnl0ZXMoKTsKLQkJCX0KLQkJfQotCi0JCS8vIEFsbCByZXF1ZXN0cyBhcmUgZm9yd2FyZGVkIHRvIHRoaXMgb2JqZWN0LgotCQlwcml2YXRlIFBhY2tTdGF0aXN0aWNzIHN0YXRpc3RpY3M7Ci0KLQkJLyoqCi0JCSAqIFdyYXBzIGEge0BsaW5rIFBhY2tTdGF0aXN0aWNzfSBvYmplY3QgdG8gbWFpbnRhaW4gYmFja3dhcmRzCi0JCSAqIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBBUEkuCi0JCSAqCi0JCSAqIEBwYXJhbSBzdGF0cwotCQkgKiAgICAgICAgICAgIHRoZSB3cmFwcGVkIFBhY2tTdGF0aXRpY3Mgb2JqZWN0Ci0JCSAqLwotCQlwdWJsaWMgU3RhdGlzdGljcyhQYWNrU3RhdGlzdGljcyBzdGF0cykgewotCQkJc3RhdGlzdGljcyA9IHN0YXRzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gdW5tb2RpZmlhYmxlIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyB0byBiZSBpbmNsdWRlZCBpbiB0aGUKLQkJICogICAgICAgICBwYWNrLiBNYXkgYmUgbnVsbCBpZiB0aGUgcGFjayB3YXMgaGFuZC1jcmFmdGVkIGluIGEgdW5pdAotCQkgKiAgICAgICAgIHRlc3QuCi0JCSAqLwotCQlwdWJsaWMgU2V0PE9iamVjdElkPiBnZXRJbnRlcmVzdGluZ09iamVjdHMoKSB7Ci0JCQlyZXR1cm4gc3RhdGlzdGljcy5nZXRJbnRlcmVzdGluZ09iamVjdHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIHVubW9kaWZpYWJsZSBjb2xsZWN0aW9uIG9mIG9iamVjdHMgdGhhdCBzaG91bGQgYmUgZXhjbHVkZWQKLQkJICogICAgICAgICBmcm9tIHRoZSBwYWNrLCBhcyB0aGUgcGVlciB0aGF0IHdpbGwgcmVjZWl2ZSB0aGUgcGFjayBhbHJlYWR5Ci0JCSAqICAgICAgICAgaGFzIHRoZXNlIG9iamVjdHMuCi0JCSAqLwotCQlwdWJsaWMgU2V0PE9iamVjdElkPiBnZXRVbmludGVyZXN0aW5nT2JqZWN0cygpIHsKLQkJCXJldHVybiBzdGF0aXN0aWNzLmdldFVuaW50ZXJlc3RpbmdPYmplY3RzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiB1bm1vZGlmaWFibGUgY29sbGVjdGlvbiBvZiB0aGUgY2FjaGVkIHBhY2tzIHRoYXQgd2VyZSByZXVzZWQKLQkJICogICAgICAgICBpbiB0aGUgb3V0cHV0LCBpZiBhbnkgd2VyZSBzZWxlY3RlZCBmb3IgcmV1c2UuCi0JCSAqLwotCQlwdWJsaWMgQ29sbGVjdGlvbjxDYWNoZWRQYWNrPiBnZXRSZXVzZWRQYWNrcygpIHsKLQkJCXJldHVybiBzdGF0aXN0aWNzLmdldFJldXNlZFBhY2tzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBudW1iZXIgb2Ygb2JqZWN0cyBpbiB0aGUgb3V0cHV0IHBhY2sgdGhhdCB3ZW50IHRocm91Z2ggdGhlCi0JCSAqICAgICAgICAgZGVsdGEgc2VhcmNoIHByb2Nlc3MgaW4gb3JkZXIgdG8gZmluZCBhIHBvdGVudGlhbCBkZWx0YSBiYXNlLgotCQkgKi8KLQkJcHVibGljIGludCBnZXREZWx0YVNlYXJjaE5vbkVkZ2VPYmplY3RzKCkgewotCQkJcmV0dXJuIHN0YXRpc3RpY3MuZ2V0RGVsdGFTZWFyY2hOb25FZGdlT2JqZWN0cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gbnVtYmVyIG9mIG9iamVjdHMgaW4gdGhlIG91dHB1dCBwYWNrIHRoYXQgd2VudCB0aHJvdWdoIGRlbHRhCi0JCSAqICAgICAgICAgYmFzZSBzZWFyY2ggYW5kIGZvdW5kIGEgc3VpdGFibGUgYmFzZS4gVGhpcyBpcyBhIHN1YnNldCBvZgotCQkgKiAgICAgICAgIHtAbGluayAjZ2V0RGVsdGFTZWFyY2hOb25FZGdlT2JqZWN0cygpfS4KLQkJICovCi0JCXB1YmxpYyBpbnQgZ2V0RGVsdGFzRm91bmQoKSB7Ci0JCQlyZXR1cm4gc3RhdGlzdGljcy5nZXREZWx0YXNGb3VuZCgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gdG90YWwgbnVtYmVyIG9mIG9iamVjdHMgb3V0cHV0LiBUaGlzIHRvdGFsIGluY2x1ZGVzIHRoZSB2YWx1ZQotCQkgKiAgICAgICAgIG9mIHtAbGluayAjZ2V0VG90YWxEZWx0YXMoKX0uCi0JCSAqLwotCQlwdWJsaWMgbG9uZyBnZXRUb3RhbE9iamVjdHMoKSB7Ci0JCQlyZXR1cm4gc3RhdGlzdGljcy5nZXRUb3RhbE9iamVjdHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIHRoZSBjb3VudCBvZiBvYmplY3RzIHRoYXQgbmVlZGVkIHRvIGJlIGRpc2NvdmVyZWQgdGhyb3VnaCBhbgotCQkgKiAgICAgICAgIG9iamVjdCB3YWxrIGJlY2F1c2UgdGhleSB3ZXJlIG5vdCBmb3VuZCBpbiBiaXRtYXAgaW5kaWNlcy4KLQkJICogICAgICAgICBSZXR1cm5zIC0xIGlmIG5vIGJpdG1hcCBpbmRpY2VzIHdlcmUgZm91bmQuCi0JCSAqLwotCQlwdWJsaWMgbG9uZyBnZXRCaXRtYXBJbmRleE1pc3NlcygpIHsKLQkJCXJldHVybiBzdGF0aXN0aWNzLmdldEJpdG1hcEluZGV4TWlzc2VzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiB0b3RhbCBudW1iZXIgb2YgZGVsdGFzIG91dHB1dC4gVGhpcyBtYXkgYmUgbG93ZXIgdGhhbiB0aGUKLQkJICogICAgICAgICBhY3R1YWwgbnVtYmVyIG9mIGRlbHRhcyBpZiBhIGNhY2hlZCBwYWNrIHdhcyByZXVzZWQuCi0JCSAqLwotCQlwdWJsaWMgbG9uZyBnZXRUb3RhbERlbHRhcygpIHsKLQkJCXJldHVybiBzdGF0aXN0aWNzLmdldFRvdGFsRGVsdGFzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBudW1iZXIgb2Ygb2JqZWN0cyB3aG9zZSBleGlzdGluZyByZXByZXNlbnRhdGlvbiB3YXMgcmV1c2VkIGluCi0JCSAqICAgICAgICAgdGhlIG91dHB1dC4gVGhpcyBjb3VudCBpbmNsdWRlcyB7QGxpbmsgI2dldFJldXNlZERlbHRhcygpfS4KLQkJICovCi0JCXB1YmxpYyBsb25nIGdldFJldXNlZE9iamVjdHMoKSB7Ci0JCQlyZXR1cm4gc3RhdGlzdGljcy5nZXRSZXVzZWRPYmplY3RzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBudW1iZXIgb2YgZGVsdGFzIHdob3NlIGV4aXN0aW5nIHJlcHJlc2VudGF0aW9uIHdhcyByZXVzZWQgaW4KLQkJICogICAgICAgICB0aGUgb3V0cHV0LCBhcyB0aGVpciBiYXNlIG9iamVjdCB3YXMgYWxzbyBvdXRwdXQgb3Igd2FzCi0JCSAqICAgICAgICAgYXNzdW1lZCBwcmVzZW50IGZvciBhIHRoaW4gcGFjay4gVGhpcyBtYXkgYmUgbG93ZXIgdGhhbiB0aGUKLQkJICogICAgICAgICBhY3R1YWwgbnVtYmVyIG9mIHJldXNlZCBkZWx0YXMgaWYgYSBjYWNoZWQgcGFjayB3YXMgcmV1c2VkLgotCQkgKi8KLQkJcHVibGljIGxvbmcgZ2V0UmV1c2VkRGVsdGFzKCkgewotCQkJcmV0dXJuIHN0YXRpc3RpY3MuZ2V0UmV1c2VkRGVsdGFzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4gVGhpcyBzaXplIGluY2x1ZGVzIHRoZSBwYWNrCi0JCSAqICAgICAgICAgaGVhZGVyLCB0cmFpbGVyLCB0aGluIHBhY2ssIGFuZCByZXVzZWQgY2FjaGVkIHBhY2socykuCi0JCSAqLwotCQlwdWJsaWMgbG9uZyBnZXRUb3RhbEJ5dGVzKCkgewotCQkJcmV0dXJuIHN0YXRpc3RpY3MuZ2V0VG90YWxCeXRlcygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gc2l6ZSBvZiB0aGUgdGhpbiBwYWNrIGluIGJ5dGVzLCBpZiBhIHRoaW4gcGFjayB3YXMgZ2VuZXJhdGVkLgotCQkgKiAgICAgICAgIEEgdGhpbiBwYWNrIGlzIGNyZWF0ZWQgd2hlbiB0aGUgY2xpZW50IGFscmVhZHkgaGFzIG9iamVjdHMKLQkJICogICAgICAgICBhbmQgc29tZSBkZWx0YXMgYXJlIGNyZWF0ZWQgYWdhaW5zdCB0aG9zZSBvYmplY3RzLCBvciBpZiBhCi0JCSAqICAgICAgICAgY2FjaGVkIHBhY2sgaXMgYmVpbmcgdXNlZCBhbmQgc29tZSBkZWx0YXMgd2lsbCByZWZlcmVuY2UKLQkJICogICAgICAgICBvYmplY3RzIGluIHRoZSBjYWNoZWQgcGFjay4gVGhpcyBzaXplIGRvZXMgbm90IGluY2x1ZGUgdGhlCi0JCSAqICAgICAgICAgcGFjayBoZWFkZXIgb3IgdHJhaWxlci4KLQkJICovCi0JCXB1YmxpYyBsb25nIGdldFRoaW5QYWNrQnl0ZXMoKSB7Ci0JCQlyZXR1cm4gc3RhdGlzdGljcy5nZXRUaGluUGFja0J5dGVzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIHR5cGVDb2RlCi0JCSAqICAgICAgICAgICAgb2JqZWN0IHR5cGUgY29kZSwgZS5nLiBPQkpfQ09NTUlUIG9yIE9CSl9UUkVFLgotCQkgKiBAcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdHlwZSBvZiBvYmplY3QgaW4gdGhlIHBhY2suCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0VHlwZSBieU9iamVjdFR5cGUoaW50IHR5cGVDb2RlKSB7Ci0JCQlyZXR1cm4gbmV3IE9iamVjdFR5cGUoc3RhdGlzdGljcy5ieU9iamVjdFR5cGUodHlwZUNvZGUpKTsKLQkJfQotCi0JCS8qKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlc3VsdGluZyBwYWNrIGZpbGUgd2FzIGEgc2hhbGxvdyBwYWNrLiAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc1NoYWxsb3coKSB7Ci0JCQlyZXR1cm4gc3RhdGlzdGljcy5pc1NoYWxsb3coKTsKLQkJfQotCi0JCS8qKiBAcmV0dXJuIGRlcHRoIChpbiBjb21taXRzKSB0aGUgcGFjayBpbmNsdWRlcyBpZiBzaGFsbG93LiAqLwotCQlwdWJsaWMgaW50IGdldERlcHRoKCkgewotCQkJcmV0dXJuIHN0YXRpc3RpY3MuZ2V0RGVwdGgoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHNwZW50IGVudW1lcmF0aW5nIHRoZSBvYmplY3RzIHRoYXQgbmVlZAotCQkgKiAgICAgICAgIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQuIFRoaXMgdGltZSBpbmNsdWRlcyBhbnkgcmVzdGFydHMKLQkJICogICAgICAgICB0aGF0IG9jY3VyIHdoZW4gYSBjYWNoZWQgcGFjayBpcyBzZWxlY3RlZCBmb3IgcmV1c2UuCi0JCSAqLwotCQlwdWJsaWMgbG9uZyBnZXRUaW1lQ291bnRpbmcoKSB7Ci0JCQlyZXR1cm4gc3RhdGlzdGljcy5nZXRUaW1lQ291bnRpbmcoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHNwZW50IG1hdGNoaW5nIGV4aXN0aW5nIHJlcHJlc2VudGF0aW9ucwotCQkgKiAgICAgICAgIGFnYWluc3Qgb2JqZWN0cyB0aGF0IHdpbGwgYmUgdHJhbnNtaXR0ZWQsIG9yIHRoYXQgdGhlIGNsaWVudAotCQkgKiAgICAgICAgIGNhbiBiZSBhc3N1bWVkIHRvIGFscmVhZHkgaGF2ZS4KLQkJICovCi0JCXB1YmxpYyBsb25nIGdldFRpbWVTZWFyY2hpbmdGb3JSZXVzZSgpIHsKLQkJCXJldHVybiBzdGF0aXN0aWNzLmdldFRpbWVTZWFyY2hpbmdGb3JSZXVzZSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gdGltZSBpbiBtaWxsaXNlY29uZHMgc3BlbnQgZmluZGluZyB0aGUgc2l6ZXMgb2YgYWxsIG9iamVjdHMKLQkJICogICAgICAgICB0aGF0IHdpbGwgZW50ZXIgdGhlIGRlbHRhIGNvbXByZXNzaW9uIHNlYXJjaCB3aW5kb3cuIFRoZQotCQkgKiAgICAgICAgIHNpemVzIG5lZWQgdG8gYmUga25vd24gdG8gYmV0dGVyIG1hdGNoIHNpbWlsYXIgb2JqZWN0cwotCQkgKiAgICAgICAgIHRvZ2V0aGVyIGFuZCBpbXByb3ZlIGRlbHRhIGNvbXByZXNzaW9uIHJhdGlvcy4KLQkJICovCi0JCXB1YmxpYyBsb25nIGdldFRpbWVTZWFyY2hpbmdGb3JTaXplcygpIHsKLQkJCXJldHVybiBzdGF0aXN0aWNzLmdldFRpbWVTZWFyY2hpbmdGb3JTaXplcygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gdGltZSBpbiBtaWxsaXNlY29uZHMgc3BlbnQgb24gZGVsdGEgY29tcHJlc3Npb24uIFRoaXMgaXMKLQkJICogICAgICAgICBvYnNlcnZlZCB3YWxsLWNsb2NrIHRpbWUgYW5kIGRvZXMgbm90IGFjY3VyYXRlbHkgdHJhY2sgQ1BVCi0JCSAqICAgICAgICAgdGltZSB1c2VkIHdoZW4gbXVsdGlwbGUgdGhyZWFkcyB3ZXJlIHVzZWQgdG8gcGVyZm9ybSB0aGUKLQkJICogICAgICAgICBkZWx0YSBjb21wcmVzc2lvbi4KLQkJICovCi0JCXB1YmxpYyBsb25nIGdldFRpbWVDb21wcmVzc2luZygpIHsKLQkJCXJldHVybiBzdGF0aXN0aWNzLmdldFRpbWVDb21wcmVzc2luZygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gdGltZSBpbiBtaWxsaXNlY29uZHMgc3BlbnQgd3JpdGluZyB0aGUgcGFjayBvdXRwdXQsIGZyb20KLQkJICogICAgICAgICBzdGFydCBvZiBoZWFkZXIgdW50aWwgZW5kIG9mIHRyYWlsZXIuIFRoZSB0cmFuc2ZlciBzcGVlZCBjYW4KLQkJICogICAgICAgICBiZSBhcHByb3hpbWF0ZWQgYnkgZGl2aWRpbmcge0BsaW5rICNnZXRUb3RhbEJ5dGVzKCl9IGJ5IHRoaXMKLQkJICogICAgICAgICB2YWx1ZS4KLQkJICovCi0JCXB1YmxpYyBsb25nIGdldFRpbWVXcml0aW5nKCkgewotCQkJcmV0dXJuIHN0YXRpc3RpY3MuZ2V0VGltZVdyaXRpbmcoKTsKLQkJfQotCi0JCS8qKiBAcmV0dXJuIHRvdGFsIHRpbWUgc3BlbnQgcHJvY2Vzc2luZyB0aGlzIHBhY2suICovCi0JCXB1YmxpYyBsb25nIGdldFRpbWVUb3RhbCgpIHsKLQkJCXJldHVybiBzdGF0aXN0aWNzLmdldFRpbWVUb3RhbCgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gZ2V0IHRoZSBhdmVyYWdlIG91dHB1dCBzcGVlZCBpbiB0ZXJtcyBvZiBieXRlcy1wZXItc2Vjb25kLgotCQkgKiAgICAgICAgIHtAY29kZSBnZXRUb3RhbEJ5dGVzKCkgLyAoZ2V0VGltZVdyaXRpbmcoKSAvIDEwMDAuMCl9LgotCQkgKi8KLQkJcHVibGljIGRvdWJsZSBnZXRUcmFuc2ZlclJhdGUoKSB7Ci0JCQlyZXR1cm4gc3RhdGlzdGljcy5nZXRUcmFuc2ZlclJhdGUoKTsKLQkJfQotCi0JCS8qKiBAcmV0dXJuIGZvcm1hdHRlZCBtZXNzYWdlIHN0cmluZyBmb3IgZGlzcGxheSB0byBjbGllbnRzLiAqLwotCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0JCQlyZXR1cm4gc3RhdGlzdGljcy5nZXRNZXNzYWdlKCk7Ci0JCX0KLQl9Ci0KIAlwcml2YXRlIGNsYXNzIE11dGFibGVTdGF0ZSB7CiAJCS8qKiBFc3RpbWF0ZWQgc2l6ZSBvZiBhIHNpbmdsZSBPYmplY3RUb1BhY2sgaW5zdGFuY2UuICovCiAJCS8vIEFzc3VtZSA2NC1iaXQgcG9pbnRlcnMsIHNpbmNlIHRoaXMgaXMganVzdCBhbiBlc3RpbWF0ZS4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0YWJsZS9CbG9ja1JlYWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3JlZnRhYmxlL0Jsb2NrUmVhZGVyLmphdmEKaW5kZXggY2UyYmE0YS4uOTQyZDcyZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3JlZnRhYmxlL0Jsb2NrUmVhZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3JlZnRhYmxlL0Jsb2NrUmVhZGVyLmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGU7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlLkJsb2NrV3JpdGVyLmNvbXBhcmU7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0YWJsZS5SZWZ0YWJsZUNvbnN0YW50cy5GSUxFX0JMT0NLX1RZUEU7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0YWJsZS5SZWZ0YWJsZUNvbnN0YW50cy5GSUxFX0hFQURFUl9MRU47CkBAIC0xMzgsNyArMTM4LDcgQEAKIAkJaWYgKGJsb2NrVHlwZSA9PSBMT0dfQkxPQ0tfVFlQRSkgewogCQkJbGVuIC09IDk7CiAJCX0KLQkJcmV0dXJuIFJhd1BhcnNlVXRpbHMuZGVjb2RlKFVURl84LCBuYW1lQnVmLCAwLCBsZW4pOworCQlyZXR1cm4gUmF3UGFyc2VVdGlscy5kZWNvZGUoQ0hBUlNFVCwgbmFtZUJ1ZiwgMCwgbGVuKTsKIAl9CiAKIAlib29sZWFuIG1hdGNoKGJ5dGVbXSBtYXRjaCwgYm9vbGVhbiBtYXRjaElzUHJlZml4KSB7CkBAIC0xNzEsNyArMTcxLDcgQEAKIAl9CiAKIAlSZWYgcmVhZFJlZigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBuYW1lID0gUmF3UGFyc2VVdGlscy5kZWNvZGUoVVRGXzgsIG5hbWVCdWYsIDAsIG5hbWVMZW4pOworCQlTdHJpbmcgbmFtZSA9IFJhd1BhcnNlVXRpbHMuZGVjb2RlKENIQVJTRVQsIG5hbWVCdWYsIDAsIG5hbWVMZW4pOwogCQlzd2l0Y2ggKHZhbHVlVHlwZSAmIFZBTFVFX1RZUEVfTUFTSykgewogCQljYXNlIFZBTFVFX05PTkU6IC8vIGRlbGV0ZQogCQkJcmV0dXJuIG5ld1JlZihuYW1lKTsKQEAgLTI2Niw3ICsyNjYsNyBAQAogCXByaXZhdGUgU3RyaW5nIHJlYWRWYWx1ZVN0cmluZygpIHsKIAkJaW50IGxlbiA9IHJlYWRWYXJpbnQzMigpOwogCQlpbnQgZW5kID0gcHRyICsgbGVuOwotCQlTdHJpbmcgcyA9IFJhd1BhcnNlVXRpbHMuZGVjb2RlKFVURl84LCBidWYsIHB0ciwgZW5kKTsKKwkJU3RyaW5nIHMgPSBSYXdQYXJzZVV0aWxzLmRlY29kZShDSEFSU0VULCBidWYsIHB0ciwgZW5kKTsKIAkJcHRyID0gZW5kOwogCQlyZXR1cm4gczsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcmVmdGFibGUvQmxvY2tXcml0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0YWJsZS9CbG9ja1dyaXRlci5qYXZhCmluZGV4IGIzMTczZTguLjNkOGZiZjQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0YWJsZS9CbG9ja1dyaXRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0YWJsZS9CbG9ja1dyaXRlci5qYXZhCkBAIC00Myw3ICs0Myw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0YWJsZS5SZWZ0YWJsZUNvbnN0YW50cy5GSUxFX0hFQURFUl9MRU47CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0YWJsZS5SZWZ0YWJsZUNvbnN0YW50cy5JTkRFWF9CTE9DS19UWVBFOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGUuUmVmdGFibGVDb25zdGFudHMuTE9HX0JMT0NLX1RZUEU7CkBAIC00NDAsNyArNDQwLDcgQEAKIAkJfQogCiAJCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBuYW1lVXRmOChSZWYgcmVmKSB7Ci0JCQlyZXR1cm4gcmVmLmdldE5hbWUoKS5nZXRCeXRlcyhVVEZfOCk7CisJCQlyZXR1cm4gcmVmLmdldE5hbWUoKS5nZXRCeXRlcyhDSEFSU0VUKTsKIAkJfQogCX0KIApAQCAtNTU5LDEzICs1NTksMTMgQEAKIAkJCXRoaXMubmV3SWQgPSBuZXdJZDsKIAkJCXRoaXMudGltZVNlY3MgPSB3aG8uZ2V0V2hlbigpLmdldFRpbWUoKSAvIDEwMDBMOwogCQkJdGhpcy50eiA9IChzaG9ydCkgd2hvLmdldFRpbWVab25lT2Zmc2V0KCk7Ci0JCQl0aGlzLm5hbWUgPSB3aG8uZ2V0TmFtZSgpLmdldEJ5dGVzKFVURl84KTsKLQkJCXRoaXMuZW1haWwgPSB3aG8uZ2V0RW1haWxBZGRyZXNzKCkuZ2V0Qnl0ZXMoVVRGXzgpOwotCQkJdGhpcy5tc2cgPSBtZXNzYWdlLmdldEJ5dGVzKFVURl84KTsKKwkJCXRoaXMubmFtZSA9IHdoby5nZXROYW1lKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCk7CisJCQl0aGlzLmVtYWlsID0gd2hvLmdldEVtYWlsQWRkcmVzcygpLmdldEJ5dGVzKENIQVJTRVQpOworCQkJdGhpcy5tc2cgPSBtZXNzYWdlLmdldEJ5dGVzKENIQVJTRVQpOwogCQl9CiAKIAkJc3RhdGljIGJ5dGVbXSBrZXkoU3RyaW5nIHJlZiwgbG9uZyBpbmRleCkgewotCQkJYnl0ZVtdIG5hbWUgPSByZWYuZ2V0Qnl0ZXMoVVRGXzgpOworCQkJYnl0ZVtdIG5hbWUgPSByZWYuZ2V0Qnl0ZXMoQ0hBUlNFVCk7CiAJCQlieXRlW10ga2V5ID0gQXJyYXlzLmNvcHlPZihuYW1lLCBuYW1lLmxlbmd0aCArIDEgKyA4KTsKIAkJCU5CLmVuY29kZUludDY0KGtleSwga2V5Lmxlbmd0aCAtIDgsIHJldmVyc2VVcGRhdGVJbmRleChpbmRleCkpOwogCQkJcmV0dXJuIGtleTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0YWJsZS9SZWZ0YWJsZU91dHB1dFN0cmVhbS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3JlZnRhYmxlL1JlZnRhYmxlT3V0cHV0U3RyZWFtLmphdmEKaW5kZXggMWZjNDNjOS4uNDRiYmIxNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3JlZnRhYmxlL1JlZnRhYmxlT3V0cHV0U3RyZWFtLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3JlZnRhYmxlL1JlZnRhYmxlT3V0cHV0U3RyZWFtLmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGU7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlLlJlZnRhYmxlQ29uc3RhbnRzLkZJTEVfSEVBREVSX0xFTjsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlLlJlZnRhYmxlQ29uc3RhbnRzLklOREVYX0JMT0NLX1RZUEU7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0YWJsZS5SZWZ0YWJsZUNvbnN0YW50cy5MT0dfQkxPQ0tfVFlQRTsKQEAgLTE2MCw3ICsxNjAsNyBAQAogCX0KIAogCXZvaWQgd3JpdGVWYXJpbnRTdHJpbmcoU3RyaW5nIHMpIHsKLQkJd3JpdGVWYXJpbnRTdHJpbmcocy5nZXRCeXRlcyhVVEZfOCkpOworCQl3cml0ZVZhcmludFN0cmluZyhzLmdldEJ5dGVzKENIQVJTRVQpKTsKIAl9CiAKIAl2b2lkIHdyaXRlVmFyaW50U3RyaW5nKGJ5dGVbXSBtc2cpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0YWJsZS9SZWZ0YWJsZVJlYWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3JlZnRhYmxlL1JlZnRhYmxlUmVhZGVyLmphdmEKaW5kZXggNzQ4NzcxOS4uNTM1Njk1MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3JlZnRhYmxlL1JlZnRhYmxlUmVhZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3JlZnRhYmxlL1JlZnRhYmxlUmVhZGVyLmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGU7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlLkJsb2NrUmVhZGVyLmRlY29kZUJsb2NrTGVuOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGUuUmVmdGFibGVDb25zdGFudHMuRklMRV9CTE9DS19UWVBFOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGUuUmVmdGFibGVDb25zdGFudHMuRklMRV9GT09URVJfTEVOOwpAQCAtMTgyLDcgKzE4Miw3IEBACiAJcHVibGljIFJlZkN1cnNvciBzZWVrUmVmKFN0cmluZyByZWZOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpbml0UmVmSW5kZXgoKTsKIAotCQlieXRlW10ga2V5ID0gcmVmTmFtZS5nZXRCeXRlcyhVVEZfOCk7CisJCWJ5dGVbXSBrZXkgPSByZWZOYW1lLmdldEJ5dGVzKENIQVJTRVQpOwogCQlib29sZWFuIHByZWZpeCA9IGtleVtrZXkubGVuZ3RoIC0gMV0gPT0gJy8nOwogCiAJCVJlZkN1cnNvckltcGwgaSA9IG5ldyBSZWZDdXJzb3JJbXBsKHJlZkVuZCwga2V5LCBwcmVmaXgpOwpAQCAtMjIzLDcgKzIyMyw3IEBACiAJCWluaXRMb2dJbmRleCgpOwogCQlpZiAobG9nUG9zaXRpb24gPiAwKSB7CiAJCQlieXRlW10ga2V5ID0gTG9nRW50cnkua2V5KHJlZk5hbWUsIHVwZGF0ZUluZGV4KTsKLQkJCWJ5dGVbXSBtYXRjaCA9IHJlZk5hbWUuZ2V0Qnl0ZXMoVVRGXzgpOworCQkJYnl0ZVtdIG1hdGNoID0gcmVmTmFtZS5nZXRCeXRlcyhDSEFSU0VUKTsKIAkJCUxvZ0N1cnNvckltcGwgaSA9IG5ldyBMb2dDdXJzb3JJbXBsKGxvZ0VuZCwgbWF0Y2gpOwogCQkJaS5ibG9jayA9IHNlZWsoTE9HX0JMT0NLX1RZUEUsIGtleSwgbG9nSW5kZXgsIGxvZ1Bvc2l0aW9uLCBsb2dFbmQpOwogCQkJcmV0dXJuIGk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcmVmdHJlZS9SZWZUcmVlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcmVmdHJlZS9SZWZUcmVlLmphdmEKaW5kZXggZTlhYTExMC4uNTc1MWRkNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3JlZnRyZWUvUmVmVHJlZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0cmVlL1JlZlRyZWUuamF2YQpAQCAtMjc5LDcgKzI3OSw3IEBACiAJCXJldHVybiBIRUFELmVxdWFscyhuKSB8fCBSZXBvc2l0b3J5LmlzVmFsaWRSZWZOYW1lKG4pOwogCX0KIAotCXByaXZhdGUgdm9pZCBhcHBseShEaXJDYWNoZUVkaXRvciBlZCwgZmluYWwgQ29tbWFuZCBjbWQpIHsKKwlwcml2YXRlIHZvaWQgYXBwbHkoRGlyQ2FjaGVFZGl0b3IgZWQsIENvbW1hbmQgY21kKSB7CiAJCVN0cmluZyBwYXRoID0gcmVmUGF0aChjbWQuZ2V0UmVmTmFtZSgpKTsKIAkJUmVmIG9sZFJlZiA9IGNtZC5nZXRPbGRSZWYoKTsKIAkJZmluYWwgUmVmIG5ld1JlZiA9IGNtZC5nZXROZXdSZWYoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0cmVlL1JlZlRyZWVEYXRhYmFzZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3JlZnRyZWUvUmVmVHJlZURhdGFiYXNlLmphdmEKaW5kZXggMTgzNDY4Zi4uMjdkYWFmMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3JlZnRyZWUvUmVmVHJlZURhdGFiYXNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3JlZnRyZWUvUmVmVHJlZURhdGFiYXNlLmphdmEKQEAgLTI4Miw3ICsyODIsNyBAQAogCXB1YmxpYyBMaXN0PFJlZj4gZ2V0QWRkaXRpb25hbFJlZnMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlDb2xsZWN0aW9uPFJlZj4gdHhuUmVmczsKIAkJaWYgKHR4bk5hbWVzcGFjZSAhPSBudWxsKSB7Ci0JCQl0eG5SZWZzID0gYm9vdHN0cmFwLmdldFJlZnModHhuTmFtZXNwYWNlKS52YWx1ZXMoKTsKKwkJCXR4blJlZnMgPSBib290c3RyYXAuZ2V0UmVmc0J5UHJlZml4KHR4bk5hbWVzcGFjZSk7CiAJCX0gZWxzZSB7CiAJCQlSZWYgciA9IGJvb3RzdHJhcC5leGFjdFJlZih0eG5Db21taXR0ZWQpOwogCQkJaWYgKHIgIT0gbnVsbCAmJiByLmdldE9iamVjdElkKCkgIT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQWJicmV2aWF0ZWRPYmplY3RJZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQWJicmV2aWF0ZWRPYmplY3RJZC5qYXZhCmluZGV4IDQyNWY3ZjYuLmQxMDVkMGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0FiYnJldmlhdGVkT2JqZWN0SWQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9BYmJyZXZpYXRlZE9iamVjdElkLmphdmEKQEAgLTc0LDcgKzc0LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gdGVzdC4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN0cmluZyBjYW4gY29udmVydGVkIGludG8gYW4gQWJicmV2aWF0ZWRPYmplY3RJZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNJZChmaW5hbCBTdHJpbmcgaWQpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNJZChTdHJpbmcgaWQpIHsKIAkJaWYgKGlkLmxlbmd0aCgpIDwgMiB8fCBDb25zdGFudHMuT0JKRUNUX0lEX1NUUklOR19MRU5HVEggPCBpZC5sZW5ndGgoKSkKIAkJCXJldHVybiBmYWxzZTsKIAkJdHJ5IHsKQEAgLTEzMSw3ICsxMzEsNyBAQAogCSAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byByZWFkIGZyb20uIE11c3QgYmUgJmx0Oz0gNDAgY2hhcmFjdGVycy4KIAkgKiBAcmV0dXJuIHRoZSBjb252ZXJ0ZWQgb2JqZWN0IGlkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQWJicmV2aWF0ZWRPYmplY3RJZCBmcm9tU3RyaW5nKGZpbmFsIFN0cmluZyBzdHIpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEFiYnJldmlhdGVkT2JqZWN0SWQgZnJvbVN0cmluZyhTdHJpbmcgc3RyKSB7CiAJCWlmIChzdHIubGVuZ3RoKCkgPiBDb25zdGFudHMuT0JKRUNUX0lEX1NUUklOR19MRU5HVEgpCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmludmFsaWRJZCwgc3RyKSk7CiAJCWZpbmFsIGJ5dGVbXSBiID0gQ29uc3RhbnRzLmVuY29kZUFTQ0lJKHN0cik7CkBAIC0xNjUsNyArMTY1LDcgQEAKIAkJcmV0dXJuIHIgPDwgKDggLSBuKSAqIDQ7CiAJfQogCi0Jc3RhdGljIGludCBtYXNrKGZpbmFsIGludCBuaWJibGVzLCBmaW5hbCBpbnQgd29yZCwgZmluYWwgaW50IHYpIHsKKwlzdGF0aWMgaW50IG1hc2soaW50IG5pYmJsZXMsIGludCB3b3JkLCBpbnQgdikgewogCQlmaW5hbCBpbnQgYiA9ICh3b3JkIC0gMSkgKiA4OwogCQlpZiAoYiArIDggPD0gbmliYmxlcykgewogCQkJLy8gV2UgaGF2ZSBhbGwgb2YgdGhlIGJpdHMgcmVxdWlyZWQgZm9yIHRoaXMgd29yZC4KQEAgLTI0NCw3ICsyNDQsNyBAQAogCSAqICAgICAgICAgJmd0OzAgaWYgdGhpcyBhYmJyZXZpYXRpb24gbmFtZXMgYW4gb2JqZWN0IHRoYXQgaXMgYWZ0ZXIKIAkgKiAgICAgICAgIDxjb2RlPm90aGVyPC9jb2RlPi4KIAkgKi8KLQlwdWJsaWMgZmluYWwgaW50IHByZWZpeENvbXBhcmUoZmluYWwgQW55T2JqZWN0SWQgb3RoZXIpIHsKKwlwdWJsaWMgZmluYWwgaW50IHByZWZpeENvbXBhcmUoQW55T2JqZWN0SWQgb3RoZXIpIHsKIAkJaW50IGNtcDsKIAogCQljbXAgPSBOQi5jb21wYXJlVUludDMyKHcxLCBtYXNrKDEsIG90aGVyLncxKSk7CkBAIC0yODAsNyArMjgwLDcgQEAKIAkgKiAgICAgICAgICZndDswIGlmIHRoaXMgYWJicmV2aWF0aW9uIG5hbWVzIGFuIG9iamVjdCB0aGF0IGlzIGFmdGVyCiAJICogICAgICAgICA8Y29kZT5vdGhlcjwvY29kZT4uCiAJICovCi0JcHVibGljIGZpbmFsIGludCBwcmVmaXhDb21wYXJlKGZpbmFsIGJ5dGVbXSBicywgZmluYWwgaW50IHApIHsKKwlwdWJsaWMgZmluYWwgaW50IHByZWZpeENvbXBhcmUoYnl0ZVtdIGJzLCBpbnQgcCkgewogCQlpbnQgY21wOwogCiAJCWNtcCA9IE5CLmNvbXBhcmVVSW50MzIodzEsIG1hc2soMSwgTkIuZGVjb2RlSW50MzIoYnMsIHApKSk7CkBAIC0zMTYsNyArMzE2LDcgQEAKIAkgKiAgICAgICAgICZndDswIGlmIHRoaXMgYWJicmV2aWF0aW9uIG5hbWVzIGFuIG9iamVjdCB0aGF0IGlzIGFmdGVyCiAJICogICAgICAgICA8Y29kZT5vdGhlcjwvY29kZT4uCiAJICovCi0JcHVibGljIGZpbmFsIGludCBwcmVmaXhDb21wYXJlKGZpbmFsIGludFtdIGJzLCBmaW5hbCBpbnQgcCkgeworCXB1YmxpYyBmaW5hbCBpbnQgcHJlZml4Q29tcGFyZShpbnRbXSBicywgaW50IHApIHsKIAkJaW50IGNtcDsKIAogCQljbXAgPSBOQi5jb21wYXJlVUludDMyKHcxLCBtYXNrKDEsIGJzW3BdKSk7CkBAIC0zNDcsNyArMzQ3LDcgQEAKIAkJcmV0dXJuIHcxID4+PiAyNDsKIAl9CiAKLQlwcml2YXRlIGludCBtYXNrKGZpbmFsIGludCB3b3JkLCBmaW5hbCBpbnQgdikgeworCXByaXZhdGUgaW50IG1hc2soaW50IHdvcmQsIGludCB2KSB7CiAJCXJldHVybiBtYXNrKG5pYmJsZXMsIHdvcmQsIHYpOwogCX0KIApAQCAtMzU5LDcgKzM1OSw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3QgbykgeworCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewogCQlpZiAobyBpbnN0YW5jZW9mIEFiYnJldmlhdGVkT2JqZWN0SWQpIHsKIAkJCWZpbmFsIEFiYnJldmlhdGVkT2JqZWN0SWQgYiA9IChBYmJyZXZpYXRlZE9iamVjdElkKSBvOwogCQkJcmV0dXJuIG5pYmJsZXMgPT0gYi5uaWJibGVzICYmIHcxID09IGIudzEgJiYgdzIgPT0gYi53MgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQW55T2JqZWN0SWQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0FueU9iamVjdElkLmphdmEKaW5kZXggNTg0Nzc2NS4uOTc4ZGQzYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQW55T2JqZWN0SWQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9BbnlPYmplY3RJZC5qYXZhCkBAIC03MywxNyArNzMsMTkgQEAKIAkJaWYgKGZpcnN0T2JqZWN0SWQgPT0gc2Vjb25kT2JqZWN0SWQpCiAJCQlyZXR1cm4gdHJ1ZTsKIAotCQkvLyBXZSB0ZXN0IHdvcmQgMiBmaXJzdCBhcyBvZGRzIGFyZSBzb21lb25lIGFscmVhZHkgdXNlZCBvdXIKLQkJLy8gd29yZCAxIGFzIGEgaGFzaCBjb2RlLCBhbmQgYXBwbHlpbmcgdGhhdCBjYW1lIHVwIHdpdGggdGhlc2UKLQkJLy8gdHdvIGluc3RhbmNlcyB3ZSBhcmUgY29tcGFyaW5nIGZvciBlcXVhbGl0eS4gVGhlcmVmb3JlIHRoZQotCQkvLyBmaXJzdCB0d28gd29yZHMgYXJlIHZlcnkgbGlrZWx5IHRvIGJlIGlkZW50aWNhbC4gV2Ugd2FudCB0bwotCQkvLyBicmVhayBhd2F5IGZyb20gY29sbGlzaW9ucyBhcyBxdWlja2x5IGFzIHBvc3NpYmxlLgorCQkvLyBXZSB0ZXN0IHdvcmQgMyBmaXJzdCBzaW5jZSB0aGUgZ2l0IGZpbGUtYmFzZWQgT0RCCisJCS8vIHVzZXMgdGhlIGZpcnN0IGJ5dGUgb2YgdzEsIGFuZCB3ZSB1c2UgdzIgYXMgdGhlCisJCS8vIGhhc2ggY29kZSwgb25lIG9mIHRob3NlIHByb2JhYmx5IGNhbWUgdXAgd2l0aCB0aGVzZQorCQkvLyB0d28gaW5zdGFuY2VzIHdoaWNoIHdlIGFyZSBjb21wYXJpbmcgZm9yIGVxdWFsaXR5LgorCQkvLyBUaGVyZWZvcmUgdGhlIGZpcnN0IHR3byB3b3JkcyBhcmUgdmVyeSBsaWtlbHkgdG8gYmUKKwkJLy8gaWRlbnRpY2FsLiBXZSB3YW50IHRvIGJyZWFrIGF3YXkgZnJvbSBjb2xsaXNpb25zIGFzCisJCS8vIHF1aWNrbHkgYXMgcG9zc2libGUuCiAJCS8vCi0JCXJldHVybiBmaXJzdE9iamVjdElkLncyID09IHNlY29uZE9iamVjdElkLncyCi0JCQkJJiYgZmlyc3RPYmplY3RJZC53MyA9PSBzZWNvbmRPYmplY3RJZC53MworCQlyZXR1cm4gZmlyc3RPYmplY3RJZC53MyA9PSBzZWNvbmRPYmplY3RJZC53MwogCQkJCSYmIGZpcnN0T2JqZWN0SWQudzQgPT0gc2Vjb25kT2JqZWN0SWQudzQKIAkJCQkmJiBmaXJzdE9iamVjdElkLnc1ID09IHNlY29uZE9iamVjdElkLnc1Ci0JCQkJJiYgZmlyc3RPYmplY3RJZC53MSA9PSBzZWNvbmRPYmplY3RJZC53MTsKKwkJCQkmJiBmaXJzdE9iamVjdElkLncxID09IHNlY29uZE9iamVjdElkLncxCisJCQkJJiYgZmlyc3RPYmplY3RJZC53MiA9PSBzZWNvbmRPYmplY3RJZC53MjsKIAl9CiAKIAlpbnQgdzE7CkBAIC0xNTksNyArMTYxLDcgQEAKIAkgKiBDb21wYXJlIHRoaXMgT2JqZWN0SWQgdG8gYW5vdGhlciBhbmQgb2J0YWluIGEgc29ydCBvcmRlcmluZy4KIAkgKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgaW50IGNvbXBhcmVUbyhmaW5hbCBBbnlPYmplY3RJZCBvdGhlcikgeworCXB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZVRvKEFueU9iamVjdElkIG90aGVyKSB7CiAJCWlmICh0aGlzID09IG90aGVyKQogCQkJcmV0dXJuIDA7CiAKQEAgLTE5NSw3ICsxOTcsNyBAQAogCSAqIEByZXR1cm4gYSBuZWdhdGl2ZSBpbnRlZ2VyLCB6ZXJvLCBvciBhIHBvc2l0aXZlIGludGVnZXIgYXMgdGhpcyBvYmplY3QgaXMKIAkgKiAgICAgICAgIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KIAkgKi8KLQlwdWJsaWMgZmluYWwgaW50IGNvbXBhcmVUbyhmaW5hbCBieXRlW10gYnMsIGZpbmFsIGludCBwKSB7CisJcHVibGljIGZpbmFsIGludCBjb21wYXJlVG8oYnl0ZVtdIGJzLCBpbnQgcCkgewogCQlpbnQgY21wOwogCiAJCWNtcCA9IE5CLmNvbXBhcmVVSW50MzIodzEsIE5CLmRlY29kZUludDMyKGJzLCBwKSk7CkBAIC0yMjgsNyArMjMwLDcgQEAKIAkgKiBAcmV0dXJuIGEgbmVnYXRpdmUgaW50ZWdlciwgemVybywgb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIGFzIHRoaXMgb2JqZWN0IGlzCiAJICogICAgICAgICBsZXNzIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCBvYmplY3QuCiAJICovCi0JcHVibGljIGZpbmFsIGludCBjb21wYXJlVG8oZmluYWwgaW50W10gYnMsIGZpbmFsIGludCBwKSB7CisJcHVibGljIGZpbmFsIGludCBjb21wYXJlVG8oaW50W10gYnMsIGludCBwKSB7CiAJCWludCBjbXA7CiAKIAkJY21wID0gTkIuY29tcGFyZVVJbnQzMih3MSwgYnNbcF0pOwpAQCAtMjU3LDcgKzI1OSw3IEBACiAJICogICAgICAgICAgICB0aGUgYWJicmV2aWF0aW9uLgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIE9iamVjdElkIGJlZ2lucyB3aXRoIHRoZSBhYmJyZXZpYXRpb247IGVsc2UgZmFsc2UuCiAJICovCi0JcHVibGljIGJvb2xlYW4gc3RhcnRzV2l0aChmaW5hbCBBYmJyZXZpYXRlZE9iamVjdElkIGFiYnIpIHsKKwlwdWJsaWMgYm9vbGVhbiBzdGFydHNXaXRoKEFiYnJldmlhdGVkT2JqZWN0SWQgYWJicikgewogCQlyZXR1cm4gYWJici5wcmVmaXhDb21wYXJlKHRoaXMpID09IDA7CiAJfQogCkBAIC0yNzQsMTMgKzI3NiwxMyBAQAogCSAqICAgICAgICAgICAgdGhlIG90aGVyIGlkIHRvIGNvbXBhcmUgdG8uIE1heSBiZSBudWxsLgogCSAqIEByZXR1cm4gdHJ1ZSBvbmx5IGlmIGJvdGggT2JqZWN0SWRzIGhhdmUgaWRlbnRpY2FsIGJpdHMuCiAJICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKGZpbmFsIEFueU9iamVjdElkIG90aGVyKSB7CisJcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKEFueU9iamVjdElkIG90aGVyKSB7CiAJCXJldHVybiBvdGhlciAhPSBudWxsID8gZXF1YWxzKHRoaXMsIG90aGVyKSA6IGZhbHNlOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvKSB7CisJcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CiAJCWlmIChvIGluc3RhbmNlb2YgQW55T2JqZWN0SWQpCiAJCQlyZXR1cm4gZXF1YWxzKChBbnlPYmplY3RJZCkgbyk7CiAJCWVsc2UKQEAgLTI5Myw3ICsyOTUsNyBAQAogCSAqIEBwYXJhbSB3CiAJICogICAgICAgICAgICB0aGUgYnVmZmVyIHRvIGNvcHkgdG8uIE11c3QgYmUgaW4gYmlnIGVuZGlhbiBvcmRlci4KIAkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5UmF3VG8oZmluYWwgQnl0ZUJ1ZmZlciB3KSB7CisJcHVibGljIHZvaWQgY29weVJhd1RvKEJ5dGVCdWZmZXIgdykgewogCQl3LnB1dEludCh3MSk7CiAJCXcucHV0SW50KHcyKTsKIAkJdy5wdXRJbnQodzMpOwpAQCAtMzA5LDcgKzMxMSw3IEBACiAJICogQHBhcmFtIG8KIAkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgd2l0aGluIGIgdG8gd3JpdGUgYXQuCiAJICovCi0JcHVibGljIHZvaWQgY29weVJhd1RvKGZpbmFsIGJ5dGVbXSBiLCBmaW5hbCBpbnQgbykgeworCXB1YmxpYyB2b2lkIGNvcHlSYXdUbyhieXRlW10gYiwgaW50IG8pIHsKIAkJTkIuZW5jb2RlSW50MzIoYiwgbywgdzEpOwogCQlOQi5lbmNvZGVJbnQzMihiLCBvICsgNCwgdzIpOwogCQlOQi5lbmNvZGVJbnQzMihiLCBvICsgOCwgdzMpOwpAQCAtMzI1LDcgKzMyNyw3IEBACiAJICogQHBhcmFtIG8KIAkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgd2l0aGluIGIgdG8gd3JpdGUgYXQuCiAJICovCi0JcHVibGljIHZvaWQgY29weVJhd1RvKGZpbmFsIGludFtdIGIsIGZpbmFsIGludCBvKSB7CisJcHVibGljIHZvaWQgY29weVJhd1RvKGludFtdIGIsIGludCBvKSB7CiAJCWJbb10gPSB3MTsKIAkJYltvICsgMV0gPSB3MjsKIAkJYltvICsgMl0gPSB3MzsKQEAgLTM0MSw3ICszNDMsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBzdHJlYW0gd3JpdGluZyBmYWlsZWQuCiAJICovCi0JcHVibGljIHZvaWQgY29weVJhd1RvKGZpbmFsIE91dHB1dFN0cmVhbSB3KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyB2b2lkIGNvcHlSYXdUbyhPdXRwdXRTdHJlYW0gdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJd3JpdGVSYXdJbnQodywgdzEpOwogCQl3cml0ZVJhd0ludCh3LCB3Mik7CiAJCXdyaXRlUmF3SW50KHcsIHczKTsKQEAgLTM0OSw3ICszNTEsNyBAQAogCQl3cml0ZVJhd0ludCh3LCB3NSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVJhd0ludChmaW5hbCBPdXRwdXRTdHJlYW0gdywgaW50IHYpCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVJhd0ludChPdXRwdXRTdHJlYW0gdywgaW50IHYpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl3LndyaXRlKHYgPj4+IDI0KTsKIAkJdy53cml0ZSh2ID4+PiAxNik7CkBAIC0zNjUsNyArMzY3LDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgc3RyZWFtIHdyaXRpbmcgZmFpbGVkLgogCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlUbyhmaW5hbCBPdXRwdXRTdHJlYW0gdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBjb3B5VG8oT3V0cHV0U3RyZWFtIHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXcud3JpdGUodG9IZXhCeXRlQXJyYXkoKSk7CiAJfQogCkBAIC00MDgsNyArNDEwLDcgQEAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gaGV4Ynl0ZSA9IHsgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLAogCQkJJzcnLCAnOCcsICc5JywgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJyB9OwogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmb3JtYXRIZXhCeXRlKGZpbmFsIGJ5dGVbXSBkc3QsIGZpbmFsIGludCBwLCBpbnQgdykgeworCXByaXZhdGUgc3RhdGljIHZvaWQgZm9ybWF0SGV4Qnl0ZShieXRlW10gZHN0LCBpbnQgcCwgaW50IHcpIHsKIAkJaW50IG8gPSBwICsgNzsKIAkJd2hpbGUgKG8gPj0gcCAmJiB3ICE9IDApIHsKIAkJCWRzdFtvLS1dID0gaGV4Ynl0ZVt3ICYgMHhmXTsKQEAgLTQyNiw3ICs0MjgsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBzdHJlYW0gd3JpdGluZyBmYWlsZWQuCiAJICovCi0JcHVibGljIHZvaWQgY29weVRvKGZpbmFsIFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyB2b2lkIGNvcHlUbyhXcml0ZXIgdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdy53cml0ZSh0b0hleENoYXJBcnJheSgpKTsKIAl9CiAKQEAgLTQ0Miw3ICs0NDQsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBzdHJlYW0gd3JpdGluZyBmYWlsZWQuCiAJICovCi0JcHVibGljIHZvaWQgY29weVRvKGZpbmFsIGNoYXJbXSB0bXAsIGZpbmFsIFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyB2b2lkIGNvcHlUbyhjaGFyW10gdG1wLCBXcml0ZXIgdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdG9IZXhDaGFyQXJyYXkodG1wKTsKIAkJdy53cml0ZSh0bXAsIDAsIENvbnN0YW50cy5PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSCk7CiAJfQpAQCAtNDU3LDcgKzQ1OSw3IEBACiAJICogQHBhcmFtIHcKIAkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gYXBwZW5kIG9udG8uCiAJICovCi0JcHVibGljIHZvaWQgY29weVRvKGZpbmFsIGNoYXJbXSB0bXAsIGZpbmFsIFN0cmluZ0J1aWxkZXIgdykgeworCXB1YmxpYyB2b2lkIGNvcHlUbyhjaGFyW10gdG1wLCBTdHJpbmdCdWlsZGVyIHcpIHsKIAkJdG9IZXhDaGFyQXJyYXkodG1wKTsKIAkJdy5hcHBlbmQodG1wLCAwLCBDb25zdGFudHMuT0JKRUNUX0lEX1NUUklOR19MRU5HVEgpOwogCX0KQEAgLTQ2OCw3ICs0NzAsNyBAQAogCQlyZXR1cm4gZHN0OwogCX0KIAotCXByaXZhdGUgdm9pZCB0b0hleENoYXJBcnJheShmaW5hbCBjaGFyW10gZHN0KSB7CisJcHJpdmF0ZSB2b2lkIHRvSGV4Q2hhckFycmF5KGNoYXJbXSBkc3QpIHsKIAkJZm9ybWF0SGV4Q2hhcihkc3QsIDAsIHcxKTsKIAkJZm9ybWF0SGV4Q2hhcihkc3QsIDgsIHcyKTsKIAkJZm9ybWF0SGV4Q2hhcihkc3QsIDE2LCB3Myk7CkBAIC00NzksNyArNDgxLDcgQEAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gaGV4Y2hhciA9IHsgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLAogCQkJJzcnLCAnOCcsICc5JywgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJyB9OwogCi0Jc3RhdGljIHZvaWQgZm9ybWF0SGV4Q2hhcihmaW5hbCBjaGFyW10gZHN0LCBmaW5hbCBpbnQgcCwgaW50IHcpIHsKKwlzdGF0aWMgdm9pZCBmb3JtYXRIZXhDaGFyKGNoYXJbXSBkc3QsIGludCBwLCBpbnQgdykgewogCQlpbnQgbyA9IHAgKyA3OwogCQl3aGlsZSAobyA+PSBwICYmIHcgIT0gMCkgewogCQkJZHN0W28tLV0gPSBoZXhjaGFyW3cgJiAweGZdOwpAQCAtNTI3LDcgKzUyOSw3IEBACiAJICogICAgICAgICAgICBsZW5ndGggb2YgdGhlIGFiYnJldmlhdGVkIHN0cmluZy4KIAkgKiBAcmV0dXJuIFNIQS0xIGFiYnJldmlhdGlvbi4KIAkgKi8KLQlwdWJsaWMgQWJicmV2aWF0ZWRPYmplY3RJZCBhYmJyZXZpYXRlKGZpbmFsIGludCBsZW4pIHsKKwlwdWJsaWMgQWJicmV2aWF0ZWRPYmplY3RJZCBhYmJyZXZpYXRlKGludCBsZW4pIHsKIAkJZmluYWwgaW50IGEgPSBBYmJyZXZpYXRlZE9iamVjdElkLm1hc2sobGVuLCAxLCB3MSk7CiAJCWZpbmFsIGludCBiID0gQWJicmV2aWF0ZWRPYmplY3RJZC5tYXNrKGxlbiwgMiwgdzIpOwogCQlmaW5hbCBpbnQgYyA9IEFiYnJldmlhdGVkT2JqZWN0SWQubWFzayhsZW4sIDMsIHczKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0JhdGNoUmVmVXBkYXRlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9CYXRjaFJlZlVwZGF0ZS5qYXZhCmluZGV4IDY5MTlmN2UuLjkyNWI2YmUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0JhdGNoUmVmVXBkYXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQmF0Y2hSZWZVcGRhdGUuamF2YQpAQCAtNDYsNiArNDYsNyBAQAogCiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlJlY2VpdmVDb21tYW5kLlJlc3VsdC5OT1RfQVRURU1QVEVEOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5SZWNlaXZlQ29tbWFuZC5SZXN1bHQuUkVKRUNURURfT1RIRVJfUkVBU09OOworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9Db2xsZWN0aW9uOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKQEAgLTE3OSw3ICsxODAsNyBAQAogCSAqICAgICAgICAgICAgY29uZmlndXJhdGlvbi4KIAkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfS4KIAkgKi8KLQlwdWJsaWMgQmF0Y2hSZWZVcGRhdGUgc2V0UmVmTG9nSWRlbnQoZmluYWwgUGVyc29uSWRlbnQgcGkpIHsKKwlwdWJsaWMgQmF0Y2hSZWZVcGRhdGUgc2V0UmVmTG9nSWRlbnQoUGVyc29uSWRlbnQgcGkpIHsKIAkJcmVmTG9nSWRlbnQgPSBwaTsKIAkJcmV0dXJuIHRoaXM7CiAJfQpAQCAtNTI4LDggKzUyOSw5IEBACiAJCX0KIAkJaWYgKCFjb21tYW5kczIuaXNFbXB0eSgpKSB7CiAJCQkvLyBXaGF0IHBhcnQgb2YgdGhlIG5hbWUgc3BhY2UgaXMgYWxyZWFkeSB0YWtlbgotCQkJQ29sbGVjdGlvbjxTdHJpbmc+IHRha2VuTmFtZXMgPSBuZXcgSGFzaFNldDw+KHJlZmRiLmdldFJlZnMoCi0JCQkJCVJlZkRhdGFiYXNlLkFMTCkua2V5U2V0KCkpOworCQkJQ29sbGVjdGlvbjxTdHJpbmc+IHRha2VuTmFtZXMgPSByZWZkYi5nZXRSZWZzKCkuc3RyZWFtKCkKKwkJCQkJLm1hcChSZWY6OmdldE5hbWUpCisJCQkJCS5jb2xsZWN0KHRvQ29sbGVjdGlvbihIYXNoU2V0OjpuZXcpKTsKIAkJCUNvbGxlY3Rpb248U3RyaW5nPiB0YWtlblByZWZpeGVzID0gZ2V0VGFrZW5QcmVmaXhlcyh0YWtlbk5hbWVzKTsKIAogCQkJLy8gTm93IHRvIHRoZSB1cGRhdGUgdGhhdCBtYXkgcmVxdWlyZSBtb3JlIHJvb20gaW4gdGhlIG5hbWUgc3BhY2UKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0JpdG1hcEluZGV4LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9CaXRtYXBJbmRleC5qYXZhCmluZGV4IGZjMzU0ZGIuLjlmNjRmMzUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0JpdG1hcEluZGV4LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQml0bWFwSW5kZXguamF2YQpAQCAtMTIxLDE5ICsxMjEsNiBAQAogCSAqIHJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBidWlsZGVyLgogCSAqLwogCXB1YmxpYyBpbnRlcmZhY2UgQml0bWFwQnVpbGRlciBleHRlbmRzIEJpdG1hcCB7Ci0JCS8qKgotCQkgKiBBZGRzIHRoZSBpZCBhbmQgdGhlIGV4aXN0aW5nIGJpdG1hcCBmb3IgdGhlIGlkLCBpZiBvbmUgZXhpc3RzLCB0byB0aGUKLQkJICogYml0bWFwLgotCQkgKgotCQkgKiBAcGFyYW0gb2JqZWN0SWQKLQkJICogICAgICAgICAgICB0aGUgb2JqZWN0IElECi0JCSAqIEBwYXJhbSB0eXBlCi0JCSAqICAgICAgICAgICAgdGhlIEdpdCBvYmplY3QgdHlwZS4gU2VlIHtAbGluayBDb25zdGFudHN9LgotCQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIHdhcyBub3QgY29udGFpbmVkIG9yIGFibGUgdG8gYmUgbG9hZGVkLgotCQkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNvcn0gb3Ige0BsaW5rICNhZGRPYmplY3R9IGluc3RlYWQuCi0JCSAqLwotCQlARGVwcmVjYXRlZAotCQlib29sZWFuIGFkZChBbnlPYmplY3RJZCBvYmplY3RJZCwgaW50IHR5cGUpOwogCiAJCS8qKgogCQkgKiBXaGV0aGVyIHRoZSBiaXRtYXAgaGFzIHRoZSBpZCBzZXQuCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9CbG9iQmFzZWRDb25maWcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0Jsb2JCYXNlZENvbmZpZy5qYXZhCmluZGV4IDNmZjkyZGMuLmUwMDhiZTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0Jsb2JCYXNlZENvbmZpZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0Jsb2JCYXNlZENvbmZpZy5qYXZhCkBAIC00NSw2ICs0NSw4IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5saWI7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CisKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwpAQCAtNzYsMTMgKzc4LDEyIEBACiAJICogQHRocm93cyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Db25maWdJbnZhbGlkRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIGJ5dGUgYXJyYXkgaXMgbm90IGEgdmFsaWQgY29uZmlndXJhdGlvbiBmb3JtYXQuCiAJICovCi0JcHVibGljIEJsb2JCYXNlZENvbmZpZyhDb25maWcgYmFzZSwgZmluYWwgYnl0ZVtdIGJsb2IpCisJcHVibGljIEJsb2JCYXNlZENvbmZpZyhDb25maWcgYmFzZSwgYnl0ZVtdIGJsb2IpCiAJCQl0aHJvd3MgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiB7CiAJCXN1cGVyKGJhc2UpOwogCQlmaW5hbCBTdHJpbmcgZGVjb2RlZDsKIAkJaWYgKGlzVXRmOChibG9iKSkgewotCQkJZGVjb2RlZCA9IFJhd1BhcnNlVXRpbHMuZGVjb2RlKFJhd1BhcnNlVXRpbHMuVVRGOF9DSEFSU0VULAotCQkJCQlibG9iLCAzLCBibG9iLmxlbmd0aCk7CisJCQlkZWNvZGVkID0gUmF3UGFyc2VVdGlscy5kZWNvZGUoQ0hBUlNFVCwgYmxvYiwgMywgYmxvYi5sZW5ndGgpOwogCQl9IGVsc2UgewogCQkJZGVjb2RlZCA9IFJhd1BhcnNlVXRpbHMuZGVjb2RlKGJsb2IpOwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9CcmFuY2hDb25maWcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0JyYW5jaENvbmZpZy5qYXZhCmluZGV4IDU5NmRhMDMuLmJlNTNjNGIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0JyYW5jaENvbmZpZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0JyYW5jaENvbmZpZy5qYXZhCkBAIC0xMDcsNyArMTA3LDcgQEAKIAkgKiBAcGFyYW0gYnJhbmNoTmFtZQogCSAqICAgICAgICAgICAgdGhlIHNob3J0IGJyYW5jaCBuYW1lIG9mIHRoZSBzZWN0aW9uIHRvIHJlYWQKIAkgKi8KLQlwdWJsaWMgQnJhbmNoQ29uZmlnKGZpbmFsIENvbmZpZyBjb25maWcsIFN0cmluZyBicmFuY2hOYW1lKSB7CisJcHVibGljIEJyYW5jaENvbmZpZyhDb25maWcgY29uZmlnLCBTdHJpbmcgYnJhbmNoTmFtZSkgewogCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKIAkJdGhpcy5icmFuY2hOYW1lID0gYnJhbmNoTmFtZTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db21taXRCdWlsZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db21taXRCdWlsZGVyLmphdmEKaW5kZXggMjIxN2ZkZS4uNTlhMTNmNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29tbWl0QnVpbGRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbW1pdEJ1aWxkZXIuamF2YQpAQCAtMjQzLDcgKzI0Myw3IEBACiAJICogQHBhcmFtIG5ld01lc3NhZ2UKIAkgKiAgICAgICAgICAgIHRoZSBjb21taXQgbWVzc2FnZS4gU2hvdWxkIG5vdCBiZSBudWxsLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoZmluYWwgU3RyaW5nIG5ld01lc3NhZ2UpIHsKKwlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBuZXdNZXNzYWdlKSB7CiAJCW1lc3NhZ2UgPSBuZXdNZXNzYWdlOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25maWcuamF2YQppbmRleCA0ZDU1OGM5Li4wZTAxY2NhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25maWcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25maWcuamF2YQpAQCAtNTEsNiArNTEsOCBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubGliOwogCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOworCiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CkBAIC0zNzQsNyArMzc2LDcgQEAKIAl9CiAKIAlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyA8VD4gVFtdIGFsbFZhbHVlc09mKGZpbmFsIFQgdmFsdWUpIHsKKwlwcml2YXRlIHN0YXRpYyA8VD4gVFtdIGFsbFZhbHVlc09mKFQgdmFsdWUpIHsKIAkJdHJ5IHsKIAkJCXJldHVybiAoVFtdKSB2YWx1ZS5nZXRDbGFzcygpLmdldE1ldGhvZCgidmFsdWVzIikuaW52b2tlKG51bGwpOyAvLyROT04tTkxTLTEkCiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlcnIpIHsKQEAgLTUxMyw3ICs1MTUsNyBAQAogCSAqICAgICAgICAgb3JkZXIgdGhleSBhcmUgZGVjbGFyZWQgYnkgdGhlIGNvbmZpZ3VyYXRpb24gc3RhcnRpbmcgZnJvbSB0aGlzCiAJICogICAgICAgICBpbnN0YW5jZSBhbmQgcHJvZ3Jlc3NpbmcgdGhyb3VnaCB0aGUgYmFzZS4KIAkgKi8KLQlwdWJsaWMgU2V0PFN0cmluZz4gZ2V0U3Vic2VjdGlvbnMoZmluYWwgU3RyaW5nIHNlY3Rpb24pIHsKKwlwdWJsaWMgU2V0PFN0cmluZz4gZ2V0U3Vic2VjdGlvbnMoU3RyaW5nIHNlY3Rpb24pIHsKIAkJcmV0dXJuIGdldFN0YXRlKCkuZ2V0U3Vic2VjdGlvbnMoc2VjdGlvbik7CiAJfQogCkBAIC01OTksNyArNjAxLDcgQEAKIAkgKiBAcmV0dXJuIHRoZSBwYXJzZWQgb2JqZWN0IGluc3RhbmNlLCB3aGljaCBpcyBjYWNoZWQgaW5zaWRlIHRoaXMgY29uZmlnLgogCSAqLwogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyA8VD4gVCBnZXQoZmluYWwgU2VjdGlvblBhcnNlcjxUPiBwYXJzZXIpIHsKKwlwdWJsaWMgPFQ+IFQgZ2V0KFNlY3Rpb25QYXJzZXI8VD4gcGFyc2VyKSB7CiAJCWZpbmFsIENvbmZpZ1NuYXBzaG90IG15U3RhdGUgPSBnZXRTdGF0ZSgpOwogCQlUIG9iaiA9IChUKSBteVN0YXRlLmNhY2hlLmdldChwYXJzZXIpOwogCQlpZiAob2JqID09IG51bGwpIHsKQEAgLTYxOSw3ICs2MjEsNyBAQAogCSAqICAgICAgICAgICAgcGFyc2VyIHVzZWQgdG8gb2J0YWluIHRoZSBjb25maWd1cmF0aW9uIG9iamVjdC4KIAkgKiBAc2VlICNnZXQoU2VjdGlvblBhcnNlcikKIAkgKi8KLQlwdWJsaWMgdm9pZCB1bmNhY2hlKGZpbmFsIFNlY3Rpb25QYXJzZXI8Pz4gcGFyc2VyKSB7CisJcHVibGljIHZvaWQgdW5jYWNoZShTZWN0aW9uUGFyc2VyPD8+IHBhcnNlcikgewogCQlzdGF0ZS5nZXQoKS5jYWNoZS5yZW1vdmUocGFyc2VyKTsKIAl9CiAKQEAgLTEwMDgsNyArMTAxMCw3IEBACiAJICovCiAJcHVibGljIFN0cmluZyB0b1RleHQoKSB7CiAJCWZpbmFsIFN0cmluZ0J1aWxkZXIgb3V0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJZm9yIChmaW5hbCBDb25maWdMaW5lIGUgOiBzdGF0ZS5nZXQoKS5lbnRyeUxpc3QpIHsKKwkJZm9yIChDb25maWdMaW5lIGUgOiBzdGF0ZS5nZXQoKS5lbnRyeUxpc3QpIHsKIAkJCWlmIChlLnByZWZpeCAhPSBudWxsKQogCQkJCW91dC5hcHBlbmQoZS5wcmVmaXgpOwogCQkJaWYgKGUuc2VjdGlvbiAhPSBudWxsICYmIGUubmFtZSA9PSBudWxsKSB7CkBAIC0xMDU3LDExICsxMDU5LDExIEBACiAJICogICAgICAgICAgICAgdGhlIHRleHQgc3VwcGxpZWQgaXMgbm90IGZvcm1hdHRlZCBjb3JyZWN0bHkuIE5vIGNoYW5nZXMgd2VyZQogCSAqICAgICAgICAgICAgIG1hZGUgdG8ge0Bjb2RlIHRoaXN9LgogCSAqLwotCXB1YmxpYyB2b2lkIGZyb21UZXh0KGZpbmFsIFN0cmluZyB0ZXh0KSB0aHJvd3MgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgZnJvbVRleHQoU3RyaW5nIHRleHQpIHRocm93cyBDb25maWdJbnZhbGlkRXhjZXB0aW9uIHsKIAkJc3RhdGUuc2V0KG5ld1N0YXRlKGZyb21UZXh0UmVjdXJzZSh0ZXh0LCAxKSkpOwogCX0KIAotCXByaXZhdGUgTGlzdDxDb25maWdMaW5lPiBmcm9tVGV4dFJlY3Vyc2UoZmluYWwgU3RyaW5nIHRleHQsIGludCBkZXB0aCkKKwlwcml2YXRlIExpc3Q8Q29uZmlnTGluZT4gZnJvbVRleHRSZWN1cnNlKFN0cmluZyB0ZXh0LCBpbnQgZGVwdGgpCiAJCQl0aHJvd3MgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiB7CiAJCWlmIChkZXB0aCA+IE1BWF9ERVBUSCkgewogCQkJdGhyb3cgbmV3IENvbmZpZ0ludmFsaWRFeGNlcHRpb24oCkBAIC0xMTY2LDggKzExNjgsNyBAQAogCiAJCVN0cmluZyBkZWNvZGVkOwogCQlpZiAoaXNVdGY4KGJ5dGVzKSkgewotCQkJZGVjb2RlZCA9IFJhd1BhcnNlVXRpbHMuZGVjb2RlKFJhd1BhcnNlVXRpbHMuVVRGOF9DSEFSU0VULCBieXRlcywgMywKLQkJCQkJYnl0ZXMubGVuZ3RoKTsKKwkJCWRlY29kZWQgPSBSYXdQYXJzZVV0aWxzLmRlY29kZShDSEFSU0VULCBieXRlcywgMywgYnl0ZXMubGVuZ3RoKTsKIAkJfSBlbHNlIHsKIAkJCWRlY29kZWQgPSBSYXdQYXJzZVV0aWxzLmRlY29kZShieXRlcyk7CiAJCX0KQEAgLTExODQsNyArMTE4NSw3IEBACiAJCQkJZ2V0QmFzZVN0YXRlKCkpOwogCX0KIAotCXByaXZhdGUgQ29uZmlnU25hcHNob3QgbmV3U3RhdGUoZmluYWwgTGlzdDxDb25maWdMaW5lPiBlbnRyaWVzKSB7CisJcHJpdmF0ZSBDb25maWdTbmFwc2hvdCBuZXdTdGF0ZShMaXN0PENvbmZpZ0xpbmU+IGVudHJpZXMpIHsKIAkJcmV0dXJuIG5ldyBDb25maWdTbmFwc2hvdChDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KGVudHJpZXMpLAogCQkJCWdldEJhc2VTdGF0ZSgpKTsKIAl9CkBAIC0xMjA5LDcgKzEyMTAsNyBAQAogCQkJCSYmIGJ5dGVzWzFdID09IChieXRlKSAweEJCICYmIGJ5dGVzWzJdID09IChieXRlKSAweEJGOwogCX0KIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyByZWFkU2VjdGlvbk5hbWUoZmluYWwgU3RyaW5nUmVhZGVyIGluKQorCXByaXZhdGUgc3RhdGljIFN0cmluZyByZWFkU2VjdGlvbk5hbWUoU3RyaW5nUmVhZGVyIGluKQogCQkJdGhyb3dzIENvbmZpZ0ludmFsaWRFeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIG5hbWUgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQlmb3IgKDs7KSB7CkBAIC0xMjQ4LDcgKzEyNDksNyBAQAogCQlyZXR1cm4gbmFtZS50b1N0cmluZygpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyByZWFkS2V5TmFtZShmaW5hbCBTdHJpbmdSZWFkZXIgaW4pCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlYWRLZXlOYW1lKFN0cmluZ1JlYWRlciBpbikKIAkJCXRocm93cyBDb25maWdJbnZhbGlkRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nQnVpbGRlciBuYW1lID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJZm9yICg7OykgewpAQCAtMTMzNSw3ICsxMzM2LDcgQEAKIAkJcmV0dXJuIHIudG9TdHJpbmcoKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVhZFZhbHVlKGZpbmFsIFN0cmluZ1JlYWRlciBpbikKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVhZFZhbHVlKFN0cmluZ1JlYWRlciBpbikKIAkJCXRocm93cyBDb25maWdJbnZhbGlkRXhjZXB0aW9uIHsKIAkJU3RyaW5nQnVpbGRlciB2YWx1ZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAJCVN0cmluZ0J1aWxkZXIgdHJhaWxpbmdTcGFjZXMgPSBudWxsOwpAQCAtMTQ1MSw3ICsxNDUyLDcgQEAKIAogCQlwcml2YXRlIGludCBwb3M7CiAKLQkJU3RyaW5nUmVhZGVyKGZpbmFsIFN0cmluZyBpbikgeworCQlTdHJpbmdSZWFkZXIoU3RyaW5nIGluKSB7CiAJCQlidWYgPSBpbi50b0NoYXJBcnJheSgpOwogCQl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbmZpZ0xpbmUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbmZpZ0xpbmUuamF2YQppbmRleCBkNWYxZDhmLi45MzdiYTkyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25maWdMaW5lLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnTGluZS5qYXZhCkBAIC03Myw3ICs3Myw3IEBACiAJLyoqIFRoZSB0ZXh0IGNvbnRlbnQgYWZ0ZXIgZW50cnkuICovCiAJU3RyaW5nIHN1ZmZpeDsKIAotCUNvbmZpZ0xpbmUgZm9yVmFsdWUoZmluYWwgU3RyaW5nIG5ld1ZhbHVlKSB7CisJQ29uZmlnTGluZSBmb3JWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKIAkJZmluYWwgQ29uZmlnTGluZSBlID0gbmV3IENvbmZpZ0xpbmUoKTsKIAkJZS5wcmVmaXggPSBwcmVmaXg7CiAJCWUuc2VjdGlvbiA9IHNlY3Rpb247CkBAIC05MSwxMiArOTEsMTIgQEAKIAkJCQkmJiBlcUlnbm9yZUNhc2UobmFtZSwgYUtleSk7CiAJfQogCi0JYm9vbGVhbiBtYXRjaChmaW5hbCBTdHJpbmcgYVNlY3Rpb24sIGZpbmFsIFN0cmluZyBhU3Vic2VjdGlvbikgeworCWJvb2xlYW4gbWF0Y2goU3RyaW5nIGFTZWN0aW9uLCBTdHJpbmcgYVN1YnNlY3Rpb24pIHsKIAkJcmV0dXJuIGVxSWdub3JlQ2FzZShzZWN0aW9uLCBhU2VjdGlvbikKIAkJCQkmJiBlcVNhbWVDYXNlKHN1YnNlY3Rpb24sIGFTdWJzZWN0aW9uKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxSWdub3JlQ2FzZShmaW5hbCBTdHJpbmcgYSwgZmluYWwgU3RyaW5nIGIpIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxSWdub3JlQ2FzZShTdHJpbmcgYSwgU3RyaW5nIGIpIHsKIAkJaWYgKGEgPT0gbnVsbCAmJiBiID09IG51bGwpCiAJCQlyZXR1cm4gdHJ1ZTsKIAkJaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpCkBAIC0xMDQsNyArMTA0LDcgQEAKIAkJcmV0dXJuIFN0cmluZ1V0aWxzLmVxdWFsc0lnbm9yZUNhc2UoYSwgYik7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcVNhbWVDYXNlKGZpbmFsIFN0cmluZyBhLCBmaW5hbCBTdHJpbmcgYikgeworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXFTYW1lQ2FzZShTdHJpbmcgYSwgU3RyaW5nIGIpIHsKIAkJaWYgKGEgPT0gbnVsbCAmJiBiID09IG51bGwpCiAJCQlyZXR1cm4gdHJ1ZTsKIAkJaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25zdGFudHMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbnN0YW50cy5qYXZhCmluZGV4IDEwYWJkOWUuLjkwMjNiZDggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbnN0YW50cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbnN0YW50cy5qYXZhCkBAIC00NSw2ICs0NSw4IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5saWI7CiAKK2ltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OwpAQCAtMjI2LDEwICsyMjgsMTAgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBQQUNLX1NJR05BVFVSRSA9IHsgJ1AnLCAnQScsICdDJywgJ0snIH07CiAKIAkvKiogTmF0aXZlIGNoYXJhY3RlciBlbmNvZGluZyBmb3IgY29tbWl0IG1lc3NhZ2VzLCBmaWxlIG5hbWVzLi4uICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBUkFDVEVSX0VOQ09ESU5HID0gIlVURi04IjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoYXJzZXQgQ0hBUlNFVDsKIAogCS8qKiBOYXRpdmUgY2hhcmFjdGVyIGVuY29kaW5nIGZvciBjb21taXQgbWVzc2FnZXMsIGZpbGUgbmFtZXMuLi4gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoYXJzZXQgQ0hBUlNFVDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFSQUNURVJfRU5DT0RJTkc7CiAKIAkvKiogRGVmYXVsdCBtYWluIGJyYW5jaCBuYW1lICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFTVEVSID0gIm1hc3RlciI7CkBAIC00NzUsNyArNDc3LDcgQEAKIAkgKiBAcGFyYW0gdHlwZUNvZGUgdGhlIHR5cGUgY29kZSwgZnJvbSBhIHBhY2sgcmVwcmVzZW50YXRpb24uCiAJICogQHJldHVybiB0aGUgY2Fub25pY2FsIHN0cmluZyBuYW1lIG9mIHRoaXMgdHlwZS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0eXBlU3RyaW5nKGZpbmFsIGludCB0eXBlQ29kZSkgeworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHR5cGVTdHJpbmcoaW50IHR5cGVDb2RlKSB7CiAJCXN3aXRjaCAodHlwZUNvZGUpIHsKIAkJY2FzZSBPQkpfQ09NTUlUOgogCQkJcmV0dXJuIFRZUEVfQ09NTUlUOwpAQCAtNTAwLDcgKzUwMiw3IEBACiAJICogQHBhcmFtIHR5cGVDb2RlIHRoZSB0eXBlIGNvZGUsIGZyb20gYSBwYWNrIHJlcHJlc2VudGF0aW9uLgogCSAqIEByZXR1cm4gdGhlIGNhbm9uaWNhbCBBU0NJSSBlbmNvZGVkIG5hbWUgb2YgdGhpcyB0eXBlLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGVuY29kZWRUeXBlU3RyaW5nKGZpbmFsIGludCB0eXBlQ29kZSkgeworCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGVuY29kZWRUeXBlU3RyaW5nKGludCB0eXBlQ29kZSkgewogCQlzd2l0Y2ggKHR5cGVDb2RlKSB7CiAJCWNhc2UgT0JKX0NPTU1JVDoKIAkJCXJldHVybiBFTkNPREVEX1RZUEVfQ09NTUlUOwpAQCAtNTk5LDcgKzYwMSw3IEBACiAJICogQHJldHVybiBhIGRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGlucHV0IGludGVnZXIuIFRoZSByZXR1cm5lZCBhcnJheQogCSAqICAgICAgICAgaXMgdGhlIHNtYWxsZXN0IGFycmF5IHRoYXQgd2lsbCBob2xkIHRoZSB2YWx1ZS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSBlbmNvZGVBU0NJSShmaW5hbCBsb25nIHMpIHsKKwlwdWJsaWMgc3RhdGljIGJ5dGVbXSBlbmNvZGVBU0NJSShsb25nIHMpIHsKIAkJcmV0dXJuIGVuY29kZUFTQ0lJKExvbmcudG9TdHJpbmcocykpOwogCX0KIApAQCAtNjE1LDcgKzYxNyw3IEBACiAJICogICAgICAgICAgICAgdGhlIGlucHV0IHN0cmluZyBjb250YWlucyBvbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIG91dHNpZGUgb2YKIAkgKiAgICAgICAgICAgICB0aGUgNy1iaXQgQVNDSUkgY2hhcmFjdGVyIHNwYWNlLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGVuY29kZUFTQ0lJKGZpbmFsIFN0cmluZyBzKSB7CisJcHVibGljIHN0YXRpYyBieXRlW10gZW5jb2RlQVNDSUkoU3RyaW5nIHMpIHsKIAkJZmluYWwgYnl0ZVtdIHIgPSBuZXcgYnl0ZVtzLmxlbmd0aCgpXTsKIAkJZm9yIChpbnQgayA9IHIubGVuZ3RoIC0gMTsgayA+PSAwOyBrLS0pIHsKIAkJCWZpbmFsIGNoYXIgYyA9IHMuY2hhckF0KGspOwpAQCAtNjM1LDcgKzYzNyw3IEBACiAJICogICAgICAgICBkZWZhdWx0IGNoYXJhY3RlciBlbmNvZGluZyAoVVRGLTgpLgogCSAqIEBzZWUgI0NIQVJBQ1RFUl9FTkNPRElORwogCSAqLwotCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGVuY29kZShmaW5hbCBTdHJpbmcgc3RyKSB7CisJcHVibGljIHN0YXRpYyBieXRlW10gZW5jb2RlKFN0cmluZyBzdHIpIHsKIAkJZmluYWwgQnl0ZUJ1ZmZlciBiYiA9IENvbnN0YW50cy5DSEFSU0VULmVuY29kZShzdHIpOwogCQlmaW5hbCBpbnQgbGVuID0gYmIubGltaXQoKTsKIAkJaWYgKGJiLmhhc0FycmF5KCkgJiYgYmIuYXJyYXlPZmZzZXQoKSA9PSAwKSB7CkBAIC02NTIsNyArNjU0LDggQEAKIAlzdGF0aWMgewogCQlpZiAoT0JKRUNUX0lEX0xFTkdUSCAhPSBuZXdNZXNzYWdlRGlnZXN0KCkuZ2V0RGlnZXN0TGVuZ3RoKCkpCiAJCQl0aHJvdyBuZXcgTGlua2FnZUVycm9yKEpHaXRUZXh0LmdldCgpLmluY29ycmVjdE9CSkVDVF9JRF9MRU5HVEgpOwotCQlDSEFSU0VUID0gQ2hhcnNldC5mb3JOYW1lKENIQVJBQ1RFUl9FTkNPRElORyk7CisJCUNIQVJTRVQgPSBVVEZfODsKKwkJQ0hBUkFDVEVSX0VOQ09ESU5HID0gQ0hBUlNFVC5uYW1lKCk7CiAJfQogCiAJLyoqIG5hbWUgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgY29tbWl0IG1zZyBmb3IgYSBtZXJnZSBjb21taXQgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvcmVDb25maWcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvcmVDb25maWcuamF2YQppbmRleCAzMmE4OTRmLi45OGRlM2E5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db3JlQ29uZmlnLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29yZUNvbmZpZy5qYXZhCkBAIC0xNjYsNyArMTY2LDcgQEAKIAkJRE9UR0lUT05MWQogCX0KIAotCXByaXZhdGUgQ29yZUNvbmZpZyhmaW5hbCBDb25maWcgcmMpIHsKKwlwcml2YXRlIENvcmVDb25maWcoQ29uZmlnIHJjKSB7CiAJCWNvbXByZXNzaW9uID0gcmMuZ2V0SW50KENvbmZpZ0NvbnN0YW50cy5DT05GSUdfQ09SRV9TRUNUSU9OLAogCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX0NPTVBSRVNTSU9OLCBERUZBVUxUX0NPTVBSRVNTSU9OKTsKIAkJcGFja0luZGV4VmVyc2lvbiA9IHJjLmdldEludChDb25maWdDb25zdGFudHMuQ09ORklHX1BBQ0tfU0VDVElPTiwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0RlZmF1bHRUeXBlZENvbmZpZ0dldHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvRGVmYXVsdFR5cGVkQ29uZmlnR2V0dGVyLmphdmEKaW5kZXggNjhmODgxZC4uODkxYzdmMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvRGVmYXVsdFR5cGVkQ29uZmlnR2V0dGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvRGVmYXVsdFR5cGVkQ29uZmlnR2V0dGVyLmphdmEKQEAgLTI3MCw4ICsyNzAsOCBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtYXRjaChmaW5hbCBTdHJpbmcgYSwgZmluYWwgU3RyaW5nLi4uIGNhc2VzKSB7Ci0JCWZvciAoZmluYWwgU3RyaW5nIGIgOiBjYXNlcykgeworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWF0Y2goU3RyaW5nIGEsIFN0cmluZy4uLiBjYXNlcykgeworCQlmb3IgKFN0cmluZyBiIDogY2FzZXMpIHsKIAkJCWlmIChiICE9IG51bGwgJiYgYi5lcXVhbHNJZ25vcmVDYXNlKGEpKSB7CiAJCQkJcmV0dXJuIHRydWU7CiAJCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9GaWxlTW9kZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvRmlsZU1vZGUuamF2YQppbmRleCA3ODUyMzcxLi5kNGM0ZDViIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9GaWxlTW9kZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0ZpbGVNb2RlLmphdmEKQEAgLTg4LDcgKzg4LDcgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIEZpbGVNb2RlIFRSRUUgPSBuZXcgRmlsZU1vZGUoVFlQRV9UUkVFLAogCQkJQ29uc3RhbnRzLk9CSl9UUkVFKSB7CiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgaW50IG1vZGVCaXRzKSB7CisJCXB1YmxpYyBib29sZWFuIGVxdWFscyhpbnQgbW9kZUJpdHMpIHsKIAkJCXJldHVybiAobW9kZUJpdHMgJiBUWVBFX01BU0spID09IFRZUEVfVFJFRTsKIAkJfQogCX07CkBAIC05Nyw3ICs5Nyw3IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBGaWxlTW9kZSBTWU1MSU5LID0gbmV3IEZpbGVNb2RlKFRZUEVfU1lNTElOSywKIAkJCUNvbnN0YW50cy5PQkpfQkxPQikgewogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIGludCBtb2RlQml0cykgeworCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoaW50IG1vZGVCaXRzKSB7CiAJCQlyZXR1cm4gKG1vZGVCaXRzICYgVFlQRV9NQVNLKSA9PSBUWVBFX1NZTUxJTks7CiAJCX0KIAl9OwpAQCAtMTA2LDcgKzEwNiw3IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBGaWxlTW9kZSBSRUdVTEFSX0ZJTEUgPSBuZXcgRmlsZU1vZGUoMDEwMDY0NCwKIAkJCUNvbnN0YW50cy5PQkpfQkxPQikgewogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIGludCBtb2RlQml0cykgeworCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoaW50IG1vZGVCaXRzKSB7CiAJCQlyZXR1cm4gKG1vZGVCaXRzICYgVFlQRV9NQVNLKSA9PSBUWVBFX0ZJTEUgJiYgKG1vZGVCaXRzICYgMDExMSkgPT0gMDsKIAkJfQogCX07CkBAIC0xMTUsNyArMTE1LDcgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIEZpbGVNb2RlIEVYRUNVVEFCTEVfRklMRSA9IG5ldyBGaWxlTW9kZSgwMTAwNzU1LAogCQkJQ29uc3RhbnRzLk9CSl9CTE9CKSB7CiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgaW50IG1vZGVCaXRzKSB7CisJCXB1YmxpYyBib29sZWFuIGVxdWFscyhpbnQgbW9kZUJpdHMpIHsKIAkJCXJldHVybiAobW9kZUJpdHMgJiBUWVBFX01BU0spID09IFRZUEVfRklMRSAmJiAobW9kZUJpdHMgJiAwMTExKSAhPSAwOwogCQl9CiAJfTsKQEAgLTEyNCw3ICsxMjQsNyBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgRmlsZU1vZGUgR0lUTElOSyA9IG5ldyBGaWxlTW9kZShUWVBFX0dJVExJTkssCiAJCQlDb25zdGFudHMuT0JKX0NPTU1JVCkgewogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIGludCBtb2RlQml0cykgeworCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoaW50IG1vZGVCaXRzKSB7CiAJCQlyZXR1cm4gKG1vZGVCaXRzICYgVFlQRV9NQVNLKSA9PSBUWVBFX0dJVExJTks7CiAJCX0KIAl9OwpAQCAtMTMzLDcgKzEzMyw3IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBGaWxlTW9kZSBNSVNTSU5HID0gbmV3IEZpbGVNb2RlKFRZUEVfTUlTU0lORywKIAkJCUNvbnN0YW50cy5PQkpfQkFEKSB7CiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgaW50IG1vZGVCaXRzKSB7CisJCXB1YmxpYyBib29sZWFuIGVxdWFscyhpbnQgbW9kZUJpdHMpIHsKIAkJCXJldHVybiBtb2RlQml0cyA9PSAwOwogCQl9CiAJfTsKQEAgLTE0NSw3ICsxNDUsNyBAQAogCSAqICAgICAgICAgICAgdGhlIG1vZGUgYml0cyB0aGUgY2FsbGVyIGhhcyBzb21laG93IG9idGFpbmVkLgogCSAqIEByZXR1cm4gdGhlIEZpbGVNb2RlIGluc3RhbmNlIHRoYXQgcmVwcmVzZW50cyB0aGUgZ2l2ZW4gYml0cy4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZpbGVNb2RlIGZyb21CaXRzKGZpbmFsIGludCBiaXRzKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBGaWxlTW9kZSBmcm9tQml0cyhpbnQgYml0cykgewogCQlzd2l0Y2ggKGJpdHMgJiBUWVBFX01BU0spIHsKIAkJY2FzZSBUWVBFX01JU1NJTkc6CiAJCQlpZiAoYml0cyA9PSAwKQpAQCAtMTY1LDcgKzE2NSw3IEBACiAKIAkJcmV0dXJuIG5ldyBGaWxlTW9kZShiaXRzLCBDb25zdGFudHMuT0JKX0JBRCkgewogCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgaW50IGEpIHsKKwkJCXB1YmxpYyBib29sZWFuIGVxdWFscyhpbnQgYSkgewogCQkJCXJldHVybiBiaXRzID09IGE7CiAJCQl9CiAJCX07CkBAIC0xNzcsNyArMTc3LDcgQEAKIAogCXByaXZhdGUgZmluYWwgaW50IG9iamVjdFR5cGU7CiAKLQlwcml2YXRlIEZpbGVNb2RlKGludCBtb2RlLCBmaW5hbCBpbnQgZXhwVHlwZSkgeworCXByaXZhdGUgRmlsZU1vZGUoaW50IG1vZGUsIGludCBleHBUeXBlKSB7CiAJCW1vZGVCaXRzID0gbW9kZTsKIAkJb2JqZWN0VHlwZSA9IGV4cFR5cGU7CiAJCWlmIChtb2RlICE9IDApIHsKQEAgLTIwNiw3ICsyMDYsNyBAQAogCSAqICAgICAgICAgICAgYSBpbnQuCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBtb2RlIGJpdHMgcmVwcmVzZW50IHRoZSBzYW1lIG1vZGUgYXMgdGhpcyBvYmplY3QKIAkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBlcXVhbHMoZmluYWwgaW50IG1vZGViaXRzKTsKKwlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBlcXVhbHMoaW50IG1vZGViaXRzKTsKIAogCS8qKgogCSAqIENvcHkgdGhpcyBtb2RlIGFzIGEgc2VxdWVuY2Ugb2Ygb2N0YWwgVVMtQVNDSUkgYnl0ZXMuCkBAIC0yMjIsNyArMjIyLDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgc3RyZWFtIGVuY291bnRlcmVkIGFuIGVycm9yIGR1cmluZyB0aGUgY29weS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5VG8oZmluYWwgT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyB2b2lkIGNvcHlUbyhPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCW9zLndyaXRlKG9jdGFsQnl0ZXMpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvSW5kZXhEaWZmLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9JbmRleERpZmYuamF2YQppbmRleCA4NzA4NmNiLi45NGI5ZGRjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9JbmRleERpZmYuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9JbmRleERpZmYuamF2YQpAQCAtNTQyLDEwICs1NDIsOSBAQAogCQkJCQkJCUpHaXRUZXh0LmdldCgpLmludmFsaWRJZ25vcmVQYXJhbVN1Ym1vZHVsZSwKIAkJCQkJCQlzbXcuZ2V0UGF0aCgpKSwgZSk7CiAJCQkJfQotCQkJCVJlcG9zaXRvcnkgc3ViUmVwbyA9IHNtdy5nZXRSZXBvc2l0b3J5KCk7Ci0JCQkJaWYgKHN1YlJlcG8gIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgc3ViUmVwb1BhdGggPSBzbXcuZ2V0UGF0aCgpOwotCQkJCQl0cnkgeworCQkJCXRyeSAoUmVwb3NpdG9yeSBzdWJSZXBvID0gc213LmdldFJlcG9zaXRvcnkoKSkgeworCQkJCQlpZiAoc3ViUmVwbyAhPSBudWxsKSB7CisJCQkJCQlTdHJpbmcgc3ViUmVwb1BhdGggPSBzbXcuZ2V0UGF0aCgpOwogCQkJCQkJT2JqZWN0SWQgc3ViSGVhZCA9IHN1YlJlcG8ucmVzb2x2ZSgiSEVBRCIpOyAvLyROT04tTkxTLTEkCiAJCQkJCQlpZiAoc3ViSGVhZCAhPSBudWxsCiAJCQkJCQkJCSYmICFzdWJIZWFkLmVxdWFscyhzbXcuZ2V0T2JqZWN0SWQoKSkpIHsKQEAgLTU3NCw4ICs1NzMsNiBAQAogCQkJCQkJCQlyZWNvcmRGaWxlTW9kZShzdWJSZXBvUGF0aCwgRmlsZU1vZGUuR0lUTElOSyk7CiAJCQkJCQkJfQogCQkJCQkJfQotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJc3ViUmVwby5jbG9zZSgpOwogCQkJCQl9CiAJCQkJfQogCQkJfQpAQCAtNzQ1LDcgKzc0Miw3IEBACiAJICogQHBhcmFtIHBhdGggYSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30gb2JqZWN0LgogCSAqIEByZXR1cm4gZmlsZSBtb2RlCiAJICovCi0JcHVibGljIEZpbGVNb2RlIGdldEluZGV4TW9kZShmaW5hbCBTdHJpbmcgcGF0aCkgeworCXB1YmxpYyBGaWxlTW9kZSBnZXRJbmRleE1vZGUoU3RyaW5nIHBhdGgpIHsKIAkJZmluYWwgRGlyQ2FjaGVFbnRyeSBlbnRyeSA9IGRpckNhY2hlLmdldEVudHJ5KHBhdGgpOwogCQlyZXR1cm4gZW50cnkgIT0gbnVsbCA/IGVudHJ5LmdldEZpbGVNb2RlKCkgOiBGaWxlTW9kZS5NSVNTSU5HOwogCX0KQEAgLTc1OSw3ICs3NTYsNyBAQAogCSAqICAgICAgICAgdGhlIGdpdmVuIGZpbGUgbW9kZQogCSAqIEBzaW5jZSAzLjYKIAkgKi8KLQlwdWJsaWMgU2V0PFN0cmluZz4gZ2V0UGF0aHNXaXRoSW5kZXhNb2RlKGZpbmFsIEZpbGVNb2RlIG1vZGUpIHsKKwlwdWJsaWMgU2V0PFN0cmluZz4gZ2V0UGF0aHNXaXRoSW5kZXhNb2RlKEZpbGVNb2RlIG1vZGUpIHsKIAkJU2V0PFN0cmluZz4gcGF0aHMgPSBmaWxlTW9kZXMuZ2V0KG1vZGUpOwogCQlpZiAocGF0aHMgPT0gbnVsbCkKIAkJCXBhdGhzID0gbmV3IEhhc2hTZXQ8PigpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvSW5mbGF0ZXJDYWNoZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvSW5mbGF0ZXJDYWNoZS5qYXZhCmluZGV4IGE5NzcyMWMuLmRkMGYxOGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0luZmxhdGVyQ2FjaGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9JbmZsYXRlckNhY2hlLmphdmEKQEAgLTg5LDcgKzg5LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBpbmZsYXRlciB0byByZXR1cm4uIE1heSBiZSBudWxsLCBpbiB3aGljaCBjYXNlIHRoaXMgbWV0aG9kCiAJICogICAgICAgICAgICBkb2VzIG5vdGhpbmcuCiAJICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbGVhc2UoZmluYWwgSW5mbGF0ZXIgaSkgeworCXB1YmxpYyBzdGF0aWMgdm9pZCByZWxlYXNlKEluZmxhdGVyIGkpIHsKIAkJaWYgKGkgIT0gbnVsbCkgewogCQkJaS5yZXNldCgpOwogCQkJaWYgKHJlbGVhc2VJbXBsKGkpKQpAQCAtOTcsNyArOTcsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVsZWFzZUltcGwoZmluYWwgSW5mbGF0ZXIgaSkgeworCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBib29sZWFuIHJlbGVhc2VJbXBsKEluZmxhdGVyIGkpIHsKIAkJaWYgKG9wZW5JbmZsYXRlckNvdW50IDwgU1opIHsKIAkJCWluZmxhdGVyQ2FjaGVbb3BlbkluZmxhdGVyQ291bnQrK10gPSBpOwogCQkJcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvTXV0YWJsZU9iamVjdElkLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9NdXRhYmxlT2JqZWN0SWQuamF2YQppbmRleCBlNDkyYWY5Li44Y2YwZmQwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9NdXRhYmxlT2JqZWN0SWQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9NdXRhYmxlT2JqZWN0SWQuamF2YQpAQCAtMTYyLDcgKzE2Miw3IEBACiAJICogICAgICAgICAgICB0aGUgcmF3IGJ5dGUgYnVmZmVyIHRvIHJlYWQgZnJvbS4gQXQgbGVhc3QgMjAgYnl0ZXMgbXVzdCBiZQogCSAqICAgICAgICAgICAgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIGJ5dGUgYXJyYXkuCiAJICovCi0JcHVibGljIHZvaWQgZnJvbVJhdyhmaW5hbCBieXRlW10gYnMpIHsKKwlwdWJsaWMgdm9pZCBmcm9tUmF3KGJ5dGVbXSBicykgewogCQlmcm9tUmF3KGJzLCAwKTsKIAl9CiAKQEAgLTE3NSw3ICsxNzUsNyBAQAogCSAqIEBwYXJhbSBwCiAJICogICAgICAgICAgICBwb3NpdGlvbiB0byByZWFkIHRoZSBmaXJzdCBieXRlIG9mIGRhdGEgZnJvbS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBmcm9tUmF3KGZpbmFsIGJ5dGVbXSBicywgZmluYWwgaW50IHApIHsKKwlwdWJsaWMgdm9pZCBmcm9tUmF3KGJ5dGVbXSBicywgaW50IHApIHsKIAkJdzEgPSBOQi5kZWNvZGVJbnQzMihicywgcCk7CiAJCXcyID0gTkIuZGVjb2RlSW50MzIoYnMsIHAgKyA0KTsKIAkJdzMgPSBOQi5kZWNvZGVJbnQzMihicywgcCArIDgpOwpAQCAtMTkwLDcgKzE5MCw3IEBACiAJICogICAgICAgICAgICB0aGUgcmF3IGludCBidWZmZXIgdG8gcmVhZCBmcm9tLiBBdCBsZWFzdCA1IGludGVnZXJzIG11c3QgYmUKIAkgKiAgICAgICAgICAgIGF2YWlsYWJsZSB3aXRoaW4gdGhpcyBpbnRlZ2VycyBhcnJheS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBmcm9tUmF3KGZpbmFsIGludFtdIGludHMpIHsKKwlwdWJsaWMgdm9pZCBmcm9tUmF3KGludFtdIGludHMpIHsKIAkJZnJvbVJhdyhpbnRzLCAwKTsKIAl9CiAKQEAgLTIwMyw3ICsyMDMsNyBAQAogCSAqIEBwYXJhbSBwCiAJICogICAgICAgICAgICBwb3NpdGlvbiB0byByZWFkIHRoZSBmaXJzdCBpbnRlZ2VyIG9mIGRhdGEgZnJvbS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBmcm9tUmF3KGZpbmFsIGludFtdIGludHMsIGZpbmFsIGludCBwKSB7CisJcHVibGljIHZvaWQgZnJvbVJhdyhpbnRbXSBpbnRzLCBpbnQgcCkgewogCQl3MSA9IGludHNbcF07CiAJCXcyID0gaW50c1twICsgMV07CiAJCXczID0gaW50c1twICsgMl07CkBAIC0yNDMsNyArMjQzLDcgQEAKIAkgKiBAcGFyYW0gb2Zmc2V0CiAJICogICAgICAgICAgICBwb3NpdGlvbiB0byByZWFkIHRoZSBmaXJzdCBjaGFyYWN0ZXIgZnJvbS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBmcm9tU3RyaW5nKGZpbmFsIGJ5dGVbXSBidWYsIGZpbmFsIGludCBvZmZzZXQpIHsKKwlwdWJsaWMgdm9pZCBmcm9tU3RyaW5nKGJ5dGVbXSBidWYsIGludCBvZmZzZXQpIHsKIAkJZnJvbUhleFN0cmluZyhidWYsIG9mZnNldCk7CiAJfQogCkBAIC0yNTMsMTQgKzI1MywxNCBAQAogCSAqIEBwYXJhbSBzdHIKIAkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gcmVhZCBmcm9tLiBNdXN0IGJlIDQwIGNoYXJhY3RlcnMgbG9uZy4KIAkgKi8KLQlwdWJsaWMgdm9pZCBmcm9tU3RyaW5nKGZpbmFsIFN0cmluZyBzdHIpIHsKKwlwdWJsaWMgdm9pZCBmcm9tU3RyaW5nKFN0cmluZyBzdHIpIHsKIAkJaWYgKHN0ci5sZW5ndGgoKSAhPSBDb25zdGFudHMuT0JKRUNUX0lEX1NUUklOR19MRU5HVEgpCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAogCQkJCQlKR2l0VGV4dC5nZXQoKS5pbnZhbGlkSWQsIHN0cikpOwogCQlmcm9tSGV4U3RyaW5nKENvbnN0YW50cy5lbmNvZGVBU0NJSShzdHIpLCAwKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgZnJvbUhleFN0cmluZyhmaW5hbCBieXRlW10gYnMsIGludCBwKSB7CisJcHJpdmF0ZSB2b2lkIGZyb21IZXhTdHJpbmcoYnl0ZVtdIGJzLCBpbnQgcCkgewogCQl0cnkgewogCQkJdzEgPSBSYXdQYXJzZVV0aWxzLnBhcnNlSGV4SW50MzIoYnMsIHApOwogCQkJdzIgPSBSYXdQYXJzZVV0aWxzLnBhcnNlSGV4SW50MzIoYnMsIHAgKyA4KTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdENoZWNrZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdENoZWNrZXIuamF2YQppbmRleCBhNmQyYzNmLi42ODk2NTliIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RDaGVja2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0Q2hlY2tlci5qYXZhCkBAIC0xMTA1LDcgKzExMDUsNyBAQAogCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQ29ycnVwdE9iamVjdEV4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGlmIGFueSBlcnJvciB3YXMgZGV0ZWN0ZWQuCiAJICovCi0JcHVibGljIHZvaWQgY2hlY2tCbG9iKGZpbmFsIGJ5dGVbXSByYXcpIHRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBjaGVja0Jsb2IoYnl0ZVtdIHJhdykgdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24gewogCQkvLyBXZSBjYW4gYWx3YXlzIGFzc3VtZSB0aGUgYmxvYiBpcyB2YWxpZC4KIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdERhdGFiYXNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3REYXRhYmFzZS5qYXZhCmluZGV4IGJiZWY1MWQuLjkzYWRkNWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdERhdGFiYXNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0RGF0YWJhc2UuamF2YQpAQCAtMTIxLDggKzEyMSw4IEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIG9iamVjdCBzdG9yZSBjYW5ub3QgYmUgYWNjZXNzZWQuCiAJICovCi0JcHVibGljIGJvb2xlYW4gaGFzKGZpbmFsIEFueU9iamVjdElkIG9iamVjdElkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0cnkgKGZpbmFsIE9iamVjdFJlYWRlciBvciA9IG5ld1JlYWRlcigpKSB7CisJcHVibGljIGJvb2xlYW4gaGFzKEFueU9iamVjdElkIG9iamVjdElkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl0cnkgKE9iamVjdFJlYWRlciBvciA9IG5ld1JlYWRlcigpKSB7CiAJCQlyZXR1cm4gb3IuaGFzKG9iamVjdElkKTsKIAkJfQogCX0KQEAgLTE0MSw3ICsxNDEsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBvYmplY3Qgc3RvcmUgY2Fubm90IGJlIGFjY2Vzc2VkLgogCSAqLwotCXB1YmxpYyBPYmplY3RMb2FkZXIgb3BlbihmaW5hbCBBbnlPYmplY3RJZCBvYmplY3RJZCkKKwlwdWJsaWMgT2JqZWN0TG9hZGVyIG9wZW4oQW55T2JqZWN0SWQgb2JqZWN0SWQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gb3BlbihvYmplY3RJZCwgT2JqZWN0UmVhZGVyLk9CSl9BTlkpOwogCX0KQEAgLTE3Miw3ICsxNzIsNyBAQAogCXB1YmxpYyBPYmplY3RMb2FkZXIgb3BlbihBbnlPYmplY3RJZCBvYmplY3RJZCwgaW50IHR5cGVIaW50KQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQlJT0V4Y2VwdGlvbiB7Ci0JCXRyeSAoZmluYWwgT2JqZWN0UmVhZGVyIG9yID0gbmV3UmVhZGVyKCkpIHsKKwkJdHJ5IChPYmplY3RSZWFkZXIgb3IgPSBuZXdSZWFkZXIoKSkgewogCQkJcmV0dXJuIG9yLm9wZW4ob2JqZWN0SWQsIHR5cGVIaW50KTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdElkLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RJZC5qYXZhCmluZGV4IDBlODU1NDUuLjc2NGY4OTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdElkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0SWQuamF2YQpAQCAtODYsNyArODYsNyBAQAogCSAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byB0ZXN0LgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyaW5nIGNhbiBjb252ZXJ0ZWQgaW50byBhbiBPYmplY3RJZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNJZChmaW5hbCBTdHJpbmcgaWQpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNJZChTdHJpbmcgaWQpIHsKIAkJaWYgKGlkLmxlbmd0aCgpICE9IENvbnN0YW50cy5PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSCkKIAkJCXJldHVybiBmYWxzZTsKIAkJdHJ5IHsKQEAgLTEwNiw3ICsxMDYsNyBAQAogCSAqICAgICAgICAgICAgdGhlIGlkIHRvIGNvbnZlcnQuIE1heSBiZSBudWxsLgogCSAqIEByZXR1cm4gdGhlIGhleCBzdHJpbmcgY29udmVyc2lvbiBvZiB0aGlzIGlkJ3MgY29udGVudC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyB0b1N0cmluZyhmaW5hbCBPYmplY3RJZCBpKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgdG9TdHJpbmcoT2JqZWN0SWQgaSkgewogCQlyZXR1cm4gaSAhPSBudWxsID8gaS5uYW1lKCkgOiBaRVJPSURfU1RSOwogCX0KIApAQCAtMTU3LDcgKzE1Nyw3IEBACiAJICogICAgICAgICAgICBhdmFpbGFibGUgd2l0aGluIHRoaXMgYnl0ZSBhcnJheS4KIAkgKiBAcmV0dXJuIHRoZSBjb252ZXJ0ZWQgb2JqZWN0IGlkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0SWQgZnJvbVJhdyhmaW5hbCBieXRlW10gYnMpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdElkIGZyb21SYXcoYnl0ZVtdIGJzKSB7CiAJCXJldHVybiBmcm9tUmF3KGJzLCAwKTsKIAl9CiAKQEAgLTE3MSw3ICsxNzEsNyBAQAogCSAqICAgICAgICAgICAgcG9zaXRpb24gdG8gcmVhZCB0aGUgZmlyc3QgYnl0ZSBvZiBkYXRhIGZyb20uCiAJICogQHJldHVybiB0aGUgY29udmVydGVkIG9iamVjdCBpZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdElkIGZyb21SYXcoZmluYWwgYnl0ZVtdIGJzLCBmaW5hbCBpbnQgcCkgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0SWQgZnJvbVJhdyhieXRlW10gYnMsIGludCBwKSB7CiAJCWZpbmFsIGludCBhID0gTkIuZGVjb2RlSW50MzIoYnMsIHApOwogCQlmaW5hbCBpbnQgYiA9IE5CLmRlY29kZUludDMyKGJzLCBwICsgNCk7CiAJCWZpbmFsIGludCBjID0gTkIuZGVjb2RlSW50MzIoYnMsIHAgKyA4KTsKQEAgLTE4OCw3ICsxODgsNyBAQAogCSAqICAgICAgICAgICAgYmUgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIGludCBhcnJheS4KIAkgKiBAcmV0dXJuIHRoZSBjb252ZXJ0ZWQgb2JqZWN0IGlkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0SWQgZnJvbVJhdyhmaW5hbCBpbnRbXSBpcykgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0SWQgZnJvbVJhdyhpbnRbXSBpcykgewogCQlyZXR1cm4gZnJvbVJhdyhpcywgMCk7CiAJfQogCkBAIC0yMDIsNyArMjAyLDcgQEAKIAkgKiAgICAgICAgICAgIHBvc2l0aW9uIHRvIHJlYWQgdGhlIGZpcnN0IGludGVnZXIgb2YgZGF0YSBmcm9tLgogCSAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBvYmplY3QgaWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3RJZCBmcm9tUmF3KGZpbmFsIGludFtdIGlzLCBmaW5hbCBpbnQgcCkgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0SWQgZnJvbVJhdyhpbnRbXSBpcywgaW50IHApIHsKIAkJcmV0dXJuIG5ldyBPYmplY3RJZChpc1twXSwgaXNbcCArIDFdLCBpc1twICsgMl0sIGlzW3AgKyAzXSwgaXNbcCArIDRdKTsKIAl9CiAKQEAgLTIxNiw3ICsyMTYsNyBAQAogCSAqICAgICAgICAgICAgcG9zaXRpb24gdG8gcmVhZCB0aGUgZmlyc3QgY2hhcmFjdGVyIGZyb20uCiAJICogQHJldHVybiB0aGUgY29udmVydGVkIG9iamVjdCBpZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdElkIGZyb21TdHJpbmcoZmluYWwgYnl0ZVtdIGJ1ZiwgZmluYWwgaW50IG9mZnNldCkgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0SWQgZnJvbVN0cmluZyhieXRlW10gYnVmLCBpbnQgb2Zmc2V0KSB7CiAJCXJldHVybiBmcm9tSGV4U3RyaW5nKGJ1Ziwgb2Zmc2V0KTsKIAl9CiAKQEAgLTIyNywxNCArMjI3LDE0IEBACiAJICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIHJlYWQgZnJvbS4gTXVzdCBiZSA0MCBjaGFyYWN0ZXJzIGxvbmcuCiAJICogQHJldHVybiB0aGUgY29udmVydGVkIG9iamVjdCBpZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdElkIGZyb21TdHJpbmcoZmluYWwgU3RyaW5nIHN0cikgeworCXB1YmxpYyBzdGF0aWMgT2JqZWN0SWQgZnJvbVN0cmluZyhTdHJpbmcgc3RyKSB7CiAJCWlmIChzdHIubGVuZ3RoKCkgIT0gQ29uc3RhbnRzLk9CSkVDVF9JRF9TVFJJTkdfTEVOR1RIKSB7CiAJCQl0aHJvdyBuZXcgSW52YWxpZE9iamVjdElkRXhjZXB0aW9uKHN0cik7CiAJCX0KIAkJcmV0dXJuIGZyb21IZXhTdHJpbmcoQ29uc3RhbnRzLmVuY29kZUFTQ0lJKHN0ciksIDApOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdElkIGZyb21IZXhTdHJpbmcoZmluYWwgYnl0ZVtdIGJzLCBpbnQgcCkgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdElkIGZyb21IZXhTdHJpbmcoYnl0ZVtdIGJzLCBpbnQgcCkgewogCQl0cnkgewogCQkJZmluYWwgaW50IGEgPSBSYXdQYXJzZVV0aWxzLnBhcnNlSGV4SW50MzIoYnMsIHApOwogCQkJZmluYWwgaW50IGIgPSBSYXdQYXJzZVV0aWxzLnBhcnNlSGV4SW50MzIoYnMsIHAgKyA4KTsKQEAgLTI4MSw3ICsyODEsNyBAQAogCSAqIEBwYXJhbSBzcmMKIAkgKiAgICAgICAgICAgIGFub3RoZXIgYWxyZWFkeSBwYXJzZWQgT2JqZWN0SWQgdG8gY29weSB0aGUgdmFsdWUgb3V0IG9mLgogCSAqLwotCXByb3RlY3RlZCBPYmplY3RJZChmaW5hbCBBbnlPYmplY3RJZCBzcmMpIHsKKwlwcm90ZWN0ZWQgT2JqZWN0SWQoQW55T2JqZWN0SWQgc3JjKSB7CiAJCXcxID0gc3JjLncxOwogCQl3MiA9IHNyYy53MjsKIAkJdzMgPSBzcmMudzM7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RJZE93bmVyTWFwLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RJZE93bmVyTWFwLmphdmEKaW5kZXggMDNhNDMwYy4uOWRmNTkzMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0SWRPd25lck1hcC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdElkT3duZXJNYXAuamF2YQpAQCAtMTM0LDcgKzEzNCw3IEBACiAJICogQHJldHVybiB0aGUgaW5zdGFuY2UgbWFwcGVkIHRvIHRvRmluZCwgb3IgbnVsbCBpZiBubyBtYXBwaW5nIGV4aXN0cy4KIAkgKi8KIAlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgViBnZXQoZmluYWwgQW55T2JqZWN0SWQgdG9GaW5kKSB7CisJcHVibGljIFYgZ2V0KEFueU9iamVjdElkIHRvRmluZCkgewogCQlpbnQgaCA9IHRvRmluZC53MTsKIAkJViBvYmogPSBkaXJlY3RvcnlbaCAmIG1hc2tdW2ggPj4+IFNFR01FTlRfU0hJRlRdOwogCQlmb3IgKDsgb2JqICE9IG51bGw7IG9iaiA9IChWKSBvYmoubmV4dCkKQEAgLTE0OSw3ICsxNDksNyBAQAogCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1hcCBjb250YWlucyB0aGUgc3BlY2lmaWVkIG9iamVjdC4KIAkgKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhmaW5hbCBBbnlPYmplY3RJZCB0b0ZpbmQpIHsKKwlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhBbnlPYmplY3RJZCB0b0ZpbmQpIHsKIAkJcmV0dXJuIGdldCh0b0ZpbmQpICE9IG51bGw7CiAJfQogCkBAIC0xNjMsNyArMTYzLDcgQEAKIAkgKiBAcGFyYW0gbmV3VmFsdWUKIAkgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gc3RvcmUuCiAJICovCi0JcHVibGljIDxRIGV4dGVuZHMgVj4gdm9pZCBhZGQoZmluYWwgUSBuZXdWYWx1ZSkgeworCXB1YmxpYyA8USBleHRlbmRzIFY+IHZvaWQgYWRkKFEgbmV3VmFsdWUpIHsKIAkJaWYgKCsrc2l6ZSA9PSBncm93KQogCQkJZ3JvdygpOwogCkBAIC0xOTQsNyArMTk0LDcgQEAKIAkgKiAgICAgICAgIHtAY29kZSBnZXQobmV3VmFsdWUpfSBmaXJzdC4KIAkgKi8KIAlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgPFEgZXh0ZW5kcyBWPiBWIGFkZElmQWJzZW50KGZpbmFsIFEgbmV3VmFsdWUpIHsKKwlwdWJsaWMgPFEgZXh0ZW5kcyBWPiBWIGFkZElmQWJzZW50KFEgbmV3VmFsdWUpIHsKIAkJaW50IGggPSBuZXdWYWx1ZS53MTsKIAkJVltdIHRhYmxlID0gZGlyZWN0b3J5W2ggJiBtYXNrXTsKIAkJaCA+Pj49IFNFR01FTlRfU0hJRlQ7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RJZFN1YmNsYXNzTWFwLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RJZFN1YmNsYXNzTWFwLmphdmEKaW5kZXggMDAxYWE5Yy4uY2Q1N2JkYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0SWRTdWJjbGFzc01hcC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdElkU3ViY2xhc3NNYXAuamF2YQpAQCAtOTYsNyArOTYsNyBAQAogCSAqICAgICAgICAgICAgdGhlIG9iamVjdCBpZGVudGlmaWVyIHRvIGZpbmQuCiAJICogQHJldHVybiB0aGUgaW5zdGFuY2UgbWFwcGVkIHRvIHRvRmluZCwgb3IgbnVsbCBpZiBubyBtYXBwaW5nIGV4aXN0cy4KIAkgKi8KLQlwdWJsaWMgViBnZXQoZmluYWwgQW55T2JqZWN0SWQgdG9GaW5kKSB7CisJcHVibGljIFYgZ2V0KEFueU9iamVjdElkIHRvRmluZCkgewogCQlmaW5hbCBpbnQgbXNrID0gbWFzazsKIAkJaW50IGkgPSB0b0ZpbmQudzEgJiBtc2s7CiAJCWZpbmFsIFZbXSB0YmwgPSB0YWJsZTsKQEAgLTExNiw3ICsxMTYsNyBAQAogCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1hcCBjb250YWlucyB0aGUgc3BlY2lmaWVkIG9iamVjdC4KIAkgKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhmaW5hbCBBbnlPYmplY3RJZCB0b0ZpbmQpIHsKKwlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhBbnlPYmplY3RJZCB0b0ZpbmQpIHsKIAkJcmV0dXJuIGdldCh0b0ZpbmQpICE9IG51bGw7CiAJfQogCkBAIC0xMzEsNyArMTMxLDcgQEAKIAkgKiBAcGFyYW0gbmV3VmFsdWUKIAkgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gc3RvcmUuCiAJICovCi0JcHVibGljIDxRIGV4dGVuZHMgVj4gdm9pZCBhZGQoZmluYWwgUSBuZXdWYWx1ZSkgeworCXB1YmxpYyA8USBleHRlbmRzIFY+IHZvaWQgYWRkKFEgbmV3VmFsdWUpIHsKIAkJaWYgKCsrc2l6ZSA9PSBncm93KQogCQkJZ3JvdygpOwogCQlpbnNlcnQobmV3VmFsdWUpOwpAQCAtMTU1LDcgKzE1NSw3IEBACiAJICogICAgICAgICB0aGF0IHdvdWxkIGhhdmUgYmVlbiByZXR1cm5lZCBoYWQgdGhlIGNhbGxlciB1c2VkCiAJICogICAgICAgICB7QGNvZGUgZ2V0KG5ld1ZhbHVlKX0gZmlyc3QuCiAJICovCi0JcHVibGljIDxRIGV4dGVuZHMgVj4gViBhZGRJZkFic2VudChmaW5hbCBRIG5ld1ZhbHVlKSB7CisJcHVibGljIDxRIGV4dGVuZHMgVj4gViBhZGRJZkFic2VudChRIG5ld1ZhbHVlKSB7CiAJCWZpbmFsIGludCBtc2sgPSBtYXNrOwogCQlpbnQgaSA9IG5ld1ZhbHVlLncxICYgbXNrOwogCQlmaW5hbCBWW10gdGJsID0gdGFibGU7CkBAIC0yMjYsNyArMjI2LDcgQEAKIAkJfTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgaW5zZXJ0KGZpbmFsIFYgbmV3VmFsdWUpIHsKKwlwcml2YXRlIHZvaWQgaW5zZXJ0KFYgbmV3VmFsdWUpIHsKIAkJZmluYWwgaW50IG1zayA9IG1hc2s7CiAJCWludCBqID0gbmV3VmFsdWUudzEgJiBtc2s7CiAJCWZpbmFsIFZbXSB0YmwgPSB0YWJsZTsKQEAgLTI1NCw3ICsyNTQsNyBAQAogCX0KIAogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgZmluYWwgVltdIGNyZWF0ZUFycmF5KGZpbmFsIGludCBzeikgeworCXByaXZhdGUgZmluYWwgVltdIGNyZWF0ZUFycmF5KGludCBzeikgewogCQlyZXR1cm4gKFZbXSkgbmV3IE9iamVjdElkW3N6XTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RJbnNlcnRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0SW5zZXJ0ZXIuamF2YQppbmRleCA0MDUyMmJhLi43N2ZhMWIyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RJbnNlcnRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdEluc2VydGVyLmphdmEKQEAgLTM2MSw3ICszNjEsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBvYmplY3QgY291bGQgbm90IGJlIHN0b3JlZC4KIAkgKi8KLQlwdWJsaWMgT2JqZWN0SWQgaW5zZXJ0KGZpbmFsIGludCB0eXBlLCBmaW5hbCBieXRlW10gZGF0YSkKKwlwdWJsaWMgT2JqZWN0SWQgaW5zZXJ0KGludCB0eXBlLCBieXRlW10gZGF0YSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBpbnNlcnQodHlwZSwgZGF0YSwgMCwgZGF0YS5sZW5ndGgpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdExvYWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0TG9hZGVyLmphdmEKaW5kZXggNDMyZjVhNi4uMmU1MmYwMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0TG9hZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0TG9hZGVyLmphdmEKQEAgLTE5NCw4ICsxOTQsNyBAQAogCQlpZiAoIWlzTGFyZ2UoKSkKIAkJCXJldHVybiBnZXRDYWNoZWRCeXRlcygpOwogCi0JCU9iamVjdFN0cmVhbSBpbiA9IG9wZW5TdHJlYW0oKTsKLQkJdHJ5IHsKKwkJdHJ5IChPYmplY3RTdHJlYW0gaW4gPSBvcGVuU3RyZWFtKCkpIHsKIAkJCWxvbmcgc3ogPSBpbi5nZXRTaXplKCk7CiAJCQlpZiAoc2l6ZUxpbWl0IDwgc3opCiAJCQkJdGhyb3cgbmV3IExhcmdlT2JqZWN0RXhjZXB0aW9uLkV4Y2VlZHNMaW1pdChzaXplTGltaXQsIHN6KTsKQEAgLTIxMiw4ICsyMTEsNiBAQAogCiAJCQlJTy5yZWFkRnVsbHkoaW4sIGJ1ZiwgMCwgYnVmLmxlbmd0aCk7CiAJCQlyZXR1cm4gYnVmOwotCQl9IGZpbmFsbHkgewotCQkJaW4uY2xvc2UoKTsKIAkJfQogCX0KIApAQCAtMjU1LDggKzI1Miw3IEBACiAJcHVibGljIHZvaWQgY29weVRvKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJSU9FeGNlcHRpb24gewogCQlpZiAoaXNMYXJnZSgpKSB7Ci0JCQlPYmplY3RTdHJlYW0gaW4gPSBvcGVuU3RyZWFtKCk7Ci0JCQl0cnkgeworCQkJdHJ5IChPYmplY3RTdHJlYW0gaW4gPSBvcGVuU3RyZWFtKCkpIHsKIAkJCQlmaW5hbCBsb25nIHN6ID0gaW4uZ2V0U2l6ZSgpOwogCQkJCWJ5dGVbXSB0bXAgPSBuZXcgYnl0ZVs4MTkyXTsKIAkJCQlsb25nIGNvcGllZCA9IDA7CkBAIC0yNjksMTUgKzI2NSwxMyBAQAogCQkJCX0KIAkJCQlpZiAoMCA8PSBpbi5yZWFkKCkpCiAJCQkJCXRocm93IG5ldyBFT0ZFeGNlcHRpb24oKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaW4uY2xvc2UoKTsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCW91dC53cml0ZShnZXRDYWNoZWRCeXRlcygpKTsKIAkJfQogCX0KIAotCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBjbG9uZUFycmF5KGZpbmFsIGJ5dGVbXSBkYXRhKSB7CisJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGNsb25lQXJyYXkoYnl0ZVtdIGRhdGEpIHsKIAkJZmluYWwgYnl0ZVtdIGNvcHkgPSBuZXcgYnl0ZVtkYXRhLmxlbmd0aF07CiAJCVN5c3RlbS5hcnJheWNvcHkoZGF0YSwgMCwgY29weSwgMCwgZGF0YS5sZW5ndGgpOwogCQlyZXR1cm4gY29weTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1BlcnNvbklkZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9QZXJzb25JZGVudC5qYXZhCmluZGV4IDE4YTExZjAuLmMxNmEyYjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1BlcnNvbklkZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUGVyc29uSWRlbnQuamF2YQpAQCAtMTY3LDcgKzE2Nyw3IEBACiAJICoKIAkgKiBAcGFyYW0gcmVwbyBhIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5fSBvYmplY3QuCiAJICovCi0JcHVibGljIFBlcnNvbklkZW50KGZpbmFsIFJlcG9zaXRvcnkgcmVwbykgeworCXB1YmxpYyBQZXJzb25JZGVudChSZXBvc2l0b3J5IHJlcG8pIHsKIAkJdGhpcyhyZXBvLmdldENvbmZpZygpLmdldChVc2VyQ29uZmlnLktFWSkpOwogCX0KIApAQCAtMTc3LDcgKzE3Nyw3IEBACiAJICogQHBhcmFtIHBpCiAJICogICAgICAgICAgICBPcmlnaW5hbCB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuUGVyc29uSWRlbnR9CiAJICovCi0JcHVibGljIFBlcnNvbklkZW50KGZpbmFsIFBlcnNvbklkZW50IHBpKSB7CisJcHVibGljIFBlcnNvbklkZW50KFBlcnNvbklkZW50IHBpKSB7CiAJCXRoaXMocGkuZ2V0TmFtZSgpLCBwaS5nZXRFbWFpbEFkZHJlc3MoKSk7CiAJfQogCkBAIC0xOTAsNyArMTkwLDcgQEAKIAkgKiBAcGFyYW0gYUVtYWlsQWRkcmVzcwogCSAqICAgICAgICAgICAgYSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30gb2JqZWN0LgogCSAqLwotCXB1YmxpYyBQZXJzb25JZGVudChmaW5hbCBTdHJpbmcgYU5hbWUsIGZpbmFsIFN0cmluZyBhRW1haWxBZGRyZXNzKSB7CisJcHVibGljIFBlcnNvbklkZW50KFN0cmluZyBhTmFtZSwgU3RyaW5nIGFFbWFpbEFkZHJlc3MpIHsKIAkJdGhpcyhhTmFtZSwgYUVtYWlsQWRkcmVzcywgU3lzdGVtUmVhZGVyLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudFRpbWUoKSk7CiAJfQogCkBAIC0yMjEsNyArMjIxLDcgQEAKIAkgKiBAcGFyYW0gdHoKIAkgKiAgICAgICAgICAgIHRpbWUgem9uZQogCSAqLwotCXB1YmxpYyBQZXJzb25JZGVudChmaW5hbCBQZXJzb25JZGVudCBwaSwgZmluYWwgRGF0ZSB3aGVuLCBmaW5hbCBUaW1lWm9uZSB0eikgeworCXB1YmxpYyBQZXJzb25JZGVudChQZXJzb25JZGVudCBwaSwgRGF0ZSB3aGVuLCBUaW1lWm9uZSB0eikgewogCQl0aGlzKHBpLmdldE5hbWUoKSwgcGkuZ2V0RW1haWxBZGRyZXNzKCksIHdoZW4sIHR6KTsKIAl9CiAKQEAgLTIzNCw3ICsyMzQsNyBAQAogCSAqIEBwYXJhbSBhV2hlbgogCSAqICAgICAgICAgICAgbG9jYWwgdGltZQogCSAqLwotCXB1YmxpYyBQZXJzb25JZGVudChmaW5hbCBQZXJzb25JZGVudCBwaSwgZmluYWwgRGF0ZSBhV2hlbikgeworCXB1YmxpYyBQZXJzb25JZGVudChQZXJzb25JZGVudCBwaSwgRGF0ZSBhV2hlbikgewogCQl0aGlzKHBpLmdldE5hbWUoKSwgcGkuZ2V0RW1haWxBZGRyZXNzKCksIGFXaGVuLmdldFRpbWUoKSwgcGkudHpPZmZzZXQpOwogCX0KIApAQCAtMjY0LDcgKzI2NCw3IEBACiAJICogQHBhcmFtIGFUWgogCSAqICAgICAgICAgICAgdGltZSB6b25lCiAJICovCi0JcHVibGljIFBlcnNvbklkZW50KGZpbmFsIFBlcnNvbklkZW50IHBpLCBmaW5hbCBsb25nIGFXaGVuLCBmaW5hbCBpbnQgYVRaKSB7CisJcHVibGljIFBlcnNvbklkZW50KFBlcnNvbklkZW50IHBpLCBsb25nIGFXaGVuLCBpbnQgYVRaKSB7CiAJCXRoaXMocGkuZ2V0TmFtZSgpLCBwaS5nZXRFbWFpbEFkZHJlc3MoKSwgYVdoZW4sIGFUWik7CiAJfQogCkBAIC0yNzQsNyArMjc0LDcgQEAKIAkJCQkuZ2V0VGltZXpvbmUod2hlbikpOwogCX0KIAotCXByaXZhdGUgUGVyc29uSWRlbnQoZmluYWwgVXNlckNvbmZpZyBjb25maWcpIHsKKwlwcml2YXRlIFBlcnNvbklkZW50KFVzZXJDb25maWcgY29uZmlnKSB7CiAJCXRoaXMoY29uZmlnLmdldENvbW1pdHRlck5hbWUoKSwgY29uZmlnLmdldENvbW1pdHRlckVtYWlsKCkpOwogCX0KIApAQCAtMzcwLDcgKzM3MCw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3QgbykgeworCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewogCQlpZiAobyBpbnN0YW5jZW9mIFBlcnNvbklkZW50KSB7CiAJCQlmaW5hbCBQZXJzb25JZGVudCBwID0gKFBlcnNvbklkZW50KSBvOwogCQkJcmV0dXJuIGdldE5hbWUoKS5lcXVhbHMocC5nZXROYW1lKCkpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWJhc2VUb2RvRmlsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmViYXNlVG9kb0ZpbGUuamF2YQppbmRleCAwNmI0YjIyLi4zODcxNjA1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWJhc2VUb2RvRmlsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlYmFzZVRvZG9GaWxlLmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CkBAIC0xODMsNyArMTgzLDcgQEAKIAkJCXN3aXRjaCAodG9rZW5Db3VudCkgewogCQkJY2FzZSAwOgogCQkJCVN0cmluZyBhY3Rpb25Ub2tlbiA9IG5ldyBTdHJpbmcoYnVmLCB0b2tlbkJlZ2luLAotCQkJCQkJbmV4dFNwYWNlIC0gdG9rZW5CZWdpbiAtIDEsIFVURl84KTsKKwkJCQkJCW5leHRTcGFjZSAtIHRva2VuQmVnaW4gLSAxLCBDSEFSU0VUKTsKIAkJCQl0b2tlbkJlZ2luID0gbmV4dFNwYWNlOwogCQkJCWFjdGlvbiA9IFJlYmFzZVRvZG9MaW5lLkFjdGlvbi5wYXJzZShhY3Rpb25Ub2tlbik7CiAJCQkJaWYgKGFjdGlvbiA9PSBudWxsKQpAQCAtMTkyLDcgKzE5Miw3IEBACiAJCQljYXNlIDE6CiAJCQkJbmV4dFNwYWNlID0gUmF3UGFyc2VVdGlscy5uZXh0KGJ1ZiwgdG9rZW5CZWdpbiwgJyAnKTsKIAkJCQlTdHJpbmcgY29tbWl0VG9rZW4gPSBuZXcgU3RyaW5nKGJ1ZiwgdG9rZW5CZWdpbiwKLQkJCQkJCW5leHRTcGFjZSAtIHRva2VuQmVnaW4gLSAxLCBVVEZfOCk7CisJCQkJCQluZXh0U3BhY2UgLSB0b2tlbkJlZ2luIC0gMSwgQ0hBUlNFVCk7CiAJCQkJdG9rZW5CZWdpbiA9IG5leHRTcGFjZTsKIAkJCQljb21taXQgPSBBYmJyZXZpYXRlZE9iamVjdElkLmZyb21TdHJpbmcoY29tbWl0VG9rZW4pOwogCQkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWYuamF2YQppbmRleCAzOTViYjMyLi5iMDAwNTU4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWYuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWYuamF2YQpAQCAtMTA1LDcgKzEwNSw3IEBACiAKIAkJcHJpdmF0ZSBmaW5hbCBib29sZWFuIHBhY2tlZDsKIAotCQlwcml2YXRlIFN0b3JhZ2UoZmluYWwgYm9vbGVhbiBsLCBmaW5hbCBib29sZWFuIHApIHsKKwkJcHJpdmF0ZSBTdG9yYWdlKGJvb2xlYW4gbCwgYm9vbGVhbiBwKSB7CiAJCQlsb29zZSA9IGw7CiAJCQlwYWNrZWQgPSBwOwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZDb21wYXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZDb21wYXJhdG9yLmphdmEKaW5kZXggNDNkMmYzNy4uOGJjYWMwMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmQ29tcGFyYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlZkNvbXBhcmF0b3IuamF2YQpAQCAtNjIsNyArNjIsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGNvbXBhcmUoZmluYWwgUmVmIG8xLCBmaW5hbCBSZWYgbzIpIHsKKwlwdWJsaWMgaW50IGNvbXBhcmUoUmVmIG8xLCBSZWYgbzIpIHsKIAkJcmV0dXJuIGNvbXBhcmVUbyhvMSwgbzIpOwogCX0KIApAQCAtNzMsNyArNzMsNyBAQAogCSAqICAgICAgICAgICAgY29sbGVjdGlvbiB0byBiZSBzb3J0ZWQKIAkgKiBAcmV0dXJuIHNvcnRlZCBjb2xsZWN0aW9uIG9mIHJlZnMKIAkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248UmVmPiBzb3J0KGZpbmFsIENvbGxlY3Rpb248UmVmPiByZWZzKSB7CisJcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPFJlZj4gc29ydChDb2xsZWN0aW9uPFJlZj4gcmVmcykgewogCQlmaW5hbCBMaXN0PFJlZj4gciA9IG5ldyBBcnJheUxpc3Q8PihyZWZzKTsKIAkJQ29sbGVjdGlvbnMuc29ydChyLCBJTlNUQU5DRSk7CiAJCXJldHVybiByOwpAQCAtMTAxLDcgKzEwMSw3IEBACiAJICogICAgICAgICAgICB0aGUgb3RoZXIgcmVmZXJlbmNlIGluc3RhbmNlLgogCSAqIEByZXR1cm4gc3RhbmRhcmQgQ29tcGFyYXRvciByZXN1bHQgb2YgJmx0OyAwLCAwLCAmZ3Q7IDAuCiAJICovCi0JcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKGZpbmFsIFJlZiBvMSwgZmluYWwgUmVmIG8yKSB7CisJcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKFJlZiBvMSwgUmVmIG8yKSB7CiAJCXJldHVybiBvMS5nZXROYW1lKCkuY29tcGFyZVRvKG8yLmdldE5hbWUoKSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmRGF0YWJhc2UuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlZkRhdGFiYXNlLmphdmEKaW5kZXggNTU3YmRiOS4uMzE3MDc4NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmRGF0YWJhc2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZEYXRhYmFzZS5qYXZhCkBAIC00Myw2ICs0Myw4IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5saWI7CiAKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdDsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKQEAgLTg5LDcgKzkxLDEwIEBACiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NZTUJPTElDX1JFRl9ERVBUSCA9IDU7CiAKLQkvKiogTWFnaWMgdmFsdWUgZm9yIHtAbGluayAjZ2V0UmVmcyhTdHJpbmcpfSB0byByZXR1cm4gYWxsIHJlZmVyZW5jZXMuICovCisJLyoqCisJICogTWFnaWMgdmFsdWUgZm9yIHtAbGluayAjZ2V0UmVmc0J5UHJlZml4KFN0cmluZyl9IHRvIHJldHVybiBhbGwKKwkgKiByZWZlcmVuY2VzLgorCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTCA9ICIiOy8vJE5PTi1OTFMtMSQKIAogCS8qKgpAQCAtMzMyLDYgKzMzNywyOSBAQAogCX0KIAogCS8qKgorCSAqIFJldHVybnMgYWxsIHJlZnMuCisJICogPHA+CisJICogVGhpcyBpbmNsdWRlcyB7QGNvZGUgSEVBRH0sIGJyYW5jaGVzIHVuZGVyIHtAY29kZSByZWYvaGVhZHMvfSwgdGFncworCSAqIHVuZGVyIHtAY29kZSByZWZzL3RhZ3MvfSwgZXRjLiBJdCBkb2VzIG5vdCBpbmNsdWRlIHBzZXVkby1yZWZzIGxpa2UKKwkgKiB7QGNvZGUgRkVUQ0hfSEVBRH07IGZvciB0aG9zZSwgc2VlIHtAbGluayAjZ2V0QWRkaXRpb25hbFJlZnN9LgorCSAqIDxwPgorCSAqIFN5bWJvbGljIHJlZmVyZW5jZXMgdG8gYSBub24tZXhpc3RlbnQgcmVmIChmb3IgZXhhbXBsZSwKKwkgKiB7QGNvZGUgSEVBRH0gcG9pbnRpbmcgdG8gYSBicmFuY2ggeWV0IHRvIGJlIGJvcm4pIGFyZSBub3QgaW5jbHVkZWQuCisJICogPHA+CisJICogQ2FsbGVycyBpbnRlcmVzdGVkIGluIG9ubHkgYSBwb3J0aW9uIG9mIHRoZSByZWYgaGllcmFyY2h5IGNhbiBjYWxsCisJICoge0BsaW5rICNnZXRSZWZzQnlQcmVmaXh9IGluc3RlYWQuCisJICoKKwkgKiBAcmV0dXJuIGltbXV0YWJsZSBsaXN0IG9mIGFsbCByZWZzLgorCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIHRoZSByZWZlcmVuY2Ugc3BhY2UgY2Fubm90IGJlIGFjY2Vzc2VkLgorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlATm9uTnVsbAorCXB1YmxpYyBMaXN0PFJlZj4gZ2V0UmVmcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiBnZXRSZWZzQnlQcmVmaXgoQUxMKTsKKwl9CisKKwkvKioKIAkgKiBHZXQgYSBzZWN0aW9uIG9mIHRoZSByZWZlcmVuY2UgbmFtZXNwYWNlLgogCSAqCiAJICogQHBhcmFtIHByZWZpeApAQCAtMzQzLDE2ICszNzEsNzMgQEAKIAkgKiAgICAgICAgIG9mIGVhY2gga2V5LiBUaGUgbWFwIGNhbiBiZSBhbiB1bnNvcnRlZCBtYXAuCiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIHJlZmVyZW5jZSBzcGFjZSBjYW5ub3QgYmUgYWNjZXNzZWQuCisJICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjZ2V0UmVmc0J5UHJlZml4fSBpbnN0ZWFkCiAJICovCiAJQE5vbk51bGwKKwlARGVwcmVjYXRlZAogCXB1YmxpYyBhYnN0cmFjdCBNYXA8U3RyaW5nLCBSZWY+IGdldFJlZnMoU3RyaW5nIHByZWZpeCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAJLyoqCisJICogUmV0dXJucyByZWZzIHdob3NlIG5hbWVzIHN0YXJ0IHdpdGggYSBnaXZlbiBwcmVmaXguCisJICogPHA+CisJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdXNlcyB7QGxpbmsgI2dldFJlZnMoU3RyaW5nKX0uIEltcGxlbWVudG9ycyBvZgorCSAqIHtAbGluayBSZWZEYXRhYmFzZX0gc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGRpcmVjdGx5IGlmIGEgYmV0dGVyCisJICogaW1wbGVtZW50YXRpb24gaXMgcG9zc2libGUuCisJICoKKwkgKiBAcGFyYW0gcHJlZml4IHN0cmluZyB0aGF0IG5hbWVzIG9mIHJlZnMgc2hvdWxkIHN0YXJ0IHdpdGg7IG1heSBiZQorCSAqICAgICAgICAgICAgIGVtcHR5ICh0byByZXR1cm4gYWxsIHJlZnMpLgorCSAqIEByZXR1cm4gaW1tdXRhYmxlIGxpc3Qgb2YgcmVmcyB3aG9zZSBuYW1lcyBzdGFydCB3aXRoIHtAY29kZSBwcmVmaXh9LgorCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIHRoZSByZWZlcmVuY2Ugc3BhY2UgY2Fubm90IGJlIGFjY2Vzc2VkLgorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlATm9uTnVsbAorCXB1YmxpYyBMaXN0PFJlZj4gZ2V0UmVmc0J5UHJlZml4KFN0cmluZyBwcmVmaXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCU1hcDxTdHJpbmcsIFJlZj4gY29hcnNlUmVmczsKKwkJaW50IGxhc3RTbGFzaCA9IHByZWZpeC5sYXN0SW5kZXhPZignLycpOworCQlpZiAobGFzdFNsYXNoID09IC0xKSB7CisJCQljb2Fyc2VSZWZzID0gZ2V0UmVmcyhBTEwpOworCQl9IGVsc2UgeworCQkJY29hcnNlUmVmcyA9IGdldFJlZnMocHJlZml4LnN1YnN0cmluZygwLCBsYXN0U2xhc2ggKyAxKSk7CisJCX0KKworCQlMaXN0PFJlZj4gcmVzdWx0OworCQlpZiAobGFzdFNsYXNoICsgMSA9PSBwcmVmaXgubGVuZ3RoKCkpIHsKKwkJCXJlc3VsdCA9IGNvYXJzZVJlZnMudmFsdWVzKCkuc3RyZWFtKCkuY29sbGVjdCh0b0xpc3QoKSk7CisJCX0gZWxzZSB7CisJCQlTdHJpbmcgcCA9IHByZWZpeC5zdWJzdHJpbmcobGFzdFNsYXNoICsgMSk7CisJCQlyZXN1bHQgPSBjb2Fyc2VSZWZzLmVudHJ5U2V0KCkuc3RyZWFtKCkKKwkJCQkJLmZpbHRlcihlIC0+IGUuZ2V0S2V5KCkuc3RhcnRzV2l0aChwKSkKKwkJCQkJLm1hcChlIC0+IGUuZ2V0VmFsdWUoKSkKKwkJCQkJLmNvbGxlY3QodG9MaXN0KCkpOworCQl9CisJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHJlc3VsdCk7CisJfQorCisJLyoqCisJICogQ2hlY2sgaWYgYW55IHJlZnMgZXhpc3QgaW4gdGhlIHJlZiBkYXRhYmFzZS4KKwkgKiA8cD4KKwkgKiBUaGlzIHVzZXMgdGhlIHNhbWUgZGVmaW5pdGlvbiBvZiByZWZzIGFzIHtAbGluayAjZ2V0UmVmcygpfS4gSW4KKwkgKiBwYXJ0aWN1bGFyLCByZXR1cm5zIHtAY29kZSBmYWxzZX0gaW4gYSBuZXcgcmVwb3NpdG9yeSB3aXRoIG5vIHJlZnMKKwkgKiB1bmRlciB7QGNvZGUgcmVmcy99IGFuZCB7QGNvZGUgSEVBRH0gcG9pbnRpbmcgdG8gYSBicmFuY2ggeWV0IHRvIGJlCisJICogYm9ybiwgYW5kIHJldHVybnMge0Bjb2RlIHRydWV9IGluIGEgcmVwb3NpdG9yeSB3aXRoIG5vIHJlZnMgdW5kZXIKKwkgKiB7QGNvZGUgcmVmcy99IGFuZCBhIGRldGFjaGVkIHtAY29kZSBIRUFEfSBwb2ludGluZyB0byBoaXN0b3J5LgorCSAqCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBkYXRhYmFzZSBoYXMgcmVmcy4KKwkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKwkgKiAgICAgICAgICAgICB0aGUgcmVmZXJlbmNlIHNwYWNlIGNhbm5vdCBiZSBhY2Nlc3NlZC4KKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIGJvb2xlYW4gaGFzUmVmcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiAhZ2V0UmVmcygpLmlzRW1wdHkoKTsKKwl9CisKKwkvKioKIAkgKiBHZXQgdGhlIGFkZGl0aW9uYWwgcmVmZXJlbmNlLWxpa2UgZW50aXRpZXMgZnJvbSB0aGUgcmVwb3NpdG9yeS4KIAkgKiA8cD4KIAkgKiBUaGUgcmVzdWx0IGxpc3QgaW5jbHVkZXMgbm9uLXJlZiBpdGVtcyBzdWNoIGFzIE1FUkdFX0hFQUQgYW5kCiAJICogRkVUQ0hfUkVTVUxUIGNhc3QgdG8gYmUgcmVmcy4gVGhlIG5hbWVzIG9mIHRoZXNlIHJlZnMgYXJlIG5vdCByZXR1cm5lZCBieQotCSAqIDxjb2RlPmdldFJlZnMoQUxMKTwvY29kZT4gYnV0IGFyZSBhY2NlcHRlZCBieSB7QGxpbmsgI2dldFJlZihTdHJpbmcpfQorCSAqIDxjb2RlPmdldFJlZnMoKTwvY29kZT4gYnV0IGFyZSBhY2NlcHRlZCBieSB7QGxpbmsgI2dldFJlZihTdHJpbmcpfQogCSAqIGFuZCB7QGxpbmsgI2V4YWN0UmVmKFN0cmluZyl9LgogCSAqCiAJICogQHJldHVybiBhIGxpc3Qgb2YgYWRkaXRpb25hbCByZWZzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZSZW5hbWUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlZlJlbmFtZS5qYXZhCmluZGV4IDNkMjJiYjAuLmEwNWRhYTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlZlJlbmFtZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlZlJlbmFtZS5qYXZhCkBAIC03Myw3ICs3Myw3IEBACiAJICogQHBhcmFtIGRzdAogCSAqICAgICAgICAgICAgb3BlcmF0aW9uIHRvIGNyZWF0ZSAob3Igb3ZlcndyaXRlKSB0aGUgZGVzdGluYXRpb24uCiAJICovCi0JcHJvdGVjdGVkIFJlZlJlbmFtZShmaW5hbCBSZWZVcGRhdGUgc3JjLCBmaW5hbCBSZWZVcGRhdGUgZHN0KSB7CisJcHJvdGVjdGVkIFJlZlJlbmFtZShSZWZVcGRhdGUgc3JjLCBSZWZVcGRhdGUgZHN0KSB7CiAJCXNvdXJjZSA9IHNyYzsKIAkJZGVzdGluYXRpb24gPSBkc3Q7CiAKQEAgLTEwNyw3ICsxMDcsNyBAQAogCSAqICAgICAgICAgICAgYXV0b21hdGljYWxseSBkZXRlcm1pbmVkIGJhc2VkIG9uIHRoZSByZXBvc2l0b3J5CiAJICogICAgICAgICAgICBjb25maWd1cmF0aW9uLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZkxvZ0lkZW50KGZpbmFsIFBlcnNvbklkZW50IHBpKSB7CisJcHVibGljIHZvaWQgc2V0UmVmTG9nSWRlbnQoUGVyc29uSWRlbnQgcGkpIHsKIAkJZGVzdGluYXRpb24uc2V0UmVmTG9nSWRlbnQocGkpOwogCX0KIApAQCAtMTI3LDcgKzEyNyw3IEBACiAJICogQHBhcmFtIG1zZwogCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gZGVzY3JpYmUgdGhpcyBjaGFuZ2UuCiAJICovCi0JcHVibGljIHZvaWQgc2V0UmVmTG9nTWVzc2FnZShmaW5hbCBTdHJpbmcgbXNnKSB7CisJcHVibGljIHZvaWQgc2V0UmVmTG9nTWVzc2FnZShTdHJpbmcgbXNnKSB7CiAJCWlmIChtc2cgPT0gbnVsbCkKIAkJCWRpc2FibGVSZWZMb2coKTsKIAkJZWxzZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmVXBkYXRlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZVcGRhdGUuamF2YQppbmRleCAwNmE3NTc2Li41Y2Q1OTNlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZVcGRhdGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZVcGRhdGUuamF2YQpAQCAtMjI3LDcgKzIyNyw3IEBACiAJICogQHBhcmFtIHJlZgogCSAqICAgICAgICAgICAgdGhlIHJlZmVyZW5jZSB0aGF0IHdpbGwgYmUgdXBkYXRlZCBieSB0aGlzIG9wZXJhdGlvbi4KIAkgKi8KLQlwcm90ZWN0ZWQgUmVmVXBkYXRlKGZpbmFsIFJlZiByZWYpIHsKKwlwcm90ZWN0ZWQgUmVmVXBkYXRlKFJlZiByZWYpIHsKIAkJdGhpcy5yZWYgPSByZWY7CiAJCW9sZFZhbHVlID0gcmVmLmdldE9iamVjdElkKCk7CiAJCXJlZkxvZ01lc3NhZ2UgPSAiIjsgLy8kTk9OLU5MUy0xJApAQCAtMzUwLDcgKzM1MCw3IEBACiAJICogQHBhcmFtIGlkCiAJICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldE5ld09iamVjdElkKGZpbmFsIEFueU9iamVjdElkIGlkKSB7CisJcHVibGljIHZvaWQgc2V0TmV3T2JqZWN0SWQoQW55T2JqZWN0SWQgaWQpIHsKIAkJbmV3VmFsdWUgPSBpZC5jb3B5KCk7CiAJfQogCkBAIC0zNzcsNyArMzc3LDcgQEAKIAkgKiAgICAgICAgICAgIFVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQjemVyb0lkKCl9IHRvIGluZGljYXRlCiAJICogICAgICAgICAgICBleHBlY3RhdGlvbiBvZiBhIG5vbi1leGlzdGFudCByZWYuCiAJICovCi0JcHVibGljIHZvaWQgc2V0RXhwZWN0ZWRPbGRPYmplY3RJZChmaW5hbCBBbnlPYmplY3RJZCBpZCkgeworCXB1YmxpYyB2b2lkIHNldEV4cGVjdGVkT2xkT2JqZWN0SWQoQW55T2JqZWN0SWQgaWQpIHsKIAkJZXhwVmFsdWUgPSBpZCAhPSBudWxsID8gaWQudG9PYmplY3RJZCgpIDogbnVsbDsKIAl9CiAKQEAgLTM5Niw3ICszOTYsNyBAQAogCSAqIEBwYXJhbSBiCiAJICogICAgICAgICAgICB0cnVlIGlmIHRoaXMgdXBkYXRlIHNob3VsZCBpZ25vcmUgbWVyZ2UgdGVzdHMuCiAJICovCi0JcHVibGljIHZvaWQgc2V0Rm9yY2VVcGRhdGUoZmluYWwgYm9vbGVhbiBiKSB7CisJcHVibGljIHZvaWQgc2V0Rm9yY2VVcGRhdGUoYm9vbGVhbiBiKSB7CiAJCWZvcmNlID0gYjsKIAl9CiAKQEAgLTQyMSw3ICs0MjEsNyBAQAogCSAqICAgICAgICAgICAgYXV0b21hdGljYWxseSBkZXRlcm1pbmVkIGJhc2VkIG9uIHRoZSByZXBvc2l0b3J5CiAJICogICAgICAgICAgICBjb25maWd1cmF0aW9uLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZkxvZ0lkZW50KGZpbmFsIFBlcnNvbklkZW50IHBpKSB7CisJcHVibGljIHZvaWQgc2V0UmVmTG9nSWRlbnQoUGVyc29uSWRlbnQgcGkpIHsKIAkJcmVmTG9nSWRlbnQgPSBwaTsKIAl9CiAKQEAgLTQ2MSw3ICs0NjEsNyBAQAogCSAqICAgICAgICAgICAgZm9yY2VkLXVwZGF0ZSkgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIHRoZSB1c2VyIHN1cHBsaWVkCiAJICogICAgICAgICAgICBtZXNzYWdlLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZkxvZ01lc3NhZ2UoZmluYWwgU3RyaW5nIG1zZywgZmluYWwgYm9vbGVhbiBhcHBlbmRTdGF0dXMpIHsKKwlwdWJsaWMgdm9pZCBzZXRSZWZMb2dNZXNzYWdlKFN0cmluZyBtc2csIGJvb2xlYW4gYXBwZW5kU3RhdHVzKSB7CiAJCWlmIChtc2cgPT0gbnVsbCAmJiAhYXBwZW5kU3RhdHVzKQogCQkJZGlzYWJsZVJlZkxvZygpOwogCQllbHNlIGlmIChtc2cgPT0gbnVsbCAmJiBhcHBlbmRTdGF0dXMpIHsKQEAgLTYxNSw3ICs2MTUsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGFuIHVuZXhwZWN0ZWQgSU8gZXJyb3Igb2NjdXJyZWQgd2hpbGUgd3JpdGluZyBjaGFuZ2VzLgogCSAqLwotCXB1YmxpYyBSZXN1bHQgdXBkYXRlKGZpbmFsIFJldldhbGsgd2FsaykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgUmVzdWx0IHVwZGF0ZShSZXZXYWxrIHdhbGspIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJlcXVpcmVDYW5Eb1VwZGF0ZSgpOwogCQl0cnkgewogCQkJcmV0dXJuIHJlc3VsdCA9IHVwZGF0ZUltcGwod2FsaywgbmV3IFN0b3JlKCkgewpAQCAtNjU5LDcgKzY1OSw3IEBACiAJICogQHJldHVybiB0aGUgcmVzdWx0IHN0YXR1cyBvZiB0aGUgZGVsZXRlLgogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqLwotCXB1YmxpYyBSZXN1bHQgZGVsZXRlKGZpbmFsIFJldldhbGsgd2FsaykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgUmVzdWx0IGRlbGV0ZShSZXZXYWxrIHdhbGspIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZyBteU5hbWUgPSBkZXRhY2hpbmdTeW1ib2xpY1JlZgogCQkJCT8gZ2V0UmVmKCkuZ2V0TmFtZSgpCiAJCQkJOiBnZXRSZWYoKS5nZXRMZWFmKCkuZ2V0TmFtZSgpOwpAQCAtNzMxLDcgKzczMSw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIFJlc3VsdCB1cGRhdGVJbXBsKGZpbmFsIFJldldhbGsgd2FsaywgZmluYWwgU3RvcmUgc3RvcmUpCisJcHJpdmF0ZSBSZXN1bHQgdXBkYXRlSW1wbChSZXZXYWxrIHdhbGssIFN0b3JlIHN0b3JlKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJUmV2T2JqZWN0IG5ld09iajsKIAkJUmV2T2JqZWN0IG9sZE9iajsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlZldyaXRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmV3JpdGVyLmphdmEKaW5kZXggOTBhMDM1MC4uNzFlZTk2MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmV3JpdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmV3JpdGVyLmphdmEKQEAgLTExNiw3ICsxMTYsNyBAQAogCXB1YmxpYyB2b2lkIHdyaXRlSW5mb1JlZnMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmdXcml0ZXIgdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKIAkJZmluYWwgY2hhcltdIHRtcCA9IG5ldyBjaGFyW0NvbnN0YW50cy5PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSF07Ci0JCWZvciAoZmluYWwgUmVmIHIgOiByZWZzKSB7CisJCWZvciAoUmVmIHIgOiByZWZzKSB7CiAJCQlpZiAoQ29uc3RhbnRzLkhFQUQuZXF1YWxzKHIuZ2V0TmFtZSgpKSkgewogCQkJCS8vIEhpc3RvcmljYWxseSBIRUFEIGhhcyBuZXZlciBiZWVuIHB1Ymxpc2hlZCB0aHJvdWdoCiAJCQkJLy8gdGhlIElORk9fUkVGUyBmaWxlLiBUaGlzIGlzIGEgbWlzdGFrZSwgYnV0IGl0cyB0aGUKQEAgLTE2MSw3ICsxNjEsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIHdyaXRlUGFja2VkUmVmcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWJvb2xlYW4gcGVlbGVkID0gZmFsc2U7Ci0JCWZvciAoZmluYWwgUmVmIHIgOiByZWZzKSB7CisJCWZvciAoUmVmIHIgOiByZWZzKSB7CiAJCQlpZiAoci5nZXRTdG9yYWdlKCkuaXNQYWNrZWQoKSAmJiByLmlzUGVlbGVkKCkpIHsKIAkJCQlwZWVsZWQgPSB0cnVlOwogCQkJCWJyZWFrOwpAQCAtMTc3LDcgKzE3Nyw3IEBACiAJCX0KIAogCQlmaW5hbCBjaGFyW10gdG1wID0gbmV3IGNoYXJbQ29uc3RhbnRzLk9CSkVDVF9JRF9TVFJJTkdfTEVOR1RIXTsKLQkJZm9yIChmaW5hbCBSZWYgciA6IHJlZnMpIHsKKwkJZm9yIChSZWYgciA6IHJlZnMpIHsKIAkJCWlmIChyLmdldFN0b3JhZ2UoKSAhPSBSZWYuU3RvcmFnZS5QQUNLRUQpCiAJCQkJY29udGludWU7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlcG9zaXRvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlcG9zaXRvcnkuamF2YQppbmRleCBkYjVjYWQwLi4yOWNjMTljIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZXBvc2l0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVwb3NpdG9yeS5qYXZhCkBAIC0xNjQsNyArMTY0LDcgQEAKIAkgKiBAcGFyYW0gb3B0aW9ucwogCSAqICAgICAgICAgICAgb3B0aW9ucyB0byBjb25maWd1cmUgdGhlIHJlcG9zaXRvcnkuCiAJICovCi0JcHJvdGVjdGVkIFJlcG9zaXRvcnkoZmluYWwgQmFzZVJlcG9zaXRvcnlCdWlsZGVyIG9wdGlvbnMpIHsKKwlwcm90ZWN0ZWQgUmVwb3NpdG9yeShCYXNlUmVwb3NpdG9yeUJ1aWxkZXIgb3B0aW9ucykgewogCQlnaXREaXIgPSBvcHRpb25zLmdldEdpdERpcigpOwogCQlmcyA9IG9wdGlvbnMuZ2V0RlMoKTsKIAkJd29ya1RyZWUgPSBvcHRpb25zLmdldFdvcmtUcmVlKCk7CkBAIC0zNDQsNyArMzQ0LDcgQEAKIAkgKiAgICAgICAgICAgICB0aGUgb2JqZWN0IHN0b3JlIGNhbm5vdCBiZSBhY2Nlc3NlZC4KIAkgKi8KIAlATm9uTnVsbAotCXB1YmxpYyBPYmplY3RMb2FkZXIgb3BlbihmaW5hbCBBbnlPYmplY3RJZCBvYmplY3RJZCkKKwlwdWJsaWMgT2JqZWN0TG9hZGVyIG9wZW4oQW55T2JqZWN0SWQgb2JqZWN0SWQpCiAJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gZ2V0T2JqZWN0RGF0YWJhc2UoKS5vcGVuKG9iamVjdElkKTsKIAl9CkBAIC0zOTIsNyArMzkyLDcgQEAKIAkgKiAgICAgICAgICAgICB0byB0aGUgYmFzZSByZWYsIGFzIHRoZSBzeW1ib2xpYyByZWYgY291bGQgbm90IGJlIHJlYWQuCiAJICovCiAJQE5vbk51bGwKLQlwdWJsaWMgUmVmVXBkYXRlIHVwZGF0ZVJlZihmaW5hbCBTdHJpbmcgcmVmKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBSZWZVcGRhdGUgdXBkYXRlUmVmKFN0cmluZyByZWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiB1cGRhdGVSZWYocmVmLCBmYWxzZSk7CiAJfQogCkBAIC00MTEsNyArNDExLDcgQEAKIAkgKiAgICAgICAgICAgICB0byB0aGUgYmFzZSByZWYsIGFzIHRoZSBzeW1ib2xpYyByZWYgY291bGQgbm90IGJlIHJlYWQuCiAJICovCiAJQE5vbk51bGwKLQlwdWJsaWMgUmVmVXBkYXRlIHVwZGF0ZVJlZihmaW5hbCBTdHJpbmcgcmVmLCBmaW5hbCBib29sZWFuIGRldGFjaCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgUmVmVXBkYXRlIHVwZGF0ZVJlZihTdHJpbmcgcmVmLCBib29sZWFuIGRldGFjaCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIGdldFJlZkRhdGFiYXNlKCkubmV3VXBkYXRlKHJlZiwgZGV0YWNoKTsKIAl9CiAKQEAgLTQyNyw3ICs0MjcsNyBAQAogCSAqICAgICAgICAgICAgIHRoZSByZW5hbWUgY291bGQgbm90IGJlIHBlcmZvcm1lZC4KIAkgKi8KIAlATm9uTnVsbAotCXB1YmxpYyBSZWZSZW5hbWUgcmVuYW1lUmVmKGZpbmFsIFN0cmluZyBmcm9tUmVmLCBmaW5hbCBTdHJpbmcgdG9SZWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIFJlZlJlbmFtZSByZW5hbWVSZWYoU3RyaW5nIGZyb21SZWYsIFN0cmluZyB0b1JlZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIGdldFJlZkRhdGFiYXNlKCkubmV3UmVuYW1lKGZyb21SZWYsIHRvUmVmKTsKIAl9CiAKQEAgLTQ4MiwxMyArNDgyLDEzIEBACiAJICogICAgICAgICAgICAgb24gc2VyaW91cyBlcnJvcnMKIAkgKi8KIAlATnVsbGFibGUKLQlwdWJsaWMgT2JqZWN0SWQgcmVzb2x2ZShmaW5hbCBTdHJpbmcgcmV2c3RyKQorCXB1YmxpYyBPYmplY3RJZCByZXNvbHZlKFN0cmluZyByZXZzdHIpCiAJCQl0aHJvd3MgQW1iaWd1b3VzT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJUmV2aXNpb25TeW50YXhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJdHJ5IChSZXZXYWxrIHJ3ID0gbmV3IFJldldhbGsodGhpcykpIHsKIAkJCU9iamVjdCByZXNvbHZlZCA9IHJlc29sdmUocncsIHJldnN0cik7CiAJCQlpZiAocmVzb2x2ZWQgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQlmaW5hbCBSZWYgcmVmID0gZ2V0UmVmKChTdHJpbmcpcmVzb2x2ZWQpOworCQkJCWZpbmFsIFJlZiByZWYgPSBmaW5kUmVmKChTdHJpbmcpIHJlc29sdmVkKTsKIAkJCQlyZXR1cm4gcmVmICE9IG51bGwgPyByZWYuZ2V0TGVhZigpLmdldE9iamVjdElkKCkgOiBudWxsOwogCQkJfSBlbHNlIHsKIAkJCQlyZXR1cm4gKE9iamVjdElkKSByZXNvbHZlZDsKQEAgLTUwOSw3ICs1MDksNyBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqLwogCUBOdWxsYWJsZQotCXB1YmxpYyBTdHJpbmcgc2ltcGxpZnkoZmluYWwgU3RyaW5nIHJldnN0cikKKwlwdWJsaWMgU3RyaW5nIHNpbXBsaWZ5KFN0cmluZyByZXZzdHIpCiAJCQl0aHJvd3MgQW1iaWd1b3VzT2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCXRyeSAoUmV2V2FsayBydyA9IG5ldyBSZXZXYWxrKHRoaXMpKSB7CiAJCQlPYmplY3QgcmVzb2x2ZWQgPSByZXNvbHZlKHJ3LCByZXZzdHIpOwpAQCAtNTIzLDcgKzUyMyw3IEBACiAJfQogCiAJQE51bGxhYmxlCi0JcHJpdmF0ZSBPYmplY3QgcmVzb2x2ZShmaW5hbCBSZXZXYWxrIHJ3LCBmaW5hbCBTdHJpbmcgcmV2c3RyKQorCXByaXZhdGUgT2JqZWN0IHJlc29sdmUoUmV2V2FsayBydywgU3RyaW5nIHJldnN0cikKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWNoYXJbXSByZXZDaGFycyA9IHJldnN0ci50b0NoYXJBcnJheSgpOwogCQlSZXZPYmplY3QgcmV2ID0gbnVsbDsKQEAgLTY4OCw2ICs2ODgsOCBAQAogCQkJY2FzZSAnQCc6CiAJCQkJaWYgKHJldiAhPSBudWxsKQogCQkJCQl0aHJvdyBuZXcgUmV2aXNpb25TeW50YXhFeGNlcHRpb24ocmV2c3RyKTsKKwkJCQlpZiAoaSArIDEgPT0gcmV2Q2hhcnMubGVuZ3RoKQorCQkJCQljb250aW51ZTsKIAkJCQlpZiAoaSArIDEgPCByZXZDaGFycy5sZW5ndGggJiYgcmV2Q2hhcnNbaSArIDFdICE9ICd7JykKIAkJCQkJY29udGludWU7CiAJCQkJaW50IG07CkBAIC03MTEsNyArNzEzLDcgQEAKIAkJCQkJCQkJCS5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuaW52YWxpZFJlZk5hbWUsCiAJCQkJCQkJCQkJCW5hbWUpLAogCQkJCQkJCQkJcmV2c3RyKTsKLQkJCQkJCVJlZiByZWYgPSBnZXRSZWYobmFtZSk7CisJCQkJCQlSZWYgcmVmID0gZmluZFJlZihuYW1lKTsKIAkJCQkJCW5hbWUgPSBudWxsOwogCQkJCQkJaWYgKHJlZiA9PSBudWxsKQogCQkJCQkJCXJldHVybiBudWxsOwpAQCAtNzY0LDcgKzc2Niw3IEBACiAJCQkJCQkJCQkuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmludmFsaWRSZWZOYW1lLAogCQkJCQkJCQkJCQluYW1lKSwKIAkJCQkJCQkJCXJldnN0cik7Ci0JCQkJCQlSZWYgcmVmID0gZ2V0UmVmKG5hbWUpOworCQkJCQkJUmVmIHJlZiA9IGZpbmRSZWYobmFtZSk7CiAJCQkJCQluYW1lID0gbnVsbDsKIAkJCQkJCWlmIChyZWYgPT0gbnVsbCkKIAkJCQkJCQlyZXR1cm4gbnVsbDsKQEAgLTgxNSw3ICs4MTcsNyBAQAogCQkJdGhyb3cgbmV3IFJldmlzaW9uU3ludGF4RXhjZXB0aW9uKAogCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5pbnZhbGlkUmVmTmFtZSwgbmFtZSksCiAJCQkJCXJldnN0cik7Ci0JCWlmIChnZXRSZWYobmFtZSkgIT0gbnVsbCkKKwkJaWYgKGZpbmRSZWYobmFtZSkgIT0gbnVsbCkKIAkJCXJldHVybiBuYW1lOwogCQlyZXR1cm4gcmVzb2x2ZVNpbXBsZShuYW1lKTsKIAl9CkBAIC04NDEsNyArODQzLDcgQEAKIAl9CiAKIAlATnVsbGFibGUKLQlwcml2YXRlIE9iamVjdElkIHJlc29sdmVTaW1wbGUoZmluYWwgU3RyaW5nIHJldnN0cikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIE9iamVjdElkIHJlc29sdmVTaW1wbGUoU3RyaW5nIHJldnN0cikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKE9iamVjdElkLmlzSWQocmV2c3RyKSkKIAkJCXJldHVybiBPYmplY3RJZC5mcm9tU3RyaW5nKHJldnN0cik7CiAKQEAgLTkxMSw3ICs5MTMsNyBAQAogCX0KIAogCUBOdWxsYWJsZQotCXByaXZhdGUgT2JqZWN0SWQgcmVzb2x2ZUFiYnJldmlhdGlvbihmaW5hbCBTdHJpbmcgcmV2c3RyKSB0aHJvd3MgSU9FeGNlcHRpb24sCisJcHJpdmF0ZSBPYmplY3RJZCByZXNvbHZlQWJicmV2aWF0aW9uKFN0cmluZyByZXZzdHIpIHRocm93cyBJT0V4Y2VwdGlvbiwKIAkJCUFtYmlndW91c09iamVjdEV4Y2VwdGlvbiB7CiAJCUFiYnJldmlhdGVkT2JqZWN0SWQgaWQgPSBBYmJyZXZpYXRlZE9iamVjdElkLmZyb21TdHJpbmcocmV2c3RyKTsKIAkJdHJ5IChPYmplY3RSZWFkZXIgcmVhZGVyID0gbmV3T2JqZWN0UmVhZGVyKCkpIHsKQEAgLTEwNTksMjQgKzEwNjEsNiBAQAogCSAqIEdldCBhIHJlZiBieSBuYW1lLgogCSAqCiAJICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSByZWYgdG8gbG9va3VwLiBNYXkgYmUgYSBzaG9ydC1oYW5kIGZvcm0sIGUuZy4KLQkgKiAgICAgICAgICAgICJtYXN0ZXIiIHdoaWNoIGlzIGlzIGF1dG9tYXRpY2FsbHkgZXhwYW5kZWQgdG8KLQkgKiAgICAgICAgICAgICJyZWZzL2hlYWRzL21hc3RlciIgaWYgInJlZnMvaGVhZHMvbWFzdGVyIiBhbHJlYWR5IGV4aXN0cy4KLQkgKiBAcmV0dXJuIHRoZSBSZWYgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3Ige0Bjb2RlIG51bGx9IGlmIGl0IGRvZXMgbm90IGV4aXN0Ci0JICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZXhhY3RSZWYoU3RyaW5nKX0gb3Ige0BsaW5rICNmaW5kUmVmKFN0cmluZyl9Ci0JICogaW5zdGVhZC4KLQkgKi8KLQlARGVwcmVjYXRlZAotCUBOdWxsYWJsZQotCXB1YmxpYyBSZWYgZ2V0UmVmKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZmluZFJlZihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYSByZWYgYnkgbmFtZS4KLQkgKgotCSAqIEBwYXJhbSBuYW1lCiAJICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcmVmIHRvIGxvb2t1cC4gTXVzdCBub3QgYmUgYSBzaG9ydC1oYW5kCiAJICogICAgICAgICAgICBmb3JtOyBlLmcuLCAibWFzdGVyIiBpcyBub3QgYXV0b21hdGljYWxseSBleHBhbmRlZCB0bwogCSAqICAgICAgICAgICAgInJlZnMvaGVhZHMvbWFzdGVyIi4KQEAgLTEwODUsNyArMTA2OSw3IEBACiAJICogQHNpbmNlIDQuMgogCSAqLwogCUBOdWxsYWJsZQotCXB1YmxpYyBSZWYgZXhhY3RSZWYoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIGZpbmFsIFJlZiBleGFjdFJlZihTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIGdldFJlZkRhdGFiYXNlKCkuZXhhY3RSZWYobmFtZSk7CiAJfQogCkBAIC0xMTAxLDcgKzEwODUsNyBAQAogCSAqIEBzaW5jZSA0LjIKIAkgKi8KIAlATnVsbGFibGUKLQlwdWJsaWMgUmVmIGZpbmRSZWYoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIGZpbmFsIFJlZiBmaW5kUmVmKFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWYobmFtZSk7CiAJfQogCkBAIC0xMTI2LDcgKzExMTAsOSBAQAogCSAqIEByZXR1cm4gbXV0YWJsZSBtYXAgb2YgYWxsIHRhZ3M7IGtleSBpcyBzaG9ydCB0YWcgbmFtZSAoInYxLjAiKSBhbmQgdmFsdWUKIAkgKiAgICAgICAgIG9mIHRoZSBlbnRyeSBjb250YWlucyB0aGUgcmVmIHdpdGggdGhlIGZ1bGwgdGFnIG5hbWUKIAkgKiAgICAgICAgICgicmVmcy90YWdzL3YxLjAiKS4KKwkgKiBAZGVwcmVjYXRlZCB1c2Uge0Bjb2RlIGdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmc0J5UHJlZml4KFJfVEFHUyl9IGluc3RlYWQKIAkgKi8KKwlARGVwcmVjYXRlZAogCUBOb25OdWxsCiAJcHVibGljIE1hcDxTdHJpbmcsIFJlZj4gZ2V0VGFncygpIHsKIAkJdHJ5IHsKQEAgLTExNDksOSArMTEzNSwxMSBAQAogCSAqICAgICAgICAgbmV3IFJlZiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzYW1lIGRhdGEgYXMgUmVmLCBidXQgaXNQZWVsZWQoKQogCSAqICAgICAgICAgd2lsbCBiZSB0cnVlIGFuZCBnZXRQZWVsZWRPYmplY3RJZCB3aWxsIGNvbnRhaW4gdGhlIHBlZWxlZCBvYmplY3QKIAkgKiAgICAgICAgIChvciBudWxsKS4KKwkgKiBAZGVwcmVjYXRlZCB1c2Uge0Bjb2RlIGdldFJlZkRhdGFiYXNlKCkucGVlbChyZWYpfSBpbnN0ZWFkLgogCSAqLworCUBEZXByZWNhdGVkCiAJQE5vbk51bGwKLQlwdWJsaWMgUmVmIHBlZWwoZmluYWwgUmVmIHJlZikgeworCXB1YmxpYyBSZWYgcGVlbChSZWYgcmVmKSB7CiAJCXRyeSB7CiAJCQlyZXR1cm4gZ2V0UmVmRGF0YWJhc2UoKS5wZWVsKHJlZik7CiAJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKQEAgLTEyODUsNyArMTI3Myw3IEBACiAJCUluZGV4Q2hhbmdlZExpc3RlbmVyIGwgPSBuZXcgSW5kZXhDaGFuZ2VkTGlzdGVuZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIG9uSW5kZXhDaGFuZ2VkKEluZGV4Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJbm90aWZ5SW5kZXhDaGFuZ2VkKCk7CisJCQkJbm90aWZ5SW5kZXhDaGFuZ2VkKHRydWUpOwogCQkJfQogCQl9OwogCQlyZXR1cm4gRGlyQ2FjaGUubG9jayh0aGlzLCBsKTsKQEAgLTEzNzgsNyArMTM2Niw3IEBACiAJICogQHBhcmFtIHJlZk5hbWUgYSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30gb2JqZWN0LgogCSAqIEByZXR1cm4gdHJ1ZSBpZiByZWZOYW1lIGlzIGEgdmFsaWQgcmVmIG5hbWUKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFJlZk5hbWUoZmluYWwgU3RyaW5nIHJlZk5hbWUpIHsKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFJlZk5hbWUoU3RyaW5nIHJlZk5hbWUpIHsKIAkJZmluYWwgaW50IGxlbiA9IHJlZk5hbWUubGVuZ3RoKCk7CiAJCWlmIChsZW4gPT0gMCkgewogCQkJcmV0dXJuIGZhbHNlOwpAQCAtMTU4MCwxNiArMTU2OCwyMiBAQAogCX0KIAogCS8qKgotCSAqIEZvcmNlIGEgc2NhbiBmb3IgY2hhbmdlZCByZWZzLgorCSAqIEZvcmNlIGEgc2NhbiBmb3IgY2hhbmdlZCByZWZzLiBGaXJlcyBhbiBJbmRleENoYW5nZWRFdmVudChmYWxzZSkgaWYKKwkgKiBjaGFuZ2VzIGFyZSBkZXRlY3RlZC4KIAkgKgogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqLwogCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNjYW5Gb3JSZXBvQ2hhbmdlcygpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogCS8qKgotCSAqIE5vdGlmeSB0aGF0IHRoZSBpbmRleCBjaGFuZ2VkCisJICogTm90aWZ5IHRoYXQgdGhlIGluZGV4IGNoYW5nZWQgYnkgZmlyaW5nIGFuIEluZGV4Q2hhbmdlZEV2ZW50LgorCSAqCisJICogQHBhcmFtIGludGVybmFsCisJICogICAgICAgICAgICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGluZGV4IHdhcyBjaGFuZ2VkIGJ5IHRoZSBzYW1lCisJICogICAgICAgICAgICAgICAgICAgICBKR2l0IHByb2Nlc3MKKwkgKiBAc2luY2UgNS4wCiAJICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgbm90aWZ5SW5kZXhDaGFuZ2VkKCk7CisJcHVibGljIGFic3RyYWN0IHZvaWQgbm90aWZ5SW5kZXhDaGFuZ2VkKGJvb2xlYW4gaW50ZXJuYWwpOwogCiAJLyoqCiAJICogR2V0IGEgc2hvcnRlbmVkIG1vcmUgdXNlciBmcmllbmRseSByZWYgbmFtZQpAQCAtMTk2OCwxMSArMTk2Miw4IEBACiAKIAlwcml2YXRlIHZvaWQgd3JpdGVDb21taXRNc2coRmlsZSBtc2dGaWxlLCBTdHJpbmcgbXNnKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obXNnRmlsZSk7Ci0JCQl0cnkgeworCQkJdHJ5IChGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG1zZ0ZpbGUpKSB7CiAJCQkJZm9zLndyaXRlKG1zZy5nZXRCeXRlcyhDb25zdGFudHMuQ0hBUkFDVEVSX0VOQ09ESU5HKSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWZvcy5jbG9zZSgpOwogCQkJfQogCQl9IGVsc2UgewogCQkJRmlsZVV0aWxzLmRlbGV0ZShtc2dGaWxlLCBGaWxlVXRpbHMuU0tJUF9NSVNTSU5HKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlcG9zaXRvcnlDYWNoZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVwb3NpdG9yeUNhY2hlLmphdmEKaW5kZXggY2U3Y2U4Yy4uNDAwMzQyYjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlcG9zaXRvcnlDYWNoZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlcG9zaXRvcnlDYWNoZS5qYXZhCkBAIC04OCw3ICs4OCw3IEBACiAJICogQHRocm93cyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGVyZSBpcyBubyByZXBvc2l0b3J5IGF0IHRoZSBnaXZlbiBsb2NhdGlvbi4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFJlcG9zaXRvcnkgb3BlbihmaW5hbCBLZXkgbG9jYXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiwKKwlwdWJsaWMgc3RhdGljIFJlcG9zaXRvcnkgb3BlbihLZXkgbG9jYXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiwKIAkJCVJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbiB7CiAJCXJldHVybiBvcGVuKGxvY2F0aW9uLCB0cnVlKTsKIAl9CkBAIC0xMTUsNyArMTE1LDcgQEAKIAkgKiAgICAgICAgICAgICBUaGVyZSBpcyBubyByZXBvc2l0b3J5IGF0IHRoZSBnaXZlbiBsb2NhdGlvbiwgb25seSB0aHJvd24gaWYKIAkgKiAgICAgICAgICAgICB7QGNvZGUgbXVzdEV4aXN0fSBpcyB0cnVlLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVwb3NpdG9yeSBvcGVuKGZpbmFsIEtleSBsb2NhdGlvbiwgZmluYWwgYm9vbGVhbiBtdXN0RXhpc3QpCisJcHVibGljIHN0YXRpYyBSZXBvc2l0b3J5IG9wZW4oS2V5IGxvY2F0aW9uLCBib29sZWFuIG11c3RFeGlzdCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBjYWNoZS5vcGVuUmVwb3NpdG9yeShsb2NhdGlvbiwgbXVzdEV4aXN0KTsKIAl9CkBAIC0xMzUsNyArMTM1LDcgQEAKIAkgKiBAcGFyYW0gZGIKIAkgKiAgICAgICAgICAgIHJlcG9zaXRvcnkgdG8gcmVnaXN0ZXIuCiAJICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyKGZpbmFsIFJlcG9zaXRvcnkgZGIpIHsKKwlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoUmVwb3NpdG9yeSBkYikgewogCQlpZiAoZGIuZ2V0RGlyZWN0b3J5KCkgIT0gbnVsbCkgewogCQkJRmlsZUtleSBrZXkgPSBGaWxlS2V5LmV4YWN0KGRiLmdldERpcmVjdG9yeSgpLCBkYi5nZXRGUygpKTsKIAkJCWNhY2hlLnJlZ2lzdGVyUmVwb3NpdG9yeShrZXksIGRiKTsKQEAgLTE1MSw3ICsxNTEsNyBAQAogCSAqIEBwYXJhbSBkYgogCSAqICAgICAgICAgICAgcmVwb3NpdG9yeSB0byB1bnJlZ2lzdGVyLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZShATm9uTnVsbCBmaW5hbCBSZXBvc2l0b3J5IGRiKSB7CisJcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlKEBOb25OdWxsIFJlcG9zaXRvcnkgZGIpIHsKIAkJaWYgKGRiLmdldERpcmVjdG9yeSgpICE9IG51bGwpIHsKIAkJCUZpbGVLZXkga2V5ID0gRmlsZUtleS5leGFjdChkYi5nZXREaXJlY3RvcnkoKSwgZGIuZ2V0RlMoKSk7CiAJCQljYWNoZS51bnJlZ2lzdGVyQW5kQ2xvc2VSZXBvc2l0b3J5KGtleSk7CkBAIC0xNzAsNyArMTcwLDcgQEAKIAkgKiAgICAgICAgICAgIHJlcG9zaXRvcnkgdG8gdW5yZWdpc3Rlci4KIAkgKiBAc2luY2UgNC4zCiAJICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVucmVnaXN0ZXIoZmluYWwgUmVwb3NpdG9yeSBkYikgeworCXB1YmxpYyBzdGF0aWMgdm9pZCB1bnJlZ2lzdGVyKFJlcG9zaXRvcnkgZGIpIHsKIAkJaWYgKGRiLmdldERpcmVjdG9yeSgpICE9IG51bGwpIHsKIAkJCXVucmVnaXN0ZXIoRmlsZUtleS5leGFjdChkYi5nZXREaXJlY3RvcnkoKSwgZGIuZ2V0RlMoKSkpOwogCQl9CkBAIC0yODcsMTMgKzI4NywxMyBAQAogCQlyZXR1cm4gZGI7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyUmVwb3NpdG9yeShmaW5hbCBLZXkgbG9jYXRpb24sIGZpbmFsIFJlcG9zaXRvcnkgZGIpIHsKLQkJUmVwb3NpdG9yeSBvbGREYiA9IGNhY2hlTWFwLnB1dChsb2NhdGlvbiwgZGIpOwotCQlpZiAob2xkRGIgIT0gbnVsbCkKLQkJCW9sZERiLmNsb3NlKCk7CisJcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyUmVwb3NpdG9yeShLZXkgbG9jYXRpb24sIFJlcG9zaXRvcnkgZGIpIHsKKwkJdHJ5IChSZXBvc2l0b3J5IG9sZERiID0gY2FjaGVNYXAucHV0KGxvY2F0aW9uLCBkYikpIHsKKwkJCS8vIG9sZERiIGlzIGF1dG8tY2xvc2VkCisJCX0KIAl9CiAKLQlwcml2YXRlIFJlcG9zaXRvcnkgdW5yZWdpc3RlclJlcG9zaXRvcnkoZmluYWwgS2V5IGxvY2F0aW9uKSB7CisJcHJpdmF0ZSBSZXBvc2l0b3J5IHVucmVnaXN0ZXJSZXBvc2l0b3J5KEtleSBsb2NhdGlvbikgewogCQlyZXR1cm4gY2FjaGVNYXAucmVtb3ZlKGxvY2F0aW9uKTsKIAl9CiAKQEAgLTMwMiw3ICszMDIsNyBAQAogCQkJJiYgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gZGIuY2xvc2VkQXQuZ2V0KCkgPiBleHBpcmVBZnRlcik7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHVucmVnaXN0ZXJBbmRDbG9zZVJlcG9zaXRvcnkoZmluYWwgS2V5IGxvY2F0aW9uKSB7CisJcHJpdmF0ZSB2b2lkIHVucmVnaXN0ZXJBbmRDbG9zZVJlcG9zaXRvcnkoS2V5IGxvY2F0aW9uKSB7CiAJCXN5bmNocm9uaXplZCAobG9ja0Zvcihsb2NhdGlvbikpIHsKIAkJCVJlcG9zaXRvcnkgb2xkRGIgPSB1bnJlZ2lzdGVyUmVwb3NpdG9yeShsb2NhdGlvbik7CiAJCQlpZiAob2xkRGIgIT0gbnVsbCkgewpAQCAtMzI5LDcgKzMyOSw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIExvY2sgbG9ja0ZvcihmaW5hbCBLZXkgbG9jYXRpb24pIHsKKwlwcml2YXRlIExvY2sgbG9ja0ZvcihLZXkgbG9jYXRpb24pIHsKIAkJcmV0dXJuIG9wZW5Mb2Nrc1sobG9jYXRpb24uaGFzaENvZGUoKSA+Pj4gMSkgJSBvcGVuTG9ja3MubGVuZ3RoXTsKIAl9CiAKQEAgLTM4Myw3ICszODMsNyBAQAogCQkgKiBAcmV0dXJuIGEga2V5IGZvciB0aGUgZ2l2ZW4gZGlyZWN0b3J5LgogCQkgKiBAc2VlICNsZW5pZW50KEZpbGUsIEZTKQogCQkgKi8KLQkJcHVibGljIHN0YXRpYyBGaWxlS2V5IGV4YWN0KGZpbmFsIEZpbGUgZGlyZWN0b3J5LCBGUyBmcykgeworCQlwdWJsaWMgc3RhdGljIEZpbGVLZXkgZXhhY3QoRmlsZSBkaXJlY3RvcnksIEZTIGZzKSB7CiAJCQlyZXR1cm4gbmV3IEZpbGVLZXkoZGlyZWN0b3J5LCBmcyk7CiAJCX0KIApAQCAtNDA2LDcgKzQwNiw3IEBACiAJCSAqIEByZXR1cm4gYSBrZXkgZm9yIHRoZSBnaXZlbiBkaXJlY3RvcnkuCiAJCSAqIEBzZWUgI2V4YWN0KEZpbGUsIEZTKQogCQkgKi8KLQkJcHVibGljIHN0YXRpYyBGaWxlS2V5IGxlbmllbnQoZmluYWwgRmlsZSBkaXJlY3RvcnksIEZTIGZzKSB7CisJCXB1YmxpYyBzdGF0aWMgRmlsZUtleSBsZW5pZW50KEZpbGUgZGlyZWN0b3J5LCBGUyBmcykgewogCQkJZmluYWwgRmlsZSBnaXRkaXIgPSByZXNvbHZlKGRpcmVjdG9yeSwgZnMpOwogCQkJcmV0dXJuIG5ldyBGaWxlS2V5KGdpdGRpciAhPSBudWxsID8gZ2l0ZGlyIDogZGlyZWN0b3J5LCBmcyk7CiAJCX0KQEAgLTQyMSwxMiArNDIxLDEyIEBACiAJCSAqICAgICAgICAgICAgdGhlIGZpbGUgc3lzdGVtIGFic3RyYWN0aW9uIHdoaWNoIHdpbGwgYmUgbmVjZXNzYXJ5IHRvCiAJCSAqICAgICAgICAgICAgcGVyZm9ybSBjZXJ0YWluIGZpbGUgc3lzdGVtIG9wZXJhdGlvbnMuCiAJCSAqLwotCQlwcm90ZWN0ZWQgRmlsZUtleShmaW5hbCBGaWxlIGRpcmVjdG9yeSwgRlMgZnMpIHsKKwkJcHJvdGVjdGVkIEZpbGVLZXkoRmlsZSBkaXJlY3RvcnksIEZTIGZzKSB7CiAJCQlwYXRoID0gY2Fub25pY2FsKGRpcmVjdG9yeSk7CiAJCQl0aGlzLmZzID0gZnM7CiAJCX0KIAotCQlwcml2YXRlIHN0YXRpYyBGaWxlIGNhbm9uaWNhbChmaW5hbCBGaWxlIHBhdGgpIHsKKwkJcHJpdmF0ZSBzdGF0aWMgRmlsZSBjYW5vbmljYWwoRmlsZSBwYXRoKSB7CiAJCQl0cnkgewogCQkJCXJldHVybiBwYXRoLmdldENhbm9uaWNhbEZpbGUoKTsKIAkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKQEAgLTQ0MCw3ICs0NDAsNyBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBSZXBvc2l0b3J5IG9wZW4oZmluYWwgYm9vbGVhbiBtdXN0RXhpc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXB1YmxpYyBSZXBvc2l0b3J5IG9wZW4oYm9vbGVhbiBtdXN0RXhpc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlpZiAobXVzdEV4aXN0ICYmICFpc0dpdFJlcG9zaXRvcnkocGF0aCwgZnMpKQogCQkJCXRocm93IG5ldyBSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24ocGF0aCk7CiAJCQlyZXR1cm4gbmV3IEZpbGVSZXBvc2l0b3J5KHBhdGgpOwpAQCAtNDUyLDcgKzQ1Miw3IEBACiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvKSB7CisJCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewogCQkJcmV0dXJuIG8gaW5zdGFuY2VvZiBGaWxlS2V5ICYmIHBhdGguZXF1YWxzKCgoRmlsZUtleSkgbykucGF0aCk7CiAJCX0KIApAQCAtNDc2LDE5ICs0NzYsMTkgQEAKIAkJICogICAgICAgICBpdCBkb2Vzbid0IGxvb2sgZW5vdWdoIGxpa2UgYSBHaXQgZGlyZWN0b3J5IHRvIHJlYWxseSBiZSBhCiAJCSAqICAgICAgICAgR2l0IGRpcmVjdG9yeS4KIAkJICovCi0JCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0dpdFJlcG9zaXRvcnkoZmluYWwgRmlsZSBkaXIsIEZTIGZzKSB7CisJCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0dpdFJlcG9zaXRvcnkoRmlsZSBkaXIsIEZTIGZzKSB7CiAJCQlyZXR1cm4gZnMucmVzb2x2ZShkaXIsICJvYmplY3RzIikuZXhpc3RzKCkgLy8kTk9OLU5MUy0xJAogCQkJCQkmJiBmcy5yZXNvbHZlKGRpciwgInJlZnMiKS5leGlzdHMoKSAvLyROT04tTkxTLTEkCiAJCQkJCSYmIGlzVmFsaWRIZWFkKG5ldyBGaWxlKGRpciwgQ29uc3RhbnRzLkhFQUQpKTsKIAkJfQogCi0JCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEhlYWQoZmluYWwgRmlsZSBoZWFkKSB7CisJCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEhlYWQoRmlsZSBoZWFkKSB7CiAJCQlmaW5hbCBTdHJpbmcgcmVmID0gcmVhZEZpcnN0TGluZShoZWFkKTsKIAkJCXJldHVybiByZWYgIT0gbnVsbAogCQkJCQkmJiAocmVmLnN0YXJ0c1dpdGgoInJlZjogcmVmcy8iKSB8fCBPYmplY3RJZC5pc0lkKHJlZikpOyAvLyROT04tTkxTLTEkCiAJCX0KIAotCQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVhZEZpcnN0TGluZShmaW5hbCBGaWxlIGhlYWQpIHsKKwkJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlYWRGaXJzdExpbmUoRmlsZSBoZWFkKSB7CiAJCQl0cnkgewogCQkJCWZpbmFsIGJ5dGVbXSBidWYgPSBJTy5yZWFkRnVsbHkoaGVhZCwgNDA5Nik7CiAJCQkJaW50IG4gPSBidWYubGVuZ3RoOwpAQCAtNTIxLDcgKzUyMSw3IEBACiAJCSAqIEByZXR1cm4gdGhlIGFjdHVhbCBkaXJlY3RvcnkgbG9jYXRpb24gaWYgYSBiZXR0ZXIgbWF0Y2ggaXMgZm91bmQ7CiAJCSAqICAgICAgICAgbnVsbCBpZiB0aGVyZSBpcyBubyBzdWl0YWJsZSBtYXRjaC4KIAkJICovCi0JCXB1YmxpYyBzdGF0aWMgRmlsZSByZXNvbHZlKGZpbmFsIEZpbGUgZGlyZWN0b3J5LCBGUyBmcykgeworCQlwdWJsaWMgc3RhdGljIEZpbGUgcmVzb2x2ZShGaWxlIGRpcmVjdG9yeSwgRlMgZnMpIHsKIAkJCWlmIChpc0dpdFJlcG9zaXRvcnkoZGlyZWN0b3J5LCBmcykpCiAJCQkJcmV0dXJuIGRpcmVjdG9yeTsKIAkJCWlmIChpc0dpdFJlcG9zaXRvcnkobmV3IEZpbGUoZGlyZWN0b3J5LCBDb25zdGFudHMuRE9UX0dJVCksIGZzKSkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1RhZ0J1aWxkZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1RhZ0J1aWxkZXIuamF2YQppbmRleCAzMmVmNTA0Li5iZDAzMTY1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9UYWdCdWlsZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvVGFnQnVpbGRlci5qYXZhCkBAIC0xNjgsNyArMTY4LDcgQEAKIAkgKiBAcGFyYW0gbmV3TWVzc2FnZQogCSAqICAgICAgICAgICAgdGhlIHRhZydzIG1lc3NhZ2UuCiAJICovCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZShmaW5hbCBTdHJpbmcgbmV3TWVzc2FnZSkgeworCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG5ld01lc3NhZ2UpIHsKIAkJbWVzc2FnZSA9IG5ld01lc3NhZ2U7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9UZXh0UHJvZ3Jlc3NNb25pdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9UZXh0UHJvZ3Jlc3NNb25pdG9yLmphdmEKaW5kZXggOTM2Y2UzZC4uMmY3NTllNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvVGV4dFByb2dyZXNzTW9uaXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1RleHRQcm9ncmVzc01vbml0b3IuamF2YQpAQCAtNDQsNyArNDQsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubGliOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwpAQCAtNjMsNyArNjMsNyBAQAogCSAqIEluaXRpYWxpemUgYSBuZXcgcHJvZ3Jlc3MgbW9uaXRvci4KIAkgKi8KIAlwdWJsaWMgVGV4dFByb2dyZXNzTW9uaXRvcigpIHsKLQkJdGhpcyhuZXcgUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihTeXN0ZW0uZXJyLCBVVEZfOCkpKTsKKwkJdGhpcyhuZXcgUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihTeXN0ZW0uZXJyLCBDSEFSU0VUKSkpOwogCX0KIAogCS8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvVXNlckNvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvVXNlckNvbmZpZy5qYXZhCmluZGV4IDFhM2M2ZjYuLmJmYjVlMmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1VzZXJDb25maWcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Vc2VyQ29uZmlnLmphdmEKQEAgLTcxLDcgKzcxLDcgQEAKIAogCXByaXZhdGUgYm9vbGVhbiBpc0NvbW1pdHRlckVtYWlsSW1wbGljaXQ7CiAKLQlwcml2YXRlIFVzZXJDb25maWcoZmluYWwgQ29uZmlnIHJjKSB7CisJcHJpdmF0ZSBVc2VyQ29uZmlnKENvbmZpZyByYykgewogCQlhdXRob3JOYW1lID0gZ2V0TmFtZUludGVybmFsKHJjLCBDb25zdGFudHMuR0lUX0FVVEhPUl9OQU1FX0tFWSk7CiAJCWlmIChhdXRob3JOYW1lID09IG51bGwpIHsKIAkJCWF1dGhvck5hbWUgPSBnZXREZWZhdWx0VXNlck5hbWUoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvTWVyZ2VTdHJhdGVneS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9NZXJnZVN0cmF0ZWd5LmphdmEKaW5kZXggNTIwZWE2ZS4uOThhNzA2YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9NZXJnZVN0cmF0ZWd5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9NZXJnZVN0cmF0ZWd5LmphdmEKQEAgLTEwMCw3ICsxMDAsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGEgc3RyYXRlZ3kgYnkgdGhlIHNhbWUgbmFtZSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQuCiAJICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyKGZpbmFsIE1lcmdlU3RyYXRlZ3kgaW1wKSB7CisJcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyKE1lcmdlU3RyYXRlZ3kgaW1wKSB7CiAJCXJlZ2lzdGVyKGltcC5nZXROYW1lKCksIGltcCk7CiAJfQogCkBAIC0xMjksNyArMTI5LDcgQEAKIAkgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIHN0cmF0ZWd5IHRvIGxvY2F0ZS4KIAkgKiBAcmV0dXJuIHRoZSBzdHJhdGVneSBpbnN0YW5jZTsgbnVsbCBpZiBubyBzdHJhdGVneSBtYXRjaGVzIHRoZSBuYW1lLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIE1lcmdlU3RyYXRlZ3kgZ2V0KGZpbmFsIFN0cmluZyBuYW1lKSB7CisJcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgTWVyZ2VTdHJhdGVneSBnZXQoU3RyaW5nIG5hbWUpIHsKIAkJcmV0dXJuIFNUUkFURUdJRVMuZ2V0KG5hbWUpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9NZXJnZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvTWVyZ2VyLmphdmEKaW5kZXggY2QxOWQ2OS4uMjVlYjFhZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9NZXJnZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL01lcmdlci5qYXZhCkBAIC0xMTMsNyArMTEzLDcgQEAKIAkgKiBAcGFyYW0gbG9jYWwKIAkgKiAgICAgICAgICAgIHRoZSByZXBvc2l0b3J5IHRoaXMgbWVyZ2VyIHdpbGwgcmVhZCBhbmQgd3JpdGUgZGF0YSBvbi4KIAkgKi8KLQlwcm90ZWN0ZWQgTWVyZ2VyKGZpbmFsIFJlcG9zaXRvcnkgbG9jYWwpIHsKKwlwcm90ZWN0ZWQgTWVyZ2VyKFJlcG9zaXRvcnkgbG9jYWwpIHsKIAkJaWYgKGxvY2FsID09IG51bGwpIHsKIAkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS5yZXBvc2l0b3J5SXNSZXF1aXJlZCk7CiAJCX0KQEAgLTIxNSw3ICsyMTUsNyBAQAogCSAqICAgICAgICAgICAgIG9uZSBvciBtb3JlIHNvdXJjZXMgY291bGQgbm90IGJlIHJlYWQsIG9yIG91dHB1dHMgY291bGQgbm90CiAJICogICAgICAgICAgICAgYmUgd3JpdHRlbiB0byB0aGUgUmVwb3NpdG9yeS4KIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtZXJnZShmaW5hbCBBbnlPYmplY3RJZC4uLiB0aXBzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBib29sZWFuIG1lcmdlKEFueU9iamVjdElkLi4uIHRpcHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBtZXJnZSh0cnVlLCB0aXBzKTsKIAl9CiAKQEAgLTI0Myw3ICsyNDMsNyBAQAogCSAqICAgICAgICAgICAgIG9uZSBvciBtb3JlIHNvdXJjZXMgY291bGQgbm90IGJlIHJlYWQsIG9yIG91dHB1dHMgY291bGQgbm90CiAJICogICAgICAgICAgICAgYmUgd3JpdHRlbiB0byB0aGUgUmVwb3NpdG9yeS4KIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtZXJnZShmaW5hbCBib29sZWFuIGZsdXNoLCBmaW5hbCBBbnlPYmplY3RJZC4uLiB0aXBzKQorCXB1YmxpYyBib29sZWFuIG1lcmdlKGJvb2xlYW4gZmx1c2gsIEFueU9iamVjdElkLi4uIHRpcHMpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlzb3VyY2VPYmplY3RzID0gbmV3IFJldk9iamVjdFt0aXBzLmxlbmd0aF07CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgdGlwcy5sZW5ndGg7IGkrKykKQEAgLTMyOCw3ICszMjgsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSB0cmVlIG9iamVjdCBpcyBub3QgZm91bmQgb3IgY2Fubm90IGJlIHJlYWQuCiAJICovCi0JcHJvdGVjdGVkIEFic3RyYWN0VHJlZUl0ZXJhdG9yIG9wZW5UcmVlKGZpbmFsIEFueU9iamVjdElkIHRyZWVJZCkKKwlwcm90ZWN0ZWQgQWJzdHJhY3RUcmVlSXRlcmF0b3Igb3BlblRyZWUoQW55T2JqZWN0SWQgdHJlZUlkKQogCQkJdGhyb3dzIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIG5ldyBDYW5vbmljYWxUcmVlUGFyc2VyKG51bGwsIHJlYWRlciwgdHJlZUlkKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1Jlc29sdmVNZXJnZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvUmVzb2x2ZU1lcmdlci5qYXZhCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNmY3YTcwMi4uZGE2YTNkYQotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1Jlc29sdmVNZXJnZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1Jlc29sdmVNZXJnZXIuamF2YQpAQCAtNTE2LDYxICs1MTYsNiBAQAogCSAqIEBwYXJhbSBpZ25vcmVDb25mbGljdHMKIAkgKiAgICAgICAgICAgIHNlZQogCSAqICAgICAgICAgICAge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2UuUmVzb2x2ZU1lcmdlciNtZXJnZVRyZWVzKEFic3RyYWN0VHJlZUl0ZXJhdG9yLCBSZXZUcmVlLCBSZXZUcmVlLCBib29sZWFuKX0KLQkgKiBAcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgbWVyZ2Ugd2lsbCBmYWlsIGJlY2F1c2UgdGhlIGluZGV4IGVudHJ5Ci0JICogICAgICAgICBkaWRuJ3QgbWF0Y2ggb3VycyBvciB0aGUgd29ya2luZy1kaXIgZmlsZSB3YXMgZGlydHkgYW5kIGEKLQkgKiAgICAgICAgIGNvbmZsaWN0IG9jY3VycmVkCi0JICogQHRocm93cyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5NaXNzaW5nT2JqZWN0RXhjZXB0aW9uCi0JICogQHRocm93cyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5JbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uCi0JICogQHRocm93cyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Db3JydXB0T2JqZWN0RXhjZXB0aW9uCi0JICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICogQHNpbmNlIDMuNQotCSAqLwotCUBEZXByZWNhdGVkCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0VudHJ5KENhbm9uaWNhbFRyZWVQYXJzZXIgYmFzZSwKLQkJCUNhbm9uaWNhbFRyZWVQYXJzZXIgb3VycywgQ2Fub25pY2FsVHJlZVBhcnNlciB0aGVpcnMsCi0JCQlEaXJDYWNoZUJ1aWxkSXRlcmF0b3IgaW5kZXgsIFdvcmtpbmdUcmVlSXRlcmF0b3Igd29yaywKLQkJCWJvb2xlYW4gaWdub3JlQ29uZmxpY3RzKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKLQkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIENvcnJ1cHRPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHByb2Nlc3NFbnRyeShiYXNlLCBvdXJzLCB0aGVpcnMsIGluZGV4LCB3b3JrLCBpZ25vcmVDb25mbGljdHMsCi0JCQkJbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUHJvY2Vzc2VzIG9uZSBwYXRoIGFuZCB0cmllcyB0byBtZXJnZSB0YWtpbmcgZ2l0IGF0dHJpYnV0ZXMgaW4gYWNjb3VudC4KLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGRvIGFsbCB0cml2aWFsIChub3QgY29udGVudCkgbWVyZ2VzIGFuZCB3aWxsIGFsc28gZGV0ZWN0Ci0JICogaWYgYSBtZXJnZSB3aWxsIGZhaWwuIFRoZSBtZXJnZSB3aWxsIGZhaWwgd2hlbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcwotCSAqIHRydWUKLQkgKiA8dWw+Ci0JICogPGxpPnRoZSBpbmRleCBlbnRyeSBkb2VzIG5vdCBtYXRjaCB0aGUgZW50cnkgaW4gb3Vycy4gV2hlbiBtZXJnaW5nIG9uZQotCSAqIGJyYW5jaCBpbnRvIHRoZSBjdXJyZW50IEhFQUQsIG91cnMgd2lsbCBwb2ludCB0byBIRUFEIGFuZCB0aGVpcnMgd2lsbAotCSAqIHBvaW50IHRvIHRoZSBvdGhlciBicmFuY2guIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgaW5kZXggbWF0Y2hlcyB0aGUgSEVBRAotCSAqIGJlY2F1c2UgaXQgd2lsbCBvbmx5IG5vdCBtYXRjaCBIRUFEIGlmIGl0IHdhcyBwb3B1bGF0ZWQgYmVmb3JlIHRoZSBtZXJnZQotCSAqIG9wZXJhdGlvbi4gQnV0IHRoZSBtZXJnZSBjb21taXQgc2hvdWxkIG5vdCBhY2NpZGVudGFsbHkgY29udGFpbgotCSAqIG1vZGlmaWNhdGlvbnMgZG9uZSBiZWZvcmUgdGhlIG1lcmdlLiBDaGVjayB0aGUgPGEgaHJlZj0KLQkgKiAiaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9zb2Z0d2FyZS9zY20vZ2l0L2RvY3MvZ2l0LXJlYWQtdHJlZS5odG1sI18zX3dheV9tZXJnZSIKLQkgKiA+Z2l0IHJlYWQtdHJlZTwvYT4gZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlciBleHBsYW5hdGlvbnMuPC9saT4KLQkgKiA8bGk+QSBjb25mbGljdCB3YXMgZGV0ZWN0ZWQgYW5kIHRoZSB3b3JraW5nLXRyZWUgZmlsZSBpcyBkaXJ0eS4gV2hlbiBhCi0JICogY29uZmxpY3QgaXMgZGV0ZWN0ZWQgdGhlIGNvbnRlbnQtbWVyZ2UgYWxnb3JpdGhtIHdpbGwgdHJ5IHRvIHdyaXRlIGEKLQkgKiBtZXJnZWQgdmVyc2lvbiBpbnRvIHRoZSB3b3JraW5nLXRyZWUuIElmIHRoZSBmaWxlIGlzIGRpcnR5IHdlIHdvdWxkCi0JICogb3ZlcnJpZGUgdW5zYXZlZCBkYXRhLjwvbGk+Ci0JICogPC91bD4KLQkgKgotCSAqIEBwYXJhbSBiYXNlCi0JICogICAgICAgICAgICB0aGUgY29tbW9uIGJhc2UgZm9yIG91cnMgYW5kIHRoZWlycwotCSAqIEBwYXJhbSBvdXJzCi0JICogICAgICAgICAgICB0aGUgb3VycyBzaWRlIG9mIHRoZSBtZXJnZS4gV2hlbiBtZXJnaW5nIGEgYnJhbmNoIGludG8gdGhlCi0JICogICAgICAgICAgICBIRUFEIG91cnMgd2lsbCBwb2ludCB0byBIRUFECi0JICogQHBhcmFtIHRoZWlycwotCSAqICAgICAgICAgICAgdGhlIHRoZWlycyBzaWRlIG9mIHRoZSBtZXJnZS4gV2hlbiBtZXJnaW5nIGEgYnJhbmNoIGludG8gdGhlCi0JICogICAgICAgICAgICBjdXJyZW50IEhFQUQgdGhlaXJzIHdpbGwgcG9pbnQgdG8gdGhlIGJyYW5jaCB3aGljaCBpcyBtZXJnZWQKLQkgKiAgICAgICAgICAgIGludG8gSEVBRC4KLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIHRoZSBpbmRleCBlbnRyeQotCSAqIEBwYXJhbSB3b3JrCi0JICogICAgICAgICAgICB0aGUgZmlsZSBpbiB0aGUgd29ya2luZyB0cmVlCi0JICogQHBhcmFtIGlnbm9yZUNvbmZsaWN0cwotCSAqICAgICAgICAgICAgc2VlCi0JICogICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5tZXJnZS5SZXNvbHZlTWVyZ2VyI21lcmdlVHJlZXMoQWJzdHJhY3RUcmVlSXRlcmF0b3IsIFJldlRyZWUsIFJldlRyZWUsIGJvb2xlYW4pfQogCSAqIEBwYXJhbSBhdHRyaWJ1dGVzCiAJICogICAgICAgICAgICB0aGUgYXR0cmlidXRlcyBkZWZpbmVkIGZvciB0aGlzIGVudHJ5CiAJICogQHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIG1lcmdlIHdpbGwgZmFpbCBiZWNhdXNlIHRoZSBpbmRleCBlbnRyeQpAQCAtMTA1MCwxMSArOTk1LDExIEBACiAJCXJldHVybiBSYXdUZXh0LmxvYWQobG9hZGVyLCB0aHJlc2hvbGQpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbm9uVHJlZShmaW5hbCBpbnQgbW9kZSkgeworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbm9uVHJlZShpbnQgbW9kZSkgewogCQlyZXR1cm4gbW9kZSAhPSAwICYmICFGaWxlTW9kZS5UUkVFLmVxdWFscyhtb2RlKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzR2l0TGluayhmaW5hbCBpbnQgbW9kZSkgeworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNHaXRMaW5rKGludCBtb2RlKSB7CiAJCXJldHVybiBGaWxlTW9kZS5HSVRMSU5LLmVxdWFscyhtb2RlKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvU3RyYXRlZ3lPbmVTaWRlZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9TdHJhdGVneU9uZVNpZGVkLmphdmEKaW5kZXggOTc5Njg1Yy4uNmUyZTJhYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9TdHJhdGVneU9uZVNpZGVkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9TdHJhdGVneU9uZVNpZGVkLmphdmEKQEAgLTcxLDcgKzcxLDcgQEAKIAkgKiBAcGFyYW0gaW5kZXgKIAkgKiAgICAgICAgICAgIHRoZSBwb3NpdGlvbiBvZiB0aGUgaW5wdXQgdHJlZSB0byBhY2NlcHQgYXMgdGhlIHJlc3VsdC4KIAkgKi8KLQlwcm90ZWN0ZWQgU3RyYXRlZ3lPbmVTaWRlZChmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgaW50IGluZGV4KSB7CisJcHJvdGVjdGVkIFN0cmF0ZWd5T25lU2lkZWQoU3RyaW5nIG5hbWUsIGludCBpbmRleCkgewogCQlzdHJhdGVneU5hbWUgPSBuYW1lOwogCQl0cmVlSW5kZXggPSBpbmRleDsKIAl9CkBAIC04NCwzMSArODQsMzEgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIE1lcmdlciBuZXdNZXJnZXIoZmluYWwgUmVwb3NpdG9yeSBkYikgeworCXB1YmxpYyBNZXJnZXIgbmV3TWVyZ2VyKFJlcG9zaXRvcnkgZGIpIHsKIAkJcmV0dXJuIG5ldyBPbmVTaWRlKGRiLCB0cmVlSW5kZXgpOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIE1lcmdlciBuZXdNZXJnZXIoZmluYWwgUmVwb3NpdG9yeSBkYiwgYm9vbGVhbiBpbkNvcmUpIHsKKwlwdWJsaWMgTWVyZ2VyIG5ld01lcmdlcihSZXBvc2l0b3J5IGRiLCBib29sZWFuIGluQ29yZSkgewogCQlyZXR1cm4gbmV3IE9uZVNpZGUoZGIsIHRyZWVJbmRleCk7CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgTWVyZ2VyIG5ld01lcmdlcihmaW5hbCBPYmplY3RJbnNlcnRlciBpbnNlcnRlciwgZmluYWwgQ29uZmlnIGNvbmZpZykgeworCXB1YmxpYyBNZXJnZXIgbmV3TWVyZ2VyKE9iamVjdEluc2VydGVyIGluc2VydGVyLCBDb25maWcgY29uZmlnKSB7CiAJCXJldHVybiBuZXcgT25lU2lkZShpbnNlcnRlciwgdHJlZUluZGV4KTsKIAl9CiAKIAlzdGF0aWMgY2xhc3MgT25lU2lkZSBleHRlbmRzIE1lcmdlciB7CiAJCXByaXZhdGUgZmluYWwgaW50IHRyZWVJbmRleDsKIAotCQlwcm90ZWN0ZWQgT25lU2lkZShmaW5hbCBSZXBvc2l0b3J5IGxvY2FsLCBmaW5hbCBpbnQgaW5kZXgpIHsKKwkJcHJvdGVjdGVkIE9uZVNpZGUoUmVwb3NpdG9yeSBsb2NhbCwgaW50IGluZGV4KSB7CiAJCQlzdXBlcihsb2NhbCk7CiAJCQl0cmVlSW5kZXggPSBpbmRleDsKIAkJfQogCi0JCXByb3RlY3RlZCBPbmVTaWRlKGZpbmFsIE9iamVjdEluc2VydGVyIGluc2VydGVyLCBmaW5hbCBpbnQgaW5kZXgpIHsKKwkJcHJvdGVjdGVkIE9uZVNpZGUoT2JqZWN0SW5zZXJ0ZXIgaW5zZXJ0ZXIsIGludCBpbmRleCkgewogCQkJc3VwZXIoaW5zZXJ0ZXIpOwogCQkJdHJlZUluZGV4ID0gaW5kZXg7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvU3RyYXRlZ3lTaW1wbGVUd29XYXlJbkNvcmUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvU3RyYXRlZ3lTaW1wbGVUd29XYXlJbkNvcmUuamF2YQppbmRleCA1NzM5ZDU4Li40YWVhY2Y1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1N0cmF0ZWd5U2ltcGxlVHdvV2F5SW5Db3JlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9TdHJhdGVneVNpbXBsZVR3b1dheUluQ29yZS5qYXZhCkBAIC04NCw3ICs4NCw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBUaHJlZVdheU1lcmdlciBuZXdNZXJnZXIoZmluYWwgUmVwb3NpdG9yeSBkYikgeworCXB1YmxpYyBUaHJlZVdheU1lcmdlciBuZXdNZXJnZXIoUmVwb3NpdG9yeSBkYikgewogCQlyZXR1cm4gbmV3IEluQ29yZU1lcmdlcihkYik7CiAJfQogCkBAIC0xMTYsMTMgKzExNiwxMyBAQAogCiAJCXByaXZhdGUgT2JqZWN0SWQgcmVzdWx0VHJlZTsKIAotCQlJbkNvcmVNZXJnZXIoZmluYWwgUmVwb3NpdG9yeSBsb2NhbCkgeworCQlJbkNvcmVNZXJnZXIoUmVwb3NpdG9yeSBsb2NhbCkgewogCQkJc3VwZXIobG9jYWwpOwogCQkJdHcgPSBuZXcgTmFtZUNvbmZsaWN0VHJlZVdhbGsobG9jYWwsIHJlYWRlcik7CiAJCQljYWNoZSA9IERpckNhY2hlLm5ld0luQ29yZSgpOwogCQl9CiAKLQkJSW5Db3JlTWVyZ2VyKGZpbmFsIE9iamVjdEluc2VydGVyIGluc2VydGVyKSB7CisJCUluQ29yZU1lcmdlcihPYmplY3RJbnNlcnRlciBpbnNlcnRlcikgewogCQkJc3VwZXIoaW5zZXJ0ZXIpOwogCQkJdHcgPSBuZXcgTmFtZUNvbmZsaWN0VHJlZVdhbGsobnVsbCwgcmVhZGVyKTsKIAkJCWNhY2hlID0gRGlyQ2FjaGUubmV3SW5Db3JlKCk7CkBAIC0xODIsMTEgKzE4MiwxMSBAQAogCQkJfQogCQl9CiAKLQkJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBub25UcmVlKGZpbmFsIGludCBtb2RlKSB7CisJCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbm9uVHJlZShpbnQgbW9kZSkgewogCQkJcmV0dXJuIG1vZGUgIT0gMCAmJiAhRmlsZU1vZGUuVFJFRS5lcXVhbHMobW9kZSk7CiAJCX0KIAotCQlwcml2YXRlIHZvaWQgYWRkKGZpbmFsIGludCB0cmVlLCBmaW5hbCBpbnQgc3RhZ2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXByaXZhdGUgdm9pZCBhZGQoaW50IHRyZWUsIGludCBzdGFnZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCWZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGkgPSBnZXRUcmVlKHRyZWUpOwogCQkJaWYgKGkgIT0gbnVsbCkgewogCQkJCWlmIChGaWxlTW9kZS5UUkVFLmVxdWFscyh0dy5nZXRSYXdNb2RlKHRyZWUpKSkgewpAQCAtMjAzLDcgKzIwMyw3IEBACiAJCQl9CiAJCX0KIAotCQlwcml2YXRlIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGdldFRyZWUoZmluYWwgaW50IHRyZWUpIHsKKwkJcHJpdmF0ZSBBYnN0cmFjdFRyZWVJdGVyYXRvciBnZXRUcmVlKGludCB0cmVlKSB7CiAJCQlyZXR1cm4gdHcuZ2V0VHJlZSh0cmVlLCBBYnN0cmFjdFRyZWVJdGVyYXRvci5jbGFzcyk7CiAJCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9UaHJlZVdheU1lcmdlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9UaHJlZVdheU1lcmdlci5qYXZhCmluZGV4IDNmMjg4MjAuLjJmYzBmNGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvVGhyZWVXYXlNZXJnZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1RocmVlV2F5TWVyZ2VyLmphdmEKQEAgLTcxLDcgKzcxLDcgQEAKIAkgKiBAcGFyYW0gbG9jYWwKIAkgKiAgICAgICAgICAgIHRoZSByZXBvc2l0b3J5IHRoaXMgbWVyZ2VyIHdpbGwgcmVhZCBhbmQgd3JpdGUgZGF0YSBvbi4KIAkgKi8KLQlwcm90ZWN0ZWQgVGhyZWVXYXlNZXJnZXIoZmluYWwgUmVwb3NpdG9yeSBsb2NhbCkgeworCXByb3RlY3RlZCBUaHJlZVdheU1lcmdlcihSZXBvc2l0b3J5IGxvY2FsKSB7CiAJCXN1cGVyKGxvY2FsKTsKIAl9CiAKQEAgLTgzLDcgKzgzLDcgQEAKIAkgKiBAcGFyYW0gaW5Db3JlCiAJICogICAgICAgICAgICBwZXJmb3JtIHRoZSBtZXJnZSBpbiBjb3JlIHdpdGggbm8gd29ya2luZyBmb2xkZXIgaW52b2x2ZWQKIAkgKi8KLQlwcm90ZWN0ZWQgVGhyZWVXYXlNZXJnZXIoZmluYWwgUmVwb3NpdG9yeSBsb2NhbCwgYm9vbGVhbiBpbkNvcmUpIHsKKwlwcm90ZWN0ZWQgVGhyZWVXYXlNZXJnZXIoUmVwb3NpdG9yeSBsb2NhbCwgYm9vbGVhbiBpbkNvcmUpIHsKIAkJdGhpcyhsb2NhbCk7CiAJfQogCkBAIC0xMTIsNyArMTEyLDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgb2JqZWN0IGNvdWxkIG5vdCBiZSByZWFkLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhc2UoZmluYWwgQW55T2JqZWN0SWQgaWQpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAorCXB1YmxpYyB2b2lkIHNldEJhc2UoQW55T2JqZWN0SWQgaWQpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlpZiAoaWQgIT0gbnVsbCkgewogCQkJYmFzZVRyZWUgPSB3YWxrLnBhcnNlVHJlZShpZCk7CkBAIC0xMjMsNyArMTIzLDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gbWVyZ2UoZmluYWwgQW55T2JqZWN0SWQuLi4gdGlwcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgYm9vbGVhbiBtZXJnZShBbnlPYmplY3RJZC4uLiB0aXBzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAodGlwcy5sZW5ndGggIT0gMikKIAkJCXJldHVybiBmYWxzZTsKIAkJcmV0dXJuIHN1cGVyLm1lcmdlKHRpcHMpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ub3Rlcy9MZWFmQnVja2V0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L25vdGVzL0xlYWZCdWNrZXQuamF2YQppbmRleCAxYmU1MjUxLi42NzIzYjYzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L25vdGVzL0xlYWZCdWNrZXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L25vdGVzL0xlYWZCdWNrZXQuamF2YQpAQCAtMjE4LDcgKzIxOCw3IEBACiAJCXJldHVybiBmbXQ7CiAJfQogCi0JcHJpdmF0ZSBpbnQgdHJlZVNpemUoZmluYWwgaW50IG5hbWVMZW4pIHsKKwlwcml2YXRlIGludCB0cmVlU2l6ZShpbnQgbmFtZUxlbikgewogCQlpbnQgc3ogPSBjbnQgKiBUcmVlRm9ybWF0dGVyLmVudHJ5U2l6ZShSRUdVTEFSX0ZJTEUsIG5hbWVMZW4pOwogCQlmb3IgKE5vbk5vdGVFbnRyeSBlID0gbm9uTm90ZXM7IGUgIT0gbnVsbDsgZSA9IGUubmV4dCkKIAkJCXN6ICs9IGUudHJlZUVudHJ5U2l6ZSgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9CaW5hcnlIdW5rLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0JpbmFyeUh1bmsuamF2YQppbmRleCAwNzlkNmY2Li45NTM5MWVjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0JpbmFyeUh1bmsuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0JpbmFyeUh1bmsuamF2YQpAQCAtODAsNyArODAsNyBAQAogCS8qKiBJbmZsYXRlZCBsZW5ndGggb2YgdGhlIGRhdGEuICovCiAJcHJpdmF0ZSBpbnQgbGVuZ3RoOwogCi0JQmluYXJ5SHVuayhmaW5hbCBGaWxlSGVhZGVyIGZoLCBmaW5hbCBpbnQgb2Zmc2V0KSB7CisJQmluYXJ5SHVuayhGaWxlSGVhZGVyIGZoLCBpbnQgb2Zmc2V0KSB7CiAJCWZpbGUgPSBmaDsKIAkJc3RhcnRPZmZzZXQgPSBvZmZzZXQ7CiAJfQpAQCAtMTM5LDcgKzEzOSw3IEBACiAJCXJldHVybiBsZW5ndGg7CiAJfQogCi0JaW50IHBhcnNlSHVuayhpbnQgcHRyLCBmaW5hbCBpbnQgZW5kKSB7CisJaW50IHBhcnNlSHVuayhpbnQgcHRyLCBpbnQgZW5kKSB7CiAJCWZpbmFsIGJ5dGVbXSBidWYgPSBmaWxlLmJ1ZjsKIAogCQlpZiAobWF0Y2goYnVmLCBwdHIsIExJVEVSQUwpID49IDApIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvQ29tYmluZWRGaWxlSGVhZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0NvbWJpbmVkRmlsZUhlYWRlci5qYXZhCmluZGV4IDFhZmI1M2QuLjM0MDc1NzggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvQ29tYmluZWRGaWxlSGVhZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9Db21iaW5lZEZpbGVIZWFkZXIuamF2YQpAQCAtNjksNyArNjksNyBAQAogCiAJcHJpdmF0ZSBGaWxlTW9kZVtdIG9sZE1vZGVzOwogCi0JQ29tYmluZWRGaWxlSGVhZGVyKGZpbmFsIGJ5dGVbXSBiLCBmaW5hbCBpbnQgb2Zmc2V0KSB7CisJQ29tYmluZWRGaWxlSGVhZGVyKGJ5dGVbXSBiLCBpbnQgb2Zmc2V0KSB7CiAJCXN1cGVyKGIsIG9mZnNldCk7CiAJfQogCkBAIC0xMDgsNyArMTA4LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBhbmNlc3RvciB0byBnZXQgdGhlIG1vZGUgb2YKIAkgKiBAcmV0dXJuIHRoZSBtb2RlIG9mIHRoZSByZXF1ZXN0ZWQgYW5jZXN0b3IuCiAJICovCi0JcHVibGljIEZpbGVNb2RlIGdldE9sZE1vZGUoZmluYWwgaW50IG50aFBhcmVudCkgeworCXB1YmxpYyBGaWxlTW9kZSBnZXRPbGRNb2RlKGludCBudGhQYXJlbnQpIHsKIAkJcmV0dXJuIG9sZE1vZGVzW250aFBhcmVudF07CiAJfQogCkBAIC0xMzAsMTMgKzEzMCwxMyBAQAogCSAqICAgICAgICAgICAgdGhlIGFuY2VzdG9yIHRvIGdldCB0aGUgb2JqZWN0IGlkIG9mCiAJICogQHJldHVybiB0aGUgaWQgb2YgdGhlIHJlcXVlc3RlZCBhbmNlc3Rvci4KIAkgKi8KLQlwdWJsaWMgQWJicmV2aWF0ZWRPYmplY3RJZCBnZXRPbGRJZChmaW5hbCBpbnQgbnRoUGFyZW50KSB7CisJcHVibGljIEFiYnJldmlhdGVkT2JqZWN0SWQgZ2V0T2xkSWQoaW50IG50aFBhcmVudCkgewogCQlyZXR1cm4gb2xkSWRzW250aFBhcmVudF07CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFNjcmlwdFRleHQoZmluYWwgQ2hhcnNldCBvY3MsIGZpbmFsIENoYXJzZXQgbmNzKSB7CisJcHVibGljIFN0cmluZyBnZXRTY3JpcHRUZXh0KENoYXJzZXQgb2NzLCBDaGFyc2V0IG5jcykgewogCQlmaW5hbCBDaGFyc2V0W10gY3MgPSBuZXcgQ2hhcnNldFtnZXRQYXJlbnRDb3VudCgpICsgMV07CiAJCUFycmF5cy5maWxsKGNzLCBvY3MpOwogCQljc1tnZXRQYXJlbnRDb3VudCgpXSA9IG5jczsKQEAgLTE0OSwxMiArMTQ5LDEyIEBACiAJICogQ29udmVydCB0aGUgcGF0Y2ggc2NyaXB0IGZvciB0aGlzIGZpbGUgaW50byBhIHN0cmluZy4KIAkgKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFNjcmlwdFRleHQoZmluYWwgQ2hhcnNldFtdIGNoYXJzZXRHdWVzcykgeworCXB1YmxpYyBTdHJpbmcgZ2V0U2NyaXB0VGV4dChDaGFyc2V0W10gY2hhcnNldEd1ZXNzKSB7CiAJCXJldHVybiBzdXBlci5nZXRTY3JpcHRUZXh0KGNoYXJzZXRHdWVzcyk7CiAJfQogCiAJQE92ZXJyaWRlCi0JaW50IHBhcnNlR2l0SGVhZGVycyhpbnQgcHRyLCBmaW5hbCBpbnQgZW5kKSB7CisJaW50IHBhcnNlR2l0SGVhZGVycyhpbnQgcHRyLCBpbnQgZW5kKSB7CiAJCXdoaWxlIChwdHIgPCBlbmQpIHsKIAkJCWZpbmFsIGludCBlb2wgPSBuZXh0TEYoYnVmLCBwdHIpOwogCQkJaWYgKGlzSHVua0hkcihidWYsIHB0ciwgZW5kKSA+PSAxKSB7CkBAIC0xOTEsNyArMTkxLDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcGFyc2VJbmRleExpbmUoaW50IHB0ciwgZmluYWwgaW50IGVvbCkgeworCXByb3RlY3RlZCB2b2lkIHBhcnNlSW5kZXhMaW5lKGludCBwdHIsIGludCBlb2wpIHsKIAkJLy8gImluZGV4ICRhc2hhMSwkYnNoYTEuLiRjc2hhMSIKIAkJLy8KIAkJZmluYWwgTGlzdDxBYmJyZXZpYXRlZE9iamVjdElkPiBpZHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKQEAgLTIxMywxOCArMjEzLDE4IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBhcnNlTmV3RmlsZU1vZGUoZmluYWwgaW50IHB0ciwgZmluYWwgaW50IGVvbCkgeworCXByb3RlY3RlZCB2b2lkIHBhcnNlTmV3RmlsZU1vZGUoaW50IHB0ciwgaW50IGVvbCkgewogCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZE1vZGVzLmxlbmd0aDsgaSsrKQogCQkJb2xkTW9kZXNbaV0gPSBGaWxlTW9kZS5NSVNTSU5HOwogCQlzdXBlci5wYXJzZU5ld0ZpbGVNb2RlKHB0ciwgZW9sKTsKIAl9CiAKIAlAT3ZlcnJpZGUKLQlIdW5rSGVhZGVyIG5ld0h1bmtIZWFkZXIoZmluYWwgaW50IG9mZnNldCkgeworCUh1bmtIZWFkZXIgbmV3SHVua0hlYWRlcihpbnQgb2Zmc2V0KSB7CiAJCXJldHVybiBuZXcgQ29tYmluZWRIdW5rSGVhZGVyKHRoaXMsIG9mZnNldCk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHBhcnNlTW9kZUxpbmUoaW50IHB0ciwgZmluYWwgaW50IGVvbCkgeworCXByaXZhdGUgdm9pZCBwYXJzZU1vZGVMaW5lKGludCBwdHIsIGludCBlb2wpIHsKIAkJLy8gIm1vZGUgJGFtb2RlLCRibW9kZS4uJGNtb2RlIgogCQkvLwogCQlpbnQgbiA9IDA7CkBAIC0yNDAsNyArMjQwLDcgQEAKIAkJbmV3TW9kZSA9IHBhcnNlRmlsZU1vZGUoZG90MiArIDEsIGVvbCk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHBhcnNlRGVsZXRlZEZpbGVNb2RlKGludCBwdHIsIGZpbmFsIGludCBlb2wpIHsKKwlwcml2YXRlIHZvaWQgcGFyc2VEZWxldGVkRmlsZU1vZGUoaW50IHB0ciwgaW50IGVvbCkgewogCQkvLyAiZGVsZXRlZCBmaWxlIG1vZGUgJGFtb2RlLCRibW9kZSIKIAkJLy8KIAkJY2hhbmdlVHlwZSA9IENoYW5nZVR5cGUuREVMRVRFOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9Db21iaW5lZEh1bmtIZWFkZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvQ29tYmluZWRIdW5rSGVhZGVyLmphdmEKaW5kZXggYmJmODAyMy4uZDI3ODEzMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9Db21iaW5lZEh1bmtIZWFkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0NvbWJpbmVkSHVua0hlYWRlci5qYXZhCkBAIC02NCw3ICs2NCw3IEBACiAKIAlwcml2YXRlIENvbWJpbmVkT2xkSW1hZ2VbXSBvbGQ7CiAKLQlDb21iaW5lZEh1bmtIZWFkZXIoZmluYWwgQ29tYmluZWRGaWxlSGVhZGVyIGZoLCBmaW5hbCBpbnQgb2Zmc2V0KSB7CisJQ29tYmluZWRIdW5rSGVhZGVyKENvbWJpbmVkRmlsZUhlYWRlciBmaCwgaW50IG9mZnNldCkgewogCQlzdXBlcihmaCwgb2Zmc2V0LCBudWxsKTsKIAkJb2xkID0gbmV3IENvbWJpbmVkT2xkSW1hZ2VbZmguZ2V0UGFyZW50Q291bnQoKV07CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkLmxlbmd0aDsgaSsrKSB7CkBAIC05Nyw3ICs5Nyw3IEBACiAJICogICAgICAgICAgICB0aGUgYW5jZXN0b3IgdG8gZ2V0IHRoZSBvbGQgaW1hZ2UgZGF0YSBvZgogCSAqIEByZXR1cm4gaW1hZ2UgZGF0YSBvZiB0aGUgcmVxdWVzdGVkIGFuY2VzdG9yLgogCSAqLwotCXB1YmxpYyBPbGRJbWFnZSBnZXRPbGRJbWFnZShmaW5hbCBpbnQgbnRoUGFyZW50KSB7CisJcHVibGljIE9sZEltYWdlIGdldE9sZEltYWdlKGludCBudGhQYXJlbnQpIHsKIAkJcmV0dXJuIG9sZFtudGhQYXJlbnRdOwogCX0KIApAQCAtMTI1LDExICsxMjUsMTEgQEAKIAl9CiAKIAlAT3ZlcnJpZGUKLQlpbnQgcGFyc2VCb2R5KGZpbmFsIFBhdGNoIHNjcmlwdCwgZmluYWwgaW50IGVuZCkgeworCWludCBwYXJzZUJvZHkoUGF0Y2ggc2NyaXB0LCBpbnQgZW5kKSB7CiAJCWZpbmFsIGJ5dGVbXSBidWYgPSBmaWxlLmJ1ZjsKIAkJaW50IGMgPSBuZXh0TEYoYnVmLCBzdGFydE9mZnNldCk7CiAKLQkJZm9yIChmaW5hbCBDb21iaW5lZE9sZEltYWdlIG8gOiBvbGQpIHsKKwkJZm9yIChDb21iaW5lZE9sZEltYWdlIG8gOiBvbGQpIHsKIAkJCW8ubkRlbGV0ZWQgPSAwOwogCQkJby5uQWRkZWQgPSAwOwogCQkJby5uQ29udGV4dCA9IDA7CkBAIC0yMDcsNyArMjA3LDcgQEAKIAl9CiAKIAlAT3ZlcnJpZGUKLQl2b2lkIGV4dHJhY3RGaWxlTGluZXMoZmluYWwgT3V0cHV0U3RyZWFtW10gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXZvaWQgZXh0cmFjdEZpbGVMaW5lcyhPdXRwdXRTdHJlYW1bXSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGJ5dGVbXSBidWYgPSBmaWxlLmJ1ZjsKIAkJaW50IHB0ciA9IHN0YXJ0T2Zmc2V0OwogCQlpbnQgZW9sID0gbmV4dExGKGJ1ZiwgcHRyKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvRmlsZUhlYWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9GaWxlSGVhZGVyLmphdmEKaW5kZXggNWNmYmJiMi4uZDBhNTIxNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9GaWxlSGVhZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9GaWxlSGVhZGVyLmphdmEKQEAgLTE0Niw3ICsxNDYsNyBAQAogCSAqIEBwYXJhbSB0eXBlCiAJICogICAgICAgICAgICB0aGUgdHlwZSBvZiBwYXRjaCB1c2VkIHRvIG1vZGlmeSB0aGlzIGZpbGUKIAkgKi8KLQlwdWJsaWMgRmlsZUhlYWRlcihmaW5hbCBieXRlW10gaGVhZGVyTGluZXMsIEVkaXRMaXN0IGVkaXRzLCBQYXRjaFR5cGUgdHlwZSkgeworCXB1YmxpYyBGaWxlSGVhZGVyKGJ5dGVbXSBoZWFkZXJMaW5lcywgRWRpdExpc3QgZWRpdHMsIFBhdGNoVHlwZSB0eXBlKSB7CiAJCXRoaXMoaGVhZGVyTGluZXMsIDApOwogCQllbmRPZmZzZXQgPSBoZWFkZXJMaW5lcy5sZW5ndGg7CiAJCWludCBwdHIgPSBwYXJzZUdpdEZpbGVOYW1lKFBhdGNoLkRJRkZfR0lULmxlbmd0aCwgaGVhZGVyTGluZXMubGVuZ3RoKTsKQEAgLTE1NSw3ICsxNTUsNyBAQAogCQlhZGRIdW5rKG5ldyBIdW5rSGVhZGVyKHRoaXMsIGVkaXRzKSk7CiAJfQogCi0JRmlsZUhlYWRlcihmaW5hbCBieXRlW10gYiwgZmluYWwgaW50IG9mZnNldCkgeworCUZpbGVIZWFkZXIoYnl0ZVtdIGIsIGludCBvZmZzZXQpIHsKIAkJYnVmID0gYjsKIAkJc3RhcnRPZmZzZXQgPSBvZmZzZXQ7CiAJCWNoYW5nZVR5cGUgPSBDaGFuZ2VUeXBlLk1PRElGWTsgLy8gdW5sZXNzIG90aGVyd2lzZSBkZXNpZ25hdGVkCkBAIC0yNjQsMTIgKzI2NCwxMiBAQAogCiAJCWZpbmFsIFN0cmluZ1tdIGZpbGVzID0gZXh0cmFjdEZpbGVMaW5lcyhjaGFyc2V0R3Vlc3MpOwogCQlmaW5hbCBpbnRbXSBvZmZzZXRzID0gbmV3IGludFtmaWxlcy5sZW5ndGhdOwotCQlmb3IgKGZpbmFsIEh1bmtIZWFkZXIgaCA6IGdldEh1bmtzKCkpCisJCWZvciAoSHVua0hlYWRlciBoIDogZ2V0SHVua3MoKSkKIAkJCWguZXh0cmFjdEZpbGVMaW5lcyhyLCBmaWxlcywgb2Zmc2V0cyk7CiAJCXJldHVybiByLnRvU3RyaW5nKCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB0cnlTaW1wbGVDb252ZXJzaW9uKGZpbmFsIENoYXJzZXRbXSBjaGFyc2V0R3Vlc3MpIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIHRyeVNpbXBsZUNvbnZlcnNpb24oQ2hhcnNldFtdIGNoYXJzZXRHdWVzcykgewogCQlpZiAoY2hhcnNldEd1ZXNzID09IG51bGwpCiAJCQlyZXR1cm4gdHJ1ZTsKIAkJZm9yIChpbnQgaSA9IDE7IGkgPCBjaGFyc2V0R3Vlc3MubGVuZ3RoOyBpKyspIHsKQEAgLTI3OSwxMiArMjc5LDEyIEBACiAJCXJldHVybiB0cnVlOwogCX0KIAotCXByaXZhdGUgU3RyaW5nW10gZXh0cmFjdEZpbGVMaW5lcyhmaW5hbCBDaGFyc2V0W10gY3NHdWVzcykgeworCXByaXZhdGUgU3RyaW5nW10gZXh0cmFjdEZpbGVMaW5lcyhDaGFyc2V0W10gY3NHdWVzcykgewogCQlmaW5hbCBUZW1wb3JhcnlCdWZmZXJbXSB0bXAgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyW2dldFBhcmVudENvdW50KCkgKyAxXTsKIAkJdHJ5IHsKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG1wLmxlbmd0aDsgaSsrKQogCQkJCXRtcFtpXSA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuSGVhcChJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0JCQlmb3IgKGZpbmFsIEh1bmtIZWFkZXIgaCA6IGdldEh1bmtzKCkpCisJCQlmb3IgKEh1bmtIZWFkZXIgaCA6IGdldEh1bmtzKCkpCiAJCQkJaC5leHRyYWN0RmlsZUxpbmVzKHRtcCk7CiAKIAkJCWZpbmFsIFN0cmluZ1tdIHIgPSBuZXcgU3RyaW5nW3RtcC5sZW5ndGhdOwpAQCAtMzI5LDcgKzMyOSw3IEBACiAJCXJldHVybiBodW5rczsKIAl9CiAKLQl2b2lkIGFkZEh1bmsoZmluYWwgSHVua0hlYWRlciBoKSB7CisJdm9pZCBhZGRIdW5rKEh1bmtIZWFkZXIgaCkgewogCQlpZiAoaC5nZXRGaWxlSGVhZGVyKCkgIT0gdGhpcykKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkuaHVua0JlbG9uZ3NUb0Fub3RoZXJGaWxlKTsKIAkJaWYgKGh1bmtzID09IG51bGwpCkBAIC0zMzcsNyArMzM3LDcgQEAKIAkJaHVua3MuYWRkKGgpOwogCX0KIAotCUh1bmtIZWFkZXIgbmV3SHVua0hlYWRlcihmaW5hbCBpbnQgb2Zmc2V0KSB7CisJSHVua0hlYWRlciBuZXdIdW5rSGVhZGVyKGludCBvZmZzZXQpIHsKIAkJcmV0dXJuIG5ldyBIdW5rSGVhZGVyKHRoaXMsIG9mZnNldCk7CiAJfQogCkBAIC0zNzAsNyArMzcwLDcgQEAKIAkgKi8KIAlwdWJsaWMgRWRpdExpc3QgdG9FZGl0TGlzdCgpIHsKIAkJZmluYWwgRWRpdExpc3QgciA9IG5ldyBFZGl0TGlzdCgpOwotCQlmb3IgKGZpbmFsIEh1bmtIZWFkZXIgaHVuayA6IGh1bmtzKQorCQlmb3IgKEh1bmtIZWFkZXIgaHVuayA6IGh1bmtzKQogCQkJci5hZGRBbGwoaHVuay50b0VkaXRMaXN0KCkpOwogCQlyZXR1cm4gcjsKIAl9CkBAIC0zODQsNyArMzg0LDcgQEAKIAkgKiAgICAgICAgICAgIG9uZSBwYXN0IHRoZSBsYXN0IHBvc2l0aW9uIHRvIHBhcnNlLgogCSAqIEByZXR1cm4gZmlyc3QgY2hhcmFjdGVyIGFmdGVyIHRoZSBMRiBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lOyAtMSBvbiBlcnJvci4KIAkgKi8KLQlpbnQgcGFyc2VHaXRGaWxlTmFtZShpbnQgcHRyLCBmaW5hbCBpbnQgZW5kKSB7CisJaW50IHBhcnNlR2l0RmlsZU5hbWUoaW50IHB0ciwgaW50IGVuZCkgewogCQlmaW5hbCBpbnQgZW9sID0gbmV4dExGKGJ1ZiwgcHRyKTsKIAkJZmluYWwgaW50IGJvbCA9IHB0cjsKIAkJaWYgKGVvbCA+PSBlbmQpIHsKQEAgLTQ0NCw3ICs0NDQsNyBAQAogCQlyZXR1cm4gZW9sOwogCX0KIAotCWludCBwYXJzZUdpdEhlYWRlcnMoaW50IHB0ciwgZmluYWwgaW50IGVuZCkgeworCWludCBwYXJzZUdpdEhlYWRlcnMoaW50IHB0ciwgaW50IGVuZCkgewogCQl3aGlsZSAocHRyIDwgZW5kKSB7CiAJCQlmaW5hbCBpbnQgZW9sID0gbmV4dExGKGJ1ZiwgcHRyKTsKIAkJCWlmIChpc0h1bmtIZHIoYnVmLCBwdHIsIGVvbCkgPj0gMSkgewpAQCAtNTE0LDI1ICs1MTQsMjUgQEAKIAkJcmV0dXJuIHB0cjsKIAl9CiAKLQl2b2lkIHBhcnNlT2xkTmFtZShpbnQgcHRyLCBmaW5hbCBpbnQgZW9sKSB7CisJdm9pZCBwYXJzZU9sZE5hbWUoaW50IHB0ciwgaW50IGVvbCkgewogCQlvbGRQYXRoID0gcDEocGFyc2VOYW1lKG9sZFBhdGgsIHB0ciArIE9MRF9OQU1FLmxlbmd0aCwgZW9sKSk7CiAJCWlmIChvbGRQYXRoID09IERFVl9OVUxMKQogCQkJY2hhbmdlVHlwZSA9IENoYW5nZVR5cGUuQUREOwogCX0KIAotCXZvaWQgcGFyc2VOZXdOYW1lKGludCBwdHIsIGZpbmFsIGludCBlb2wpIHsKKwl2b2lkIHBhcnNlTmV3TmFtZShpbnQgcHRyLCBpbnQgZW9sKSB7CiAJCW5ld1BhdGggPSBwMShwYXJzZU5hbWUobmV3UGF0aCwgcHRyICsgTkVXX05BTUUubGVuZ3RoLCBlb2wpKTsKIAkJaWYgKG5ld1BhdGggPT0gREVWX05VTEwpCiAJCQljaGFuZ2VUeXBlID0gQ2hhbmdlVHlwZS5ERUxFVEU7CiAJfQogCi0Jdm9pZCBwYXJzZU5ld0ZpbGVNb2RlKGludCBwdHIsIGZpbmFsIGludCBlb2wpIHsKKwl2b2lkIHBhcnNlTmV3RmlsZU1vZGUoaW50IHB0ciwgaW50IGVvbCkgewogCQlvbGRNb2RlID0gRmlsZU1vZGUuTUlTU0lORzsKIAkJbmV3TW9kZSA9IHBhcnNlRmlsZU1vZGUocHRyICsgTkVXX0ZJTEVfTU9ERS5sZW5ndGgsIGVvbCk7CiAJCWNoYW5nZVR5cGUgPSBDaGFuZ2VUeXBlLkFERDsKIAl9CiAKLQlpbnQgcGFyc2VUcmFkaXRpb25hbEhlYWRlcnMoaW50IHB0ciwgZmluYWwgaW50IGVuZCkgeworCWludCBwYXJzZVRyYWRpdGlvbmFsSGVhZGVycyhpbnQgcHRyLCBpbnQgZW5kKSB7CiAJCXdoaWxlIChwdHIgPCBlbmQpIHsKIAkJCWZpbmFsIGludCBlb2wgPSBuZXh0TEYoYnVmLCBwdHIpOwogCQkJaWYgKGlzSHVua0hkcihidWYsIHB0ciwgZW9sKSA+PSAxKSB7CkBAIC01NTUsNyArNTU1LDcgQEAKIAkJcmV0dXJuIHB0cjsKIAl9CiAKLQlwcml2YXRlIFN0cmluZyBwYXJzZU5hbWUoZmluYWwgU3RyaW5nIGV4cGVjdCwgaW50IHB0ciwgZmluYWwgaW50IGVuZCkgeworCXByaXZhdGUgU3RyaW5nIHBhcnNlTmFtZShTdHJpbmcgZXhwZWN0LCBpbnQgcHRyLCBpbnQgZW5kKSB7CiAJCWlmIChwdHIgPT0gZW5kKQogCQkJcmV0dXJuIGV4cGVjdDsKIApAQCAtNTg1LDcgKzU4NSw3IEBACiAJCXJldHVybiBzID4gMCA/IHIuc3Vic3RyaW5nKHMgKyAxKSA6IHI7CiAJfQogCi0JRmlsZU1vZGUgcGFyc2VGaWxlTW9kZShpbnQgcHRyLCBmaW5hbCBpbnQgZW5kKSB7CisJRmlsZU1vZGUgcGFyc2VGaWxlTW9kZShpbnQgcHRyLCBpbnQgZW5kKSB7CiAJCWludCB0bXAgPSAwOwogCQl3aGlsZSAocHRyIDwgZW5kIC0gMSkgewogCQkJdG1wIDw8PSAzOwpAQCAtNTk0LDcgKzU5NCw3IEBACiAJCXJldHVybiBGaWxlTW9kZS5mcm9tQml0cyh0bXApOwogCX0KIAotCXZvaWQgcGFyc2VJbmRleExpbmUoaW50IHB0ciwgZmluYWwgaW50IGVuZCkgeworCXZvaWQgcGFyc2VJbmRleExpbmUoaW50IHB0ciwgaW50IGVuZCkgewogCQkvLyAiaW5kZXggJGFzaGExLi4kYnNoYTFbICRtb2RlXSIgd2hlcmUgJGFzaGExIGFuZCAkYnNoYTEKIAkJLy8gY2FuIGJlIHVuaXF1ZSBhYmJyZXZpYXRpb25zCiAJCS8vCkBAIC02MzYsNyArNjM2LDcgQEAKIAkgKiAgICAgICAgIGZvciBhIDMgd2F5LW1lcmdlIHJldHVybnMgMy4gSWYgdGhpcyBpcyBub3QgYSBodW5rIGhlYWRlciwgMCBpcwogCSAqICAgICAgICAgcmV0dXJuZWQgaW5zdGVhZC4KIAkgKi8KLQlzdGF0aWMgaW50IGlzSHVua0hkcihmaW5hbCBieXRlW10gYnVmLCBmaW5hbCBpbnQgc3RhcnQsIGZpbmFsIGludCBlbmQpIHsKKwlzdGF0aWMgaW50IGlzSHVua0hkcihieXRlW10gYnVmLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKIAkJaW50IHB0ciA9IHN0YXJ0OwogCQl3aGlsZSAocHRyIDwgZW5kICYmIGJ1ZltwdHJdID09ICdAJykKIAkJCXB0cisrOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9IdW5rSGVhZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0h1bmtIZWFkZXIuamF2YQppbmRleCBkMDIyZDQ3Li4xNDU4OTQ1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0h1bmtIZWFkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0h1bmtIZWFkZXIuamF2YQpAQCAtMTIwLDcgKzEyMCw3IEBACiAKIAlwcml2YXRlIEVkaXRMaXN0IGVkaXRMaXN0OwogCi0JSHVua0hlYWRlcihmaW5hbCBGaWxlSGVhZGVyIGZoLCBmaW5hbCBpbnQgb2Zmc2V0KSB7CisJSHVua0hlYWRlcihGaWxlSGVhZGVyIGZoLCBpbnQgb2Zmc2V0KSB7CiAJCXRoaXMoZmgsIG9mZnNldCwgbmV3IE9sZEltYWdlKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgQWJicmV2aWF0ZWRPYmplY3RJZCBnZXRJZCgpIHsKQEAgLTEyOSwxMyArMTI5LDEzIEBACiAJCX0pOwogCX0KIAotCUh1bmtIZWFkZXIoZmluYWwgRmlsZUhlYWRlciBmaCwgZmluYWwgaW50IG9mZnNldCwgZmluYWwgT2xkSW1hZ2Ugb2kpIHsKKwlIdW5rSGVhZGVyKEZpbGVIZWFkZXIgZmgsIGludCBvZmZzZXQsIE9sZEltYWdlIG9pKSB7CiAJCWZpbGUgPSBmaDsKIAkJc3RhcnRPZmZzZXQgPSBvZmZzZXQ7CiAJCW9sZCA9IG9pOwogCX0KIAotCUh1bmtIZWFkZXIoZmluYWwgRmlsZUhlYWRlciBmaCwgZmluYWwgRWRpdExpc3QgZWRpdExpc3QpIHsKKwlIdW5rSGVhZGVyKEZpbGVIZWFkZXIgZmgsIEVkaXRMaXN0IGVkaXRMaXN0KSB7CiAJCXRoaXMoZmgsIGZoLmJ1Zi5sZW5ndGgpOwogCQl0aGlzLmVkaXRMaXN0ID0gZWRpdExpc3Q7CiAJCWVuZE9mZnNldCA9IHN0YXJ0T2Zmc2V0OwpAQCAtMjkzLDcgKzI5Myw3IEBACiAJCQluZXdMaW5lQ291bnQgPSAxOwogCX0KIAotCWludCBwYXJzZUJvZHkoZmluYWwgUGF0Y2ggc2NyaXB0LCBmaW5hbCBpbnQgZW5kKSB7CisJaW50IHBhcnNlQm9keShQYXRjaCBzY3JpcHQsIGludCBlbmQpIHsKIAkJZmluYWwgYnl0ZVtdIGJ1ZiA9IGZpbGUuYnVmOwogCQlpbnQgYyA9IG5leHRMRihidWYsIHN0YXJ0T2Zmc2V0KSwgbGFzdCA9IGM7CiAKQEAgLTM1OSw3ICszNTksNyBAQAogCQlyZXR1cm4gYzsKIAl9CiAKLQl2b2lkIGV4dHJhY3RGaWxlTGluZXMoZmluYWwgT3V0cHV0U3RyZWFtW10gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXZvaWQgZXh0cmFjdEZpbGVMaW5lcyhPdXRwdXRTdHJlYW1bXSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGJ5dGVbXSBidWYgPSBmaWxlLmJ1ZjsKIAkJaW50IHB0ciA9IHN0YXJ0T2Zmc2V0OwogCQlpbnQgZW9sID0gbmV4dExGKGJ1ZiwgcHRyKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvUGF0Y2guamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvUGF0Y2guamF2YQppbmRleCBkYTEyM2E3Li4wNTJmMmE3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL1BhdGNoLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9QYXRjaC5qYXZhCkBAIC0xMDEsNyArMTAxLDcgQEAKIAkgKiBAcGFyYW0gZmgKIAkgKiAgICAgICAgICAgIHRoZSBoZWFkZXIgb2YgdGhlIGZpbGUuCiAJICovCi0JcHVibGljIHZvaWQgYWRkRmlsZShmaW5hbCBGaWxlSGVhZGVyIGZoKSB7CisJcHVibGljIHZvaWQgYWRkRmlsZShGaWxlSGVhZGVyIGZoKSB7CiAJCWZpbGVzLmFkZChmaCk7CiAJfQogCkBAIC0xMjAsNyArMTIwLDcgQEAKIAkgKiBAcGFyYW0gZXJyCiAJICogICAgICAgICAgICB0aGUgZXJyb3IgZGVzY3JpcHRpb24uCiAJICovCi0JcHVibGljIHZvaWQgYWRkRXJyb3IoZmluYWwgRm9ybWF0RXJyb3IgZXJyKSB7CisJcHVibGljIHZvaWQgYWRkRXJyb3IoRm9ybWF0RXJyb3IgZXJyKSB7CiAJCWVycm9ycy5hZGQoZXJyKTsKIAl9CiAKQEAgLTE0NiwxMiArMTQ2LDEyIEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLgogCSAqLwotCXB1YmxpYyB2b2lkIHBhcnNlKGZpbmFsIElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyB2b2lkIHBhcnNlKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBieXRlW10gYnVmID0gcmVhZEZ1bGx5KGlzKTsKIAkJcGFyc2UoYnVmLCAwLCBidWYubGVuZ3RoKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBieXRlW10gcmVhZEZ1bGx5KGZpbmFsIElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgc3RhdGljIGJ5dGVbXSByZWFkRnVsbHkoSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRyeSAoVGVtcG9yYXJ5QnVmZmVyIGIgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkhlYXAoSW50ZWdlci5NQVhfVkFMVUUpKSB7CiAJCQliLmNvcHkoaXMpOwogCQkJcmV0dXJuIGIudG9CeXRlQXJyYXkoKTsKQEAgLTE3MywxMiArMTczLDEyIEBACiAJICogICAgICAgICAgICAxIHBhc3QgdGhlIGxhc3QgcG9zaXRpb24gdG8gZW5kIHBhcnNpbmcuIFRoZSB0b3RhbCBsZW5ndGggdG8KIAkgKiAgICAgICAgICAgIGJlIHBhcnNlZCBpcyA8Y29kZT5lbmQgLSBwdHI8L2NvZGU+LgogCSAqLwotCXB1YmxpYyB2b2lkIHBhcnNlKGZpbmFsIGJ5dGVbXSBidWYsIGludCBwdHIsIGZpbmFsIGludCBlbmQpIHsKKwlwdWJsaWMgdm9pZCBwYXJzZShieXRlW10gYnVmLCBpbnQgcHRyLCBpbnQgZW5kKSB7CiAJCXdoaWxlIChwdHIgPCBlbmQpCiAJCQlwdHIgPSBwYXJzZUZpbGUoYnVmLCBwdHIsIGVuZCk7CiAJfQogCi0JcHJpdmF0ZSBpbnQgcGFyc2VGaWxlKGZpbmFsIGJ5dGVbXSBidWYsIGludCBjLCBmaW5hbCBpbnQgZW5kKSB7CisJcHJpdmF0ZSBpbnQgcGFyc2VGaWxlKGJ5dGVbXSBidWYsIGludCBjLCBpbnQgZW5kKSB7CiAJCXdoaWxlIChjIDwgZW5kKSB7CiAJCQlpZiAoaXNIdW5rSGRyKGJ1ZiwgYywgZW5kKSA+PSAxKSB7CiAJCQkJLy8gSWYgd2UgZmluZCBhIGRpc2Nvbm5lY3RlZCBodW5rIGhlYWRlciB3ZSBtaWdodApAQCAtMjM0LDcgKzIzNCw3IEBACiAJCXJldHVybiBjOwogCX0KIAotCXByaXZhdGUgaW50IHBhcnNlRGlmZkdpdChmaW5hbCBieXRlW10gYnVmLCBmaW5hbCBpbnQgc3RhcnQsIGZpbmFsIGludCBlbmQpIHsKKwlwcml2YXRlIGludCBwYXJzZURpZmZHaXQoYnl0ZVtdIGJ1ZiwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAJCWZpbmFsIEZpbGVIZWFkZXIgZmggPSBuZXcgRmlsZUhlYWRlcihidWYsIHN0YXJ0KTsKIAkJaW50IHB0ciA9IGZoLnBhcnNlR2l0RmlsZU5hbWUoc3RhcnQgKyBESUZGX0dJVC5sZW5ndGgsIGVuZCk7CiAJCWlmIChwdHIgPCAwKQpAQCAtMjcxLDE0ICsyNzEsMTQgQEAKIAkJcmV0dXJuIHB0cjsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBpbnQgc2tpcEZpbGUoZmluYWwgYnl0ZVtdIGJ1ZiwgaW50IHB0cikgeworCXByaXZhdGUgc3RhdGljIGludCBza2lwRmlsZShieXRlW10gYnVmLCBpbnQgcHRyKSB7CiAJCXB0ciA9IG5leHRMRihidWYsIHB0cik7CiAJCWlmIChtYXRjaChidWYsIHB0ciwgT0xEX05BTUUpID49IDApCiAJCQlwdHIgPSBuZXh0TEYoYnVmLCBwdHIpOwogCQlyZXR1cm4gcHRyOwogCX0KIAotCXByaXZhdGUgaW50IHBhcnNlSHVua3MoZmluYWwgRmlsZUhlYWRlciBmaCwgaW50IGMsIGZpbmFsIGludCBlbmQpIHsKKwlwcml2YXRlIGludCBwYXJzZUh1bmtzKEZpbGVIZWFkZXIgZmgsIGludCBjLCBpbnQgZW5kKSB7CiAJCWZpbmFsIGJ5dGVbXSBidWYgPSBmaC5idWY7CiAJCXdoaWxlIChjIDwgZW5kKSB7CiAJCQkvLyBJZiB3ZSBzZWUgYSBmaWxlIGhlYWRlciBhdCB0aGlzIHBvaW50LCB3ZSBoYXZlIGFsbCBvZiB0aGUKQEAgLTM0OSw3ICszNDksNyBAQAogCQlyZXR1cm4gYzsKIAl9CiAKLQlwcml2YXRlIGludCBwYXJzZUdpdEJpbmFyeShmaW5hbCBGaWxlSGVhZGVyIGZoLCBpbnQgYywgZmluYWwgaW50IGVuZCkgeworCXByaXZhdGUgaW50IHBhcnNlR2l0QmluYXJ5KEZpbGVIZWFkZXIgZmgsIGludCBjLCBpbnQgZW5kKSB7CiAJCWZpbmFsIEJpbmFyeUh1bmsgcG9zdEltYWdlID0gbmV3IEJpbmFyeUh1bmsoZmgsIGMpOwogCQlmaW5hbCBpbnQgbkVuZCA9IHBvc3RJbWFnZS5wYXJzZUh1bmsoYywgZW5kKTsKIAkJaWYgKG5FbmQgPCAwKSB7CkBAIC0zNzMsMTcgKzM3MywxNyBAQAogCQlyZXR1cm4gYzsKIAl9CiAKLQl2b2lkIHdhcm4oZmluYWwgYnl0ZVtdIGJ1ZiwgZmluYWwgaW50IHB0ciwgZmluYWwgU3RyaW5nIG1zZykgeworCXZvaWQgd2FybihieXRlW10gYnVmLCBpbnQgcHRyLCBTdHJpbmcgbXNnKSB7CiAJCWFkZEVycm9yKG5ldyBGb3JtYXRFcnJvcihidWYsIHB0ciwgRm9ybWF0RXJyb3IuU2V2ZXJpdHkuV0FSTklORywgbXNnKSk7CiAJfQogCi0Jdm9pZCBlcnJvcihmaW5hbCBieXRlW10gYnVmLCBmaW5hbCBpbnQgcHRyLCBmaW5hbCBTdHJpbmcgbXNnKSB7CisJdm9pZCBlcnJvcihieXRlW10gYnVmLCBpbnQgcHRyLCBTdHJpbmcgbXNnKSB7CiAJCWFkZEVycm9yKG5ldyBGb3JtYXRFcnJvcihidWYsIHB0ciwgRm9ybWF0RXJyb3IuU2V2ZXJpdHkuRVJST1IsIG1zZykpOwogCX0KIAogCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWF0Y2hBbnkoZmluYWwgYnl0ZVtdIGJ1ZiwgZmluYWwgaW50IGMsCiAJCQlmaW5hbCBieXRlW11bXSBzcmNzKSB7Ci0JCWZvciAoZmluYWwgYnl0ZVtdIHMgOiBzcmNzKSB7CisJCWZvciAoYnl0ZVtdIHMgOiBzcmNzKSB7CiAJCQlpZiAobWF0Y2goYnVmLCBjLCBzKSA+PSAwKQogCQkJCXJldHVybiB0cnVlOwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldnBsb3QvQWJzdHJhY3RQbG90UmVuZGVyZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2cGxvdC9BYnN0cmFjdFBsb3RSZW5kZXJlci5qYXZhCmluZGV4IGY4OGI4MTkuLjU4ZTIxMDYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2cGxvdC9BYnN0cmFjdFBsb3RSZW5kZXJlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2cGxvdC9BYnN0cmFjdFBsb3RSZW5kZXJlci5qYXZhCkBAIC05MiwxNCArOTIsMTQgQEAKIAkgKiAgICAgICAgICAgIHRvdGFsIGhlaWdodCAoaW4gcGl4ZWxzKSBvZiB0aGlzIGNlbGwuCiAJICovCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHZvaWQgcGFpbnRDb21taXQoZmluYWwgUGxvdENvbW1pdDxUTGFuZT4gY29tbWl0LCBmaW5hbCBpbnQgaCkgeworCXByb3RlY3RlZCB2b2lkIHBhaW50Q29tbWl0KFBsb3RDb21taXQ8VExhbmU+IGNvbW1pdCwgaW50IGgpIHsKIAkJZmluYWwgaW50IGRvdFNpemUgPSBjb21wdXRlRG90U2l6ZShoKTsKIAkJZmluYWwgVExhbmUgbXlMYW5lID0gY29tbWl0LmdldExhbmUoKTsKIAkJZmluYWwgaW50IG15TGFuZVggPSBsYW5lQyhteUxhbmUpOwogCQlmaW5hbCBUQ29sb3IgbXlDb2xvciA9IGxhbmVDb2xvcihteUxhbmUpOwogCiAJCWludCBtYXhDZW50ZXIgPSBteUxhbmVYOwotCQlmb3IgKGZpbmFsIFRMYW5lIHBhc3NpbmdMYW5lIDogKFRMYW5lW10pIGNvbW1pdC5wYXNzaW5nTGFuZXMpIHsKKwkJZm9yIChUTGFuZSBwYXNzaW5nTGFuZSA6IChUTGFuZVtdKSBjb21taXQucGFzc2luZ0xhbmVzKSB7CiAJCQlmaW5hbCBpbnQgY3ggPSBsYW5lQyhwYXNzaW5nTGFuZSk7CiAJCQlmaW5hbCBUQ29sb3IgYyA9IGxhbmVDb2xvcihwYXNzaW5nTGFuZSk7CiAJCQlkcmF3TGluZShjLCBjeCwgMCwgY3gsIGgsIExJTkVfV0lEVEgpOwpAQCAtMTkwLDcgKzE5MCw3IEBACiAJICovCiAJcHJvdGVjdGVkIGFic3RyYWN0IGludCBkcmF3TGFiZWwoaW50IHgsIGludCB5LCBSZWYgcmVmKTsKIAotCXByaXZhdGUgc3RhdGljIGludCBjb21wdXRlRG90U2l6ZShmaW5hbCBpbnQgaCkgeworCXByaXZhdGUgc3RhdGljIGludCBjb21wdXRlRG90U2l6ZShpbnQgaCkgewogCQlpbnQgZCA9IChpbnQpIChNYXRoLm1pbihoLCBMQU5FX1dJRFRIKSAqIDAuNTBmKTsKIAkJZCArPSAoZCAmIDEpOwogCQlyZXR1cm4gZDsKQEAgLTI4MiwxMiArMjgyLDEyIEBACiAJICovCiAJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZHJhd1RleHQoU3RyaW5nIG1zZywgaW50IHgsIGludCB5KTsKIAotCXByaXZhdGUgc3RhdGljIGludCBsYW5lWChmaW5hbCBQbG90TGFuZSBteUxhbmUpIHsKKwlwcml2YXRlIHN0YXRpYyBpbnQgbGFuZVgoUGxvdExhbmUgbXlMYW5lKSB7CiAJCWZpbmFsIGludCBwID0gbXlMYW5lICE9IG51bGwgPyBteUxhbmUuZ2V0UG9zaXRpb24oKSA6IDA7CiAJCXJldHVybiBMRUZUX1BBRCArIExBTkVfV0lEVEggKiBwOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGludCBsYW5lQyhmaW5hbCBQbG90TGFuZSBteUxhbmUpIHsKKwlwcml2YXRlIHN0YXRpYyBpbnQgbGFuZUMoUGxvdExhbmUgbXlMYW5lKSB7CiAJCXJldHVybiBsYW5lWChteUxhbmUpICsgTEFORV9XSURUSCAvIDI7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZwbG90L1Bsb3RDb21taXQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2cGxvdC9QbG90Q29tbWl0LmphdmEKaW5kZXggMDkxYmY2OC4uOTkxNGIwYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZwbG90L1Bsb3RDb21taXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldnBsb3QvUGxvdENvbW1pdC5qYXZhCkBAIC03OSw3ICs3OSw3IEBACiAJICogQHBhcmFtIGlkCiAJICogICAgICAgICAgICB0aGUgaWRlbnRpdHkgb2YgdGhpcyBjb21taXQuCiAJICovCi0JcHJvdGVjdGVkIFBsb3RDb21taXQoZmluYWwgQW55T2JqZWN0SWQgaWQpIHsKKwlwcm90ZWN0ZWQgUGxvdENvbW1pdChBbnlPYmplY3RJZCBpZCkgewogCQlzdXBlcihpZCk7CiAJCWZvcmtpbmdPZmZMYW5lcyA9IE5PX0xBTkVTOwogCQlwYXNzaW5nTGFuZXMgPSBOT19MQU5FUzsKQEAgLTg4LDE5ICs4OCwxOSBAQAogCQlyZWZzID0gTk9fUkVGUzsKIAl9CiAKLQl2b2lkIGFkZEZvcmtpbmdPZmZMYW5lKGZpbmFsIFBsb3RMYW5lIGYpIHsKKwl2b2lkIGFkZEZvcmtpbmdPZmZMYW5lKFBsb3RMYW5lIGYpIHsKIAkJZm9ya2luZ09mZkxhbmVzID0gYWRkTGFuZShmLCBmb3JraW5nT2ZmTGFuZXMpOwogCX0KIAotCXZvaWQgYWRkUGFzc2luZ0xhbmUoZmluYWwgUGxvdExhbmUgYykgeworCXZvaWQgYWRkUGFzc2luZ0xhbmUoUGxvdExhbmUgYykgewogCQlwYXNzaW5nTGFuZXMgPSBhZGRMYW5lKGMsIHBhc3NpbmdMYW5lcyk7CiAJfQogCi0Jdm9pZCBhZGRNZXJnaW5nTGFuZShmaW5hbCBQbG90TGFuZSBtKSB7CisJdm9pZCBhZGRNZXJnaW5nTGFuZShQbG90TGFuZSBtKSB7CiAJCW1lcmdpbmdMYW5lcyA9IGFkZExhbmUobSwgbWVyZ2luZ0xhbmVzKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBQbG90TGFuZVtdIGFkZExhbmUoZmluYWwgUGxvdExhbmUgbCwgUGxvdExhbmVbXSBsYW5lcykgeworCXByaXZhdGUgc3RhdGljIFBsb3RMYW5lW10gYWRkTGFuZShQbG90TGFuZSBsLCBQbG90TGFuZVtdIGxhbmVzKSB7CiAJCWZpbmFsIGludCBjbnQgPSBsYW5lcy5sZW5ndGg7CiAJCWlmIChjbnQgPT0gMCkKIAkJCWxhbmVzID0gbmV3IFBsb3RMYW5lW10geyBsIH07CkBAIC0xMTUsNyArMTE1LDcgQEAKIAkJcmV0dXJuIGxhbmVzOwogCX0KIAotCXZvaWQgYWRkQ2hpbGQoZmluYWwgUGxvdENvbW1pdCBjKSB7CisJdm9pZCBhZGRDaGlsZChQbG90Q29tbWl0IGMpIHsKIAkJZmluYWwgaW50IGNudCA9IGNoaWxkcmVuLmxlbmd0aDsKIAkJaWYgKGNudCA9PSAwKQogCQkJY2hpbGRyZW4gPSBuZXcgUGxvdENvbW1pdFtdIHsgYyB9OwpAQCAtMTUyLDcgKzE1Miw3IEBACiAJICogQHRocm93cyBqYXZhLmxhbmcuQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgYW4gaW52YWxpZCBjaGlsZCBpbmRleCB3YXMgc3BlY2lmaWVkLgogCSAqLwotCXB1YmxpYyBmaW5hbCBQbG90Q29tbWl0IGdldENoaWxkKGZpbmFsIGludCBudGgpIHsKKwlwdWJsaWMgZmluYWwgUGxvdENvbW1pdCBnZXRDaGlsZChpbnQgbnRoKSB7CiAJCXJldHVybiBjaGlsZHJlbltudGhdOwogCX0KIApAQCAtMTYzLDggKzE2Myw4IEBACiAJICogICAgICAgICAgICB0aGUgY29tbWl0IHRvIHRlc3QuCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBjb21taXQgYnVpbHQgb24gdG9wIG9mIHRoaXMgY29tbWl0LgogCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQ2hpbGQoZmluYWwgUGxvdENvbW1pdCBjKSB7Ci0JCWZvciAoZmluYWwgUGxvdENvbW1pdCBhIDogY2hpbGRyZW4pCisJcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDaGlsZChQbG90Q29tbWl0IGMpIHsKKwkJZm9yIChQbG90Q29tbWl0IGEgOiBjaGlsZHJlbikKIAkJCWlmIChhID09IGMpCiAJCQkJcmV0dXJuIHRydWU7CiAJCXJldHVybiBmYWxzZTsKQEAgLTE4OSw3ICsxODksNyBAQAogCSAqIEB0aHJvd3MgamF2YS5sYW5nLkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGFuIGludmFsaWQgcmVmIGluZGV4IHdhcyBzcGVjaWZpZWQuCiAJICovCi0JcHVibGljIGZpbmFsIFJlZiBnZXRSZWYoZmluYWwgaW50IG50aCkgeworCXB1YmxpYyBmaW5hbCBSZWYgZ2V0UmVmKGludCBudGgpIHsKIAkJcmV0dXJuIHJlZnNbbnRoXTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2cGxvdC9QbG90Q29tbWl0TGlzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZwbG90L1Bsb3RDb21taXRMaXN0LmphdmEKaW5kZXggNmEwYmE2Ni4uNWUxNTMxNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZwbG90L1Bsb3RDb21taXRMaXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZwbG90L1Bsb3RDb21taXRMaXN0LmphdmEKQEAgLTk0LDcgKzk0LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc291cmNlKGZpbmFsIFJldldhbGsgdykgeworCXB1YmxpYyB2b2lkIHNvdXJjZShSZXZXYWxrIHcpIHsKIAkJaWYgKCEodyBpbnN0YW5jZW9mIFBsb3RXYWxrKSkKIAkJCXRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuY2xhc3NDYXN0Tm90QSwgUGxvdFdhbGsuY2xhc3MuZ2V0TmFtZSgpKSk7CiAJCXN1cGVyLnNvdXJjZSh3KTsKQEAgLTEyMCwxMyArMTIwLDEzIEBACiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAJcHVibGljIHZvaWQgZmluZFBhc3NpbmdUaHJvdWdoKGZpbmFsIFBsb3RDb21taXQ8TD4gY3VyckNvbW1pdCwKIAkJCWZpbmFsIENvbGxlY3Rpb248TD4gcmVzdWx0KSB7Ci0JCWZvciAoZmluYWwgUGxvdExhbmUgcCA6IGN1cnJDb21taXQucGFzc2luZ0xhbmVzKQorCQlmb3IgKFBsb3RMYW5lIHAgOiBjdXJyQ29tbWl0LnBhc3NpbmdMYW5lcykKIAkJCXJlc3VsdC5hZGQoKEwpIHApOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW50ZXIoZmluYWwgaW50IGluZGV4LCBmaW5hbCBQbG90Q29tbWl0PEw+IGN1cnJDb21taXQpIHsKKwlwcm90ZWN0ZWQgdm9pZCBlbnRlcihpbnQgaW5kZXgsIFBsb3RDb21taXQ8TD4gY3VyckNvbW1pdCkgewogCQlzZXR1cENoaWxkcmVuKGN1cnJDb21taXQpOwogCiAJCWZpbmFsIGludCBuQ2hpbGRyZW4gPSBjdXJyQ29tbWl0LmdldENoaWxkQ291bnQoKTsKQEAgLTIwMiw3ICsyMDIsNyBAQAogCQkJY2xvc2VMYW5lKGN1cnJDb21taXQubGFuZSk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGNvbnRpbnVlQWN0aXZlTGFuZXMoZmluYWwgUGxvdENvbW1pdCBjdXJyQ29tbWl0KSB7CisJcHJpdmF0ZSB2b2lkIGNvbnRpbnVlQWN0aXZlTGFuZXMoUGxvdENvbW1pdCBjdXJyQ29tbWl0KSB7CiAJCWZvciAoUGxvdExhbmUgbGFuZSA6IGFjdGl2ZUxhbmVzKQogCQkJaWYgKGxhbmUgIT0gY3VyckNvbW1pdC5sYW5lKQogCQkJCWN1cnJDb21taXQuYWRkUGFzc2luZ0xhbmUobGFuZSk7CkBAIC0zNTYsNyArMzU2LDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBzZXR1cENoaWxkcmVuKGZpbmFsIFBsb3RDb21taXQ8TD4gY3VyckNvbW1pdCkgeworCXByaXZhdGUgdm9pZCBzZXR1cENoaWxkcmVuKFBsb3RDb21taXQ8TD4gY3VyckNvbW1pdCkgewogCQlmaW5hbCBpbnQgblBhcmVudHMgPSBjdXJyQ29tbWl0LmdldFBhcmVudENvdW50KCk7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgblBhcmVudHM7IGkrKykKIAkJCSgoUGxvdENvbW1pdCkgY3VyckNvbW1pdC5nZXRQYXJlbnQoaSkpLmFkZENoaWxkKGN1cnJDb21taXQpOwpAQCAtNDE2LDcgKzQxNiw3IEBACiAJICogQHBhcmFtIGxhbmUKIAkgKiAgICAgICAgICAgIGEgbGFuZQogCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlY3ljbGVMYW5lKGZpbmFsIEwgbGFuZSkgeworCXByb3RlY3RlZCB2b2lkIHJlY3ljbGVMYW5lKEwgbGFuZSkgewogCQkvLyBOb3RoaW5nLgogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2cGxvdC9QbG90V2Fsay5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZwbG90L1Bsb3RXYWxrLmphdmEKaW5kZXggOGJhOGQ2ZS4uZjI3ZjM1NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZwbG90L1Bsb3RXYWxrLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZwbG90L1Bsb3RXYWxrLmphdmEKQEAgLTkwLDcgKzkwLDcgQEAKIAkgKiBAcGFyYW0gcmVwbwogCSAqICAgICAgICAgICAgdGhlIHJlcG9zaXRvcnkgdGhlIHdhbGtlciB3aWxsIG9idGFpbiBkYXRhIGZyb20uCiAJICovCi0JcHVibGljIFBsb3RXYWxrKGZpbmFsIFJlcG9zaXRvcnkgcmVwbykgeworCXB1YmxpYyBQbG90V2FsayhSZXBvc2l0b3J5IHJlcG8pIHsKIAkJc3VwZXIocmVwbyk7CiAJCXN1cGVyLnNvcnQoUmV2U29ydC5UT1BPLCB0cnVlKTsKIAkJcmV2ZXJzZVJlZk1hcCA9IHJlcG8uZ2V0QWxsUmVmc0J5UGVlbGVkT2JqZWN0SWQoKTsKQEAgLTExOCw3ICsxMTgsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzb3J0KGZpbmFsIFJldlNvcnQgcywgZmluYWwgYm9vbGVhbiB1c2UpIHsKKwlwdWJsaWMgdm9pZCBzb3J0KFJldlNvcnQgcywgYm9vbGVhbiB1c2UpIHsKIAkJaWYgKHMgPT0gUmV2U29ydC5UT1BPICYmICF1c2UpCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLnRvcG9sb2dpY2FsU29ydFJlcXVpcmVkKTsKIAkJc3VwZXIuc29ydChzLCB1c2UpOwpAQCAtMTI2LDcgKzEyNiw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCBSZXZDb21taXQgY3JlYXRlQ29tbWl0KGZpbmFsIEFueU9iamVjdElkIGlkKSB7CisJcHJvdGVjdGVkIFJldkNvbW1pdCBjcmVhdGVDb21taXQoQW55T2JqZWN0SWQgaWQpIHsKIAkJcmV0dXJuIG5ldyBQbG90Q29tbWl0KGlkKTsKIAl9CiAKQEAgLTE0MCw3ICsxNDAsNyBAQAogCQlyZXR1cm4gcGM7CiAJfQogCi0JcHJpdmF0ZSBSZWZbXSBnZXRSZWZzKGZpbmFsIEFueU9iamVjdElkIGNvbW1pdElkKSB7CisJcHJpdmF0ZSBSZWZbXSBnZXRSZWZzKEFueU9iamVjdElkIGNvbW1pdElkKSB7CiAJCUNvbGxlY3Rpb248UmVmPiBsaXN0ID0gcmV2ZXJzZVJlZk1hcC5nZXQoY29tbWl0SWQpOwogCQlpZiAobGlzdCA9PSBudWxsKQogCQkJcmV0dXJuIFBsb3RDb21taXQuTk9fUkVGUzsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9BYnN0cmFjdFJldlF1ZXVlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvQWJzdHJhY3RSZXZRdWV1ZS5qYXZhCmluZGV4IGI5NDhhZGIuLjI0N2EzYmQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9BYnN0cmFjdFJldlF1ZXVlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0Fic3RyYWN0UmV2UXVldWUuamF2YQpAQCAtNzQsNyArNzQsNyBAQAogCSAqIEBwYXJhbSBxdWV1ZUNvbnRyb2wKIAkgKiAgICAgICAgICAgIGZsYWcgdGhhdCBjb250cm9scyBhZG1pc3Npb24gdG8gdGhlIHF1ZXVlLgogCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGFkZChmaW5hbCBSZXZDb21taXQgYywgZmluYWwgUmV2RmxhZyBxdWV1ZUNvbnRyb2wpIHsKKwlwdWJsaWMgZmluYWwgdm9pZCBhZGQoUmV2Q29tbWl0IGMsIFJldkZsYWcgcXVldWVDb250cm9sKSB7CiAJCWlmICghYy5oYXMocXVldWVDb250cm9sKSkgewogCQkJYy5hZGQocXVldWVDb250cm9sKTsKIAkJCWFkZChjKTsKQEAgLTk0LDcgKzk0LDcgQEAKIAkgKiBAcGFyYW0gcXVldWVDb250cm9sCiAJICogICAgICAgICAgICBmbGFnIHRoYXQgY29udHJvbHMgYWRtaXNzaW9uIHRvIHRoZSBxdWV1ZS4KIAkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBhZGRQYXJlbnRzKGZpbmFsIFJldkNvbW1pdCBjLCBmaW5hbCBSZXZGbGFnIHF1ZXVlQ29udHJvbCkgeworCXB1YmxpYyBmaW5hbCB2b2lkIGFkZFBhcmVudHMoUmV2Q29tbWl0IGMsIFJldkZsYWcgcXVldWVDb250cm9sKSB7CiAJCWZpbmFsIFJldkNvbW1pdFtdIHBMaXN0ID0gYy5wYXJlbnRzOwogCQlpZiAocExpc3QgPT0gbnVsbCkKIAkJCXJldHVybjsKQEAgLTEzMiw3ICsxMzIsNyBAQAogCSAqIEBwYXJhbSBjCiAJICogICAgICAgICAgICBhIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0fQogCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBkZXNjcmliZShmaW5hbCBTdHJpbmdCdWlsZGVyIHMsIGZpbmFsIFJldkNvbW1pdCBjKSB7CisJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGRlc2NyaWJlKFN0cmluZ0J1aWxkZXIgcywgUmV2Q29tbWl0IGMpIHsKIAkJcy5hcHBlbmQoYy50b1N0cmluZygpKTsKIAkJcy5hcHBlbmQoJ1xuJyk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0Jsb2NrT2JqUXVldWUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9CbG9ja09ialF1ZXVlLmphdmEKaW5kZXggMzcxY2QwNi4uZmNkZjc5NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0Jsb2NrT2JqUXVldWUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvQmxvY2tPYmpRdWV1ZS5qYXZhCkBAIC01NSw3ICs1NSw3IEBACiAJCWZyZWUgPSBuZXcgQmxvY2tGcmVlTGlzdCgpOwogCX0KIAotCXZvaWQgYWRkKGZpbmFsIFJldk9iamVjdCBjKSB7CisJdm9pZCBhZGQoUmV2T2JqZWN0IGMpIHsKIAkJQmxvY2sgYiA9IHRhaWw7CiAJCWlmIChiID09IG51bGwpIHsKIAkJCWIgPSBmcmVlLm5ld0Jsb2NrKCk7CkBAIC05OCw3ICs5OCw3IEBACiAJCQlyZXR1cm4gYjsKIAkJfQogCi0JCXZvaWQgZnJlZUJsb2NrKGZpbmFsIEJsb2NrIGIpIHsKKwkJdm9pZCBmcmVlQmxvY2soQmxvY2sgYikgewogCQkJYi5uZXh0ID0gbmV4dDsKIAkJCW5leHQgPSBiOwogCQl9CkBAIC0xMjcsNyArMTI3LDcgQEAKIAkJCXJldHVybiBoZWFkSW5kZXggPT0gdGFpbEluZGV4OwogCQl9CiAKLQkJdm9pZCBhZGQoZmluYWwgUmV2T2JqZWN0IGMpIHsKKwkJdm9pZCBhZGQoUmV2T2JqZWN0IGMpIHsKIAkJCW9iamVjdHNbdGFpbEluZGV4KytdID0gYzsKIAkJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvQmxvY2tSZXZRdWV1ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0Jsb2NrUmV2UXVldWUuamF2YQppbmRleCA3NGEzNTExLi43OTMwN2I1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvQmxvY2tSZXZRdWV1ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9CbG9ja1JldlF1ZXVlLmphdmEKQEAgLTU4LDcgKzU4LDcgQEAKIAkJZnJlZSA9IG5ldyBCbG9ja0ZyZWVMaXN0KCk7CiAJfQogCi0JQmxvY2tSZXZRdWV1ZShmaW5hbCBHZW5lcmF0b3IgcykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCisJQmxvY2tSZXZRdWV1ZShHZW5lcmF0b3IgcykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCQlJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCWZyZWUgPSBuZXcgQmxvY2tGcmVlTGlzdCgpOwogCQlvdXRwdXRUeXBlID0gcy5vdXRwdXRUeXBlKCk7CkBAIC04NSw3ICs4NSw3IEBACiAJICogc2hhcmluZyB0aGUgc2FtZSBmcmVlIGxpc3QgYXJlIGRvaW5nIHNvIGZyb20gb25seSBhIHNpbmdsZSB0aHJlYWQuCiAJICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2hhcmVGcmVlTGlzdChmaW5hbCBCbG9ja1JldlF1ZXVlIHEpIHsKKwlwdWJsaWMgdm9pZCBzaGFyZUZyZWVMaXN0KEJsb2NrUmV2UXVldWUgcSkgewogCQlmcmVlID0gcS5mcmVlOwogCX0KIApAQCAtMTAxLDcgKzEwMSw3IEBACiAJCQlyZXR1cm4gYjsKIAkJfQogCi0JCXZvaWQgZnJlZUJsb2NrKGZpbmFsIEJsb2NrIGIpIHsKKwkJdm9pZCBmcmVlQmxvY2soQmxvY2sgYikgewogCQkJYi5uZXh0ID0gbmV4dDsKIAkJCW5leHQgPSBiOwogCQl9CkBAIC0xMzgsMTEgKzEzOCwxMSBAQAogCQkJcmV0dXJuIGhlYWRJbmRleCA+IDA7CiAJCX0KIAotCQl2b2lkIGFkZChmaW5hbCBSZXZDb21taXQgYykgeworCQl2b2lkIGFkZChSZXZDb21taXQgYykgewogCQkJY29tbWl0c1t0YWlsSW5kZXgrK10gPSBjOwogCQl9CiAKLQkJdm9pZCB1bnBvcChmaW5hbCBSZXZDb21taXQgYykgeworCQl2b2lkIHVucG9wKFJldkNvbW1pdCBjKSB7CiAJCQljb21taXRzWy0taGVhZEluZGV4XSA9IGM7CiAJCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0JvdW5kYXJ5R2VuZXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvQm91bmRhcnlHZW5lcmF0b3IuamF2YQppbmRleCA2YmUwYzg1Li4wZmQ2NjIxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvQm91bmRhcnlHZW5lcmF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvQm91bmRhcnlHZW5lcmF0b3IuamF2YQpAQCAtNTQsNyArNTQsNyBAQAogCiAJR2VuZXJhdG9yIGc7CiAKLQlCb3VuZGFyeUdlbmVyYXRvcihmaW5hbCBSZXZXYWxrIHcsIGZpbmFsIEdlbmVyYXRvciBzKSB7CisJQm91bmRhcnlHZW5lcmF0b3IoUmV2V2FsayB3LCBHZW5lcmF0b3IgcykgewogCQlnID0gbmV3IEluaXRpYWxHZW5lcmF0b3Iodywgcyk7CiAJfQogCkBAIC02NCw3ICs2NCw3IEBACiAJfQogCiAJQE92ZXJyaWRlCi0Jdm9pZCBzaGFyZUZyZWVMaXN0KGZpbmFsIEJsb2NrUmV2UXVldWUgcSkgeworCXZvaWQgc2hhcmVGcmVlTGlzdChCbG9ja1JldlF1ZXVlIHEpIHsKIAkJZy5zaGFyZUZyZWVMaXN0KHEpOwogCX0KIApAQCAtODUsNyArODUsNyBAQAogCiAJCXByaXZhdGUgZmluYWwgR2VuZXJhdG9yIHNvdXJjZTsKIAotCQlJbml0aWFsR2VuZXJhdG9yKGZpbmFsIFJldldhbGsgdywgZmluYWwgR2VuZXJhdG9yIHMpIHsKKwkJSW5pdGlhbEdlbmVyYXRvcihSZXZXYWxrIHcsIEdlbmVyYXRvciBzKSB7CiAJCQl3YWxrID0gdzsKIAkJCWhlbGQgPSBuZXcgRklGT1JldlF1ZXVlKCk7CiAJCQlzb3VyY2UgPSBzOwpAQCAtOTgsNyArOTgsNyBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXZvaWQgc2hhcmVGcmVlTGlzdChmaW5hbCBCbG9ja1JldlF1ZXVlIHEpIHsKKwkJdm9pZCBzaGFyZUZyZWVMaXN0KEJsb2NrUmV2UXVldWUgcSkgewogCQkJcS5zaGFyZUZyZWVMaXN0KGhlbGQpOwogCQl9CiAKQEAgLTEwNyw3ICsxMDcsNyBAQAogCQkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJCVJldkNvbW1pdCBjID0gc291cmNlLm5leHQoKTsKIAkJCWlmIChjICE9IG51bGwpIHsKLQkJCQlmb3IgKGZpbmFsIFJldkNvbW1pdCBwIDogYy5wYXJlbnRzKQorCQkJCWZvciAoUmV2Q29tbWl0IHAgOiBjLnBhcmVudHMpCiAJCQkJCWlmICgocC5mbGFncyAmIFVOSU5URVJFU1RJTkcpICE9IDApCiAJCQkJCQloZWxkLmFkZChwKTsKIAkJCQlyZXR1cm4gYzsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9EYXRlUmV2UXVldWUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9EYXRlUmV2UXVldWUuamF2YQppbmRleCBjOTkzZmU1Li5iODZlODc2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRGF0ZVJldlF1ZXVlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0RhdGVSZXZRdWV1ZS5qYXZhCkBAIC03Niw3ICs3Niw3IEBACiAJCXN1cGVyKCk7CiAJfQogCi0JRGF0ZVJldlF1ZXVlKGZpbmFsIEdlbmVyYXRvciBzKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKKwlEYXRlUmV2UXVldWUoR2VuZXJhdG9yIHMpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlmb3IgKDs7KSB7CiAJCQlmaW5hbCBSZXZDb21taXQgYyA9IHMubmV4dCgpOwpAQCAtODgsNyArODgsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGQoZmluYWwgUmV2Q29tbWl0IGMpIHsKKwlwdWJsaWMgdm9pZCBhZGQoUmV2Q29tbWl0IGMpIHsKIAkJc2luY2VMYXN0SW5kZXgrKzsKIAkJaWYgKCsraW5RdWV1ZSA+IFJFQlVJTERfSU5ERVhfQ09VTlQKIAkJCQkmJiBzaW5jZUxhc3RJbmRleCA+IFJFQlVJTERfSU5ERVhfQ09VTlQpCkBAIC0xODEsNyArMTgxLDcgQEAKIAl9CiAKIAlAT3ZlcnJpZGUKLQlib29sZWFuIGV2ZXJib2R5SGFzRmxhZyhmaW5hbCBpbnQgZikgeworCWJvb2xlYW4gZXZlcmJvZHlIYXNGbGFnKGludCBmKSB7CiAJCWZvciAoRW50cnkgcSA9IGhlYWQ7IHEgIT0gbnVsbDsgcSA9IHEubmV4dCkgewogCQkJaWYgKChxLmNvbW1pdC5mbGFncyAmIGYpID09IDApCiAJCQkJcmV0dXJuIGZhbHNlOwpAQCAtMTkwLDcgKzE5MCw3IEBACiAJfQogCiAJQE92ZXJyaWRlCi0JYm9vbGVhbiBhbnlib2R5SGFzRmxhZyhmaW5hbCBpbnQgZikgeworCWJvb2xlYW4gYW55Ym9keUhhc0ZsYWcoaW50IGYpIHsKIAkJZm9yIChFbnRyeSBxID0gaGVhZDsgcSAhPSBudWxsOyBxID0gcS5uZXh0KSB7CiAJCQlpZiAoKHEuY29tbWl0LmZsYWdzICYgZikgIT0gMCkKIAkJCQlyZXR1cm4gdHJ1ZTsKQEAgLTIxMiw3ICsyMTIsNyBAQAogCQlyZXR1cm4gcy50b1N0cmluZygpOwogCX0KIAotCXByaXZhdGUgRW50cnkgbmV3RW50cnkoZmluYWwgUmV2Q29tbWl0IGMpIHsKKwlwcml2YXRlIEVudHJ5IG5ld0VudHJ5KFJldkNvbW1pdCBjKSB7CiAJCUVudHJ5IHIgPSBmcmVlOwogCQlpZiAociA9PSBudWxsKQogCQkJciA9IG5ldyBFbnRyeSgpOwpAQCAtMjIyLDcgKzIyMiw3IEBACiAJCXJldHVybiByOwogCX0KIAotCXByaXZhdGUgdm9pZCBmcmVlRW50cnkoZmluYWwgRW50cnkgZSkgeworCXByaXZhdGUgdm9pZCBmcmVlRW50cnkoRW50cnkgZSkgewogCQllLm5leHQgPSBmcmVlOwogCQlmcmVlID0gZTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRGVsYXlSZXZRdWV1ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0RlbGF5UmV2UXVldWUuamF2YQppbmRleCA0YTBkMTlkLi5jMzk3YTAxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRGVsYXlSZXZRdWV1ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9EZWxheVJldlF1ZXVlLmphdmEKQEAgLTY5LDcgKzY5LDcgQEAKIAogCXByaXZhdGUgaW50IHNpemU7CiAKLQlEZWxheVJldlF1ZXVlKGZpbmFsIEdlbmVyYXRvciBnKSB7CisJRGVsYXlSZXZRdWV1ZShHZW5lcmF0b3IgZykgewogCQlwZW5kaW5nID0gZzsKIAkJZGVsYXkgPSBuZXcgRklGT1JldlF1ZXVlKCk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0RlcHRoR2VuZXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRGVwdGhHZW5lcmF0b3IuamF2YQppbmRleCBhZDA1MTg2Li5lYWVjMzA1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRGVwdGhHZW5lcmF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRGVwdGhHZW5lcmF0b3IuamF2YQpAQCAtMTEzLDcgKzExMyw3IEBACiAJfQogCiAJQE92ZXJyaWRlCi0Jdm9pZCBzaGFyZUZyZWVMaXN0KGZpbmFsIEJsb2NrUmV2UXVldWUgcSkgeworCXZvaWQgc2hhcmVGcmVlTGlzdChCbG9ja1JldlF1ZXVlIHEpIHsKIAkJcGVuZGluZy5zaGFyZUZyZWVMaXN0KHEpOwogCX0KIApAQCAtMTM0LDcgKzEzNCw3IEBACiAKIAkJCWludCBuZXdEZXB0aCA9IGMuZGVwdGggKyAxOwogCi0JCQlmb3IgKGZpbmFsIFJldkNvbW1pdCBwIDogYy5wYXJlbnRzKSB7CisJCQlmb3IgKFJldkNvbW1pdCBwIDogYy5wYXJlbnRzKSB7CiAJCQkJRGVwdGhXYWxrLkNvbW1pdCBkcCA9IChEZXB0aFdhbGsuQ29tbWl0KSBwOwogCiAJCQkJLy8gSWYgbm8gZGVwdGggaGFzIGJlZW4gYXNzaWduZWQgdG8gdGhpcyBjb21taXQsIGFzc2lnbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0ZJRk9SZXZRdWV1ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0ZJRk9SZXZRdWV1ZS5qYXZhCmluZGV4IDYzYjc5OTAuLmNkYjA4NGMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9GSUZPUmV2UXVldWUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRklGT1JldlF1ZXVlLmphdmEKQEAgLTYzLDE0ICs2MywxNCBAQAogCQlzdXBlcigpOwogCX0KIAotCUZJRk9SZXZRdWV1ZShmaW5hbCBHZW5lcmF0b3IgcykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCisJRklGT1JldlF1ZXVlKEdlbmVyYXRvciBzKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJc3VwZXIocyk7CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGQoZmluYWwgUmV2Q29tbWl0IGMpIHsKKwlwdWJsaWMgdm9pZCBhZGQoUmV2Q29tbWl0IGMpIHsKIAkJQmxvY2sgYiA9IHRhaWw7CiAJCWlmIChiID09IG51bGwpIHsKIAkJCWIgPSBmcmVlLm5ld0Jsb2NrKCk7CkBAIC05Miw3ICs5Miw3IEBACiAJICogQHBhcmFtIGMKIAkgKiAgICAgICAgICAgIHRoZSBjb21taXQgdG8gaW5zZXJ0IGludG8gdGhlIHF1ZXVlLgogCSAqLwotCXB1YmxpYyB2b2lkIHVucG9wKGZpbmFsIFJldkNvbW1pdCBjKSB7CisJcHVibGljIHZvaWQgdW5wb3AoUmV2Q29tbWl0IGMpIHsKIAkJQmxvY2sgYiA9IGhlYWQ7CiAJCWlmIChiID09IG51bGwpIHsKIAkJCWIgPSBmcmVlLm5ld0Jsb2NrKCk7CkBAIC0xMzksNyArMTM5LDcgQEAKIAl9CiAKIAlAT3ZlcnJpZGUKLQlib29sZWFuIGV2ZXJib2R5SGFzRmxhZyhmaW5hbCBpbnQgZikgeworCWJvb2xlYW4gZXZlcmJvZHlIYXNGbGFnKGludCBmKSB7CiAJCWZvciAoQmxvY2sgYiA9IGhlYWQ7IGIgIT0gbnVsbDsgYiA9IGIubmV4dCkgewogCQkJZm9yIChpbnQgaSA9IGIuaGVhZEluZGV4OyBpIDwgYi50YWlsSW5kZXg7IGkrKykKIAkJCQlpZiAoKGIuY29tbWl0c1tpXS5mbGFncyAmIGYpID09IDApCkBAIC0xNDksNyArMTQ5LDcgQEAKIAl9CiAKIAlAT3ZlcnJpZGUKLQlib29sZWFuIGFueWJvZHlIYXNGbGFnKGZpbmFsIGludCBmKSB7CisJYm9vbGVhbiBhbnlib2R5SGFzRmxhZyhpbnQgZikgewogCQlmb3IgKEJsb2NrIGIgPSBoZWFkOyBiICE9IG51bGw7IGIgPSBiLm5leHQpIHsKIAkJCWZvciAoaW50IGkgPSBiLmhlYWRJbmRleDsgaSA8IGIudGFpbEluZGV4OyBpKyspCiAJCQkJaWYgKChiLmNvbW1pdHNbaV0uZmxhZ3MgJiBmKSAhPSAwKQpAQCAtMTU4LDcgKzE1OCw3IEBACiAJCXJldHVybiBmYWxzZTsKIAl9CiAKLQl2b2lkIHJlbW92ZUZsYWcoZmluYWwgaW50IGYpIHsKKwl2b2lkIHJlbW92ZUZsYWcoaW50IGYpIHsKIAkJZmluYWwgaW50IG5vdF9mID0gfmY7CiAJCWZvciAoQmxvY2sgYiA9IGhlYWQ7IGIgIT0gbnVsbDsgYiA9IGIubmV4dCkgewogCQkJZm9yIChpbnQgaSA9IGIuaGVhZEluZGV4OyBpIDwgYi50YWlsSW5kZXg7IGkrKykKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9GaXhVbmludGVyZXN0aW5nR2VuZXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRml4VW5pbnRlcmVzdGluZ0dlbmVyYXRvci5qYXZhCmluZGV4IDlkNzM0YTcuLjRlNmQ3ZTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9GaXhVbmludGVyZXN0aW5nR2VuZXJhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0ZpeFVuaW50ZXJlc3RpbmdHZW5lcmF0b3IuamF2YQpAQCAtNjEsNyArNjEsNyBAQAogZmluYWwgY2xhc3MgRml4VW5pbnRlcmVzdGluZ0dlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7CiAJcHJpdmF0ZSBmaW5hbCBHZW5lcmF0b3IgcGVuZGluZzsKIAotCUZpeFVuaW50ZXJlc3RpbmdHZW5lcmF0b3IoZmluYWwgR2VuZXJhdG9yIGcpIHsKKwlGaXhVbmludGVyZXN0aW5nR2VuZXJhdG9yKEdlbmVyYXRvciBnKSB7CiAJCXBlbmRpbmcgPSBnOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0ZvbGxvd0ZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0ZvbGxvd0ZpbHRlci5qYXZhCmluZGV4IDJkYTk3YzguLmRhZTNhYWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9Gb2xsb3dGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRm9sbG93RmlsdGVyLmphdmEKQEAgLTk1LDcgKzk1LDcgQEAKIAogCXByaXZhdGUgUmVuYW1lQ2FsbGJhY2sgcmVuYW1lQ2FsbGJhY2s7CiAKLQlGb2xsb3dGaWx0ZXIoZmluYWwgUGF0aEZpbHRlciBwYXRoLCBmaW5hbCBEaWZmQ29uZmlnIGNmZykgeworCUZvbGxvd0ZpbHRlcihQYXRoRmlsdGVyIHBhdGgsIERpZmZDb25maWcgY2ZnKSB7CiAJCXRoaXMucGF0aCA9IHBhdGg7CiAJCXRoaXMuY2ZnID0gY2ZnOwogCX0KQEAgLTExMiw3ICsxMTIsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFRyZWVXYWxrIHdhbGtlcikKKwlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFRyZWVXYWxrIHdhbGtlcikKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJSU9FeGNlcHRpb24gewogCQlyZXR1cm4gcGF0aC5pbmNsdWRlKHdhbGtlcikgJiYgQU5ZX0RJRkYuaW5jbHVkZSh3YWxrZXIpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0Zvb3RlcktleS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0Zvb3RlcktleS5qYXZhCmluZGV4IDM2MGJlMjkuLjQ1ZDVmODAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9Gb290ZXJLZXkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRm9vdGVyS2V5LmphdmEKQEAgLTcwLDcgKzcwLDcgQEAKIAkgKiBAcGFyYW0ga2V5TmFtZQogCSAqICAgICAgICAgICAgbmFtZSBvZiB0aGUgZm9vdGVyIGxpbmUuCiAJICovCi0JcHVibGljIEZvb3RlcktleShmaW5hbCBTdHJpbmcga2V5TmFtZSkgeworCXB1YmxpYyBGb290ZXJLZXkoU3RyaW5nIGtleU5hbWUpIHsKIAkJbmFtZSA9IGtleU5hbWU7CiAJCXJhdyA9IENvbnN0YW50cy5lbmNvZGUoa2V5TmFtZS50b0xvd2VyQ2FzZShMb2NhbGUuUk9PVCkpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9Gb290ZXJMaW5lLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRm9vdGVyTGluZS5qYXZhCmluZGV4IDA3NGNlODIuLmQ2ZmVkNjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9Gb290ZXJMaW5lLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0Zvb3RlckxpbmUuamF2YQpAQCAtODYsNyArODYsNyBAQAogCSAqICAgICAgICAgICAga2V5IHRvIHRlc3QgdGhpcyBsaW5lJ3Mga2V5IG5hbWUgYWdhaW5zdC4KIAkgKiBAcmV0dXJuIHRydWUgaWYge0Bjb2RlIGtleS5nZXROYW1lKCkuZXF1YWxzSWdub3JlY2FzZShnZXRLZXkoKSl9LgogCSAqLwotCXB1YmxpYyBib29sZWFuIG1hdGNoZXMoZmluYWwgRm9vdGVyS2V5IGtleSkgeworCXB1YmxpYyBib29sZWFuIG1hdGNoZXMoRm9vdGVyS2V5IGtleSkgewogCQlmaW5hbCBieXRlW10ga1JhdyA9IGtleS5yYXc7CiAJCWZpbmFsIGludCBsZW4gPSBrUmF3Lmxlbmd0aDsKIAkJaW50IGJQdHIgPSBrZXlTdGFydDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9HZW5lcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9HZW5lcmF0b3IuamF2YQppbmRleCBhOTUzMDNiLi5iMmM5MmVhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvR2VuZXJhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0dlbmVyYXRvci5qYXZhCkBAIC04MSw3ICs4MSw3IEBACiAJICogQHBhcmFtIHEKIAkgKiAgICAgICAgICAgIGFub3RoZXIgRklGTyBxdWV1ZSB0aGF0IHdhbnRzIHRvIHNoYXJlIG91ciBxdWV1ZSdzIGZyZWUgbGlzdC4KIAkgKi8KLQl2b2lkIHNoYXJlRnJlZUxpc3QoZmluYWwgQmxvY2tSZXZRdWV1ZSBxKSB7CisJdm9pZCBzaGFyZUZyZWVMaXN0KEJsb2NrUmV2UXVldWUgcSkgewogCQkvLyBEbyBub3RoaW5nIGJ5IGRlZmF1bHQuCiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvTElGT1JldlF1ZXVlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvTElGT1JldlF1ZXVlLmphdmEKaW5kZXggZjczNGI2OS4uODQ2YjhkOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0xJRk9SZXZRdWV1ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9MSUZPUmV2UXVldWUuamF2YQpAQCAtNjIsMTQgKzYyLDE0IEBACiAJCXN1cGVyKCk7CiAJfQogCi0JTElGT1JldlF1ZXVlKGZpbmFsIEdlbmVyYXRvciBzKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKKwlMSUZPUmV2UXVldWUoR2VuZXJhdG9yIHMpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlzdXBlcihzKTsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZChmaW5hbCBSZXZDb21taXQgYykgeworCXB1YmxpYyB2b2lkIGFkZChSZXZDb21taXQgYykgewogCQlCbG9jayBiID0gaGVhZDsKIAkJaWYgKGIgPT0gbnVsbCB8fCAhYi5jYW5VbnBvcCgpKSB7CiAJCQliID0gZnJlZS5uZXdCbG9jaygpOwpAQCAtMTAzLDcgKzEwMyw3IEBACiAJfQogCiAJQE92ZXJyaWRlCi0JYm9vbGVhbiBldmVyYm9keUhhc0ZsYWcoZmluYWwgaW50IGYpIHsKKwlib29sZWFuIGV2ZXJib2R5SGFzRmxhZyhpbnQgZikgewogCQlmb3IgKEJsb2NrIGIgPSBoZWFkOyBiICE9IG51bGw7IGIgPSBiLm5leHQpIHsKIAkJCWZvciAoaW50IGkgPSBiLmhlYWRJbmRleDsgaSA8IGIudGFpbEluZGV4OyBpKyspCiAJCQkJaWYgKChiLmNvbW1pdHNbaV0uZmxhZ3MgJiBmKSA9PSAwKQpAQCAtMTEzLDcgKzExMyw3IEBACiAJfQogCiAJQE92ZXJyaWRlCi0JYm9vbGVhbiBhbnlib2R5SGFzRmxhZyhmaW5hbCBpbnQgZikgeworCWJvb2xlYW4gYW55Ym9keUhhc0ZsYWcoaW50IGYpIHsKIAkJZm9yIChCbG9jayBiID0gaGVhZDsgYiAhPSBudWxsOyBiID0gYi5uZXh0KSB7CiAJCQlmb3IgKGludCBpID0gYi5oZWFkSW5kZXg7IGkgPCBiLnRhaWxJbmRleDsgaSsrKQogCQkJCWlmICgoYi5jb21taXRzW2ldLmZsYWdzICYgZikgIT0gMCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9NZXJnZUJhc2VHZW5lcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9NZXJnZUJhc2VHZW5lcmF0b3IuamF2YQppbmRleCA3M2NlOTg1Li4yZmU5NTMxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvTWVyZ2VCYXNlR2VuZXJhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL01lcmdlQmFzZUdlbmVyYXRvci5qYXZhCkBAIC04NCwxMiArODQsMTIgQEAKIAogCXByaXZhdGUgQ2FycnlTdGFjayBzdGFjazsKIAotCU1lcmdlQmFzZUdlbmVyYXRvcihmaW5hbCBSZXZXYWxrIHcpIHsKKwlNZXJnZUJhc2VHZW5lcmF0b3IoUmV2V2FsayB3KSB7CiAJCXdhbGtlciA9IHc7CiAJCXBlbmRpbmcgPSBuZXcgRGF0ZVJldlF1ZXVlKCk7CiAJfQogCi0Jdm9pZCBpbml0KGZpbmFsIEFic3RyYWN0UmV2UXVldWUgcCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwl2b2lkIGluaXQoQWJzdHJhY3RSZXZRdWV1ZSBwKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0cnkgewogCQkJZm9yICg7OykgewogCQkJCWZpbmFsIFJldkNvbW1pdCBjID0gcC5uZXh0KCk7CkBAIC0xMTksNyArMTE5LDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBhZGQoZmluYWwgUmV2Q29tbWl0IGMpIHsKKwlwcml2YXRlIHZvaWQgYWRkKFJldkNvbW1pdCBjKSB7CiAJCWZpbmFsIGludCBmbGFnID0gd2Fsa2VyLmFsbG9jRmxhZygpOwogCQlicmFuY2hNYXNrIHw9IGZsYWc7CiAJCWlmICgoYy5mbGFncyAmIGJyYW5jaE1hc2spICE9IDApIHsKQEAgLTE0Niw3ICsxNDYsNyBAQAogCQkJCXJldHVybiBudWxsOwogCQkJfQogCi0JCQlmb3IgKGZpbmFsIFJldkNvbW1pdCBwIDogYy5wYXJlbnRzKSB7CisJCQlmb3IgKFJldkNvbW1pdCBwIDogYy5wYXJlbnRzKSB7CiAJCQkJaWYgKChwLmZsYWdzICYgSU5fUEVORElORykgIT0gMCkKIAkJCQkJY29udGludWU7CiAJCQkJaWYgKChwLmZsYWdzICYgUEFSU0VEKSA9PSAwKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL09iamVjdFdhbGsuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9PYmplY3RXYWxrLmphdmEKaW5kZXggMjVjM2UxMi4uZTU5MDNjOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL09iamVjdFdhbGsuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvT2JqZWN0V2Fsay5qYXZhCkBAIC0xMTksNyArMTE5LDcgQEAKIAkgKiBAcGFyYW0gcmVwbwogCSAqICAgICAgICAgICAgdGhlIHJlcG9zaXRvcnkgdGhlIHdhbGtlciB3aWxsIG9idGFpbiBkYXRhIGZyb20uCiAJICovCi0JcHVibGljIE9iamVjdFdhbGsoZmluYWwgUmVwb3NpdG9yeSByZXBvKSB7CisJcHVibGljIE9iamVjdFdhbGsoUmVwb3NpdG9yeSByZXBvKSB7CiAJCXRoaXMocmVwby5uZXdPYmplY3RSZWFkZXIoKSk7CiAJfQogCkBAIC02OTksNyArNjk5LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVzZXQoZmluYWwgaW50IHJldGFpbkZsYWdzKSB7CisJcHJvdGVjdGVkIHZvaWQgcmVzZXQoaW50IHJldGFpbkZsYWdzKSB7CiAJCXN1cGVyLnJlc2V0KHJldGFpbkZsYWdzKTsKIAogCQlmb3IgKFJldk9iamVjdCBvYmogOiByb290T2JqZWN0cykKQEAgLTcxMSw3ICs3MTEsNyBAQAogCQlmcmVlVmlzaXQgPSBudWxsOwogCX0KIAotCXByaXZhdGUgdm9pZCBhZGRPYmplY3QoZmluYWwgUmV2T2JqZWN0IG8pIHsKKwlwcml2YXRlIHZvaWQgYWRkT2JqZWN0KFJldk9iamVjdCBvKSB7CiAJCWlmICgoby5mbGFncyAmIElOX1BFTkRJTkcpID09IDApIHsKIAkJCW8uZmxhZ3MgfD0gSU5fUEVORElORzsKIAkJCXJvb3RPYmplY3RzLmFkZChvKTsKQEAgLTcxOSw3ICs3MTksNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIG1hcmtUcmVlVW5pbnRlcmVzdGluZyhmaW5hbCBSZXZUcmVlIHRyZWUpCisJcHJpdmF0ZSB2b2lkIG1hcmtUcmVlVW5pbnRlcmVzdGluZyhSZXZUcmVlIHRyZWUpCiAJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCUlPRXhjZXB0aW9uIHsKIAkJaWYgKCh0cmVlLmZsYWdzICYgVU5JTlRFUkVTVElORykgIT0gMCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9QZW5kaW5nR2VuZXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUGVuZGluZ0dlbmVyYXRvci5qYXZhCmluZGV4IDk0YWUyYzkuLmU2MDdiN2QgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9QZW5kaW5nR2VuZXJhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1BlbmRpbmdHZW5lcmF0b3IuamF2YQpAQCAtMTQwLDcgKzE0MCw3IEBACiAJCQkJCXByb2R1Y2UgPSBmaWx0ZXIuaW5jbHVkZSh3YWxrZXIsIGMpOwogCQkJCX0KIAotCQkJCWZvciAoZmluYWwgUmV2Q29tbWl0IHAgOiBjLnBhcmVudHMpIHsKKwkJCQlmb3IgKFJldkNvbW1pdCBwIDogYy5wYXJlbnRzKSB7CiAJCQkJCWlmICgocC5mbGFncyAmIFNFRU4pICE9IDApCiAJCQkJCQljb250aW51ZTsKIAkJCQkJaWYgKChwLmZsYWdzICYgUEFSU0VEKSA9PSAwKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldkJsb2IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZCbG9iLmphdmEKaW5kZXggZDM1MjkyOS4uY2M1ZTNlNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldkJsb2IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2QmxvYi5qYXZhCkBAIC02Miw3ICs2Miw3IEBACiAJICogQHBhcmFtIGlkCiAJICogICAgICAgICAgICBvYmplY3QgbmFtZSBmb3IgdGhlIGJsb2IuCiAJICovCi0JcHJvdGVjdGVkIFJldkJsb2IoZmluYWwgQW55T2JqZWN0SWQgaWQpIHsKKwlwcm90ZWN0ZWQgUmV2QmxvYihBbnlPYmplY3RJZCBpZCkgewogCQlzdXBlcihpZCk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2Q29tbWl0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2Q29tbWl0LmphdmEKaW5kZXggOWRiMTQ2Ny4uYjY3ZjkzNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldkNvbW1pdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZDb21taXQuamF2YQpAQCAtNDQsNyArNDQsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQucmV2d2FsazsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CkBAIC0xNDgsMTggKzE0OCwxOCBAQAogCSAqIEBwYXJhbSBpZAogCSAqICAgICAgICAgICAgb2JqZWN0IG5hbWUgZm9yIHRoZSBjb21taXQuCiAJICovCi0JcHJvdGVjdGVkIFJldkNvbW1pdChmaW5hbCBBbnlPYmplY3RJZCBpZCkgeworCXByb3RlY3RlZCBSZXZDb21taXQoQW55T2JqZWN0SWQgaWQpIHsKIAkJc3VwZXIoaWQpOwogCX0KIAogCUBPdmVycmlkZQotCXZvaWQgcGFyc2VIZWFkZXJzKGZpbmFsIFJldldhbGsgd2FsaykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCisJdm9pZCBwYXJzZUhlYWRlcnMoUmV2V2FsayB3YWxrKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJcGFyc2VDYW5vbmljYWwod2Fsaywgd2Fsay5nZXRDYWNoZWRCeXRlcyh0aGlzKSk7CiAJfQogCiAJQE92ZXJyaWRlCi0Jdm9pZCBwYXJzZUJvZHkoZmluYWwgUmV2V2FsayB3YWxrKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKKwl2b2lkIHBhcnNlQm9keShSZXZXYWxrIHdhbGspIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlpZiAoYnVmZmVyID09IG51bGwpIHsKIAkJCWJ1ZmZlciA9IHdhbGsuZ2V0Q2FjaGVkQnl0ZXModGhpcyk7CkBAIC0xNjgsNyArMTY4LDcgQEAKIAkJfQogCX0KIAotCXZvaWQgcGFyc2VDYW5vbmljYWwoZmluYWwgUmV2V2FsayB3YWxrLCBmaW5hbCBieXRlW10gcmF3KQorCXZvaWQgcGFyc2VDYW5vbmljYWwoUmV2V2FsayB3YWxrLCBieXRlW10gcmF3KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKCF3YWxrLnNoYWxsb3dDb21taXRzSW5pdGlhbGl6ZWQpCiAJCQl3YWxrLmluaXRpYWxpemVTaGFsbG93Q29tbWl0cygpOwpAQCAtMzEwLDcgKzMxMCw3IEBACiAJICogQHBhcmFtIGZsYWcKIAkgKiAgICAgICAgICAgIHRoZSBzaW5nbGUgZmxhZyB2YWx1ZSB0byBjYXJyeSBiYWNrIG9udG8gcGFyZW50cy4KIAkgKi8KLQlwdWJsaWMgdm9pZCBjYXJyeShmaW5hbCBSZXZGbGFnIGZsYWcpIHsKKwlwdWJsaWMgdm9pZCBjYXJyeShSZXZGbGFnIGZsYWcpIHsKIAkJZmluYWwgaW50IGNhcnJ5ID0gZmxhZ3MgJiBmbGFnLm1hc2s7CiAJCWlmIChjYXJyeSAhPSAwKQogCQkJY2FycnlGbGFncyh0aGlzLCBjYXJyeSk7CkBAIC0zNTMsNyArMzUzLDcgQEAKIAkgKiBAdGhyb3dzIGphdmEubGFuZy5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBhbiBpbnZhbGlkIHBhcmVudCBpbmRleCB3YXMgc3BlY2lmaWVkLgogCSAqLwotCXB1YmxpYyBmaW5hbCBSZXZDb21taXQgZ2V0UGFyZW50KGZpbmFsIGludCBudGgpIHsKKwlwdWJsaWMgZmluYWwgUmV2Q29tbWl0IGdldFBhcmVudChpbnQgbnRoKSB7CiAJCXJldHVybiBwYXJlbnRzW250aF07CiAJfQogCkBAIC00OTAsNyArNDkwLDcgQEAKIAkJcmV0dXJuIHN0cjsKIAl9CiAKLQlzdGF0aWMgYm9vbGVhbiBoYXNMRihmaW5hbCBieXRlW10gciwgaW50IGIsIGZpbmFsIGludCBlKSB7CisJc3RhdGljIGJvb2xlYW4gaGFzTEYoYnl0ZVtdIHIsIGludCBiLCBpbnQgZSkgewogCQl3aGlsZSAoYiA8IGUpCiAJCQlpZiAocltiKytdID09ICdcbicpCiAJCQkJcmV0dXJuIHRydWU7CkBAIC01MzksNyArNTM5LDcgQEAKIAkJdHJ5IHsKIAkJCXJldHVybiBnZXRFbmNvZGluZygpOwogCQl9IGNhdGNoIChJbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb24gfCBVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIFVURl84OworCQkJcmV0dXJuIENIQVJTRVQ7CiAJCX0KIAl9CiAKQEAgLTYxNSw3ICs2MTUsNyBAQAogCSAqICAgICAgICAgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSwgb3IgdGhlcmUgYXJlIG5vIGZvb3RlcnMgYXQgYWxsLgogCSAqIEBzZWUgI2dldEZvb3RlckxpbmVzKCkKIAkgKi8KLQlwdWJsaWMgZmluYWwgTGlzdDxTdHJpbmc+IGdldEZvb3RlckxpbmVzKGZpbmFsIFN0cmluZyBrZXlOYW1lKSB7CisJcHVibGljIGZpbmFsIExpc3Q8U3RyaW5nPiBnZXRGb290ZXJMaW5lcyhTdHJpbmcga2V5TmFtZSkgewogCQlyZXR1cm4gZ2V0Rm9vdGVyTGluZXMobmV3IEZvb3RlcktleShrZXlOYW1lKSk7CiAJfQogCkBAIC02MzAsMTIgKzYzMCwxMiBAQAogCSAqICAgICAgICAgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSwgb3IgdGhlcmUgYXJlIG5vIGZvb3RlcnMgYXQgYWxsLgogCSAqIEBzZWUgI2dldEZvb3RlckxpbmVzKCkKIAkgKi8KLQlwdWJsaWMgZmluYWwgTGlzdDxTdHJpbmc+IGdldEZvb3RlckxpbmVzKGZpbmFsIEZvb3RlcktleSBrZXlOYW1lKSB7CisJcHVibGljIGZpbmFsIExpc3Q8U3RyaW5nPiBnZXRGb290ZXJMaW5lcyhGb290ZXJLZXkga2V5TmFtZSkgewogCQlmaW5hbCBMaXN0PEZvb3RlckxpbmU+IHNyYyA9IGdldEZvb3RlckxpbmVzKCk7CiAJCWlmIChzcmMuaXNFbXB0eSgpKQogCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwogCQlmaW5hbCBBcnJheUxpc3Q8U3RyaW5nPiByID0gbmV3IEFycmF5TGlzdDw+KHNyYy5zaXplKCkpOwotCQlmb3IgKGZpbmFsIEZvb3RlckxpbmUgZiA6IHNyYykgeworCQlmb3IgKEZvb3RlckxpbmUgZiA6IHNyYykgewogCQkJaWYgKGYubWF0Y2hlcyhrZXlOYW1lKSkKIAkJCQlyLmFkZChmLmdldFZhbHVlKCkpOwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2Q29tbWl0TGlzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldkNvbW1pdExpc3QuamF2YQppbmRleCAzOGNmM2Y1Li5kMmZkYTJmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2Q29tbWl0TGlzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZDb21taXRMaXN0LmphdmEKQEAgLTkxLDcgKzkxLDcgQEAKIAkgKiAgICAgICAgICAgICBvYmplY3QgdGhhdCBzaG91bGQgYmUgcHJlc2VudCB3YXMgbm90IGZvdW5kLiBSZXBvc2l0b3J5CiAJICogICAgICAgICAgICAgY29ycnVwdGlvbiBtYXkgaGF2ZSBvY2N1cnJlZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseUZsYWcoZmluYWwgUmV2RmlsdGVyIG1hdGNoaW5nLCBmaW5hbCBSZXZGbGFnIGZsYWcpCisJcHVibGljIHZvaWQgYXBwbHlGbGFnKFJldkZpbHRlciBtYXRjaGluZywgUmV2RmxhZyBmbGFnKQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQlJT0V4Y2VwdGlvbiB7CiAJCWFwcGx5RmxhZyhtYXRjaGluZywgZmxhZywgMCwgc2l6ZSgpKTsKQEAgLTE2NSw3ICsxNjUsNyBAQAogCSAqICAgICAgICAgICAgdGhlIGZsYWcgdG8gcmVtb3ZlLiBBcHBsaWNhdGlvbnMgYXJlIHJlc3BvbnNpYmxlIGZvcgogCSAqICAgICAgICAgICAgYWxsb2NhdGluZyB0aGlzIGZsYWcgZnJvbSB0aGUgc291cmNlIFJldldhbGsuCiAJICovCi0JcHVibGljIHZvaWQgY2xlYXJGbGFnKGZpbmFsIFJldkZsYWcgZmxhZykgeworCXB1YmxpYyB2b2lkIGNsZWFyRmxhZyhSZXZGbGFnIGZsYWcpIHsKIAkJY2xlYXJGbGFnKGZsYWcsIDAsIHNpemUoKSk7CiAJfQogCkBAIC0yMDcsNyArMjA3LDcgQEAKIAkgKiBAcmV0dXJuIGluZGV4IG9mIHRoZSBmaXJzdCBjb21taXQgYXQgb3IgYWZ0ZXIgaW5kZXggPGNvZGU+YmVnaW48L2NvZGU+CiAJICogICAgICAgICB0aGF0IGhhcyB0aGUgc3BlY2lmaWVkIGZsYWcgc2V0IG9uIGl0OyAtMSBpZiBubyBtYXRjaCBpcyBmb3VuZC4KIAkgKi8KLQlwdWJsaWMgaW50IGluZGV4T2YoZmluYWwgUmV2RmxhZyBmbGFnLCBpbnQgYmVnaW4pIHsKKwlwdWJsaWMgaW50IGluZGV4T2YoUmV2RmxhZyBmbGFnLCBpbnQgYmVnaW4pIHsKIAkJd2hpbGUgKGJlZ2luIDwgc2l6ZSgpKSB7CiAJCQlpbnQgaW5kZXggPSBiZWdpbjsKIAkJCUJsb2NrIHMgPSBjb250ZW50czsKQEAgLTIzOCw3ICsyMzgsNyBAQAogCSAqIEByZXR1cm4gaW5kZXggb2YgdGhlIGZpcnN0IGNvbW1pdCBhdCBvciBiZWZvcmUgaW5kZXggPGNvZGU+YmVnaW48L2NvZGU+CiAJICogICAgICAgICB0aGF0IGhhcyB0aGUgc3BlY2lmaWVkIGZsYWcgc2V0IG9uIGl0OyAtMSBpZiBubyBtYXRjaCBpcyBmb3VuZC4KIAkgKi8KLQlwdWJsaWMgaW50IGxhc3RJbmRleE9mKGZpbmFsIFJldkZsYWcgZmxhZywgaW50IGJlZ2luKSB7CisJcHVibGljIGludCBsYXN0SW5kZXhPZihSZXZGbGFnIGZsYWcsIGludCBiZWdpbikgewogCQliZWdpbiA9IE1hdGgubWluKGJlZ2luLCBzaXplKCkgLSAxKTsKIAkJd2hpbGUgKGJlZ2luID49IDApIHsKIAkJCWludCBpbmRleCA9IGJlZ2luOwpAQCAtMjY1LDcgKzI2NSw3IEBACiAJICogICAgICAgICAgICB0aGUgd2Fsa2VyIHRvIHBvcHVsYXRlIGZyb20uCiAJICogQHNlZSAjZmlsbFRvKGludCkKIAkgKi8KLQlwdWJsaWMgdm9pZCBzb3VyY2UoZmluYWwgUmV2V2FsayB3KSB7CisJcHVibGljIHZvaWQgc291cmNlKFJldldhbGsgdykgewogCQl3YWxrZXIgPSB3OwogCX0KIApAQCAtMjk5LDcgKzI5OSw3IEBACiAJICogICAgICAgICAgICAgc2VlIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2V2FsayNuZXh0KCl9CiAJICovCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHZvaWQgZmlsbFRvKGZpbmFsIGludCBoaWdoTWFyaykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCisJcHVibGljIHZvaWQgZmlsbFRvKGludCBoaWdoTWFyaykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCQlJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCWlmICh3YWxrZXIgPT0gbnVsbCB8fCBzaXplID4gaGlnaE1hcmspCiAJCQlyZXR1cm47CkBAIC0zNjQsNyArMzY0LDcgQEAKIAkgKiAgICAgICAgICAgICBzZWUge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZXYWxrI25leHQoKX0KIAkgKi8KIAlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgdm9pZCBmaWxsVG8oZmluYWwgUmV2Q29tbWl0IGNvbW1pdFRvTG9hZCwgaW50IGhpZ2hNYXJrKQorCXB1YmxpYyB2b2lkIGZpbGxUbyhSZXZDb21taXQgY29tbWl0VG9Mb2FkLCBpbnQgaGlnaE1hcmspCiAJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCUlPRXhjZXB0aW9uIHsKIAkJaWYgKHdhbGtlciA9PSBudWxsIHx8IGNvbW1pdFRvTG9hZCA9PSBudWxsCkBAIC00MTksNyArNDE5LDcgQEAKIAkgKiBAcGFyYW0gZQogCSAqICAgICAgICAgICAgdGhlIG9iamVjdCBiZWluZyBhZGRlZCAob3Igc2V0KSBpbnRvIHRoZSBsaXN0LgogCSAqLwotCXByb3RlY3RlZCB2b2lkIGVudGVyKGZpbmFsIGludCBpbmRleCwgZmluYWwgRSBlKSB7CisJcHJvdGVjdGVkIHZvaWQgZW50ZXIoaW50IGluZGV4LCBFIGUpIHsKIAkJLy8gRG8gbm90aGluZyBieSBkZWZhdWx0LgogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZGbGFnLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2RmxhZy5qYXZhCmluZGV4IDFlNzk4NjcuLjQxM2E1NTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZGbGFnLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldkZsYWcuamF2YQpAQCAtODUsNyArODUsNyBAQAogCiAJZmluYWwgaW50IG1hc2s7CiAKLQlSZXZGbGFnKGZpbmFsIFJldldhbGsgdywgZmluYWwgU3RyaW5nIG4sIGZpbmFsIGludCBtKSB7CisJUmV2RmxhZyhSZXZXYWxrIHcsIFN0cmluZyBuLCBpbnQgbSkgewogCQl3YWxrZXIgPSB3OwogCQluYW1lID0gbjsKIAkJbWFzayA9IG07CkBAIC0xMDcsNyArMTA3LDcgQEAKIAl9CiAKIAlzdGF0aWMgY2xhc3MgU3RhdGljUmV2RmxhZyBleHRlbmRzIFJldkZsYWcgewotCQlTdGF0aWNSZXZGbGFnKGZpbmFsIFN0cmluZyBuLCBmaW5hbCBpbnQgbSkgeworCQlTdGF0aWNSZXZGbGFnKFN0cmluZyBuLCBpbnQgbSkgewogCQkJc3VwZXIobnVsbCwgbiwgbSk7CiAJCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldkZsYWdTZXQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZGbGFnU2V0LmphdmEKaW5kZXggOTc0MGQxNC4uNDVhNzMwYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldkZsYWdTZXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2RmxhZ1NldC5qYXZhCkBAIC03Myw3ICs3Myw3IEBACiAJICogQHBhcmFtIHMKIAkgKiAgICAgICAgICAgIHRoZSBzZXQgdG8gY29weSBmbGFncyBmcm9tLgogCSAqLwotCXB1YmxpYyBSZXZGbGFnU2V0KGZpbmFsIFJldkZsYWdTZXQgcykgeworCXB1YmxpYyBSZXZGbGFnU2V0KFJldkZsYWdTZXQgcykgewogCQltYXNrID0gcy5tYXNrOwogCQlhY3RpdmUgPSBuZXcgQXJyYXlMaXN0PD4ocy5hY3RpdmUpOwogCX0KQEAgLTg0LDE0ICs4NCwxNCBAQAogCSAqIEBwYXJhbSBzCiAJICogICAgICAgICAgICB0aGUgY29sbGVjdGlvbiB0byBjb3B5IGZsYWdzIGZyb20uCiAJICovCi0JcHVibGljIFJldkZsYWdTZXQoZmluYWwgQ29sbGVjdGlvbjxSZXZGbGFnPiBzKSB7CisJcHVibGljIFJldkZsYWdTZXQoQ29sbGVjdGlvbjxSZXZGbGFnPiBzKSB7CiAJCXRoaXMoKTsKIAkJYWRkQWxsKHMpOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoZmluYWwgT2JqZWN0IG8pIHsKKwlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgewogCQlpZiAobyBpbnN0YW5jZW9mIFJldkZsYWcpCiAJCQlyZXR1cm4gKG1hc2sgJiAoKFJldkZsYWcpIG8pLm1hc2spICE9IDA7CiAJCXJldHVybiBmYWxzZTsKQEAgLTk5LDcgKzk5LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoZmluYWwgQ29sbGVjdGlvbjw/PiBjKSB7CisJcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbjw/PiBjKSB7CiAJCWlmIChjIGluc3RhbmNlb2YgUmV2RmxhZ1NldCkgewogCQkJZmluYWwgaW50IGNNYXNrID0gKChSZXZGbGFnU2V0KSBjKS5tYXNrOwogCQkJcmV0dXJuIChtYXNrICYgY01hc2spID09IGNNYXNrOwpAQCAtMTA5LDcgKzEwOSw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGFkZChmaW5hbCBSZXZGbGFnIGZsYWcpIHsKKwlwdWJsaWMgYm9vbGVhbiBhZGQoUmV2RmxhZyBmbGFnKSB7CiAJCWlmICgobWFzayAmIGZsYWcubWFzaykgIT0gMCkKIAkJCXJldHVybiBmYWxzZTsKIAkJbWFzayB8PSBmbGFnLm1hc2s7CkBAIC0xMjIsNyArMTIyLDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKGZpbmFsIE9iamVjdCBvKSB7CisJcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7CiAJCWZpbmFsIFJldkZsYWcgZmxhZyA9IChSZXZGbGFnKSBvOwogCQlpZiAoKG1hc2sgJiBmbGFnLm1hc2spID09IDApCiAJCQlyZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2T2JqZWN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2T2JqZWN0LmphdmEKaW5kZXggNGE4ODEwNS4uZWVmOWJmMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1Jldk9iamVjdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZPYmplY3QuamF2YQpAQCAtNjAsNyArNjAsNyBAQAogCiAJaW50IGZsYWdzOwogCi0JUmV2T2JqZWN0KGZpbmFsIEFueU9iamVjdElkIG5hbWUpIHsKKwlSZXZPYmplY3QoQW55T2JqZWN0SWQgbmFtZSkgewogCQlzdXBlcihuYW1lKTsKIAl9CiAKQEAgLTkzLDcgKzkzLDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBmbGFnIHRvIHRlc3QuCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBmbGFnIGhhcyBiZWVuIGFkZGVkIHRvIHRoaXMgb2JqZWN0OyBmYWxzZSBpZiBub3QuCiAJICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzKGZpbmFsIFJldkZsYWcgZmxhZykgeworCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhcyhSZXZGbGFnIGZsYWcpIHsKIAkJcmV0dXJuIChmbGFncyAmIGZsYWcubWFzaykgIT0gMDsKIAl9CiAKQEAgLTEwNSw3ICsxMDUsNyBAQAogCSAqIEByZXR1cm4gdHJ1ZSBpZiBhbnkgZmxhZyBpbiB0aGUgc2V0IGhhcyBiZWVuIGFkZGVkIHRvIHRoaXMgb2JqZWN0OyBmYWxzZQogCSAqICAgICAgICAgaWYgbm90LgogCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc0FueShmaW5hbCBSZXZGbGFnU2V0IHNldCkgeworCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc0FueShSZXZGbGFnU2V0IHNldCkgewogCQlyZXR1cm4gKGZsYWdzICYgc2V0Lm1hc2spICE9IDA7CiAJfQogCkBAIC0xMTcsNyArMTE3LDcgQEAKIAkgKiBAcmV0dXJuIHRydWUgaWYgYWxsIGZsYWdzIG9mIHRoZSBzZXQgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoaXMgb2JqZWN0OwogCSAqICAgICAgICAgZmFsc2UgaWYgc29tZSBvciBub25lIGhhdmUgYmVlbiBhZGRlZC4KIAkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNBbGwoZmluYWwgUmV2RmxhZ1NldCBzZXQpIHsKKwlwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNBbGwoUmV2RmxhZ1NldCBzZXQpIHsKIAkJcmV0dXJuIChmbGFncyAmIHNldC5tYXNrKSA9PSBzZXQubWFzazsKIAl9CiAKQEAgLTEyOSw3ICsxMjksNyBAQAogCSAqIEBwYXJhbSBmbGFnCiAJICogICAgICAgICAgICB0aGUgZmxhZyB0byBtYXJrIG9uIHRoaXMgb2JqZWN0LCBmb3IgbGF0ZXIgdGVzdGluZy4KIAkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBhZGQoZmluYWwgUmV2RmxhZyBmbGFnKSB7CisJcHVibGljIGZpbmFsIHZvaWQgYWRkKFJldkZsYWcgZmxhZykgewogCQlmbGFncyB8PSBmbGFnLm1hc2s7CiAJfQogCkBAIC0xMzksNyArMTM5LDcgQEAKIAkgKiBAcGFyYW0gc2V0CiAJICogICAgICAgICAgICB0aGUgc2V0IG9mIGZsYWdzIHRvIG1hcmsgb24gdGhpcyBvYmplY3QsIGZvciBsYXRlciB0ZXN0aW5nLgogCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGFkZChmaW5hbCBSZXZGbGFnU2V0IHNldCkgeworCXB1YmxpYyBmaW5hbCB2b2lkIGFkZChSZXZGbGFnU2V0IHNldCkgewogCQlmbGFncyB8PSBzZXQubWFzazsKIAl9CiAKQEAgLTE1MSw3ICsxNTEsNyBAQAogCSAqIEBwYXJhbSBmbGFnCiAJICogICAgICAgICAgICB0aGUgZmxhZyB0byByZW1vdmUgZnJvbSB0aGlzIG9iamVjdC4KIAkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCByZW1vdmUoZmluYWwgUmV2RmxhZyBmbGFnKSB7CisJcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlKFJldkZsYWcgZmxhZykgewogCQlmbGFncyAmPSB+ZmxhZy5tYXNrOwogCX0KIApAQCAtMTYxLDcgKzE2MSw3IEBACiAJICogQHBhcmFtIHNldAogCSAqICAgICAgICAgICAgdGhlIGZsYWcgdG8gcmVtb3ZlIGZyb20gdGhpcyBvYmplY3QuCiAJICovCi0JcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlKGZpbmFsIFJldkZsYWdTZXQgc2V0KSB7CisJcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlKFJldkZsYWdTZXQgc2V0KSB7CiAJCWZsYWdzICY9IH5zZXQubWFzazsKIAl9CiAKQEAgLTE4Myw3ICsxODMsNyBAQAogCSAqIEBwYXJhbSBzCiAJICogICAgICAgICAgICBidWZmZXIgdG8gYXBwZW5kIGEgZGVidWcgZGVzY3JpcHRpb24gb2YgY29yZSBSZXZGbGFncyBvbnRvLgogCSAqLwotCXByb3RlY3RlZCB2b2lkIGFwcGVuZENvcmVGbGFncyhmaW5hbCBTdHJpbmdCdWlsZGVyIHMpIHsKKwlwcm90ZWN0ZWQgdm9pZCBhcHBlbmRDb3JlRmxhZ3MoU3RyaW5nQnVpbGRlciBzKSB7CiAJCXMuYXBwZW5kKChmbGFncyAmIFJldldhbGsuVE9QT19ERUxBWSkgIT0gMCA/ICdvJyA6ICctJyk7CiAJCXMuYXBwZW5kKChmbGFncyAmIFJldldhbGsuVEVNUF9NQVJLKSAhPSAwID8gJ3QnIDogJy0nKTsKIAkJcy5hcHBlbmQoKGZsYWdzICYgUmV2V2Fsay5SRVdSSVRFKSAhPSAwID8gJ3InIDogJy0nKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZPYmplY3RMaXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2T2JqZWN0TGlzdC5qYXZhCmluZGV4IDJiYjQ0MjcuLjJmMjFlMTcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZPYmplY3RMaXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1Jldk9iamVjdExpc3QuamF2YQpAQCAtODIsNyArODIsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGQoZmluYWwgaW50IGluZGV4LCBmaW5hbCBFIGVsZW1lbnQpIHsKKwlwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBFIGVsZW1lbnQpIHsKIAkJaWYgKGluZGV4ICE9IHNpemUpCiAJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCiAJCQkJCUpHaXRUZXh0LmdldCgpLnVuc3VwcG9ydGVkT3BlcmF0aW9uTm90QWRkQXRFbmQsCkBAIC0xNDcsNyArMTQ3LDcgQEAKIAogCQlmaW5hbCBpbnQgc2hpZnQ7CiAKLQkJQmxvY2soZmluYWwgaW50IHMpIHsKKwkJQmxvY2soaW50IHMpIHsKIAkJCXNoaWZ0ID0gczsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZUYWcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZUYWcuamF2YQppbmRleCBkNzQ4MzdlLi4wMDUwYmFjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2VGFnLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldlRhZy5qYXZhCkBAIC00NSw3ICs0NSw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKQEAgLTEzNywxOCArMTM3LDE4IEBACiAJICogQHBhcmFtIGlkCiAJICogICAgICAgICAgICBvYmplY3QgbmFtZSBmb3IgdGhlIHRhZy4KIAkgKi8KLQlwcm90ZWN0ZWQgUmV2VGFnKGZpbmFsIEFueU9iamVjdElkIGlkKSB7CisJcHJvdGVjdGVkIFJldlRhZyhBbnlPYmplY3RJZCBpZCkgewogCQlzdXBlcihpZCk7CiAJfQogCiAJQE92ZXJyaWRlCi0Jdm9pZCBwYXJzZUhlYWRlcnMoZmluYWwgUmV2V2FsayB3YWxrKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKKwl2b2lkIHBhcnNlSGVhZGVycyhSZXZXYWxrIHdhbGspIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlwYXJzZUNhbm9uaWNhbCh3YWxrLCB3YWxrLmdldENhY2hlZEJ5dGVzKHRoaXMpKTsKIAl9CiAKIAlAT3ZlcnJpZGUKLQl2b2lkIHBhcnNlQm9keShmaW5hbCBSZXZXYWxrIHdhbGspIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAorCXZvaWQgcGFyc2VCb2R5KFJldldhbGsgd2FsaykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCQlJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCWlmIChidWZmZXIgPT0gbnVsbCkgewogCQkJYnVmZmVyID0gd2Fsay5nZXRDYWNoZWRCeXRlcyh0aGlzKTsKQEAgLTE1Nyw3ICsxNTcsNyBAQAogCQl9CiAJfQogCi0Jdm9pZCBwYXJzZUNhbm9uaWNhbChmaW5hbCBSZXZXYWxrIHdhbGssIGZpbmFsIGJ5dGVbXSByYXdUYWcpCisJdm9pZCBwYXJzZUNhbm9uaWNhbChSZXZXYWxrIHdhbGssIGJ5dGVbXSByYXdUYWcpCiAJCQl0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiB7CiAJCWZpbmFsIE11dGFibGVJbnRlZ2VyIHBvcyA9IG5ldyBNdXRhYmxlSW50ZWdlcigpOwogCQlmaW5hbCBpbnQgb1R5cGU7CkBAIC0xNjksNyArMTY5LDcgQEAKIAogCQlpbnQgcCA9IHBvcy52YWx1ZSArPSA0OyAvLyAidGFnICIKIAkJZmluYWwgaW50IG5hbWVFbmQgPSBSYXdQYXJzZVV0aWxzLm5leHRMRihyYXdUYWcsIHApIC0gMTsKLQkJdGFnTmFtZSA9IFJhd1BhcnNlVXRpbHMuZGVjb2RlKFVURl84LCByYXdUYWcsIHAsIG5hbWVFbmQpOworCQl0YWdOYW1lID0gUmF3UGFyc2VVdGlscy5kZWNvZGUoQ0hBUlNFVCwgcmF3VGFnLCBwLCBuYW1lRW5kKTsKIAogCQlpZiAod2Fsay5pc1JldGFpbkJvZHkoKSkKIAkJCWJ1ZmZlciA9IHJhd1RhZzsKQEAgLTI1Nyw3ICsyNTcsNyBAQAogCQl0cnkgewogCQkJcmV0dXJuIFJhd1BhcnNlVXRpbHMucGFyc2VFbmNvZGluZyhidWZmZXIpOwogCQl9IGNhdGNoIChJbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb24gfCBVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIFVURl84OworCQkJcmV0dXJuIENIQVJTRVQ7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZUcmVlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2VHJlZS5qYXZhCmluZGV4IDkyYjgxYTEuLmU3ZGUyNzAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZUcmVlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldlRyZWUuamF2YQpAQCAtNjIsNyArNjIsNyBAQAogCSAqIEBwYXJhbSBpZAogCSAqICAgICAgICAgICAgb2JqZWN0IG5hbWUgZm9yIHRoZSB0cmVlLgogCSAqLwotCXByb3RlY3RlZCBSZXZUcmVlKGZpbmFsIEFueU9iamVjdElkIGlkKSB7CisJcHJvdGVjdGVkIFJldlRyZWUoQW55T2JqZWN0SWQgaWQpIHsKIAkJc3VwZXIoaWQpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGsuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrLmphdmEKaW5kZXggOTFjMTVhMS4uYTk4NmNmZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGsuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsay5qYXZhCkBAIC0yMDksNyArMjA5LDcgQEAKIAkgKiAgICAgICAgICAgIE9iamVjdFJlYWRlciB3aWxsIGJlIGNyZWF0ZWQgYnkgdGhlIHdhbGtlciwgYW5kIHdpbGwgYmUgY2xvc2VkCiAJICogICAgICAgICAgICB3aGVuIHRoZSB3YWxrZXIgaXMgY2xvc2VkLgogCSAqLwotCXB1YmxpYyBSZXZXYWxrKGZpbmFsIFJlcG9zaXRvcnkgcmVwbykgeworCXB1YmxpYyBSZXZXYWxrKFJlcG9zaXRvcnkgcmVwbykgewogCQl0aGlzKHJlcG8ubmV3T2JqZWN0UmVhZGVyKCksIHRydWUpOwogCX0KIApAQCAtMjk0LDcgKzI5NCw3IEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgYSBwYWNrIGZpbGUgb3IgbG9vc2Ugb2JqZWN0IGNvdWxkIG5vdCBiZSByZWFkLgogCSAqLwotCXB1YmxpYyB2b2lkIG1hcmtTdGFydChmaW5hbCBSZXZDb21taXQgYykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCisJcHVibGljIHZvaWQgbWFya1N0YXJ0KFJldkNvbW1pdCBjKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJaWYgKChjLmZsYWdzICYgU0VFTikgIT0gMCkKIAkJCXJldHVybjsKQEAgLTMyNCwxMCArMzI0LDEwIEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgYSBwYWNrIGZpbGUgb3IgbG9vc2Ugb2JqZWN0IGNvdWxkIG5vdCBiZSByZWFkLgogCSAqLwotCXB1YmxpYyB2b2lkIG1hcmtTdGFydChmaW5hbCBDb2xsZWN0aW9uPFJldkNvbW1pdD4gbGlzdCkKKwlwdWJsaWMgdm9pZCBtYXJrU3RhcnQoQ29sbGVjdGlvbjxSZXZDb21taXQ+IGxpc3QpCiAJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCUlPRXhjZXB0aW9uIHsKLQkJZm9yIChmaW5hbCBSZXZDb21taXQgYyA6IGxpc3QpCisJCWZvciAoUmV2Q29tbWl0IGMgOiBsaXN0KQogCQkJbWFya1N0YXJ0KGMpOwogCX0KIApAQCAtMzY0LDcgKzM2NCw3IEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgYSBwYWNrIGZpbGUgb3IgbG9vc2Ugb2JqZWN0IGNvdWxkIG5vdCBiZSByZWFkLgogCSAqLwotCXB1YmxpYyB2b2lkIG1hcmtVbmludGVyZXN0aW5nKGZpbmFsIFJldkNvbW1pdCBjKQorCXB1YmxpYyB2b2lkIG1hcmtVbmludGVyZXN0aW5nKFJldkNvbW1pdCBjKQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQlJT0V4Y2VwdGlvbiB7CiAJCWMuZmxhZ3MgfD0gVU5JTlRFUkVTVElORzsKQEAgLTQwMiw3ICs0MDIsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGEgcGFjayBmaWxlIG9yIGxvb3NlIG9iamVjdCBjb3VsZCBub3QgYmUgcmVhZC4KIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01lcmdlZEludG8oZmluYWwgUmV2Q29tbWl0IGJhc2UsIGZpbmFsIFJldkNvbW1pdCB0aXApCisJcHVibGljIGJvb2xlYW4gaXNNZXJnZWRJbnRvKFJldkNvbW1pdCBiYXNlLCBSZXZDb21taXQgdGlwKQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQlJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIFJldkZpbHRlciBvbGRSRiA9IGZpbHRlcjsKQEAgLTQ3NSw3ICs0NzUsNyBAQAogCSAqIEBwYXJhbSBzCiAJICogICAgICAgICAgICBhIHNvcnRpbmcgc3RyYXRlZ3kgdG8gZW5hYmxlLgogCSAqLwotCXB1YmxpYyB2b2lkIHNvcnQoZmluYWwgUmV2U29ydCBzKSB7CisJcHVibGljIHZvaWQgc29ydChSZXZTb3J0IHMpIHsKIAkJYXNzZXJ0Tm90U3RhcnRlZCgpOwogCQlzb3J0aW5nLmNsZWFyKCk7CiAJCXNvcnRpbmcuYWRkKHMpOwpAQCAtNDk2LDcgKzQ5Niw3IEBACiAJICogICAgICAgICAgICB0cnVlIGlmIHRoaXMgc3RyYXRlZ3kgc2hvdWxkIGJlIHVzZWQsIGZhbHNlIGlmIGl0IHNob3VsZCBiZQogCSAqICAgICAgICAgICAgcmVtb3ZlZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzb3J0KGZpbmFsIFJldlNvcnQgcywgZmluYWwgYm9vbGVhbiB1c2UpIHsKKwlwdWJsaWMgdm9pZCBzb3J0KFJldlNvcnQgcywgYm9vbGVhbiB1c2UpIHsKIAkJYXNzZXJ0Tm90U3RhcnRlZCgpOwogCQlpZiAodXNlKQogCQkJc29ydGluZy5hZGQocyk7CkBAIC01NDEsNyArNTQxLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5maWx0ZXIuQW5kUmV2RmlsdGVyCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuZmlsdGVyLk9yUmV2RmlsdGVyCiAJICovCi0JcHVibGljIHZvaWQgc2V0UmV2RmlsdGVyKGZpbmFsIFJldkZpbHRlciBuZXdGaWx0ZXIpIHsKKwlwdWJsaWMgdm9pZCBzZXRSZXZGaWx0ZXIoUmV2RmlsdGVyIG5ld0ZpbHRlcikgewogCQlhc3NlcnROb3RTdGFydGVkKCk7CiAJCWZpbHRlciA9IG5ld0ZpbHRlciAhPSBudWxsID8gbmV3RmlsdGVyIDogUmV2RmlsdGVyLkFMTDsKIAl9CkBAIC01ODIsNyArNTgyLDcgQEAKIAkgKiAgICAgICAgICAgIHdpbGwgYmUgdXNlZCBpbnN0ZWFkLCBhcyBpdCBtYXRjaGVzIGV2ZXJ5dGhpbmcuCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlci5QYXRoRmlsdGVyCiAJICovCi0JcHVibGljIHZvaWQgc2V0VHJlZUZpbHRlcihmaW5hbCBUcmVlRmlsdGVyIG5ld0ZpbHRlcikgeworCXB1YmxpYyB2b2lkIHNldFRyZWVGaWx0ZXIoVHJlZUZpbHRlciBuZXdGaWx0ZXIpIHsKIAkJYXNzZXJ0Tm90U3RhcnRlZCgpOwogCQl0cmVlRmlsdGVyID0gbmV3RmlsdGVyICE9IG51bGwgPyBuZXdGaWx0ZXIgOiBUcmVlRmlsdGVyLkFMTDsKIAl9CkBAIC02MzgsNyArNjM4LDcgQEAKIAkgKiBAcGFyYW0gcmV0YWluCiAJICogICAgICAgICAgICB0cnVlIHRvIHJldGFpbiBib2RpZXM7IGZhbHNlIHRvIGRpc2NhcmQgdGhlbSBlYXJseS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXRhaW5Cb2R5KGZpbmFsIGJvb2xlYW4gcmV0YWluKSB7CisJcHVibGljIHZvaWQgc2V0UmV0YWluQm9keShib29sZWFuIHJldGFpbikgewogCQlyZXRhaW5Cb2R5ID0gcmV0YWluOwogCX0KIApAQCAtNjUzLDcgKzY1Myw3IEBACiAJICogQHJldHVybiByZWZlcmVuY2UgdG8gdGhlIGJsb2Igb2JqZWN0LiBOZXZlciBudWxsLgogCSAqLwogCUBOb25OdWxsCi0JcHVibGljIFJldkJsb2IgbG9va3VwQmxvYihmaW5hbCBBbnlPYmplY3RJZCBpZCkgeworCXB1YmxpYyBSZXZCbG9iIGxvb2t1cEJsb2IoQW55T2JqZWN0SWQgaWQpIHsKIAkJUmV2QmxvYiBjID0gKFJldkJsb2IpIG9iamVjdHMuZ2V0KGlkKTsKIAkJaWYgKGMgPT0gbnVsbCkgewogCQkJYyA9IG5ldyBSZXZCbG9iKGlkKTsKQEAgLTY3Myw3ICs2NzMsNyBAQAogCSAqIEByZXR1cm4gcmVmZXJlbmNlIHRvIHRoZSB0cmVlIG9iamVjdC4gTmV2ZXIgbnVsbC4KIAkgKi8KIAlATm9uTnVsbAotCXB1YmxpYyBSZXZUcmVlIGxvb2t1cFRyZWUoZmluYWwgQW55T2JqZWN0SWQgaWQpIHsKKwlwdWJsaWMgUmV2VHJlZSBsb29rdXBUcmVlKEFueU9iamVjdElkIGlkKSB7CiAJCVJldlRyZWUgYyA9IChSZXZUcmVlKSBvYmplY3RzLmdldChpZCk7CiAJCWlmIChjID09IG51bGwpIHsKIAkJCWMgPSBuZXcgUmV2VHJlZShpZCk7CkBAIC02OTYsNyArNjk2LDcgQEAKIAkgKiBAcmV0dXJuIHJlZmVyZW5jZSB0byB0aGUgY29tbWl0IG9iamVjdC4gTmV2ZXIgbnVsbC4KIAkgKi8KIAlATm9uTnVsbAotCXB1YmxpYyBSZXZDb21taXQgbG9va3VwQ29tbWl0KGZpbmFsIEFueU9iamVjdElkIGlkKSB7CisJcHVibGljIFJldkNvbW1pdCBsb29rdXBDb21taXQoQW55T2JqZWN0SWQgaWQpIHsKIAkJUmV2Q29tbWl0IGMgPSAoUmV2Q29tbWl0KSBvYmplY3RzLmdldChpZCk7CiAJCWlmIChjID09IG51bGwpIHsKIAkJCWMgPSBjcmVhdGVDb21taXQoaWQpOwpAQCAtNzE2LDcgKzcxNiw3IEBACiAJICogQHJldHVybiByZWZlcmVuY2UgdG8gdGhlIHRhZyBvYmplY3QuIE5ldmVyIG51bGwuCiAJICovCiAJQE5vbk51bGwKLQlwdWJsaWMgUmV2VGFnIGxvb2t1cFRhZyhmaW5hbCBBbnlPYmplY3RJZCBpZCkgeworCXB1YmxpYyBSZXZUYWcgbG9va3VwVGFnKEFueU9iamVjdElkIGlkKSB7CiAJCVJldlRhZyBjID0gKFJldlRhZykgb2JqZWN0cy5nZXQoaWQpOwogCQlpZiAoYyA9PSBudWxsKSB7CiAJCQljID0gbmV3IFJldlRhZyhpZCk7CkBAIC03MzgsNyArNzM4LDcgQEAKIAkgKiBAcmV0dXJuIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0LiBOZXZlciBudWxsLgogCSAqLwogCUBOb25OdWxsCi0JcHVibGljIFJldk9iamVjdCBsb29rdXBBbnkoZmluYWwgQW55T2JqZWN0SWQgaWQsIGZpbmFsIGludCB0eXBlKSB7CisJcHVibGljIFJldk9iamVjdCBsb29rdXBBbnkoQW55T2JqZWN0SWQgaWQsIGludCB0eXBlKSB7CiAJCVJldk9iamVjdCByID0gb2JqZWN0cy5nZXQoaWQpOwogCQlpZiAociA9PSBudWxsKSB7CiAJCQlzd2l0Y2ggKHR5cGUpIHsKQEAgLTc5Myw3ICs3OTMsNyBAQAogCSAqICAgICAgICAgICAgIGEgcGFjayBmaWxlIG9yIGxvb3NlIG9iamVjdCBjb3VsZCBub3QgYmUgcmVhZC4KIAkgKi8KIAlATm9uTnVsbAotCXB1YmxpYyBSZXZDb21taXQgcGFyc2VDb21taXQoZmluYWwgQW55T2JqZWN0SWQgaWQpCisJcHVibGljIFJldkNvbW1pdCBwYXJzZUNvbW1pdChBbnlPYmplY3RJZCBpZCkKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJSU9FeGNlcHRpb24gewogCQlSZXZPYmplY3QgYyA9IHBlZWwocGFyc2VBbnkoaWQpKTsKQEAgLTgyMSw3ICs4MjEsNyBAQAogCSAqICAgICAgICAgICAgIGEgcGFjayBmaWxlIG9yIGxvb3NlIG9iamVjdCBjb3VsZCBub3QgYmUgcmVhZC4KIAkgKi8KIAlATm9uTnVsbAotCXB1YmxpYyBSZXZUcmVlIHBhcnNlVHJlZShmaW5hbCBBbnlPYmplY3RJZCBpZCkKKwlwdWJsaWMgUmV2VHJlZSBwYXJzZVRyZWUoQW55T2JqZWN0SWQgaWQpCiAJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCUlPRXhjZXB0aW9uIHsKIAkJUmV2T2JqZWN0IGMgPSBwZWVsKHBhcnNlQW55KGlkKSk7CkBAIC04NTYsNyArODU2LDcgQEAKIAkgKiAgICAgICAgICAgICBhIHBhY2sgZmlsZSBvciBsb29zZSBvYmplY3QgY291bGQgbm90IGJlIHJlYWQuCiAJICovCiAJQE5vbk51bGwKLQlwdWJsaWMgUmV2VGFnIHBhcnNlVGFnKGZpbmFsIEFueU9iamVjdElkIGlkKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKKwlwdWJsaWMgUmV2VGFnIHBhcnNlVGFnKEFueU9iamVjdElkIGlkKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJUmV2T2JqZWN0IGMgPSBwYXJzZUFueShpZCk7CiAJCWlmICghKGMgaW5zdGFuY2VvZiBSZXZUYWcpKQpAQCAtODgyLDcgKzg4Miw3IEBACiAJICogICAgICAgICAgICAgYSBwYWNrIGZpbGUgb3IgbG9vc2Ugb2JqZWN0IGNvdWxkIG5vdCBiZSByZWFkLgogCSAqLwogCUBOb25OdWxsCi0JcHVibGljIFJldk9iamVjdCBwYXJzZUFueShmaW5hbCBBbnlPYmplY3RJZCBpZCkKKwlwdWJsaWMgUmV2T2JqZWN0IHBhcnNlQW55KEFueU9iamVjdElkIGlkKQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJUmV2T2JqZWN0IHIgPSBvYmplY3RzLmdldChpZCk7CiAJCWlmIChyID09IG51bGwpCkBAIC0xMDQwLDcgKzEwNDAsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGEgcGFjayBmaWxlIG9yIGxvb3NlIG9iamVjdCBjb3VsZCBub3QgYmUgcmVhZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBwYXJzZUhlYWRlcnMoZmluYWwgUmV2T2JqZWN0IG9iaikKKwlwdWJsaWMgdm9pZCBwYXJzZUhlYWRlcnMoUmV2T2JqZWN0IG9iaikKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCWlmICgob2JqLmZsYWdzICYgUEFSU0VEKSA9PSAwKQogCQkJb2JqLnBhcnNlSGVhZGVycyh0aGlzKTsKQEAgLTEwNTksNyArMTA1OSw3IEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgYSBwYWNrIGZpbGUgb3IgbG9vc2Ugb2JqZWN0IGNvdWxkIG5vdCBiZSByZWFkLgogCSAqLwotCXB1YmxpYyB2b2lkIHBhcnNlQm9keShmaW5hbCBSZXZPYmplY3Qgb2JqKQorCXB1YmxpYyB2b2lkIHBhcnNlQm9keShSZXZPYmplY3Qgb2JqKQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJb2JqLnBhcnNlQm9keSh0aGlzKTsKIAl9CkBAIC0xMTAwLDcgKzExMDAsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRvbyBtYW55IGZsYWdzIGhhdmUgYmVlbiByZXNlcnZlZCBvbiB0aGlzIHJldmlzaW9uIHdhbGtlci4KIAkgKi8KLQlwdWJsaWMgUmV2RmxhZyBuZXdGbGFnKGZpbmFsIFN0cmluZyBuYW1lKSB7CisJcHVibGljIFJldkZsYWcgbmV3RmxhZyhTdHJpbmcgbmFtZSkgewogCQlmaW5hbCBpbnQgbSA9IGFsbG9jRmxhZygpOwogCQlyZXR1cm4gbmV3IFJldkZsYWcodGhpcywgbmFtZSwgbSk7CiAJfQpAQCAtMTEyNCw3ICsxMTI0LDcgQEAKIAkgKiBAcGFyYW0gZmxhZwogCSAqICAgICAgICAgICAgdGhlIGZsYWcgdG8gY2Fycnkgb250byBwYXJlbnRzLCBpZiBzZXQgb24gYSBkZXNjZW5kYW50LgogCSAqLwotCXB1YmxpYyB2b2lkIGNhcnJ5KGZpbmFsIFJldkZsYWcgZmxhZykgeworCXB1YmxpYyB2b2lkIGNhcnJ5KFJldkZsYWcgZmxhZykgewogCQlpZiAoKGZyZWVGbGFncyAmIGZsYWcubWFzaykgIT0gMCkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuZmxhZ0lzRGlzcG9zZWQsIGZsYWcubmFtZSkpOwogCQlpZiAoZmxhZy53YWxrZXIgIT0gdGhpcykKQEAgLTExNDEsOCArMTE0MSw4IEBACiAJICogQHBhcmFtIHNldAogCSAqICAgICAgICAgICAgdGhlIGZsYWdzIHRvIGNhcnJ5IG9udG8gcGFyZW50cywgaWYgc2V0IG9uIGEgZGVzY2VuZGFudC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBjYXJyeShmaW5hbCBDb2xsZWN0aW9uPFJldkZsYWc+IHNldCkgewotCQlmb3IgKGZpbmFsIFJldkZsYWcgZmxhZyA6IHNldCkKKwlwdWJsaWMgdm9pZCBjYXJyeShDb2xsZWN0aW9uPFJldkZsYWc+IHNldCkgeworCQlmb3IgKFJldkZsYWcgZmxhZyA6IHNldCkKIAkJCWNhcnJ5KGZsYWcpOwogCX0KIApAQCAtMTIwMCwxMSArMTIwMCwxMSBAQAogCSAqIEBwYXJhbSBmbGFnCiAJICogICAgICAgICAgICB0aGUgdG8gcmVjeWNsZS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlRmxhZyhmaW5hbCBSZXZGbGFnIGZsYWcpIHsKKwlwdWJsaWMgdm9pZCBkaXNwb3NlRmxhZyhSZXZGbGFnIGZsYWcpIHsKIAkJZnJlZUZsYWcoZmxhZy5tYXNrKTsKIAl9CiAKLQl2b2lkIGZyZWVGbGFnKGZpbmFsIGludCBtYXNrKSB7CisJdm9pZCBmcmVlRmxhZyhpbnQgbWFzaykgewogCQlyZXRhaW5PblJlc2V0ICY9IH5tYXNrOwogCQlpZiAoaXNOb3RTdGFydGVkKCkpIHsKIAkJCWZyZWVGbGFncyB8PSBtYXNrOwpAQCAtMTI0NCw3ICsxMjQ0LDcgQEAKIAkgKiAgICAgICAgICAgIGFwcGxpY2F0aW9uIGZsYWdzIHRoYXQgc2hvdWxkIDxiPm5vdDwvYj4gYmUgY2xlYXJlZCBmcm9tCiAJICogICAgICAgICAgICBleGlzdGluZyBjb21taXQgb2JqZWN0cy4KIAkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCByZXNldFJldGFpbihmaW5hbCBSZXZGbGFnU2V0IHJldGFpbkZsYWdzKSB7CisJcHVibGljIGZpbmFsIHZvaWQgcmVzZXRSZXRhaW4oUmV2RmxhZ1NldCByZXRhaW5GbGFncykgewogCQlyZXNldChyZXRhaW5GbGFncy5tYXNrKTsKIAl9CiAKQEAgLTEyNjIsOSArMTI2Miw5IEBACiAJICogICAgICAgICAgICBhcHBsaWNhdGlvbiBmbGFncyB0aGF0IHNob3VsZCA8Yj5ub3Q8L2I+IGJlIGNsZWFyZWQgZnJvbQogCSAqICAgICAgICAgICAgZXhpc3RpbmcgY29tbWl0IG9iamVjdHMuCiAJICovCi0JcHVibGljIGZpbmFsIHZvaWQgcmVzZXRSZXRhaW4oZmluYWwgUmV2RmxhZy4uLiByZXRhaW5GbGFncykgeworCXB1YmxpYyBmaW5hbCB2b2lkIHJlc2V0UmV0YWluKFJldkZsYWcuLi4gcmV0YWluRmxhZ3MpIHsKIAkJaW50IG1hc2sgPSAwOwotCQlmb3IgKGZpbmFsIFJldkZsYWcgZmxhZyA6IHJldGFpbkZsYWdzKQorCQlmb3IgKFJldkZsYWcgZmxhZyA6IHJldGFpbkZsYWdzKQogCQkJbWFzayB8PSBmbGFnLm1hc2s7CiAJCXJlc2V0KG1hc2spOwogCX0KQEAgLTEyODYsNyArMTI4Niw3IEBACiAJCWZpbmFsIGludCBjbGVhckZsYWdzID0gfnJldGFpbkZsYWdzOwogCiAJCWZpbmFsIEZJRk9SZXZRdWV1ZSBxID0gbmV3IEZJRk9SZXZRdWV1ZSgpOwotCQlmb3IgKGZpbmFsIFJldkNvbW1pdCBjIDogcm9vdHMpIHsKKwkJZm9yIChSZXZDb21taXQgYyA6IHJvb3RzKSB7CiAJCQlpZiAoKGMuZmxhZ3MgJiBjbGVhckZsYWdzKSA9PSAwKQogCQkJCWNvbnRpbnVlOwogCQkJYy5mbGFncyAmPSByZXRhaW5GbGFnczsKQEAgLTEzMDAsNyArMTMwMCw3IEBACiAJCQkJYnJlYWs7CiAJCQlpZiAoYy5wYXJlbnRzID09IG51bGwpCiAJCQkJY29udGludWU7Ci0JCQlmb3IgKGZpbmFsIFJldkNvbW1pdCBwIDogYy5wYXJlbnRzKSB7CisJCQlmb3IgKFJldkNvbW1pdCBwIDogYy5wYXJlbnRzKSB7CiAJCQkJaWYgKChwLmZsYWdzICYgY2xlYXJGbGFncykgPT0gMCkKIAkJCQkJY29udGludWU7CiAJCQkJcC5mbGFncyAmPSByZXRhaW5GbGFnczsKQEAgLTE0MzUsMTEgKzE0MzUsMTEgQEAKIAkgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdGhpcyB3YWxrZXIgcmVxdWlyZXMgYSBjb21taXQgcmVmZXJlbmNlIGZvci4KIAkgKiBAcmV0dXJuIGEgbmV3IHVucGFyc2VkIHJlZmVyZW5jZSBmb3IgdGhlIG9iamVjdC4KIAkgKi8KLQlwcm90ZWN0ZWQgUmV2Q29tbWl0IGNyZWF0ZUNvbW1pdChmaW5hbCBBbnlPYmplY3RJZCBpZCkgeworCXByb3RlY3RlZCBSZXZDb21taXQgY3JlYXRlQ29tbWl0KEFueU9iamVjdElkIGlkKSB7CiAJCXJldHVybiBuZXcgUmV2Q29tbWl0KGlkKTsKIAl9CiAKLQl2b2lkIGNhcnJ5RmxhZ3NJbXBsKGZpbmFsIFJldkNvbW1pdCBjKSB7CisJdm9pZCBjYXJyeUZsYWdzSW1wbChSZXZDb21taXQgYykgewogCQlmaW5hbCBpbnQgY2FycnkgPSBjLmZsYWdzICYgY2FycnlGbGFnczsKIAkJaWYgKGNhcnJ5ICE9IDApCiAJCQlSZXZDb21taXQuY2FycnlGbGFncyhjLCBjYXJyeSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV3cml0ZUdlbmVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1Jld3JpdGVHZW5lcmF0b3IuamF2YQppbmRleCBmODIzMDFhLi4xYzg2OGZmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV3cml0ZUdlbmVyYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXdyaXRlR2VuZXJhdG9yLmphdmEKQEAgLTc2LDEyICs3NiwxMiBAQAogCiAJcHJpdmF0ZSBmaW5hbCBHZW5lcmF0b3Igc291cmNlOwogCi0JUmV3cml0ZUdlbmVyYXRvcihmaW5hbCBHZW5lcmF0b3IgcykgeworCVJld3JpdGVHZW5lcmF0b3IoR2VuZXJhdG9yIHMpIHsKIAkJc291cmNlID0gczsKIAl9CiAKIAlAT3ZlcnJpZGUKLQl2b2lkIHNoYXJlRnJlZUxpc3QoZmluYWwgQmxvY2tSZXZRdWV1ZSBxKSB7CisJdm9pZCBzaGFyZUZyZWVMaXN0KEJsb2NrUmV2UXVldWUgcSkgewogCQlzb3VyY2Uuc2hhcmVGcmVlTGlzdChxKTsKIAl9CiAKQEAgLTE0OCw3ICsxNDgsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBSZXZDb21taXRbXSBjbGVhbnVwKGZpbmFsIFJldkNvbW1pdFtdIG9sZExpc3QpIHsKKwlwcml2YXRlIFJldkNvbW1pdFtdIGNsZWFudXAoUmV2Q29tbWl0W10gb2xkTGlzdCkgewogCQkvLyBSZW1vdmUgYW55IGR1cGxpY2F0ZSBwYXJlbnRzIGNhdXNlZCBkdWUgdG8gcmV3cml0ZXMgKGUuZy4gYSBtZXJnZQogCQkvLyB3aXRoIHR3byBzaWRlcyB0aGF0IGJvdGggc2ltcGxpZmllZCBiYWNrIGludG8gdGhlIG1lcmdlIGJhc2UpLgogCQkvLyBXZSBhbHNvIG1heSBoYXZlIGRlbGV0ZWQgYSBwYXJlbnQgYnkgbWFya2luZyBpdCBudWxsLgpAQCAtMTY3LDE0ICsxNjcsMTQgQEAKIAkJfQogCiAJCWlmIChuZXdDbnQgPT0gb2xkTGlzdC5sZW5ndGgpIHsKLQkJCWZvciAoZmluYWwgUmV2Q29tbWl0IHAgOiBvbGRMaXN0KQorCQkJZm9yIChSZXZDb21taXQgcCA6IG9sZExpc3QpCiAJCQkJcC5mbGFncyAmPSB+RFVQTElDQVRFOwogCQkJcmV0dXJuIG9sZExpc3Q7CiAJCX0KIAogCQlmaW5hbCBSZXZDb21taXRbXSBuZXdMaXN0ID0gbmV3IFJldkNvbW1pdFtuZXdDbnRdOwogCQluZXdDbnQgPSAwOwotCQlmb3IgKGZpbmFsIFJldkNvbW1pdCBwIDogb2xkTGlzdCkgeworCQlmb3IgKFJldkNvbW1pdCBwIDogb2xkTGlzdCkgewogCQkJaWYgKHAgIT0gbnVsbCkgewogCQkJCW5ld0xpc3RbbmV3Q250KytdID0gcDsKIAkJCQlwLmZsYWdzICY9IH5EVVBMSUNBVEU7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvU3RhcnRHZW5lcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9TdGFydEdlbmVyYXRvci5qYXZhCmluZGV4IDFlYzYyOTAuLmViMTI5YTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9TdGFydEdlbmVyYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9TdGFydEdlbmVyYXRvci5qYXZhCkBAIC02Niw3ICs2Niw3IEBACiBjbGFzcyBTdGFydEdlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7CiAJcHJpdmF0ZSBmaW5hbCBSZXZXYWxrIHdhbGtlcjsKIAotCVN0YXJ0R2VuZXJhdG9yKGZpbmFsIFJldldhbGsgdykgeworCVN0YXJ0R2VuZXJhdG9yKFJldldhbGsgdykgewogCQl3YWxrZXIgPSB3OwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1RvcG9Tb3J0R2VuZXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvVG9wb1NvcnRHZW5lcmF0b3IuamF2YQppbmRleCA3YjExZDA0Li42NDUwMzQzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvVG9wb1NvcnRHZW5lcmF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvVG9wb1NvcnRHZW5lcmF0b3IuamF2YQpAQCAtNjksNyArNjksNyBAQAogCSAqIEB0aHJvd3MgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbgogCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KIAkgKi8KLQlUb3BvU29ydEdlbmVyYXRvcihmaW5hbCBHZW5lcmF0b3IgcykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCisJVG9wb1NvcnRHZW5lcmF0b3IoR2VuZXJhdG9yIHMpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlwZW5kaW5nID0gbmV3IEZJRk9SZXZRdWV1ZSgpOwogCQlvdXRwdXRUeXBlID0gcy5vdXRwdXRUeXBlKCkgfCBTT1JUX1RPUE87CkBAIC03OCw3ICs3OCw3IEBACiAJCQlmaW5hbCBSZXZDb21taXQgYyA9IHMubmV4dCgpOwogCQkJaWYgKGMgPT0gbnVsbCkKIAkJCQlicmVhazsKLQkJCWZvciAoZmluYWwgUmV2Q29tbWl0IHAgOiBjLnBhcmVudHMpCisJCQlmb3IgKFJldkNvbW1pdCBwIDogYy5wYXJlbnRzKQogCQkJCXAuaW5EZWdyZWUrKzsKIAkJCXBlbmRpbmcuYWRkKGMpOwogCQl9CkBAIC05MCw3ICs5MCw3IEBACiAJfQogCiAJQE92ZXJyaWRlCi0Jdm9pZCBzaGFyZUZyZWVMaXN0KGZpbmFsIEJsb2NrUmV2UXVldWUgcSkgeworCXZvaWQgc2hhcmVGcmVlTGlzdChCbG9ja1JldlF1ZXVlIHEpIHsKIAkJcS5zaGFyZUZyZWVMaXN0KHBlbmRpbmcpOwogCX0KIApAQCAtMTEzLDcgKzExMyw3IEBACiAJCQkvLyBBbGwgb2Ygb3VyIGNoaWxkcmVuIGhhdmUgYWxyZWFkeSBwcm9kdWNlZCwKIAkJCS8vIHNvIGl0IGlzIE9LIGZvciB1cyB0byBwcm9kdWNlIG5vdyBhcyB3ZWxsLgogCQkJLy8KLQkJCWZvciAoZmluYWwgUmV2Q29tbWl0IHAgOiBjLnBhcmVudHMpIHsKKwkJCWZvciAoUmV2Q29tbWl0IHAgOiBjLnBhcmVudHMpIHsKIAkJCQlpZiAoLS1wLmluRGVncmVlID09IDAgJiYgKHAuZmxhZ3MgJiBUT1BPX0RFTEFZKSAhPSAwKSB7CiAJCQkJCS8vIFRoaXMgcGFyZW50IHRyaWVkIHRvIGNvbWUgYmVmb3JlIHVzLCBidXQgd2UgYXJlCiAJCQkJCS8vIGhpcyBsYXN0IGNoaWxkLiB1bnBvcCB0aGUgcGFyZW50IHNvIGl0IGdvZXMgcmlnaHQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9UcmVlUmV2RmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvVHJlZVJldkZpbHRlci5qYXZhCmluZGV4IDk5YzVkNTkuLjExMzAxNTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9UcmVlUmV2RmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1RyZWVSZXZGaWx0ZXIuamF2YQpAQCAtODksNyArODksNyBAQAogCSAqICAgICAgICAgICAgcmVwbGFjZWQgd2l0aCBhIG5ldyBmaWx0ZXIgZm9sbG93aW5nIG5ldyBwYXRocyBhZnRlciBhIHJlbmFtZS4KIAkgKiBAc2luY2UgMy41CiAJICovCi0JcHVibGljIFRyZWVSZXZGaWx0ZXIoZmluYWwgUmV2V2FsayB3YWxrZXIsIGZpbmFsIFRyZWVGaWx0ZXIgdCkgeworCXB1YmxpYyBUcmVlUmV2RmlsdGVyKFJldldhbGsgd2Fsa2VyLCBUcmVlRmlsdGVyIHQpIHsKIAkJdGhpcyh3YWxrZXIsIHQsIDApOwogCX0KIApAQCAtMTMyLDcgKzEzMiw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgUmV2V2FsayB3YWxrZXIsIGZpbmFsIFJldkNvbW1pdCBjKQorCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoUmV2V2FsayB3YWxrZXIsIFJldkNvbW1pdCBjKQogCQkJdGhyb3dzIFN0b3BXYWxrRXhjZXB0aW9uLCBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQkvLyBSZXNldCB0aGUgdHJlZSBmaWx0ZXIgdG8gc2NhbiB0aGlzIGNvbW1pdCBhbmQgcGFyZW50cy4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvQW5kUmV2RmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL0FuZFJldkZpbHRlci5qYXZhCmluZGV4IDAwMTllMGMuLmRmYjgzYjQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvQW5kUmV2RmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9BbmRSZXZGaWx0ZXIuamF2YQpAQCAtNzIsNyArNzIsNyBAQAogCSAqICAgICAgICAgICAgc2Vjb25kIGZpbHRlciB0byB0ZXN0LgogCSAqIEByZXR1cm4gYSBmaWx0ZXIgdGhhdCBtdXN0IG1hdGNoIGJvdGggaW5wdXQgZmlsdGVycy4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFJldkZpbHRlciBjcmVhdGUoZmluYWwgUmV2RmlsdGVyIGEsIGZpbmFsIFJldkZpbHRlciBiKSB7CisJcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgY3JlYXRlKFJldkZpbHRlciBhLCBSZXZGaWx0ZXIgYikgewogCQlpZiAoYSA9PSBBTEwpCiAJCQlyZXR1cm4gYjsKIAkJaWYgKGIgPT0gQUxMKQpAQCAtODgsNyArODgsNyBAQAogCSAqICAgICAgICAgICAgZmlsdGVycy4KIAkgKiBAcmV0dXJuIGEgZmlsdGVyIHRoYXQgbXVzdCBtYXRjaCBhbGwgaW5wdXQgZmlsdGVycy4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFJldkZpbHRlciBjcmVhdGUoZmluYWwgUmV2RmlsdGVyW10gbGlzdCkgeworCXB1YmxpYyBzdGF0aWMgUmV2RmlsdGVyIGNyZWF0ZShSZXZGaWx0ZXJbXSBsaXN0KSB7CiAJCWlmIChsaXN0Lmxlbmd0aCA9PSAyKQogCQkJcmV0dXJuIGNyZWF0ZShsaXN0WzBdLCBsaXN0WzFdKTsKIAkJaWYgKGxpc3QubGVuZ3RoIDwgMikKQEAgLTEwNiw3ICsxMDYsNyBAQAogCSAqICAgICAgICAgICAgZmlsdGVycy4KIAkgKiBAcmV0dXJuIGEgZmlsdGVyIHRoYXQgbXVzdCBtYXRjaCBhbGwgaW5wdXQgZmlsdGVycy4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFJldkZpbHRlciBjcmVhdGUoZmluYWwgQ29sbGVjdGlvbjxSZXZGaWx0ZXI+IGxpc3QpIHsKKwlwdWJsaWMgc3RhdGljIFJldkZpbHRlciBjcmVhdGUoQ29sbGVjdGlvbjxSZXZGaWx0ZXI+IGxpc3QpIHsKIAkJaWYgKGxpc3Quc2l6ZSgpIDwgMikKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkuYXRMZWFzdFR3b0ZpbHRlcnNOZWVkZWQpOwogCQlmaW5hbCBSZXZGaWx0ZXJbXSBzdWJmaWx0ZXJzID0gbmV3IFJldkZpbHRlcltsaXN0LnNpemUoKV07CkBAIC0xMjMsNyArMTIzLDcgQEAKIAogCQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gcmVxdWlyZXNDb21taXRCb2R5OwogCi0JCUJpbmFyeShmaW5hbCBSZXZGaWx0ZXIgb25lLCBmaW5hbCBSZXZGaWx0ZXIgdHdvKSB7CisJCUJpbmFyeShSZXZGaWx0ZXIgb25lLCBSZXZGaWx0ZXIgdHdvKSB7CiAJCQlhID0gb25lOwogCQkJYiA9IHR3bzsKIAkJCXJlcXVpcmVzQ29tbWl0Qm9keSA9IGEucmVxdWlyZXNDb21taXRCb2R5KCkKQEAgLTEzMSw3ICsxMzEsNyBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgUmV2V2FsayB3YWxrZXIsIGZpbmFsIFJldkNvbW1pdCBjKQorCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFJldldhbGsgd2Fsa2VyLCBSZXZDb21taXQgYykKIAkJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCQlJT0V4Y2VwdGlvbiB7CiAJCQlyZXR1cm4gYS5pbmNsdWRlKHdhbGtlciwgYykgJiYgYi5pbmNsdWRlKHdhbGtlciwgYyk7CkBAIC0xNTksNyArMTU5LDcgQEAKIAogCQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gcmVxdWlyZXNDb21taXRCb2R5OwogCi0JCUxpc3QoZmluYWwgUmV2RmlsdGVyW10gbGlzdCkgeworCQlMaXN0KFJldkZpbHRlcltdIGxpc3QpIHsKIAkJCXN1YmZpbHRlcnMgPSBsaXN0OwogCiAJCQlib29sZWFuIHJjYiA9IGZhbHNlOwpAQCAtMTY5LDEwICsxNjksMTAgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFJldldhbGsgd2Fsa2VyLCBmaW5hbCBSZXZDb21taXQgYykKKwkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShSZXZXYWxrIHdhbGtlciwgUmV2Q29tbWl0IGMpCiAJCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQkJSU9FeGNlcHRpb24gewotCQkJZm9yIChmaW5hbCBSZXZGaWx0ZXIgZiA6IHN1YmZpbHRlcnMpIHsKKwkJCWZvciAoUmV2RmlsdGVyIGYgOiBzdWJmaWx0ZXJzKSB7CiAJCQkJaWYgKCFmLmluY2x1ZGUod2Fsa2VyLCBjKSkKIAkJCQkJcmV0dXJuIGZhbHNlOwogCQkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9BdXRob3JSZXZGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvQXV0aG9yUmV2RmlsdGVyLmphdmEKaW5kZXggZTAwZmVhZi4uMzM0ZDRmMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9BdXRob3JSZXZGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL0F1dGhvclJldkZpbHRlci5qYXZhCkBAIC04MSw3ICs4MSw3IEBACiAJCS8vIERvbid0IHBlcm1pdCB1cyB0byBiZSBjcmVhdGVkLgogCX0KIAotCXN0YXRpYyBSYXdDaGFyU2VxdWVuY2UgdGV4dEZvcihmaW5hbCBSZXZDb21taXQgY21pdCkgeworCXN0YXRpYyBSYXdDaGFyU2VxdWVuY2UgdGV4dEZvcihSZXZDb21taXQgY21pdCkgewogCQlmaW5hbCBieXRlW10gcmF3ID0gY21pdC5nZXRSYXdCdWZmZXIoKTsKIAkJZmluYWwgaW50IGIgPSBSYXdQYXJzZVV0aWxzLmF1dGhvcihyYXcsIDApOwogCQlpZiAoYiA8IDApCkBAIC05MSwxMiArOTEsMTIgQEAKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBjbGFzcyBQYXR0ZXJuU2VhcmNoIGV4dGVuZHMgUGF0dGVybk1hdGNoUmV2RmlsdGVyIHsKLQkJUGF0dGVyblNlYXJjaChmaW5hbCBTdHJpbmcgcGF0dGVyblRleHQpIHsKKwkJUGF0dGVyblNlYXJjaChTdHJpbmcgcGF0dGVyblRleHQpIHsKIAkJCXN1cGVyKHBhdHRlcm5UZXh0LCB0cnVlLCB0cnVlLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUpOwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDaGFyU2VxdWVuY2UgdGV4dChmaW5hbCBSZXZDb21taXQgY21pdCkgeworCQlwcm90ZWN0ZWQgQ2hhclNlcXVlbmNlIHRleHQoUmV2Q29tbWl0IGNtaXQpIHsKIAkJCXJldHVybiB0ZXh0Rm9yKGNtaXQpOwogCQl9CiAKQEAgLTEwNywxMiArMTA3LDEyIEBACiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3ViU3RyaW5nU2VhcmNoIGV4dGVuZHMgU3ViU3RyaW5nUmV2RmlsdGVyIHsKLQkJU3ViU3RyaW5nU2VhcmNoKGZpbmFsIFN0cmluZyBwYXR0ZXJuVGV4dCkgeworCQlTdWJTdHJpbmdTZWFyY2goU3RyaW5nIHBhdHRlcm5UZXh0KSB7CiAJCQlzdXBlcihwYXR0ZXJuVGV4dCk7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFJhd0NoYXJTZXF1ZW5jZSB0ZXh0KGZpbmFsIFJldkNvbW1pdCBjbWl0KSB7CisJCXByb3RlY3RlZCBSYXdDaGFyU2VxdWVuY2UgdGV4dChSZXZDb21taXQgY21pdCkgewogCQkJcmV0dXJuIHRleHRGb3IoY21pdCk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL0NvbW1pdFRpbWVSZXZGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvQ29tbWl0VGltZVJldkZpbHRlci5qYXZhCmluZGV4IDlmNGYxMGYuLjM4ODA1MTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvQ29tbWl0VGltZVJldkZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvQ29tbWl0VGltZVJldkZpbHRlci5qYXZhCkBAIC02NCw3ICs2NCw3IEBACiAJICogICAgICAgICAgICB0aGUgcG9pbnQgaW4gdGltZSB0byBjdXQgb24uCiAJICogQHJldHVybiBhIG5ldyBmaWx0ZXIgdG8gc2VsZWN0IGNvbW1pdHMgb24gb3IgYmVmb3JlIDxjb2RlPnRzPC9jb2RlPi4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFJldkZpbHRlciBiZWZvcmUoZmluYWwgRGF0ZSB0cykgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgUmV2RmlsdGVyIGJlZm9yZShEYXRlIHRzKSB7CiAJCXJldHVybiBiZWZvcmUodHMuZ2V0VGltZSgpKTsKIAl9CiAKQEAgLTc1LDcgKzc1LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBwb2ludCBpbiB0aW1lIHRvIGN1dCBvbiwgaW4gbWlsbGlzZWNvbmRzCiAJICogQHJldHVybiBhIG5ldyBmaWx0ZXIgdG8gc2VsZWN0IGNvbW1pdHMgb24gb3IgYmVmb3JlIDxjb2RlPnRzPC9jb2RlPi4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFJldkZpbHRlciBiZWZvcmUoZmluYWwgbG9uZyB0cykgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgUmV2RmlsdGVyIGJlZm9yZShsb25nIHRzKSB7CiAJCXJldHVybiBuZXcgQmVmb3JlKHRzKTsKIAl9CiAKQEAgLTg2LDcgKzg2LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBwb2ludCBpbiB0aW1lIHRvIGN1dCBvbi4KIAkgKiBAcmV0dXJuIGEgbmV3IGZpbHRlciB0byBzZWxlY3QgY29tbWl0cyBvbiBvciBhZnRlciA8Y29kZT50czwvY29kZT4uCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXZGaWx0ZXIgYWZ0ZXIoZmluYWwgRGF0ZSB0cykgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgUmV2RmlsdGVyIGFmdGVyKERhdGUgdHMpIHsKIAkJcmV0dXJuIGFmdGVyKHRzLmdldFRpbWUoKSk7CiAJfQogCkBAIC05Nyw3ICs5Nyw3IEBACiAJICogICAgICAgICAgICB0aGUgcG9pbnQgaW4gdGltZSB0byBjdXQgb24sIGluIG1pbGxpc2Vjb25kcy4KIAkgKiBAcmV0dXJuIGEgbmV3IGZpbHRlciB0byBzZWxlY3QgY29tbWl0cyBvbiBvciBhZnRlciA8Y29kZT50czwvY29kZT4uCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXZGaWx0ZXIgYWZ0ZXIoZmluYWwgbG9uZyB0cykgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgUmV2RmlsdGVyIGFmdGVyKGxvbmcgdHMpIHsKIAkJcmV0dXJuIG5ldyBBZnRlcih0cyk7CiAJfQogCkBAIC0xMDksNyArMTA5LDcgQEAKIAkgKiBAcGFyYW0gdW50aWwgdGhlIHBvaW50IGluIHRpbWUgdG8gY3V0IG9mZi4KIAkgKiBAcmV0dXJuIGEgbmV3IGZpbHRlciB0byBzZWxlY3QgY29tbWl0cyBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlL3RpbWVzLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUmV2RmlsdGVyIGJldHdlZW4oZmluYWwgRGF0ZSBzaW5jZSwgZmluYWwgRGF0ZSB1bnRpbCkgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgUmV2RmlsdGVyIGJldHdlZW4oRGF0ZSBzaW5jZSwgRGF0ZSB1bnRpbCkgewogCQlyZXR1cm4gYmV0d2VlbihzaW5jZS5nZXRUaW1lKCksIHVudGlsLmdldFRpbWUoKSk7CiAJfQogCkBAIC0xMjEsMTMgKzEyMSwxMyBAQAogCSAqIEBwYXJhbSB1bnRpbCB0aGUgcG9pbnQgaW4gdGltZSB0byBjdXQgb2ZmLCBpbiBtaWxsaXNjb25kcy4KIAkgKiBAcmV0dXJuIGEgbmV3IGZpbHRlciB0byBzZWxlY3QgY29tbWl0cyBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlL3RpbWVzLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUmV2RmlsdGVyIGJldHdlZW4oZmluYWwgbG9uZyBzaW5jZSwgZmluYWwgbG9uZyB1bnRpbCkgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgUmV2RmlsdGVyIGJldHdlZW4obG9uZyBzaW5jZSwgbG9uZyB1bnRpbCkgewogCQlyZXR1cm4gbmV3IEJldHdlZW4oc2luY2UsIHVudGlsKTsKIAl9CiAKIAlmaW5hbCBpbnQgd2hlbjsKIAotCUNvbW1pdFRpbWVSZXZGaWx0ZXIoZmluYWwgbG9uZyB0cykgeworCUNvbW1pdFRpbWVSZXZGaWx0ZXIobG9uZyB0cykgewogCQl3aGVuID0gKGludCkgKHRzIC8gMTAwMCk7CiAJfQogCkBAIC0xNDQsMTIgKzE0NCwxMiBAQAogCX0KIAogCXByaXZhdGUgc3RhdGljIGNsYXNzIEJlZm9yZSBleHRlbmRzIENvbW1pdFRpbWVSZXZGaWx0ZXIgewotCQlCZWZvcmUoZmluYWwgbG9uZyB0cykgeworCQlCZWZvcmUobG9uZyB0cykgewogCQkJc3VwZXIodHMpOwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgUmV2V2FsayB3YWxrZXIsIGZpbmFsIFJldkNvbW1pdCBjbWl0KQorCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFJldldhbGsgd2Fsa2VyLCBSZXZDb21taXQgY21pdCkKIAkJCQl0aHJvd3MgU3RvcFdhbGtFeGNlcHRpb24sIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCQkJSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQkJcmV0dXJuIGNtaXQuZ2V0Q29tbWl0VGltZSgpIDw9IHdoZW47CkBAIC0xNjMsMTIgKzE2MywxMiBAQAogCX0KIAogCXByaXZhdGUgc3RhdGljIGNsYXNzIEFmdGVyIGV4dGVuZHMgQ29tbWl0VGltZVJldkZpbHRlciB7Ci0JCUFmdGVyKGZpbmFsIGxvbmcgdHMpIHsKKwkJQWZ0ZXIobG9uZyB0cykgewogCQkJc3VwZXIodHMpOwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgUmV2V2FsayB3YWxrZXIsIGZpbmFsIFJldkNvbW1pdCBjbWl0KQorCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFJldldhbGsgd2Fsa2VyLCBSZXZDb21taXQgY21pdCkKIAkJCQl0aHJvd3MgU3RvcFdhbGtFeGNlcHRpb24sIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCQkJSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQkJLy8gU2luY2UgdGhlIHdhbGtlciBzb3J0cyBjb21taXRzIGJ5IGNvbW1pdCB0aW1lIHdlIGNhbiBiZQpAQCAtMTkwLDEzICsxOTAsMTMgQEAKIAlwcml2YXRlIHN0YXRpYyBjbGFzcyBCZXR3ZWVuIGV4dGVuZHMgQ29tbWl0VGltZVJldkZpbHRlciB7CiAJCXByaXZhdGUgZmluYWwgaW50IHVudGlsOwogCi0JCUJldHdlZW4oZmluYWwgbG9uZyBzaW5jZSwgZmluYWwgbG9uZyB1bnRpbCkgeworCQlCZXR3ZWVuKGxvbmcgc2luY2UsIGxvbmcgdW50aWwpIHsKIAkJCXN1cGVyKHNpbmNlKTsKIAkJCXRoaXMudW50aWwgPSAoaW50KSAodW50aWwgLyAxMDAwKTsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFJldldhbGsgd2Fsa2VyLCBmaW5hbCBSZXZDb21taXQgY21pdCkKKwkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShSZXZXYWxrIHdhbGtlciwgUmV2Q29tbWl0IGNtaXQpCiAJCQkJdGhyb3dzIFN0b3BXYWxrRXhjZXB0aW9uLCBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJCXJldHVybiBjbWl0LmdldENvbW1pdFRpbWUoKSA8PSB1bnRpbCAmJiBjbWl0LmdldENvbW1pdFRpbWUoKSA+PSB3aGVuOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9Db21taXR0ZXJSZXZGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvQ29tbWl0dGVyUmV2RmlsdGVyLmphdmEKaW5kZXggNGExYjNhNi4uMzdjODQwZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9Db21taXR0ZXJSZXZGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL0NvbW1pdHRlclJldkZpbHRlci5qYXZhCkBAIC04MSw3ICs4MSw3IEBACiAJCS8vIERvbid0IHBlcm1pdCB1cyB0byBiZSBjcmVhdGVkLgogCX0KIAotCXN0YXRpYyBSYXdDaGFyU2VxdWVuY2UgdGV4dEZvcihmaW5hbCBSZXZDb21taXQgY21pdCkgeworCXN0YXRpYyBSYXdDaGFyU2VxdWVuY2UgdGV4dEZvcihSZXZDb21taXQgY21pdCkgewogCQlmaW5hbCBieXRlW10gcmF3ID0gY21pdC5nZXRSYXdCdWZmZXIoKTsKIAkJZmluYWwgaW50IGIgPSBSYXdQYXJzZVV0aWxzLmNvbW1pdHRlcihyYXcsIDApOwogCQlpZiAoYiA8IDApCkBAIC05MSwxMiArOTEsMTIgQEAKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBjbGFzcyBQYXR0ZXJuU2VhcmNoIGV4dGVuZHMgUGF0dGVybk1hdGNoUmV2RmlsdGVyIHsKLQkJUGF0dGVyblNlYXJjaChmaW5hbCBTdHJpbmcgcGF0dGVyblRleHQpIHsKKwkJUGF0dGVyblNlYXJjaChTdHJpbmcgcGF0dGVyblRleHQpIHsKIAkJCXN1cGVyKHBhdHRlcm5UZXh0LCB0cnVlLCB0cnVlLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUpOwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDaGFyU2VxdWVuY2UgdGV4dChmaW5hbCBSZXZDb21taXQgY21pdCkgeworCQlwcm90ZWN0ZWQgQ2hhclNlcXVlbmNlIHRleHQoUmV2Q29tbWl0IGNtaXQpIHsKIAkJCXJldHVybiB0ZXh0Rm9yKGNtaXQpOwogCQl9CiAKQEAgLTEwNywxMiArMTA3LDEyIEBACiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3ViU3RyaW5nU2VhcmNoIGV4dGVuZHMgU3ViU3RyaW5nUmV2RmlsdGVyIHsKLQkJU3ViU3RyaW5nU2VhcmNoKGZpbmFsIFN0cmluZyBwYXR0ZXJuVGV4dCkgeworCQlTdWJTdHJpbmdTZWFyY2goU3RyaW5nIHBhdHRlcm5UZXh0KSB7CiAJCQlzdXBlcihwYXR0ZXJuVGV4dCk7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFJhd0NoYXJTZXF1ZW5jZSB0ZXh0KGZpbmFsIFJldkNvbW1pdCBjbWl0KSB7CisJCXByb3RlY3RlZCBSYXdDaGFyU2VxdWVuY2UgdGV4dChSZXZDb21taXQgY21pdCkgewogCQkJcmV0dXJuIHRleHRGb3IoY21pdCk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL01lc3NhZ2VSZXZGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvTWVzc2FnZVJldkZpbHRlci5qYXZhCmluZGV4IGYxZjQwNjUuLjQ4MGFhYTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvTWVzc2FnZVJldkZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvTWVzc2FnZVJldkZpbHRlci5qYXZhCkBAIC04MSw3ICs4MSw3IEBACiAJCS8vIERvbid0IHBlcm1pdCB1cyB0byBiZSBjcmVhdGVkLgogCX0KIAotCXN0YXRpYyBSYXdDaGFyU2VxdWVuY2UgdGV4dEZvcihmaW5hbCBSZXZDb21taXQgY21pdCkgeworCXN0YXRpYyBSYXdDaGFyU2VxdWVuY2UgdGV4dEZvcihSZXZDb21taXQgY21pdCkgewogCQlmaW5hbCBieXRlW10gcmF3ID0gY21pdC5nZXRSYXdCdWZmZXIoKTsKIAkJZmluYWwgaW50IGIgPSBSYXdQYXJzZVV0aWxzLmNvbW1pdE1lc3NhZ2UocmF3LCAwKTsKIAkJaWYgKGIgPCAwKQpAQCAtOTAsMTMgKzkwLDEzIEBACiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGF0dGVyblNlYXJjaCBleHRlbmRzIFBhdHRlcm5NYXRjaFJldkZpbHRlciB7Ci0JCVBhdHRlcm5TZWFyY2goZmluYWwgU3RyaW5nIHBhdHRlcm5UZXh0KSB7CisJCVBhdHRlcm5TZWFyY2goU3RyaW5nIHBhdHRlcm5UZXh0KSB7CiAJCQlzdXBlcihwYXR0ZXJuVGV4dCwgdHJ1ZSwgdHJ1ZSwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFCiAJCQkJCXwgUGF0dGVybi5ET1RBTEwpOwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDaGFyU2VxdWVuY2UgdGV4dChmaW5hbCBSZXZDb21taXQgY21pdCkgeworCQlwcm90ZWN0ZWQgQ2hhclNlcXVlbmNlIHRleHQoUmV2Q29tbWl0IGNtaXQpIHsKIAkJCXJldHVybiB0ZXh0Rm9yKGNtaXQpOwogCQl9CiAKQEAgLTEwNywxMiArMTA3LDEyIEBACiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3ViU3RyaW5nU2VhcmNoIGV4dGVuZHMgU3ViU3RyaW5nUmV2RmlsdGVyIHsKLQkJU3ViU3RyaW5nU2VhcmNoKGZpbmFsIFN0cmluZyBwYXR0ZXJuVGV4dCkgeworCQlTdWJTdHJpbmdTZWFyY2goU3RyaW5nIHBhdHRlcm5UZXh0KSB7CiAJCQlzdXBlcihwYXR0ZXJuVGV4dCk7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFJhd0NoYXJTZXF1ZW5jZSB0ZXh0KGZpbmFsIFJldkNvbW1pdCBjbWl0KSB7CisJCXByb3RlY3RlZCBSYXdDaGFyU2VxdWVuY2UgdGV4dChSZXZDb21taXQgY21pdCkgewogCQkJcmV0dXJuIHRleHRGb3IoY21pdCk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL05vdFJldkZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9Ob3RSZXZGaWx0ZXIuamF2YQppbmRleCA4NGI3ZjZiLi42OWRlYzU2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL05vdFJldkZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvTm90UmV2RmlsdGVyLmphdmEKQEAgLTYxLDEzICs2MSwxMyBAQAogCSAqICAgICAgICAgICAgZmlsdGVyIHRvIG5lZ2F0ZS4KIAkgKiBAcmV0dXJuIGEgZmlsdGVyIHRoYXQgZG9lcyB0aGUgcmV2ZXJzZSBvZiA8Y29kZT5hPC9jb2RlPi4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFJldkZpbHRlciBjcmVhdGUoZmluYWwgUmV2RmlsdGVyIGEpIHsKKwlwdWJsaWMgc3RhdGljIFJldkZpbHRlciBjcmVhdGUoUmV2RmlsdGVyIGEpIHsKIAkJcmV0dXJuIG5ldyBOb3RSZXZGaWx0ZXIoYSk7CiAJfQogCiAJcHJpdmF0ZSBmaW5hbCBSZXZGaWx0ZXIgYTsKIAotCXByaXZhdGUgTm90UmV2RmlsdGVyKGZpbmFsIFJldkZpbHRlciBvbmUpIHsKKwlwcml2YXRlIE5vdFJldkZpbHRlcihSZXZGaWx0ZXIgb25lKSB7CiAJCWEgPSBvbmU7CiAJfQogCkBAIC03OSw3ICs3OSw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgUmV2V2FsayB3YWxrZXIsIGZpbmFsIFJldkNvbW1pdCBjKQorCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoUmV2V2FsayB3YWxrZXIsIFJldkNvbW1pdCBjKQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQlJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiAhYS5pbmNsdWRlKHdhbGtlciwgYyk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL09yUmV2RmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL09yUmV2RmlsdGVyLmphdmEKaW5kZXggYTE0NzY0YS4uMWNlZjEyZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9PclJldkZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvT3JSZXZGaWx0ZXIuamF2YQpAQCAtNzIsNyArNzIsNyBAQAogCSAqICAgICAgICAgICAgc2Vjb25kIGZpbHRlciB0byB0ZXN0LgogCSAqIEByZXR1cm4gYSBmaWx0ZXIgdGhhdCBtdXN0IG1hdGNoIGF0IGxlYXN0IG9uZSBpbnB1dCBmaWx0ZXIuCiAJICovCi0JcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgY3JlYXRlKGZpbmFsIFJldkZpbHRlciBhLCBmaW5hbCBSZXZGaWx0ZXIgYikgeworCXB1YmxpYyBzdGF0aWMgUmV2RmlsdGVyIGNyZWF0ZShSZXZGaWx0ZXIgYSwgUmV2RmlsdGVyIGIpIHsKIAkJaWYgKGEgPT0gQUxMIHx8IGIgPT0gQUxMKQogCQkJcmV0dXJuIEFMTDsKIAkJcmV0dXJuIG5ldyBCaW5hcnkoYSwgYik7CkBAIC04Niw3ICs4Niw3IEBACiAJICogICAgICAgICAgICBmaWx0ZXJzLgogCSAqIEByZXR1cm4gYSBmaWx0ZXIgdGhhdCBtdXN0IG1hdGNoIGF0IGxlYXN0IG9uZSBpbnB1dCBmaWx0ZXIuCiAJICovCi0JcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgY3JlYXRlKGZpbmFsIFJldkZpbHRlcltdIGxpc3QpIHsKKwlwdWJsaWMgc3RhdGljIFJldkZpbHRlciBjcmVhdGUoUmV2RmlsdGVyW10gbGlzdCkgewogCQlpZiAobGlzdC5sZW5ndGggPT0gMikKIAkJCXJldHVybiBjcmVhdGUobGlzdFswXSwgbGlzdFsxXSk7CiAJCWlmIChsaXN0Lmxlbmd0aCA8IDIpCkBAIC0xMDQsNyArMTA0LDcgQEAKIAkgKiAgICAgICAgICAgIGZpbHRlcnMuCiAJICogQHJldHVybiBhIGZpbHRlciB0aGF0IG11c3QgbWF0Y2ggYXQgbGVhc3Qgb25lIGlucHV0IGZpbHRlci4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFJldkZpbHRlciBjcmVhdGUoZmluYWwgQ29sbGVjdGlvbjxSZXZGaWx0ZXI+IGxpc3QpIHsKKwlwdWJsaWMgc3RhdGljIFJldkZpbHRlciBjcmVhdGUoQ29sbGVjdGlvbjxSZXZGaWx0ZXI+IGxpc3QpIHsKIAkJaWYgKGxpc3Quc2l6ZSgpIDwgMikKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkuYXRMZWFzdFR3b0ZpbHRlcnNOZWVkZWQpOwogCQlmaW5hbCBSZXZGaWx0ZXJbXSBzdWJmaWx0ZXJzID0gbmV3IFJldkZpbHRlcltsaXN0LnNpemUoKV07CkBAIC0xMjEsNyArMTIxLDcgQEAKIAogCQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gcmVxdWlyZXNDb21taXRCb2R5OwogCi0JCUJpbmFyeShmaW5hbCBSZXZGaWx0ZXIgb25lLCBmaW5hbCBSZXZGaWx0ZXIgdHdvKSB7CisJCUJpbmFyeShSZXZGaWx0ZXIgb25lLCBSZXZGaWx0ZXIgdHdvKSB7CiAJCQlhID0gb25lOwogCQkJYiA9IHR3bzsKIAkJCXJlcXVpcmVzQ29tbWl0Qm9keSA9IGEucmVxdWlyZXNDb21taXRCb2R5KCkKQEAgLTEyOSw3ICsxMjksNyBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgUmV2V2FsayB3YWxrZXIsIGZpbmFsIFJldkNvbW1pdCBjKQorCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFJldldhbGsgd2Fsa2VyLCBSZXZDb21taXQgYykKIAkJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCQlJT0V4Y2VwdGlvbiB7CiAJCQlyZXR1cm4gYS5pbmNsdWRlKHdhbGtlciwgYykgfHwgYi5pbmNsdWRlKHdhbGtlciwgYyk7CkBAIC0xNTcsNyArMTU3LDcgQEAKIAogCQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gcmVxdWlyZXNDb21taXRCb2R5OwogCi0JCUxpc3QoZmluYWwgUmV2RmlsdGVyW10gbGlzdCkgeworCQlMaXN0KFJldkZpbHRlcltdIGxpc3QpIHsKIAkJCXN1YmZpbHRlcnMgPSBsaXN0OwogCiAJCQlib29sZWFuIHJjYiA9IGZhbHNlOwpAQCAtMTY3LDEwICsxNjcsMTAgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFJldldhbGsgd2Fsa2VyLCBmaW5hbCBSZXZDb21taXQgYykKKwkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShSZXZXYWxrIHdhbGtlciwgUmV2Q29tbWl0IGMpCiAJCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQkJSU9FeGNlcHRpb24gewotCQkJZm9yIChmaW5hbCBSZXZGaWx0ZXIgZiA6IHN1YmZpbHRlcnMpIHsKKwkJCWZvciAoUmV2RmlsdGVyIGYgOiBzdWJmaWx0ZXJzKSB7CiAJCQkJaWYgKGYuaW5jbHVkZSh3YWxrZXIsIGMpKQogCQkJCQlyZXR1cm4gdHJ1ZTsKIAkJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvUGF0dGVybk1hdGNoUmV2RmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL1BhdHRlcm5NYXRjaFJldkZpbHRlci5qYXZhCmluZGV4IGVkY2UyMjQuLjRmNDFlZGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvUGF0dGVybk1hdGNoUmV2RmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9QYXR0ZXJuTWF0Y2hSZXZGaWx0ZXIuamF2YQpAQCAtNzIsNyArNzIsNyBAQAogCSAqIEByZXR1cm4gc2FtZSBwYXR0ZXJuLCBidXQgcmUtZW5jb2RlZCB0byBtYXRjaCBvdXIgZnVubnkgcmF3IFVURi04CiAJICogICAgICAgICBjaGFyYWN0ZXIgc2VxdWVuY2Uge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5SYXdDaGFyU2VxdWVuY2V9LgogCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGZvcmNlVG9SYXcoZmluYWwgU3RyaW5nIHBhdHRlcm5UZXh0KSB7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgZm9yY2VUb1JhdyhTdHJpbmcgcGF0dGVyblRleHQpIHsKIAkJZmluYWwgYnl0ZVtdIGIgPSBDb25zdGFudHMuZW5jb2RlKHBhdHRlcm5UZXh0KTsKIAkJZmluYWwgU3RyaW5nQnVpbGRlciBuZWVkbGUgPSBuZXcgU3RyaW5nQnVpbGRlcihiLmxlbmd0aCk7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgYi5sZW5ndGg7IGkrKykKQEAgLTEyOCw3ICsxMjgsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFJldldhbGsgd2Fsa2VyLCBmaW5hbCBSZXZDb21taXQgY21pdCkKKwlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFJldldhbGsgd2Fsa2VyLCBSZXZDb21taXQgY21pdCkKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJSU9FeGNlcHRpb24gewogCQlyZXR1cm4gY29tcGlsZWRQYXR0ZXJuLnJlc2V0KHRleHQoY21pdCkpLm1hdGNoZXMoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvUmV2RmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL1JldkZpbHRlci5qYXZhCmluZGV4IDkwNjhjNTcuLjM5ZjBkNjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvUmV2RmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9SZXZGaWx0ZXIuamF2YQpAQCAtMTAzLDcgKzEwMyw3IEBACiAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBBbGxGaWx0ZXIgZXh0ZW5kcyBSZXZGaWx0ZXIgewogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBSZXZXYWxrIHdhbGtlciwgZmluYWwgUmV2Q29tbWl0IGMpIHsKKwkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShSZXZXYWxrIHdhbGtlciwgUmV2Q29tbWl0IGMpIHsKIAkJCXJldHVybiB0cnVlOwogCQl9CiAKQEAgLTEyOCw3ICsxMjgsNyBAQAogCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTm9uZUZpbHRlciBleHRlbmRzIFJldkZpbHRlciB7CiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFJldldhbGsgd2Fsa2VyLCBmaW5hbCBSZXZDb21taXQgYykgeworCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFJldldhbGsgd2Fsa2VyLCBSZXZDb21taXQgYykgewogCQkJcmV0dXJuIGZhbHNlOwogCQl9CiAKQEAgLTE4NCw3ICsxODQsNyBAQAogCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTm9NZXJnZXNGaWx0ZXIgZXh0ZW5kcyBSZXZGaWx0ZXIgewogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBSZXZXYWxrIHdhbGtlciwgZmluYWwgUmV2Q29tbWl0IGMpIHsKKwkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShSZXZXYWxrIHdhbGtlciwgUmV2Q29tbWl0IGMpIHsKIAkJCXJldHVybiBjLmdldFBhcmVudENvdW50KCkgPCAyOwogCQl9CiAKQEAgLTIxNiw3ICsyMTYsNyBAQAogCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTWVyZ2VCYXNlRmlsdGVyIGV4dGVuZHMgUmV2RmlsdGVyIHsKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgUmV2V2FsayB3YWxrZXIsIGZpbmFsIFJldkNvbW1pdCBjKSB7CisJCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoUmV2V2FsayB3YWxrZXIsIFJldkNvbW1pdCBjKSB7CiAJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkuY2Fubm90QmVDb21iaW5lZCk7CiAJCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9SZXZGbGFnRmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL1JldkZsYWdGaWx0ZXIuamF2YQppbmRleCA4MjI1ZTRkLi5jNjdjNDRiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL1JldkZsYWdGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL1JldkZsYWdGaWx0ZXIuamF2YQpAQCAtNjMsNyArNjMsNyBAQAogCSAqICAgICAgICAgICAgdGhlIGZsYWcgdG8gdGVzdC4KIAkgKiBAcmV0dXJuIGZpbHRlciB0aGF0IHNlbGVjdHMgb25seSBjb21taXRzIHdpdGggZmxhZyA8Y29kZT5hPC9jb2RlPi4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFJldkZpbHRlciBoYXMoZmluYWwgUmV2RmxhZyBhKSB7CisJcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgaGFzKFJldkZsYWcgYSkgewogCQlmaW5hbCBSZXZGbGFnU2V0IHMgPSBuZXcgUmV2RmxhZ1NldCgpOwogCQlzLmFkZChhKTsKIAkJcmV0dXJuIG5ldyBIYXNBbGwocyk7CkBAIC03Niw5ICs3Niw5IEBACiAJICogICAgICAgICAgICBzZXQgb2YgZmxhZ3MgdG8gdGVzdC4KIAkgKiBAcmV0dXJuIGZpbHRlciB0aGF0IHNlbGVjdHMgb25seSBjb21taXRzIHdpdGggYWxsIGZsYWdzIGluIDxjb2RlPmE8L2NvZGU+LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgUmV2RmlsdGVyIGhhc0FsbChmaW5hbCBSZXZGbGFnLi4uIGEpIHsKKwlwdWJsaWMgc3RhdGljIFJldkZpbHRlciBoYXNBbGwoUmV2RmxhZy4uLiBhKSB7CiAJCWZpbmFsIFJldkZsYWdTZXQgc2V0ID0gbmV3IFJldkZsYWdTZXQoKTsKLQkJZm9yIChmaW5hbCBSZXZGbGFnIGZsYWcgOiBhKQorCQlmb3IgKFJldkZsYWcgZmxhZyA6IGEpCiAJCQlzZXQuYWRkKGZsYWcpOwogCQlyZXR1cm4gbmV3IEhhc0FsbChzZXQpOwogCX0KQEAgLTkwLDcgKzkwLDcgQEAKIAkgKiAgICAgICAgICAgIHNldCBvZiBmbGFncyB0byB0ZXN0LgogCSAqIEByZXR1cm4gZmlsdGVyIHRoYXQgc2VsZWN0cyBvbmx5IGNvbW1pdHMgd2l0aCBhbGwgZmxhZ3MgaW4gPGNvZGU+YTwvY29kZT4uCiAJICovCi0JcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgaGFzQWxsKGZpbmFsIFJldkZsYWdTZXQgYSkgeworCXB1YmxpYyBzdGF0aWMgUmV2RmlsdGVyIGhhc0FsbChSZXZGbGFnU2V0IGEpIHsKIAkJcmV0dXJuIG5ldyBIYXNBbGwobmV3IFJldkZsYWdTZXQoYSkpOwogCX0KIApAQCAtMTAxLDkgKzEwMSw5IEBACiAJICogICAgICAgICAgICBzZXQgb2YgZmxhZ3MgdG8gdGVzdC4KIAkgKiBAcmV0dXJuIGZpbHRlciB0aGF0IHNlbGVjdHMgb25seSBjb21taXRzIHdpdGggYW55IGZsYWcgaW4gPGNvZGU+YTwvY29kZT4uCiAJICovCi0JcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgaGFzQW55KGZpbmFsIFJldkZsYWcuLi4gYSkgeworCXB1YmxpYyBzdGF0aWMgUmV2RmlsdGVyIGhhc0FueShSZXZGbGFnLi4uIGEpIHsKIAkJZmluYWwgUmV2RmxhZ1NldCBzZXQgPSBuZXcgUmV2RmxhZ1NldCgpOwotCQlmb3IgKGZpbmFsIFJldkZsYWcgZmxhZyA6IGEpCisJCWZvciAoUmV2RmxhZyBmbGFnIDogYSkKIAkJCXNldC5hZGQoZmxhZyk7CiAJCXJldHVybiBuZXcgSGFzQW55KHNldCk7CiAJfQpAQCAtMTE1LDEzICsxMTUsMTMgQEAKIAkgKiAgICAgICAgICAgIHNldCBvZiBmbGFncyB0byB0ZXN0LgogCSAqIEByZXR1cm4gZmlsdGVyIHRoYXQgc2VsZWN0cyBvbmx5IGNvbW1pdHMgd2l0aCBhbnkgZmxhZyBpbiA8Y29kZT5hPC9jb2RlPi4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFJldkZpbHRlciBoYXNBbnkoZmluYWwgUmV2RmxhZ1NldCBhKSB7CisJcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgaGFzQW55KFJldkZsYWdTZXQgYSkgewogCQlyZXR1cm4gbmV3IEhhc0FueShuZXcgUmV2RmxhZ1NldChhKSk7CiAJfQogCiAJZmluYWwgUmV2RmxhZ1NldCBmbGFnczsKIAotCVJldkZsYWdGaWx0ZXIoZmluYWwgUmV2RmxhZ1NldCBtKSB7CisJUmV2RmxhZ0ZpbHRlcihSZXZGbGFnU2V0IG0pIHsKIAkJZmxhZ3MgPSBtOwogCX0KIApAQCAtMTM4LDEyICsxMzgsMTIgQEAKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBjbGFzcyBIYXNBbGwgZXh0ZW5kcyBSZXZGbGFnRmlsdGVyIHsKLQkJSGFzQWxsKGZpbmFsIFJldkZsYWdTZXQgbSkgeworCQlIYXNBbGwoUmV2RmxhZ1NldCBtKSB7CiAJCQlzdXBlcihtKTsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFJldldhbGsgd2Fsa2VyLCBmaW5hbCBSZXZDb21taXQgYykKKwkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShSZXZXYWxrIHdhbGtlciwgUmV2Q29tbWl0IGMpCiAJCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQkJSU9FeGNlcHRpb24gewogCQkJcmV0dXJuIGMuaGFzQWxsKGZsYWdzKTsKQEAgLTE1NiwxMiArMTU2LDEyIEBACiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSGFzQW55IGV4dGVuZHMgUmV2RmxhZ0ZpbHRlciB7Ci0JCUhhc0FueShmaW5hbCBSZXZGbGFnU2V0IG0pIHsKKwkJSGFzQW55KFJldkZsYWdTZXQgbSkgewogCQkJc3VwZXIobSk7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBSZXZXYWxrIHdhbGtlciwgZmluYWwgUmV2Q29tbWl0IGMpCisJCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoUmV2V2FsayB3YWxrZXIsIFJldkNvbW1pdCBjKQogCQkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJCUlPRXhjZXB0aW9uIHsKIAkJCXJldHVybiBjLmhhc0FueShmbGFncyk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL1N1YlN0cmluZ1JldkZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9TdWJTdHJpbmdSZXZGaWx0ZXIuamF2YQppbmRleCAzZTZiMTQ4Li41NDY1MGRhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL1N1YlN0cmluZ1JldkZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvU3ViU3RyaW5nUmV2RmlsdGVyLmphdmEKQEAgLTY1LDcgKzY1LDcgQEAKIAkgKiAgICAgICAgIGlmIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuZmlsdGVyLlBhdHRlcm5NYXRjaFJldkZpbHRlcn0KIAkgKiAgICAgICAgIG11c3QgYmUgdXNlZCBpbnN0ZWFkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzYWZlKGZpbmFsIFN0cmluZyBwYXR0ZXJuKSB7CisJcHVibGljIHN0YXRpYyBib29sZWFuIHNhZmUoU3RyaW5nIHBhdHRlcm4pIHsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXR0ZXJuLmxlbmd0aCgpOyBpKyspIHsKIAkJCWZpbmFsIGNoYXIgYyA9IHBhdHRlcm4uY2hhckF0KGkpOwogCQkJc3dpdGNoIChjKSB7CkBAIC05NiwxMyArOTYsMTMgQEAKIAkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgI3NhZmUoU3RyaW5nKX0gYXMgcmVndWxhciBleHByZXNzaW9uIG1ldGEKIAkgKiAgICAgICAgICAgIGNoYXJhY3RlcnMgYXJlIHRyZWF0ZWQgYXMgbGl0ZXJhbHMuCiAJICovCi0JcHJvdGVjdGVkIFN1YlN0cmluZ1JldkZpbHRlcihmaW5hbCBTdHJpbmcgcGF0dGVyblRleHQpIHsKKwlwcm90ZWN0ZWQgU3ViU3RyaW5nUmV2RmlsdGVyKFN0cmluZyBwYXR0ZXJuVGV4dCkgewogCQlwYXR0ZXJuID0gbmV3IFJhd1N1YlN0cmluZ1BhdHRlcm4ocGF0dGVyblRleHQpOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBSZXZXYWxrIHdhbGtlciwgZmluYWwgUmV2Q29tbWl0IGNtaXQpCisJcHVibGljIGJvb2xlYW4gaW5jbHVkZShSZXZXYWxrIHdhbGtlciwgUmV2Q29tbWl0IGNtaXQpCiAJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCUlPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIHBhdHRlcm4ubWF0Y2godGV4dChjbWl0KSkgPj0gMDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvc3RvcmFnZS9maWxlL0ZpbGVCYXNlZENvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9zdG9yYWdlL2ZpbGUvRmlsZUJhc2VkQ29uZmlnLmphdmEKaW5kZXggM2YwNjRlMy4uNGIyNzJiYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9zdG9yYWdlL2ZpbGUvRmlsZUJhc2VkQ29uZmlnLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9zdG9yYWdlL2ZpbGUvRmlsZUJhc2VkQ29uZmlnLmphdmEKQEAgLTQ5LDYgKzQ5LDggQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKKwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKQEAgLTE2NCw4ICsxNjYsOCBAQAogCQkJCX0gZWxzZSB7CiAJCQkJCWZpbmFsIFN0cmluZyBkZWNvZGVkOwogCQkJCQlpZiAoaXNVdGY4KGluKSkgewotCQkJCQkJZGVjb2RlZCA9IFJhd1BhcnNlVXRpbHMuZGVjb2RlKAotCQkJCQkJCQlSYXdQYXJzZVV0aWxzLlVURjhfQ0hBUlNFVCwgaW4sIDMsIGluLmxlbmd0aCk7CisJCQkJCQlkZWNvZGVkID0gUmF3UGFyc2VVdGlscy5kZWNvZGUoQ0hBUlNFVCwKKwkJCQkJCQkJaW4sIDMsIGluLmxlbmd0aCk7CiAJCQkJCQl1dGY4Qm9tID0gdHJ1ZTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCWRlY29kZWQgPSBSYXdQYXJzZVV0aWxzLmRlY29kZShpbik7CkBAIC0yMjIsNyArMjI0LDcgQEAKIAkJCWJvcy53cml0ZSgweEVGKTsKIAkJCWJvcy53cml0ZSgweEJCKTsKIAkJCWJvcy53cml0ZSgweEJGKTsKLQkJCWJvcy53cml0ZSh0ZXh0LmdldEJ5dGVzKFJhd1BhcnNlVXRpbHMuVVRGOF9DSEFSU0VULm5hbWUoKSkpOworCQkJYm9zLndyaXRlKHRleHQuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQkJb3V0ID0gYm9zLnRvQnl0ZUFycmF5KCk7CiAJCX0gZWxzZSB7CiAJCQlvdXQgPSBDb25zdGFudHMuZW5jb2RlKHRleHQpOwpAQCAtMjUyLDcgKzI1NCw3IEBACiAJCXN1cGVyLmNsZWFyKCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0SWQgaGFzaChmaW5hbCBieXRlW10gcmF3VGV4dCkgeworCXByaXZhdGUgc3RhdGljIE9iamVjdElkIGhhc2goYnl0ZVtdIHJhd1RleHQpIHsKIAkJcmV0dXJuIE9iamVjdElkLmZyb21SYXcoQ29uc3RhbnRzLm5ld01lc3NhZ2VEaWdlc3QoKS5kaWdlc3QocmF3VGV4dCkpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9zdG9yYWdlL2ZpbGUvV2luZG93Q2FjaGVDb25maWcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvc3RvcmFnZS9maWxlL1dpbmRvd0NhY2hlQ29uZmlnLmphdmEKaW5kZXggMTlmYzYzZS4uYzJlNmE0MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9zdG9yYWdlL2ZpbGUvV2luZG93Q2FjaGVDb25maWcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3N0b3JhZ2UvZmlsZS9XaW5kb3dDYWNoZUNvbmZpZy5qYXZhCkBAIC05OCw3ICs5OCw3IEBACiAJICogICAgICAgICAgICBtYXhpbXVtIG51bWJlciBvZiBzdHJlYW1zIHRvIG9wZW4gYXQgYSB0aW1lLiBPcGVuIHBhY2tzIGNvdW50CiAJICogICAgICAgICAgICBhZ2FpbnN0IHRoZSBwcm9jZXNzIGxpbWl0cwogCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhY2tlZEdpdE9wZW5GaWxlcyhmaW5hbCBpbnQgZmRMaW1pdCkgeworCXB1YmxpYyB2b2lkIHNldFBhY2tlZEdpdE9wZW5GaWxlcyhpbnQgZmRMaW1pdCkgewogCQlwYWNrZWRHaXRPcGVuRmlsZXMgPSBmZExpbWl0OwogCX0KIApAQCAtMTIxLDcgKzEyMSw3IEBACiAJICogICAgICAgICAgICBtYXhpbXVtIG51bWJlciBieXRlcyBvZiBoZWFwIG1lbW9yeSB0byBkZWRpY2F0ZSB0byBjYWNoaW5nCiAJICogICAgICAgICAgICBwYWNrIGZpbGUgZGF0YS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWNrZWRHaXRMaW1pdChmaW5hbCBsb25nIG5ld0xpbWl0KSB7CisJcHVibGljIHZvaWQgc2V0UGFja2VkR2l0TGltaXQobG9uZyBuZXdMaW1pdCkgewogCQlwYWNrZWRHaXRMaW1pdCA9IG5ld0xpbWl0OwogCX0KIApAQCAtMTQyLDcgKzE0Miw3IEBACiAJICogQHBhcmFtIG5ld1NpemUKIAkgKiAgICAgICAgICAgIHNpemUgaW4gYnl0ZXMgb2YgYSBzaW5nbGUgd2luZG93IHJlYWQgaW4gZnJvbSB0aGUgcGFjayBmaWxlLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhY2tlZEdpdFdpbmRvd1NpemUoZmluYWwgaW50IG5ld1NpemUpIHsKKwlwdWJsaWMgdm9pZCBzZXRQYWNrZWRHaXRXaW5kb3dTaXplKGludCBuZXdTaXplKSB7CiAJCXBhY2tlZEdpdFdpbmRvd1NpemUgPSBuZXdTaXplOwogCX0KIApAQCAtMTY1LDcgKzE2NSw3IEBACiAJICogICAgICAgICAgICBmb3Igd2luZG93czsgZmFsc2UgcmVhZHMgZW50aXJlIHdpbmRvdyBpbnRvIGEgYnl0ZVtdIHdpdGgKIAkgKiAgICAgICAgICAgIHN0YW5kYXJkIHJlYWQgY2FsbHMuCiAJICovCi0JcHVibGljIHZvaWQgc2V0UGFja2VkR2l0TU1BUChmaW5hbCBib29sZWFuIHVzZW1tYXApIHsKKwlwdWJsaWMgdm9pZCBzZXRQYWNrZWRHaXRNTUFQKGJvb2xlYW4gdXNlbW1hcCkgewogCQlwYWNrZWRHaXRNTUFQID0gdXNlbW1hcDsKIAl9CiAKQEAgLTE4OSw3ICsxODksNyBAQAogCSAqICAgICAgICAgICAgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gY2FjaGUgaW4gZGVsdGEgYmFzZSBjYWNoZSBmb3IKIAkgKiAgICAgICAgICAgIGluZmxhdGVkLCByZWNlbnRseSBhY2Nlc3NlZCBvYmplY3RzLCB3aXRob3V0IGRlbHRhIGNoYWlucy4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWx0YUJhc2VDYWNoZUxpbWl0KGZpbmFsIGludCBuZXdMaW1pdCkgeworCXB1YmxpYyB2b2lkIHNldERlbHRhQmFzZUNhY2hlTGltaXQoaW50IG5ld0xpbWl0KSB7CiAJCWRlbHRhQmFzZUNhY2hlTGltaXQgPSBuZXdMaW1pdDsKIAl9CiAKQEAgLTIxMSw3ICsyMTEsNyBAQAogCSAqICAgICAgICAgICAgYXJyYXksIHdoaWxlIG9iamVjdHMgYmlnZ2VyIHRoYW4gdGhpcyBzaXplIHJlcXVpcmUgdXNpbmcgYW4KIAkgKiAgICAgICAgICAgIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RTdHJlYW19LgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0cmVhbUZpbGVUaHJlc2hvbGQoZmluYWwgaW50IG5ld0xpbWl0KSB7CisJcHVibGljIHZvaWQgc2V0U3RyZWFtRmlsZVRocmVzaG9sZChpbnQgbmV3TGltaXQpIHsKIAkJc3RyZWFtRmlsZVRocmVzaG9sZCA9IG5ld0xpbWl0OwogCX0KIApAQCAtMjI2LDcgKzIyNiw3IEBACiAJICogQHJldHVybiB7QGNvZGUgdGhpc30uCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBXaW5kb3dDYWNoZUNvbmZpZyBmcm9tQ29uZmlnKGZpbmFsIENvbmZpZyByYykgeworCXB1YmxpYyBXaW5kb3dDYWNoZUNvbmZpZyBmcm9tQ29uZmlnKENvbmZpZyByYykgewogCQlzZXRQYWNrZWRHaXRPcGVuRmlsZXMocmMuZ2V0SW50KAogCQkJCSJjb3JlIiwgbnVsbCwgInBhY2tlZGdpdG9wZW5maWxlcyIsIGdldFBhY2tlZEdpdE9wZW5GaWxlcygpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQlzZXRQYWNrZWRHaXRMaW1pdChyYy5nZXRMb25nKApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9zdG9yYWdlL3BhY2svUGFja0NvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9zdG9yYWdlL3BhY2svUGFja0NvbmZpZy5qYXZhCmluZGV4IDQ4NGNkZTIuLjI1NmU0MWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvc3RvcmFnZS9wYWNrL1BhY2tDb25maWcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3N0b3JhZ2UvcGFjay9QYWNrQ29uZmlnLmphdmEKQEAgLTEwMzksNyArMTAzOSw3IEBACiAJICogQHBhcmFtIHJjCiAJICogICAgICAgICAgICBjb25maWd1cmF0aW9uIHRvIHJlYWQgcHJvcGVydGllcyBmcm9tLgogCSAqLwotCXB1YmxpYyB2b2lkIGZyb21Db25maWcoZmluYWwgQ29uZmlnIHJjKSB7CisJcHVibGljIHZvaWQgZnJvbUNvbmZpZyhDb25maWcgcmMpIHsKIAkJc2V0TWF4RGVsdGFEZXB0aChyYy5nZXRJbnQoInBhY2siLCAiZGVwdGgiLCBnZXRNYXhEZWx0YURlcHRoKCkpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCXNldERlbHRhU2VhcmNoV2luZG93U2l6ZShyYy5nZXRJbnQoCiAJCQkJInBhY2siLCAid2luZG93IiwgZ2V0RGVsdGFTZWFyY2hXaW5kb3dTaXplKCkpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3N1Ym1vZHVsZS9TdWJtb2R1bGVXYWxrLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3N1Ym1vZHVsZS9TdWJtb2R1bGVXYWxrLmphdmEKaW5kZXggMjMxNGNmMS4uY2U4OTk1YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9zdWJtb2R1bGUvU3VibW9kdWxlV2Fsay5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvc3VibW9kdWxlL1N1Ym1vZHVsZVdhbGsuamF2YQpAQCAtMTE1LDExICsxMTUsMTMgQEAKIAkgKgogCSAqIEBwYXJhbSByZXBvc2l0b3J5CiAJICogICAgICAgICAgICBhIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5fSBvYmplY3QuCi0JICogQHJldHVybiBnZW5lcmF0b3Igb3ZlciBzdWJtb2R1bGUgaW5kZXggZW50cmllcworCSAqIEByZXR1cm4gZ2VuZXJhdG9yIG92ZXIgc3VibW9kdWxlIGluZGV4IGVudHJpZXMuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUKKwkgKiAgICAgICAgIGZvciBjYWxsaW5nIHtAbGluayAjY2xvc2UoKX0uCiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICovCiAJcHVibGljIHN0YXRpYyBTdWJtb2R1bGVXYWxrIGZvckluZGV4KFJlcG9zaXRvcnkgcmVwb3NpdG9yeSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIFRoZSBjYWxsZXIgY2xvc2VzIGl0CiAJCVN1Ym1vZHVsZVdhbGsgZ2VuZXJhdG9yID0gbmV3IFN1Ym1vZHVsZVdhbGsocmVwb3NpdG9yeSk7CiAJCXRyeSB7CiAJCQlEaXJDYWNoZSBpbmRleCA9IHJlcG9zaXRvcnkucmVhZERpckNhY2hlKCk7CkBAIC0zNjksNyArMzcxLDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeX0uCiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICovCi0JcHVibGljIFN1Ym1vZHVsZVdhbGsoZmluYWwgUmVwb3NpdG9yeSByZXBvc2l0b3J5KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBTdWJtb2R1bGVXYWxrKFJlcG9zaXRvcnkgcmVwb3NpdG9yeSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdGhpcy5yZXBvc2l0b3J5ID0gcmVwb3NpdG9yeTsKIAkJcmVwb0NvbmZpZyA9IHJlcG9zaXRvcnkuZ2V0Q29uZmlnKCk7CiAJCXdhbGsgPSBuZXcgVHJlZVdhbGsocmVwb3NpdG9yeSk7CkBAIC0zODYsNyArMzg4LDcgQEAKIAkgKiAgICAgICAgICAgIC5naXRtb2R1bGVzIGNvbmZpZyBvYmplY3QKIAkgKiBAcmV0dXJuIHRoaXMgZ2VuZXJhdG9yCiAJICovCi0JcHVibGljIFN1Ym1vZHVsZVdhbGsgc2V0TW9kdWxlc0NvbmZpZyhmaW5hbCBDb25maWcgY29uZmlnKSB7CisJcHVibGljIFN1Ym1vZHVsZVdhbGsgc2V0TW9kdWxlc0NvbmZpZyhDb25maWcgY29uZmlnKSB7CiAJCW1vZHVsZXNDb25maWcgPSBjb25maWc7CiAJCWxvYWRQYXRoTmFtZXMoKTsKIAkJcmV0dXJuIHRoaXM7CkBAIC00MDUsNyArNDA3LDcgQEAKIAkgKiAgICAgICAgICAgIHRyZWUgY29udGFpbmluZyAuZ2l0bW9kdWxlcwogCSAqIEByZXR1cm4gdGhpcyBnZW5lcmF0b3IKIAkgKi8KLQlwdWJsaWMgU3VibW9kdWxlV2FsayBzZXRSb290VHJlZShmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciB0cmVlKSB7CisJcHVibGljIFN1Ym1vZHVsZVdhbGsgc2V0Um9vdFRyZWUoQWJzdHJhY3RUcmVlSXRlcmF0b3IgdHJlZSkgewogCQlyb290VHJlZSA9IHRyZWU7CiAJCW1vZHVsZXNDb25maWcgPSBudWxsOwogCQlwYXRoVG9OYW1lID0gbnVsbDsKQEAgLTQyNiw3ICs0MjgsNyBAQAogCSAqIEByZXR1cm4gdGhpcyBnZW5lcmF0b3IKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgU3VibW9kdWxlV2FsayBzZXRSb290VHJlZShmaW5hbCBBbnlPYmplY3RJZCBpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgU3VibW9kdWxlV2FsayBzZXRSb290VHJlZShBbnlPYmplY3RJZCBpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgQ2Fub25pY2FsVHJlZVBhcnNlciBwID0gbmV3IENhbm9uaWNhbFRyZWVQYXJzZXIoKTsKIAkJcC5yZXNldCh3YWxrLmdldE9iamVjdFJlYWRlcigpLCBpZCk7CiAJCXJvb3RUcmVlID0gcDsKQEAgLTU2MCw3ICs1NjIsNyBAQAogCSAqIEByZXR1cm4gdGhpcyBnZW5lcmF0b3IKIAkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkNvcnJ1cHRPYmplY3RFeGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgU3VibW9kdWxlV2FsayBzZXRUcmVlKGZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGl0ZXJhdG9yKQorCXB1YmxpYyBTdWJtb2R1bGVXYWxrIHNldFRyZWUoQWJzdHJhY3RUcmVlSXRlcmF0b3IgaXRlcmF0b3IpCiAJCQl0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiB7CiAJCXdhbGsuYWRkVHJlZShpdGVyYXRvcik7CiAJCXJldHVybiB0aGlzOwpAQCAtNTc4LDcgKzU4MCw3IEBACiAJICogQHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uCiAJICogICAgICAgICAgICAgaWYgYW55LgogCSAqLwotCXB1YmxpYyBTdWJtb2R1bGVXYWxrIHNldFRyZWUoZmluYWwgQW55T2JqZWN0SWQgdHJlZUlkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBTdWJtb2R1bGVXYWxrIHNldFRyZWUoQW55T2JqZWN0SWQgdHJlZUlkKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl3YWxrLmFkZFRyZWUodHJlZUlkKTsKIAkJcmV0dXJuIHRoaXM7CiAJfQpAQCAtNzU0LDEzICs3NTYsMTEgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKi8KIAlwdWJsaWMgT2JqZWN0SWQgZ2V0SGVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVJlcG9zaXRvcnkgc3ViUmVwbyA9IGdldFJlcG9zaXRvcnkoKTsKLQkJaWYgKHN1YlJlcG8gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQl0cnkgeworCQl0cnkgKFJlcG9zaXRvcnkgc3ViUmVwbyA9IGdldFJlcG9zaXRvcnkoKSkgeworCQkJaWYgKHN1YlJlcG8gPT0gbnVsbCkgeworCQkJCXJldHVybiBudWxsOworCQkJfQogCQkJcmV0dXJuIHN1YlJlcG8ucmVzb2x2ZShDb25zdGFudHMuSEVBRCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlzdWJSZXBvLmNsb3NlKCk7CiAJCX0KIAl9CiAKQEAgLTc3MSwxNCArNzcxLDEyIEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICovCiAJcHVibGljIFN0cmluZyBnZXRIZWFkUmVmKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJUmVwb3NpdG9yeSBzdWJSZXBvID0gZ2V0UmVwb3NpdG9yeSgpOwotCQlpZiAoc3ViUmVwbyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXRyeSB7CisJCXRyeSAoUmVwb3NpdG9yeSBzdWJSZXBvID0gZ2V0UmVwb3NpdG9yeSgpKSB7CisJCQlpZiAoc3ViUmVwbyA9PSBudWxsKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CiAJCQlSZWYgaGVhZCA9IHN1YlJlcG8uZXhhY3RSZWYoQ29uc3RhbnRzLkhFQUQpOwogCQkJcmV0dXJuIGhlYWQgIT0gbnVsbCA/IGhlYWQuZ2V0TGVhZigpLmdldE5hbWUoKSA6IG51bGw7Ci0JCX0gZmluYWxseSB7Ci0JCQlzdWJSZXBvLmNsb3NlKCk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0FtYXpvblMzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9BbWF6b25TMy5qYXZhCmluZGV4IGQ3YzViOWQuLmEwZmM1N2MgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0FtYXpvblMzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQW1hem9uUzMuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0OwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CkBAIC0xMjgsMTQgKzEyOCwxNCBAQAogCQlTSUdORURfSEVBREVSUy5hZGQoImRhdGUiKTsgLy8kTk9OLU5MUy0xJAogCX0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTaWduZWRIZWFkZXIoZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU2lnbmVkSGVhZGVyKFN0cmluZyBuYW1lKSB7CiAJCWZpbmFsIFN0cmluZyBuYW1lTEMgPSBTdHJpbmdVdGlscy50b0xvd2VyQ2FzZShuYW1lKTsKIAkJcmV0dXJuIFNJR05FRF9IRUFERVJTLmNvbnRhaW5zKG5hbWVMQykgfHwgbmFtZUxDLnN0YXJ0c1dpdGgoIngtYW16LSIpOyAvLyROT04tTkxTLTEkCiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRvQ2xlYW5TdHJpbmcoZmluYWwgTGlzdDxTdHJpbmc+IGxpc3QpIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9DbGVhblN0cmluZyhMaXN0PFN0cmluZz4gbGlzdCkgewogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlmb3IgKGZpbmFsIFN0cmluZyB2IDogbGlzdCkgeworCQlmb3IgKFN0cmluZyB2IDogbGlzdCkgewogCQkJaWYgKHMubGVuZ3RoKCkgPiAwKQogCQkJCXMuYXBwZW5kKCcsJyk7CiAJCQlzLmFwcGVuZCh2LnJlcGxhY2VBbGwoIlxuIiwgIiIpLnRyaW0oKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJApAQCAtMTQzLDcgKzE0Myw3IEBACiAJCXJldHVybiBzLnRvU3RyaW5nKCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlbW92ZShmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IG0sIGZpbmFsIFN0cmluZyBrKSB7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlbW92ZShNYXA8U3RyaW5nLCBTdHJpbmc+IG0sIFN0cmluZyBrKSB7CiAJCWZpbmFsIFN0cmluZyByID0gbS5yZW1vdmUoayk7CiAJCXJldHVybiByICE9IG51bGwgPyByIDogIiI7IC8vJE5PTi1OTFMtMSQKIAl9CkBAIC0yODMsNyArMjgzLDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBzZW5kaW5nIHRoZSByZXF1ZXN0IHdhcyBub3QgcG9zc2libGUuCiAJICovCi0JcHVibGljIFVSTENvbm5lY3Rpb24gZ2V0KGZpbmFsIFN0cmluZyBidWNrZXQsIGZpbmFsIFN0cmluZyBrZXkpCisJcHVibGljIFVSTENvbm5lY3Rpb24gZ2V0KFN0cmluZyBidWNrZXQsIFN0cmluZyBrZXkpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmb3IgKGludCBjdXJBdHRlbXB0ID0gMDsgY3VyQXR0ZW1wdCA8IG1heEF0dGVtcHRzOyBjdXJBdHRlbXB0KyspIHsKIAkJCWZpbmFsIEh0dHBVUkxDb25uZWN0aW9uIGMgPSBvcGVuKCJHRVQiLCBidWNrZXQsIGtleSk7IC8vJE5PTi1OTFMtMSQKQEAgLTMxMiw3ICszMTIsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGRlY3J5cHRpb24gY291bGQgbm90IGJlIGNvbmZpZ3VyZWQuCiAJICovCi0JcHVibGljIElucHV0U3RyZWFtIGRlY3J5cHQoZmluYWwgVVJMQ29ubmVjdGlvbiB1KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBJbnB1dFN0cmVhbSBkZWNyeXB0KFVSTENvbm5lY3Rpb24gdSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIGVuY3J5cHRpb24uZGVjcnlwdCh1LmdldElucHV0U3RyZWFtKCkpOwogCX0KIApAQCAtMzM2LDcgKzMzNiw3IEBACiAJICogICAgICAgICAgICAgc2VuZGluZyB0aGUgcmVxdWVzdCB3YXMgbm90IHBvc3NpYmxlLCBvciB0aGUgcmVzcG9uc2UgWE1MCiAJICogICAgICAgICAgICAgZG9jdW1lbnQgY291bGQgbm90IGJlIHBhcnNlZCBwcm9wZXJseS4KIAkgKi8KLQlwdWJsaWMgTGlzdDxTdHJpbmc+IGxpc3QoZmluYWwgU3RyaW5nIGJ1Y2tldCwgU3RyaW5nIHByZWZpeCkKKwlwdWJsaWMgTGlzdDxTdHJpbmc+IGxpc3QoU3RyaW5nIGJ1Y2tldCwgU3RyaW5nIHByZWZpeCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmIChwcmVmaXgubGVuZ3RoKCkgPiAwICYmICFwcmVmaXguZW5kc1dpdGgoIi8iKSkgLy8kTk9OLU5MUy0xJAogCQkJcHJlZml4ICs9ICIvIjsgLy8kTk9OLU5MUy0xJApAQCAtMzU5LDcgKzM1OSw3IEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgZGVsZXRpb24gZmFpbGVkIGR1ZSB0byBjb21tdW5pY2F0aW9ucyBlcnJvci4KIAkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGUoZmluYWwgU3RyaW5nIGJ1Y2tldCwgZmluYWwgU3RyaW5nIGtleSkKKwlwdWJsaWMgdm9pZCBkZWxldGUoU3RyaW5nIGJ1Y2tldCwgU3RyaW5nIGtleSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZvciAoaW50IGN1ckF0dGVtcHQgPSAwOyBjdXJBdHRlbXB0IDwgbWF4QXR0ZW1wdHM7IGN1ckF0dGVtcHQrKykgewogCQkJZmluYWwgSHR0cFVSTENvbm5lY3Rpb24gYyA9IG9wZW4oIkRFTEVURSIsIGJ1Y2tldCwga2V5KTsgLy8kTk9OLU5MUy0xJApAQCAtMzk2LDcgKzM5Niw3IEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgY3JlYXRpb24vdXBkYXRpbmcgZmFpbGVkIGR1ZSB0byBjb21tdW5pY2F0aW9ucyBlcnJvci4KIAkgKi8KLQlwdWJsaWMgdm9pZCBwdXQoZmluYWwgU3RyaW5nIGJ1Y2tldCwgZmluYWwgU3RyaW5nIGtleSwgZmluYWwgYnl0ZVtdIGRhdGEpCisJcHVibGljIHZvaWQgcHV0KFN0cmluZyBidWNrZXQsIFN0cmluZyBrZXksIGJ5dGVbXSBkYXRhKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKGVuY3J5cHRpb24gIT0gV2Fsa0VuY3J5cHRpb24uTk9ORSkgewogCQkJLy8gV2UgaGF2ZSB0byBjb3B5IHRvIHByb2R1Y2UgdGhlIGNpcGhlciB0ZXh0IGFueXdheSBzbyB1c2UKQEAgLTUyNCwxMiArNTI0LDExIEBACiAJCQkJSkdpdFRleHQuZ2V0KCkuYW1hem9uUzNBY3Rpb25GYWlsZWQsIGFjdGlvbiwga2V5LAogCQkJCUludGVnZXIudmFsdWVPZihIdHRwU3VwcG9ydC5yZXNwb25zZShjKSksCiAJCQkJYy5nZXRSZXNwb25zZU1lc3NhZ2UoKSkpOwotCQlmaW5hbCBJbnB1dFN0cmVhbSBlcnJvclN0cmVhbSA9IGMuZ2V0RXJyb3JTdHJlYW0oKTsKLQkJaWYgKGVycm9yU3RyZWFtID09IG51bGwpIHsKKwkJaWYgKGMuZ2V0RXJyb3JTdHJlYW0oKSA9PSBudWxsKSB7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAKLQkJdHJ5IHsKKwkJdHJ5IChJbnB1dFN0cmVhbSBlcnJvclN0cmVhbSA9IGMuZ2V0RXJyb3JTdHJlYW0oKSkgewogCQkJZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAJCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbMjA0OF07CiAJCQlmb3IgKDs7KSB7CkBAIC01NDUsMTMgKzU0NCwxMSBAQAogCQkJaWYgKGJ1Zi5sZW5ndGggPiAwKSB7CiAJCQkJZXJyLmluaXRDYXVzZShuZXcgSU9FeGNlcHRpb24oIlxuIiArIG5ldyBTdHJpbmcoYnVmKSkpOyAvLyROT04tTkxTLTEkCiAJCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQllcnJvclN0cmVhbS5jbG9zZSgpOwogCQl9CiAJCXJldHVybiBlcnI7CiAJfQogCi0JSU9FeGNlcHRpb24gbWF4QXR0ZW1wdHMoZmluYWwgU3RyaW5nIGFjdGlvbiwgZmluYWwgU3RyaW5nIGtleSkgeworCUlPRXhjZXB0aW9uIG1heEF0dGVtcHRzKFN0cmluZyBhY3Rpb24sIFN0cmluZyBrZXkpIHsKIAkJcmV0dXJuIG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQlKR2l0VGV4dC5nZXQoKS5hbWF6b25TM0FjdGlvbkZhaWxlZEdpdmluZ1VwLCBhY3Rpb24sIGtleSwKIAkJCQlJbnRlZ2VyLnZhbHVlT2YobWF4QXR0ZW1wdHMpKSk7CkBAIC02MDAsMTAgKzU5NywxMCBAQAogCQlyZXR1cm4gYzsKIAl9CiAKLQl2b2lkIGF1dGhvcml6ZShmaW5hbCBIdHRwVVJMQ29ubmVjdGlvbiBjKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXZvaWQgYXV0aG9yaXplKEh0dHBVUkxDb25uZWN0aW9uIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gcmVxSGRyID0gYy5nZXRSZXF1ZXN0UHJvcGVydGllcygpOwogCQlmaW5hbCBTb3J0ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IHNpZ0hkciA9IG5ldyBUcmVlTWFwPD4oKTsKLQkJZm9yIChmaW5hbCBNYXAuRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGVudHJ5IDogcmVxSGRyLmVudHJ5U2V0KCkpIHsKKwkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGVudHJ5IDogcmVxSGRyLmVudHJ5U2V0KCkpIHsKIAkJCWZpbmFsIFN0cmluZyBoZHIgPSBlbnRyeS5nZXRLZXkoKTsKIAkJCWlmIChpc1NpZ25lZEhlYWRlcihoZHIpKQogCQkJCXNpZ0hkci5wdXQoU3RyaW5nVXRpbHMudG9Mb3dlckNhc2UoaGRyKSwgdG9DbGVhblN0cmluZyhlbnRyeS5nZXRWYWx1ZSgpKSk7CkBAIC02MjIsNyArNjE5LDcgQEAKIAkJcy5hcHBlbmQocmVtb3ZlKHNpZ0hkciwgImRhdGUiKSk7IC8vJE5PTi1OTFMtMSQKIAkJcy5hcHBlbmQoJ1xuJyk7CiAKLQkJZm9yIChmaW5hbCBNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGUgOiBzaWdIZHIuZW50cnlTZXQoKSkgeworCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZSA6IHNpZ0hkci5lbnRyeVNldCgpKSB7CiAJCQlzLmFwcGVuZChlLmdldEtleSgpKTsKIAkJCXMuYXBwZW5kKCc6Jyk7CiAJCQlzLmFwcGVuZChlLmdldFZhbHVlKCkpOwpAQCAtNjM4LDcgKzYzNSw3IEBACiAJCXRyeSB7CiAJCQlmaW5hbCBNYWMgbSA9IE1hYy5nZXRJbnN0YW5jZShITUFDKTsKIAkJCW0uaW5pdChwcml2YXRlS2V5KTsKLQkJCXNlYyA9IEJhc2U2NC5lbmNvZGVCeXRlcyhtLmRvRmluYWwocy50b1N0cmluZygpLmdldEJ5dGVzKFVURl84KSkpOworCQkJc2VjID0gQmFzZTY0LmVuY29kZUJ5dGVzKG0uZG9GaW5hbChzLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpKTsKIAkJfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKIAkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5ub0hNQUNzdXBwb3J0LCBITUFDLCBlLmdldE1lc3NhZ2UoKSkpOwogCQl9IGNhdGNoIChJbnZhbGlkS2V5RXhjZXB0aW9uIGUpIHsKQEAgLTY0Nyw3ICs2NDQsNyBAQAogCQljLnNldFJlcXVlc3RQcm9wZXJ0eSgiQXV0aG9yaXphdGlvbiIsICJBV1MgIiArIHB1YmxpY0tleSArICI6IiArIHNlYyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCiAJfQogCi0Jc3RhdGljIFByb3BlcnRpZXMgcHJvcGVydGllcyhmaW5hbCBGaWxlIGF1dGhGaWxlKQorCXN0YXRpYyBQcm9wZXJ0aWVzIHByb3BlcnRpZXMoRmlsZSBhdXRoRmlsZSkKIAkJCXRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKIAkJdHJ5IChGaWxlSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGF1dGhGaWxlKSkgewpAQCAtNjY3LDcgKzY2NCw3IEBACiAKIAkJcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIGRhdGE7CiAKLQkJTGlzdFBhcnNlcihmaW5hbCBTdHJpbmcgYm4sIGZpbmFsIFN0cmluZyBwKSB7CisJCUxpc3RQYXJzZXIoU3RyaW5nIGJuLCBTdHJpbmcgcCkgewogCQkJYnVja2V0ID0gYm47CiAJCQlwcmVmaXggPSBwOwogCQl9CkBAIC03MzAsNyArNzI3LDcgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGZpbmFsIGNoYXJbXSBjaCwgZmluYWwgaW50IHMsIGZpbmFsIGludCBuKQorCQlwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBjaCwgaW50IHMsIGludCBuKQogCQkJCXRocm93cyBTQVhFeGNlcHRpb24gewogCQkJaWYgKGRhdGEgIT0gbnVsbCkKIAkJCQlkYXRhLmFwcGVuZChjaCwgcywgbik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlQ29ubmVjdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZUNvbm5lY3Rpb24uamF2YQppbmRleCBjOGQxZDIyLi5mNjA0NWY2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlQ29ubmVjdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Jhc2VDb25uZWN0aW9uLmphdmEKQEAgLTg1LDcgKzg1LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGZpbmFsIFJlZiBnZXRSZWYoZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlwdWJsaWMgZmluYWwgUmVmIGdldFJlZihTdHJpbmcgbmFtZSkgewogCQlyZXR1cm4gYWR2ZXJ0aXNlZFJlZnMuZ2V0KG5hbWUpOwogCX0KIApAQCAtMTMyLDcgKzEzMiw3IEBACiAJICogICAgICAgICAgICB3aWxsIGJlIHdyYXBwZWQgaW4gYW4gdW5tb2RpZmlhYmxlIHdheSB0byBwcm90ZWN0IGl0LCBidXQgaXQKIAkgKiAgICAgICAgICAgIGRvZXMgbm90IGdldCBjb3BpZWQuCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgYXZhaWxhYmxlKGZpbmFsIE1hcDxTdHJpbmcsIFJlZj4gYWxsKSB7CisJcHJvdGVjdGVkIHZvaWQgYXZhaWxhYmxlKE1hcDxTdHJpbmcsIFJlZj4gYWxsKSB7CiAJCWFkdmVydGlzZWRSZWZzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKGFsbCk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlUGFja0Nvbm5lY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Jhc2VQYWNrQ29ubmVjdGlvbi5qYXZhCmluZGV4IGU5MjI3ZTMuLjM4ZWFlMWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Jhc2VQYWNrQ29ubmVjdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Jhc2VQYWNrQ29ubmVjdGlvbi5qYXZhCkBAIC0xMjIsNyArMTIyLDcgQEAKIAkvKiogRXh0cmEgb2JqZWN0cyB0aGUgcmVtb3RlIGhhcywgYnV0IHdoaWNoIGFyZW4ndCBvZmZlcmVkIGFzIHJlZnMuICovCiAJcHJvdGVjdGVkIGZpbmFsIFNldDxPYmplY3RJZD4gYWRkaXRpb25hbEhhdmVzID0gbmV3IEhhc2hTZXQ8PigpOwogCi0JQmFzZVBhY2tDb25uZWN0aW9uKGZpbmFsIFBhY2tUcmFuc3BvcnQgcGFja1RyYW5zcG9ydCkgeworCUJhc2VQYWNrQ29ubmVjdGlvbihQYWNrVHJhbnNwb3J0IHBhY2tUcmFuc3BvcnQpIHsKIAkJdHJhbnNwb3J0ID0gKFRyYW5zcG9ydCkgcGFja1RyYW5zcG9ydDsKIAkJbG9jYWwgPSB0cmFuc3BvcnQubG9jYWw7CiAJCXVyaSA9IHRyYW5zcG9ydC51cmk7CkBAIC0yNzQsNyArMjc0LDcgQEAKIAkgKiAgICAgICAgICAgIG9wdGlvbiBzdHJpbmcKIAkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBvcHRpb24gaXMgc3VwcG9ydGVkCiAJICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDYXBhYmxlT2YoZmluYWwgU3RyaW5nIG9wdGlvbikgeworCXByb3RlY3RlZCBib29sZWFuIGlzQ2FwYWJsZU9mKFN0cmluZyBvcHRpb24pIHsKIAkJcmV0dXJuIHJlbW90ZUNhcGFibGl0aWVzLmNvbnRhaW5zKG9wdGlvbik7CiAJfQogCkBAIC0yODcsNyArMjg3LDcgQEAKIAkgKiAgICAgICAgICAgIG9wdGlvbiB3ZSB3YW50CiAJICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHJlcXVlc3RlZCBvcHRpb24gaXMgc3VwcG9ydGVkCiAJICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gd2FudENhcGFiaWxpdHkoZmluYWwgU3RyaW5nQnVpbGRlciBiLCBmaW5hbCBTdHJpbmcgb3B0aW9uKSB7CisJcHJvdGVjdGVkIGJvb2xlYW4gd2FudENhcGFiaWxpdHkoU3RyaW5nQnVpbGRlciBiLCBTdHJpbmcgb3B0aW9uKSB7CiAJCWlmICghaXNDYXBhYmxlT2Yob3B0aW9uKSkKIAkJCXJldHVybiBmYWxzZTsKIAkJYi5hcHBlbmQoJyAnKTsKQEAgLTMxNCw3ICszMTQsNyBAQAogCQlyZXR1cm4gVXNlckFnZW50LmdldEFnZW50KHJlbW90ZUNhcGFibGl0aWVzLCBzdXBlci5nZXRQZWVyVXNlckFnZW50KCkpOwogCX0KIAotCXByaXZhdGUgUGFja1Byb3RvY29sRXhjZXB0aW9uIGR1cGxpY2F0ZUFkdmVydGlzZW1lbnQoZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlwcml2YXRlIFBhY2tQcm90b2NvbEV4Y2VwdGlvbiBkdXBsaWNhdGVBZHZlcnRpc2VtZW50KFN0cmluZyBuYW1lKSB7CiAJCXJldHVybiBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKHVyaSwgTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuZHVwbGljYXRlQWR2ZXJ0aXNlbWVudHNPZiwgbmFtZSkpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZVBhY2tGZXRjaENvbm5lY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Jhc2VQYWNrRmV0Y2hDb25uZWN0aW9uLmphdmEKaW5kZXggMTM4MzA0NS4uMGRmY2Q4NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZVBhY2tGZXRjaENvbm5lY3Rpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlUGFja0ZldGNoQ29ubmVjdGlvbi5qYXZhCkBAIC00NSw4ICs0NSw2IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmRGF0YWJhc2UuQUxMOwotCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwpAQCAtNTUsNyArNTMsNiBAQAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5QYWNrUHJvdG9jb2xFeGNlcHRpb247CkBAIC0yMDAsNiArMTk3LDEzIEBACiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX0FMTE9XX1JFQUNIQUJMRV9TSEExX0lOX1dBTlQgPSBHaXRQcm90b2NvbENvbnN0YW50cy5PUFRJT05fQUxMT1dfUkVBQ0hBQkxFX1NIQTFfSU5fV0FOVDsKIAorCS8qKgorCSAqIFRoZSBjbGllbnQgc3BlY2lmaWVkIGEgZmlsdGVyIGV4cHJlc3Npb24uCisJICoKKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX0ZJTFRFUiA9IEdpdFByb3RvY29sQ29uc3RhbnRzLk9QVElPTl9GSUxURVI7CisKIAlwcml2YXRlIGZpbmFsIFJldldhbGsgd2FsazsKIAogCS8qKiBBbGwgY29tbWl0cyB0aGF0IGFyZSBpbW1lZGlhdGVseSByZWFjaGFibGUgYnkgYSBsb2NhbCByZWYuICovCkBAIC0yNDIsMTMgKzI0NiwxNiBAQAogCiAJcHJpdmF0ZSBQYWNrZXRMaW5lT3V0IHBja1N0YXRlOwogCisJLyoqIElmIG5vdCAtMSwgdGhlIG1heGltdW0gYmxvYiBzaXplIHRvIGJlIHNlbnQgdG8gdGhlIHNlcnZlci4gKi8KKwlwcml2YXRlIGZpbmFsIGxvbmcgZmlsdGVyQmxvYkxpbWl0OworCiAJLyoqCiAJICogQ3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24gdG8gZmV0Y2ggdXNpbmcgdGhlIG5hdGl2ZSBnaXQgdHJhbnNwb3J0LgogCSAqCiAJICogQHBhcmFtIHBhY2tUcmFuc3BvcnQKIAkgKiAgICAgICAgICAgIHRoZSB0cmFuc3BvcnQuCiAJICovCi0JcHVibGljIEJhc2VQYWNrRmV0Y2hDb25uZWN0aW9uKGZpbmFsIFBhY2tUcmFuc3BvcnQgcGFja1RyYW5zcG9ydCkgeworCXB1YmxpYyBCYXNlUGFja0ZldGNoQ29ubmVjdGlvbihQYWNrVHJhbnNwb3J0IHBhY2tUcmFuc3BvcnQpIHsKIAkJc3VwZXIocGFja1RyYW5zcG9ydCk7CiAKIAkJaWYgKGxvY2FsICE9IG51bGwpIHsKQEAgLTI2Miw2ICsyNjksNyBAQAogCQl9CiAJCWluY2x1ZGVUYWdzID0gdHJhbnNwb3J0LmdldFRhZ09wdCgpICE9IFRhZ09wdC5OT19UQUdTOwogCQl0aGluUGFjayA9IHRyYW5zcG9ydC5pc0ZldGNoVGhpbigpOworCQlmaWx0ZXJCbG9iTGltaXQgPSB0cmFuc3BvcnQuZ2V0RmlsdGVyQmxvYkxpbWl0KCk7CiAKIAkJaWYgKGxvY2FsICE9IG51bGwpIHsKIAkJCXdhbGsgPSBuZXcgUmV2V2Fsayhsb2NhbCk7CkBAIC0yODgsNyArMjk2LDcgQEAKIAogCQlmaW5hbCBib29sZWFuIG1pbmltYWxOZWdvdGlhdGlvbjsKIAotCQlGZXRjaENvbmZpZyhmaW5hbCBDb25maWcgYykgeworCQlGZXRjaENvbmZpZyhDb25maWcgYykgewogCQkJYWxsb3dPZnNEZWx0YSA9IGMuZ2V0Qm9vbGVhbigicmVwYWNrIiwgInVzZWRlbHRhYmFzZW9mZnNldCIsIHRydWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCW1pbmltYWxOZWdvdGlhdGlvbiA9IGMuZ2V0Qm9vbGVhbigiZmV0Y2giLCAidXNlbWluaW1hbG5lZ290aWF0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkJCWZhbHNlKTsKQEAgLTMzMSw3ICszMzksNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRQYWNrTG9ja01lc3NhZ2UoZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKwlwdWJsaWMgdm9pZCBzZXRQYWNrTG9ja01lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKIAkJbG9ja01lc3NhZ2UgPSBtZXNzYWdlOwogCX0KIApAQCAtNDEwLDkgKzQxOCw5IEBACiAJCXJldHVybiBsb2NhbC5nZXRDb25maWcoKS5nZXQoRmV0Y2hDb25maWc6Om5ldyk7CiAJfQogCi0JcHJpdmF0ZSBpbnQgbWF4VGltZVdhbnRlZChmaW5hbCBDb2xsZWN0aW9uPFJlZj4gd2FudHMpIHsKKwlwcml2YXRlIGludCBtYXhUaW1lV2FudGVkKENvbGxlY3Rpb248UmVmPiB3YW50cykgewogCQlpbnQgbWF4VGltZSA9IDA7Ci0JCWZvciAoZmluYWwgUmVmIHIgOiB3YW50cykgeworCQlmb3IgKFJlZiByIDogd2FudHMpIHsKIAkJCXRyeSB7CiAJCQkJZmluYWwgUmV2T2JqZWN0IG9iaiA9IHdhbGsucGFyc2VBbnkoci5nZXRPYmplY3RJZCgpKTsKIAkJCQlpZiAob2JqIGluc3RhbmNlb2YgUmV2Q29tbWl0KSB7CkBAIC00MjcsMTAgKzQzNSw5IEBACiAJCXJldHVybiBtYXhUaW1lOwogCX0KIAotCXByaXZhdGUgdm9pZCBtYXJrUmVhY2hhYmxlKGZpbmFsIFNldDxPYmplY3RJZD4gaGF2ZSwgZmluYWwgaW50IG1heFRpbWUpCisJcHJpdmF0ZSB2b2lkIG1hcmtSZWFjaGFibGUoU2V0PE9iamVjdElkPiBoYXZlLCBpbnQgbWF4VGltZSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCU1hcDxTdHJpbmcsIFJlZj4gcmVmcyA9IGxvY2FsLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhBTEwpOwotCQlmb3IgKGZpbmFsIFJlZiByIDogcmVmcy52YWx1ZXMoKSkgeworCQlmb3IgKFJlZiByIDogbG9jYWwuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKCkpIHsKIAkJCU9iamVjdElkIGlkID0gci5nZXRQZWVsZWRPYmplY3RJZCgpOwogCQkJaWYgKGlkID09IG51bGwpCiAJCQkJaWQgPSByLmdldE9iamVjdElkKCk7CkBAIC00ODIsMTAgKzQ4OSwxMCBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBib29sZWFuIHNlbmRXYW50cyhmaW5hbCBDb2xsZWN0aW9uPFJlZj4gd2FudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIGJvb2xlYW4gc2VuZFdhbnRzKENvbGxlY3Rpb248UmVmPiB3YW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBQYWNrZXRMaW5lT3V0IHAgPSBzdGF0ZWxlc3NSUEMgPyBwY2tTdGF0ZSA6IHBja091dDsKIAkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCWZvciAoZmluYWwgUmVmIHIgOiB3YW50KSB7CisJCWZvciAoUmVmIHIgOiB3YW50KSB7CiAJCQlPYmplY3RJZCBvYmplY3RJZCA9IHIuZ2V0T2JqZWN0SWQoKTsKIAkJCWlmIChvYmplY3RJZCA9PSBudWxsKSB7CiAJCQkJY29udGludWU7CkBAIC01MjQsNiArNTMxLDExIEBACiAJCWlmIChmaXJzdCkgewogCQkJcmV0dXJuIGZhbHNlOwogCQl9CisJCWlmIChmaWx0ZXJCbG9iTGltaXQgPT0gMCkgeworCQkJcC53cml0ZVN0cmluZyhPUFRJT05fRklMVEVSICsgIiBibG9iOm5vbmUiKTsgLy8kTk9OLU5MUy0xJAorCQl9IGVsc2UgaWYgKGZpbHRlckJsb2JMaW1pdCA+IDApIHsKKwkJCXAud3JpdGVTdHJpbmcoT1BUSU9OX0ZJTFRFUiArICIgYmxvYjpsaW1pdD0iICsgZmlsdGVyQmxvYkxpbWl0KTsgLy8kTk9OLU5MUy0xJAorCQl9CiAJCXAuZW5kKCk7CiAJCW91dE5lZWRzRW5kID0gZmFsc2U7CiAJCXJldHVybiB0cnVlOwpAQCAtNTY0LDExICs1NzYsMTYgQEAKIAkJCQkJT1BUSU9OX01VTFRJX0FDS19ERVRBSUxFRCkpOwogCQl9CiAKKwkJaWYgKGZpbHRlckJsb2JMaW1pdCA+PSAwICYmICF3YW50Q2FwYWJpbGl0eShsaW5lLCBPUFRJT05fRklMVEVSKSkgeworCQkJdGhyb3cgbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbih1cmksCisJCQkJCUpHaXRUZXh0LmdldCgpLmZpbHRlclJlcXVpcmVzQ2FwYWJpbGl0eSk7CisJCX0KKwogCQlhZGRVc2VyQWdlbnRDYXBhYmlsaXR5KGxpbmUpOwogCQlyZXR1cm4gbGluZS50b1N0cmluZygpOwogCX0KIAotCXByaXZhdGUgdm9pZCBuZWdvdGlhdGUoZmluYWwgUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiwKKwlwcml2YXRlIHZvaWQgbmVnb3RpYXRlKFByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAJCQlDYW5jZWxsZWRFeGNlcHRpb24gewogCQlmaW5hbCBNdXRhYmxlT2JqZWN0SWQgYWNrSWQgPSBuZXcgTXV0YWJsZU9iamVjdElkKCk7CiAJCWludCByZXN1bHRzUGVuZGluZyA9IDA7CkBAIC03NjgsNyArNzg1LDcgQEAKIAkJCX0KIAogCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFJldldhbGsgd2Fsa2VyLCBmaW5hbCBSZXZDb21taXQgYykgeworCQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShSZXZXYWxrIHdhbGtlciwgUmV2Q29tbWl0IGMpIHsKIAkJCQlmaW5hbCBib29sZWFuIHJlbW90ZUtub3dzSXNDb21tb24gPSBjLmhhcyhDT01NT04pOwogCQkJCWlmIChjLmhhcyhBRFZFUlRJU0VEKSkgewogCQkJCQkvLyBSZW1vdGUgYWR2ZXJ0aXNlZCB0aGlzLCBhbmQgd2UgaGF2ZSBpdCwgaGVuY2UgY29tbW9uLgpAQCAtNzg5LDE0ICs4MDYsMTQgQEAKIAl9CiAKIAlwcml2YXRlIHZvaWQgbWFya1JlZnNBZHZlcnRpc2VkKCkgewotCQlmb3IgKGZpbmFsIFJlZiByIDogZ2V0UmVmcygpKSB7CisJCWZvciAoUmVmIHIgOiBnZXRSZWZzKCkpIHsKIAkJCW1hcmtBZHZlcnRpc2VkKHIuZ2V0T2JqZWN0SWQoKSk7CiAJCQlpZiAoci5nZXRQZWVsZWRPYmplY3RJZCgpICE9IG51bGwpCiAJCQkJbWFya0FkdmVydGlzZWQoci5nZXRQZWVsZWRPYmplY3RJZCgpKTsKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBtYXJrQWR2ZXJ0aXNlZChmaW5hbCBBbnlPYmplY3RJZCBpZCkgeworCXByaXZhdGUgdm9pZCBtYXJrQWR2ZXJ0aXNlZChBbnlPYmplY3RJZCBpZCkgewogCQl0cnkgewogCQkJd2Fsay5wYXJzZUFueShpZCkuYWRkKEFEVkVSVElTRUQpOwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiByZWFkRXJyb3IpIHsKQEAgLTgwNCw3ICs4MjEsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIG1hcmtDb21tb24oZmluYWwgUmV2T2JqZWN0IG9iaiwgZmluYWwgQWNrTmFja1Jlc3VsdCBhbnIpCisJcHJpdmF0ZSB2b2lkIG1hcmtDb21tb24oUmV2T2JqZWN0IG9iaiwgQWNrTmFja1Jlc3VsdCBhbnIpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAoc3RhdGVsZXNzUlBDICYmIGFuciA9PSBBY2tOYWNrUmVzdWx0LkFDS19DT01NT04gJiYgIW9iai5oYXMoU1RBVEUpKSB7CiAJCQlTdHJpbmdCdWlsZGVyIHM7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlUGFja1B1c2hDb25uZWN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlUGFja1B1c2hDb25uZWN0aW9uLmphdmEKaW5kZXggZWU2ZjI5ZS4uNjk2MjRmZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZVBhY2tQdXNoQ29ubmVjdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Jhc2VQYWNrUHVzaENvbm5lY3Rpb24uamF2YQpAQCAtMTQ2LDcgKzE0Niw3IEBACiAJICogQHBhcmFtIHBhY2tUcmFuc3BvcnQKIAkgKiAgICAgICAgICAgIHRoZSB0cmFuc3BvcnQuCiAJICovCi0JcHVibGljIEJhc2VQYWNrUHVzaENvbm5lY3Rpb24oZmluYWwgUGFja1RyYW5zcG9ydCBwYWNrVHJhbnNwb3J0KSB7CisJcHVibGljIEJhc2VQYWNrUHVzaENvbm5lY3Rpb24oUGFja1RyYW5zcG9ydCBwYWNrVHJhbnNwb3J0KSB7CiAJCXN1cGVyKHBhY2tUcmFuc3BvcnQpOwogCQl0aGluUGFjayA9IHRyYW5zcG9ydC5pc1B1c2hUaGluKCk7CiAJCWF0b21pYyA9IHRyYW5zcG9ydC5pc1B1c2hBdG9taWMoKTsKQEAgLTI1Niw3ICsyNTYsNyBAQAogCQkJCQkJCXB1c2hPcHRpb25zLnRvU3RyaW5nKCkpKTsKIAkJfQogCi0JCWZvciAoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHJydSA6IHJlZlVwZGF0ZXMpIHsKKwkJZm9yIChSZW1vdGVSZWZVcGRhdGUgcnJ1IDogcmVmVXBkYXRlcykgewogCQkJaWYgKCFjYXBhYmxlRGVsZXRlUmVmcyAmJiBycnUuaXNEZWxldGUoKSkgewogCQkJCXJydS5zZXRTdGF0dXMoU3RhdHVzLlJFSkVDVEVEX05PREVMRVRFKTsKIAkJCQljb250aW51ZTsKQEAgLTI5NCw3ICsyOTQsNyBAQAogCX0KIAogCXByaXZhdGUgdm9pZCB0cmFuc21pdE9wdGlvbnMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmb3IgKGZpbmFsIFN0cmluZyBwdXNoT3B0aW9uIDogcHVzaE9wdGlvbnMpIHsKKwkJZm9yIChTdHJpbmcgcHVzaE9wdGlvbiA6IHB1c2hPcHRpb25zKSB7CiAJCQlwY2tPdXQud3JpdGVTdHJpbmcocHVzaE9wdGlvbik7CiAJCX0KIApAQCAtMzMyLDE3ICszMzIsMTcgQEAKIAkJU2V0PE9iamVjdElkPiByZW1vdGVPYmplY3RzID0gbmV3IEhhc2hTZXQ8PigpOwogCQlTZXQ8T2JqZWN0SWQ+IG5ld09iamVjdHMgPSBuZXcgSGFzaFNldDw+KCk7CiAKLQkJdHJ5IChmaW5hbCBQYWNrV3JpdGVyIHdyaXRlciA9IG5ldyBQYWNrV3JpdGVyKHRyYW5zcG9ydC5nZXRQYWNrQ29uZmlnKCksCisJCXRyeSAoUGFja1dyaXRlciB3cml0ZXIgPSBuZXcgUGFja1dyaXRlcih0cmFuc3BvcnQuZ2V0UGFja0NvbmZpZygpLAogCQkJCWxvY2FsLm5ld09iamVjdFJlYWRlcigpKSkgewogCi0JCQlmb3IgKGZpbmFsIFJlZiByIDogZ2V0UmVmcygpKSB7CisJCQlmb3IgKFJlZiByIDogZ2V0UmVmcygpKSB7CiAJCQkJLy8gb25seSBhZGQgb2JqZWN0cyB0aGF0IHdlIGFjdHVhbGx5IGhhdmUKIAkJCQlPYmplY3RJZCBvaWQgPSByLmdldE9iamVjdElkKCk7CiAJCQkJaWYgKGxvY2FsLmhhc09iamVjdChvaWQpKQogCQkJCQlyZW1vdGVPYmplY3RzLmFkZChvaWQpOwogCQkJfQogCQkJcmVtb3RlT2JqZWN0cy5hZGRBbGwoYWRkaXRpb25hbEhhdmVzKTsKLQkJCWZvciAoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHIgOiByZWZVcGRhdGVzLnZhbHVlcygpKSB7CisJCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSByIDogcmVmVXBkYXRlcy52YWx1ZXMoKSkgewogCQkJCWlmICghT2JqZWN0SWQuemVyb0lkKCkuZXF1YWxzKHIuZ2V0TmV3T2JqZWN0SWQoKSkpCiAJCQkJCW5ld09iamVjdHMuYWRkKHIuZ2V0TmV3T2JqZWN0SWQoKSk7CiAJCQl9CkBAIC0zNjUsNyArMzY1LDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCByZWFkU3RhdHVzUmVwb3J0KGZpbmFsIE1hcDxTdHJpbmcsIFJlbW90ZVJlZlVwZGF0ZT4gcmVmVXBkYXRlcykKKwlwcml2YXRlIHZvaWQgcmVhZFN0YXR1c1JlcG9ydChNYXA8U3RyaW5nLCBSZW1vdGVSZWZVcGRhdGU+IHJlZlVwZGF0ZXMpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmcgdW5wYWNrTGluZSA9IHJlYWRTdHJpbmdMb25nVGltZW91dCgpOwogCQlpZiAoIXVucGFja0xpbmUuc3RhcnRzV2l0aCgidW5wYWNrICIpKSAvLyROT04tTkxTLTEkCkBAIC00MTEsNyArNDExLDcgQEAKIAkJCQlycnUuc2V0TWVzc2FnZShtZXNzYWdlKTsKIAkJCX0KIAkJfQotCQlmb3IgKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSBycnUgOiByZWZVcGRhdGVzLnZhbHVlcygpKSB7CisJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHJydSA6IHJlZlVwZGF0ZXMudmFsdWVzKCkpIHsKIAkJCWlmIChycnUuZ2V0U3RhdHVzKCkgPT0gU3RhdHVzLkFXQUlUSU5HX1JFUE9SVCkKIAkJCQl0aHJvdyBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAogCQkJCQkJSkdpdFRleHQuZ2V0KCkuZXhwZWN0ZWRSZXBvcnRGb3JSZWZOb3RSZWNlaXZlZCAsIHVyaSwgcnJ1LmdldFJlbW90ZU5hbWUoKSkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZVJlY2VpdmVQYWNrLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlUmVjZWl2ZVBhY2suamF2YQppbmRleCBlOTdmNzFhLi5jNDI2ZTNjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlUmVjZWl2ZVBhY2suamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlUmVjZWl2ZVBhY2suamF2YQpAQCAtMzA2LDcgKzMwNiw3IEBACiAJICogQHBhcmFtIGludG8KIAkgKiAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiByZXBvc2l0b3J5LgogCSAqLwotCXByb3RlY3RlZCBCYXNlUmVjZWl2ZVBhY2soZmluYWwgUmVwb3NpdG9yeSBpbnRvKSB7CisJcHJvdGVjdGVkIEJhc2VSZWNlaXZlUGFjayhSZXBvc2l0b3J5IGludG8pIHsKIAkJZGIgPSBpbnRvOwogCQl3YWxrID0gbmV3IFJldldhbGsoZGIpOwogCkBAIC0zNDAsNyArMzQwLDcgQEAKIAkJZmluYWwgbG9uZyBtYXhEaXNjYXJkQnl0ZXM7CiAJCWZpbmFsIFNpZ25lZFB1c2hDb25maWcgc2lnbmVkUHVzaDsKIAotCQlSZWNlaXZlQ29uZmlnKGZpbmFsIENvbmZpZyBjb25maWcpIHsKKwkJUmVjZWl2ZUNvbmZpZyhDb25maWcgY29uZmlnKSB7CiAJCQlhbGxvd0NyZWF0ZXMgPSB0cnVlOwogCQkJYWxsb3dEZWxldGVzID0gIWNvbmZpZy5nZXRCb29sZWFuKCJyZWNlaXZlIiwgImRlbnlkZWxldGVzIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCWFsbG93Tm9uRmFzdEZvcndhcmRzID0gIWNvbmZpZy5nZXRCb29sZWFuKCJyZWNlaXZlIiwgLy8kTk9OLU5MUy0xJApAQCAtNTQ4LDcgKzU0OCw3IEBACiAJICogICAgICAgICAgICBjb21tYW5kcyBiZWZvcmUgd3JpdGluZyBvdXRwdXQgYW5kIGRvZXMgbm90IHBlcmZvcm0gdGhlCiAJICogICAgICAgICAgICBpbml0aWFsIGFkdmVydGlzaW5nLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldEJpRGlyZWN0aW9uYWxQaXBlKGZpbmFsIGJvb2xlYW4gdHdvV2F5KSB7CisJcHVibGljIHZvaWQgc2V0QmlEaXJlY3Rpb25hbFBpcGUoYm9vbGVhbiB0d29XYXkpIHsKIAkJYmlEaXJlY3Rpb25hbFBpcGUgPSB0d29XYXk7CiAJfQogCkBAIC01OTIsNyArNTkyLDcgQEAKIAkgKiAgICAgICAgICAgIGFzc3VtZSBhbGwgcmVjZWl2ZWQgb2JqZWN0cyBhcmUgdmFsaWQuCiAJICogQHNlZSAjc2V0T2JqZWN0Q2hlY2tlcihPYmplY3RDaGVja2VyKQogCSAqLwotCXB1YmxpYyB2b2lkIHNldENoZWNrUmVjZWl2ZWRPYmplY3RzKGZpbmFsIGJvb2xlYW4gY2hlY2spIHsKKwlwdWJsaWMgdm9pZCBzZXRDaGVja1JlY2VpdmVkT2JqZWN0cyhib29sZWFuIGNoZWNrKSB7CiAJCWlmIChjaGVjayAmJiBvYmplY3RDaGVja2VyID09IG51bGwpCiAJCQlzZXRPYmplY3RDaGVja2VyKG5ldyBPYmplY3RDaGVja2VyKCkpOwogCQllbHNlIGlmICghY2hlY2sgJiYgb2JqZWN0Q2hlY2tlciAhPSBudWxsKQpAQCAtNjI2LDcgKzYyNiw3IEBACiAJICogQHBhcmFtIGNhbkNyZWF0ZQogCSAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IHRvIHBlcm1pdCBjcmVhdGUgcmVmIGNvbW1hbmRzIHRvIGJlIHByb2Nlc3NlZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbGxvd0NyZWF0ZXMoZmluYWwgYm9vbGVhbiBjYW5DcmVhdGUpIHsKKwlwdWJsaWMgdm9pZCBzZXRBbGxvd0NyZWF0ZXMoYm9vbGVhbiBjYW5DcmVhdGUpIHsKIAkJYWxsb3dDcmVhdGVzID0gY2FuQ3JlYXRlOwogCX0KIApAQCAtNjQ1LDcgKzY0NSw3IEBACiAJICogQHBhcmFtIGNhbkRlbGV0ZQogCSAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IHRvIHBlcm1pdCBkZWxldGUgcmVmIGNvbW1hbmRzIHRvIGJlIHByb2Nlc3NlZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbGxvd0RlbGV0ZXMoZmluYWwgYm9vbGVhbiBjYW5EZWxldGUpIHsKKwlwdWJsaWMgdm9pZCBzZXRBbGxvd0RlbGV0ZXMoYm9vbGVhbiBjYW5EZWxldGUpIHsKIAkJYWxsb3dBbnlEZWxldGVzID0gY2FuRGVsZXRlOwogCX0KIApAQCAtNjkxLDcgKzY5MSw3IEBACiAJICogICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gdG8gcGVybWl0IHRoZSBjbGllbnQgdG8gYXNrIGZvciBub24tZmFzdC1mb3J3YXJkCiAJICogICAgICAgICAgICB1cGRhdGVzIG9mIGFuIGV4aXN0aW5nIHJlZi4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbGxvd05vbkZhc3RGb3J3YXJkcyhmaW5hbCBib29sZWFuIGNhblJld2luZCkgeworCXB1YmxpYyB2b2lkIHNldEFsbG93Tm9uRmFzdEZvcndhcmRzKGJvb2xlYW4gY2FuUmV3aW5kKSB7CiAJCWFsbG93Tm9uRmFzdEZvcndhcmRzID0gY2FuUmV3aW5kOwogCX0KIApAQCAtNzQxLDcgKzc0MSw3IEBACiAJICogICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGRldGVybWluZWQgYmFzZWQgb24gdGhlIHJlcG9zaXRvcnkKIAkgKiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uCiAJICovCi0JcHVibGljIHZvaWQgc2V0UmVmTG9nSWRlbnQoZmluYWwgUGVyc29uSWRlbnQgcGkpIHsKKwlwdWJsaWMgdm9pZCBzZXRSZWZMb2dJZGVudChQZXJzb25JZGVudCBwaSkgewogCQlyZWZMb2dJZGVudCA9IHBpOwogCX0KIApAQCAtNzc4LDcgKzc3OCw3IEBACiAJICogQHBhcmFtIGFkdmVydGlzZVJlZnNIb29rCiAJICogICAgICAgICAgICB0aGUgaG9vazsgbWF5IGJlIG51bGwgdG8gc2hvdyBhbGwgcmVmcy4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBZHZlcnRpc2VSZWZzSG9vayhmaW5hbCBBZHZlcnRpc2VSZWZzSG9vayBhZHZlcnRpc2VSZWZzSG9vaykgeworCXB1YmxpYyB2b2lkIHNldEFkdmVydGlzZVJlZnNIb29rKEFkdmVydGlzZVJlZnNIb29rIGFkdmVydGlzZVJlZnNIb29rKSB7CiAJCWlmIChhZHZlcnRpc2VSZWZzSG9vayAhPSBudWxsKQogCQkJdGhpcy5hZHZlcnRpc2VSZWZzSG9vayA9IGFkdmVydGlzZVJlZnNIb29rOwogCQllbHNlCkBAIC03OTUsNyArNzk1LDcgQEAKIAkgKiBAcGFyYW0gcmVmRmlsdGVyCiAJICogICAgICAgICAgICB0aGUgZmlsdGVyOyBtYXkgYmUgbnVsbCB0byBzaG93IGFsbCByZWZzLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZkZpbHRlcihmaW5hbCBSZWZGaWx0ZXIgcmVmRmlsdGVyKSB7CisJcHVibGljIHZvaWQgc2V0UmVmRmlsdGVyKFJlZkZpbHRlciByZWZGaWx0ZXIpIHsKIAkJdGhpcy5yZWZGaWx0ZXIgPSByZWZGaWx0ZXIgIT0gbnVsbCA/IHJlZkZpbHRlciA6IFJlZkZpbHRlci5ERUZBVUxUOwogCX0KIApAQCAtODE2LDcgKzgxNiw3IEBACiAJICogICAgICAgICAgICBiZWZvcmUgYWJvcnRpbmcgYW4gSU8gcmVhZCBvciB3cml0ZSBvcGVyYXRpb24gd2l0aCB0aGUKIAkgKiAgICAgICAgICAgIGNvbm5lY3RlZCBjbGllbnQuCiAJICovCi0JcHVibGljIHZvaWQgc2V0VGltZW91dChmaW5hbCBpbnQgc2Vjb25kcykgeworCXB1YmxpYyB2b2lkIHNldFRpbWVvdXQoaW50IHNlY29uZHMpIHsKIAkJdGltZW91dCA9IHNlY29uZHM7CiAJfQogCkBAIC04NjEsNyArODYxLDcgQEAKIAkgKiBAcGFyYW0gbGltaXQKIAkgKiAgICAgICAgICAgIHRoZSBHaXQgb2JqZWN0IHNpemUgbGltaXQuIElmIHplcm8gdGhlbiB0aGVyZSBpcyBub3QgbGltaXQuCiAJICovCi0JcHVibGljIHZvaWQgc2V0TWF4T2JqZWN0U2l6ZUxpbWl0KGZpbmFsIGxvbmcgbGltaXQpIHsKKwlwdWJsaWMgdm9pZCBzZXRNYXhPYmplY3RTaXplTGltaXQobG9uZyBsaW1pdCkgewogCQltYXhPYmplY3RTaXplTGltaXQgPSBsaW1pdDsKIAl9CiAKQEAgLTg3NCw3ICs4NzQsNyBAQAogCSAqICAgICAgICAgICAgdGhlIHBhY2sgc2l6ZSBsaW1pdCwgaW4gYnl0ZXMKIAkgKiBAc2luY2UgMy4zCiAJICovCi0JcHVibGljIHZvaWQgc2V0TWF4UGFja1NpemVMaW1pdChmaW5hbCBsb25nIGxpbWl0KSB7CisJcHVibGljIHZvaWQgc2V0TWF4UGFja1NpemVMaW1pdChsb25nIGxpbWl0KSB7CiAJCWlmIChsaW1pdCA8IDApCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAogCQkJCQlKR2l0VGV4dC5nZXQoKS5yZWNlaXZlUGFja0ludmFsaWRMaW1pdCwgTG9uZy52YWx1ZU9mKGxpbWl0KSkpOwpAQCAtMTAzMSw3ICsxMDMxLDcgQEAKIAkgKiAgICAgICAgICAgIHN0cmluZyBkZXNjcmliaW5nIHRoZSBwcm9ibGVtIGlkZW50aWZpZWQgYnkgdGhlIGhvb2suIFRoZQogCSAqICAgICAgICAgICAgc3RyaW5nIG11c3Qgbm90IGVuZCB3aXRoIGFuIExGLCBhbmQgbXVzdCBub3QgY29udGFpbiBhbiBMRi4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZW5kRXJyb3IoZmluYWwgU3RyaW5nIHdoYXQpIHsKKwlwdWJsaWMgdm9pZCBzZW5kRXJyb3IoU3RyaW5nIHdoYXQpIHsKIAkJaWYgKHJlZnMgPT0gbnVsbCkgewogCQkJaWYgKGFkdmVydGlzZUVycm9yID09IG51bGwpCiAJCQkJYWR2ZXJ0aXNlRXJyb3IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwpAQCAtMTA2NCw3ICsxMDY0LDcgQEAKIAkgKiAgICAgICAgICAgIHN0cmluZyBkZXNjcmliaW5nIHRoZSBwcm9ibGVtIGlkZW50aWZpZWQgYnkgdGhlIGhvb2suIFRoZQogCSAqICAgICAgICAgICAgc3RyaW5nIG11c3Qgbm90IGVuZCB3aXRoIGFuIExGLCBhbmQgbXVzdCBub3QgY29udGFpbiBhbiBMRi4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZW5kTWVzc2FnZShmaW5hbCBTdHJpbmcgd2hhdCkgeworCXB1YmxpYyB2b2lkIHNlbmRNZXNzYWdlKFN0cmluZyB3aGF0KSB7CiAJCW1zZ091dFdyYXBwZXIud3JpdGUoQ29uc3RhbnRzLmVuY29kZSh3aGF0ICsgIlxuIikpOyAvLyROT04tTkxTLTEkCiAJfQogCkBAIC0xMjEzLDcgKzEyMTMsNyBAQAogCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuU2VydmljZU1heU5vdENvbnRpbnVlRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIGhvb2sgZGVuaWVkIGFkdmVydGlzZW1lbnQuCiAJICovCi0JcHVibGljIHZvaWQgc2VuZEFkdmVydGlzZWRSZWZzKGZpbmFsIFJlZkFkdmVydGlzZXIgYWR2KQorCXB1YmxpYyB2b2lkIHNlbmRBZHZlcnRpc2VkUmVmcyhSZWZBZHZlcnRpc2VyIGFkdikKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmljZU1heU5vdENvbnRpbnVlRXhjZXB0aW9uIHsKIAkJaWYgKGFkdmVydGlzZUVycm9yICE9IG51bGwpIHsKIAkJCWFkdi53cml0ZU9uZSgiRVJSICIgKyBhZHZlcnRpc2VFcnJvcik7IC8vJE5PTi1OTFMtMSQKQEAgLTE0NDAsNyArMTQ0MCw3IEBACiAJICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgYSBwYWNrIGlzIGV4cGVjdGVkIGJhc2VkIG9uIHRoZSBsaXN0IG9mIGNvbW1hbmRzLgogCSAqLwogCXByb3RlY3RlZCBib29sZWFuIG5lZWRQYWNrKCkgewotCQlmb3IgKGZpbmFsIFJlY2VpdmVDb21tYW5kIGNtZCA6IGNvbW1hbmRzKSB7CisJCWZvciAoUmVjZWl2ZUNvbW1hbmQgY21kIDogY29tbWFuZHMpIHsKIAkJCWlmIChjbWQuZ2V0VHlwZSgpICE9IFJlY2VpdmVDb21tYW5kLlR5cGUuREVMRVRFKQogCQkJCXJldHVybiB0cnVlOwogCQl9CkBAIC0xNTI2LDIxICsxNTI2LDIxIEBACiAJCX0KIAkJcGFyc2VyID0gbnVsbDsKIAotCQl0cnkgKGZpbmFsIE9iamVjdFdhbGsgb3cgPSBuZXcgT2JqZWN0V2FsayhkYikpIHsKKwkJdHJ5IChPYmplY3RXYWxrIG93ID0gbmV3IE9iamVjdFdhbGsoZGIpKSB7CiAJCQlpZiAoYmFzZU9iamVjdHMgIT0gbnVsbCkgewogCQkJCW93LnNvcnQoUmV2U29ydC5UT1BPKTsKIAkJCQlpZiAoIWJhc2VPYmplY3RzLmlzRW1wdHkoKSkKIAkJCQkJb3cuc29ydChSZXZTb3J0LkJPVU5EQVJZLCB0cnVlKTsKIAkJCX0KIAotCQkJZm9yIChmaW5hbCBSZWNlaXZlQ29tbWFuZCBjbWQgOiBjb21tYW5kcykgeworCQkJZm9yIChSZWNlaXZlQ29tbWFuZCBjbWQgOiBjb21tYW5kcykgewogCQkJCWlmIChjbWQuZ2V0UmVzdWx0KCkgIT0gUmVzdWx0Lk5PVF9BVFRFTVBURUQpCiAJCQkJCWNvbnRpbnVlOwogCQkJCWlmIChjbWQuZ2V0VHlwZSgpID09IFJlY2VpdmVDb21tYW5kLlR5cGUuREVMRVRFKQogCQkJCQljb250aW51ZTsKIAkJCQlvdy5tYXJrU3RhcnQob3cucGFyc2VBbnkoY21kLmdldE5ld0lkKCkpKTsKIAkJCX0KLQkJCWZvciAoZmluYWwgT2JqZWN0SWQgaGF2ZSA6IGFkdmVydGlzZWRIYXZlcykgeworCQkJZm9yIChPYmplY3RJZCBoYXZlIDogYWR2ZXJ0aXNlZEhhdmVzKSB7CiAJCQkJUmV2T2JqZWN0IG8gPSBvdy5wYXJzZUFueShoYXZlKTsKIAkJCQlvdy5tYXJrVW5pbnRlcmVzdGluZyhvKTsKIApAQCAtMTU5Niw3ICsxNTk2LDcgQEAKIAkgKiBWYWxpZGF0ZSB0aGUgY29tbWFuZCBsaXN0LgogCSAqLwogCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQ29tbWFuZHMoKSB7Ci0JCWZvciAoZmluYWwgUmVjZWl2ZUNvbW1hbmQgY21kIDogY29tbWFuZHMpIHsKKwkJZm9yIChSZWNlaXZlQ29tbWFuZCBjbWQgOiBjb21tYW5kcykgewogCQkJZmluYWwgUmVmIHJlZiA9IGNtZC5nZXRSZWYoKTsKIAkJCWlmIChjbWQuZ2V0UmVzdWx0KCkgIT0gUmVzdWx0Lk5PVF9BVFRFTVBURUQpCiAJCQkJY29udGludWU7CkBAIC0xNzYxLDcgKzE3NjEsNyBAQAogCSAqIEByZXR1cm4gYSBjb3B5IG9mIHRoZSBjb21tYW5kIGxpc3QgY29udGFpbmluZyBvbmx5IHRob3NlIGNvbW1hbmRzIHdpdGggdGhlCiAJICogICAgICAgICBkZXNpcmVkIHN0YXR1cy4KIAkgKi8KLQlwcm90ZWN0ZWQgTGlzdDxSZWNlaXZlQ29tbWFuZD4gZmlsdGVyQ29tbWFuZHMoZmluYWwgUmVzdWx0IHdhbnQpIHsKKwlwcm90ZWN0ZWQgTGlzdDxSZWNlaXZlQ29tbWFuZD4gZmlsdGVyQ29tbWFuZHMoUmVzdWx0IHdhbnQpIHsKIAkJcmV0dXJuIFJlY2VpdmVDb21tYW5kLmZpbHRlcihjb21tYW5kcywgd2FudCk7CiAJfQogCkBAIC0xODE1LDcgKzE4MTUsNyBAQAogCQlpZiAodW5wYWNrRXJyb3IgIT0gbnVsbCkgewogCQkJb3V0LnNlbmRTdHJpbmcoInVucGFjayBlcnJvciAiICsgdW5wYWNrRXJyb3IuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAogCQkJaWYgKGZvckNsaWVudCkgewotCQkJCWZvciAoZmluYWwgUmVjZWl2ZUNvbW1hbmQgY21kIDogY29tbWFuZHMpIHsKKwkJCQlmb3IgKFJlY2VpdmVDb21tYW5kIGNtZCA6IGNvbW1hbmRzKSB7CiAJCQkJCW91dC5zZW5kU3RyaW5nKCJuZyAiICsgY21kLmdldFJlZk5hbWUoKSAvLyROT04tTkxTLTEkCiAJCQkJCQkJKyAiIG4vYSAodW5wYWNrZXIgZXJyb3IpIik7IC8vJE5PTi1OTFMtMSQKIAkJCQl9CkBAIC0xODI1LDcgKzE4MjUsNyBAQAogCiAJCWlmIChmb3JDbGllbnQpCiAJCQlvdXQuc2VuZFN0cmluZygidW5wYWNrIG9rIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChmaW5hbCBSZWNlaXZlQ29tbWFuZCBjbWQgOiBjb21tYW5kcykgeworCQlmb3IgKFJlY2VpdmVDb21tYW5kIGNtZCA6IGNvbW1hbmRzKSB7CiAJCQlpZiAoY21kLmdldFJlc3VsdCgpID09IFJlc3VsdC5PSykgewogCQkJCWlmIChmb3JDbGllbnQpCiAJCQkJCW91dC5zZW5kU3RyaW5nKCJvayAiICsgY21kLmdldFJlZk5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0J1bmRsZUZldGNoQ29ubmVjdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQnVuZGxlRmV0Y2hDb25uZWN0aW9uLmphdmEKaW5kZXggMzllZmFiZi4uNDQ5ZjUyOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQnVuZGxlRmV0Y2hDb25uZWN0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQnVuZGxlRmV0Y2hDb25uZWN0aW9uLmphdmEKQEAgLTQ3LDggKzQ3LDYgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDsKIAotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZEYXRhYmFzZS5BTEw7Ci0KIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwpAQCAtOTgsNyArOTYsNyBAQAogCiAJcHJpdmF0ZSBQYWNrTG9jayBwYWNrTG9jazsKIAotCUJ1bmRsZUZldGNoQ29ubmVjdGlvbihUcmFuc3BvcnQgdHJhbnNwb3J0QnVuZGxlLCBmaW5hbCBJbnB1dFN0cmVhbSBzcmMpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24geworCUJ1bmRsZUZldGNoQ29ubmVjdGlvbihUcmFuc3BvcnQgdHJhbnNwb3J0QnVuZGxlLCBJbnB1dFN0cmVhbSBzcmMpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQl0cmFuc3BvcnQgPSB0cmFuc3BvcnRCdW5kbGU7CiAJCWJpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHNyYyk7CiAJCXRyeSB7CkBAIC0xNTUsMTIgKzE1MywxMiBAQAogCQlhdmFpbGFibGUoYXZhaWwpOwogCX0KIAotCXByaXZhdGUgUGFja1Byb3RvY29sRXhjZXB0aW9uIGR1cGxpY2F0ZUFkdmVydGlzZW1lbnQoZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlwcml2YXRlIFBhY2tQcm90b2NvbEV4Y2VwdGlvbiBkdXBsaWNhdGVBZHZlcnRpc2VtZW50KFN0cmluZyBuYW1lKSB7CiAJCXJldHVybiBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKHRyYW5zcG9ydC51cmksCiAJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuZHVwbGljYXRlQWR2ZXJ0aXNlbWVudHNPZiwgbmFtZSkpOwogCX0KIAotCXByaXZhdGUgU3RyaW5nIHJlYWRMaW5lKGZpbmFsIGJ5dGVbXSBoZHJidWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSBTdHJpbmcgcmVhZExpbmUoYnl0ZVtdIGhkcmJ1ZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJU3RyaW5nQnVpbGRlciBsaW5lID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJYm9vbGVhbiBkb25lID0gZmFsc2U7CiAJCXdoaWxlICghZG9uZSkgewpAQCAtMjEyLDcgKzIxMCw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFBhY2tMb2NrTWVzc2FnZShmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworCXB1YmxpYyB2b2lkIHNldFBhY2tMb2NrTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewogCQlsb2NrTWVzc2FnZSA9IG1lc3NhZ2U7CiAJfQogCkBAIC0yMjgsMTMgKzIyNiwxMyBAQAogCQlpZiAocHJlcmVxcy5pc0VtcHR5KCkpCiAJCQlyZXR1cm47CiAKLQkJdHJ5IChmaW5hbCBSZXZXYWxrIHJ3ID0gbmV3IFJldldhbGsodHJhbnNwb3J0LmxvY2FsKSkgeworCQl0cnkgKFJldldhbGsgcncgPSBuZXcgUmV2V2Fsayh0cmFuc3BvcnQubG9jYWwpKSB7CiAJCQlmaW5hbCBSZXZGbGFnIFBSRVJFUSA9IHJ3Lm5ld0ZsYWcoIlBSRVJFUSIpOyAvLyROT04tTkxTLTEkCiAJCQlmaW5hbCBSZXZGbGFnIFNFRU4gPSBydy5uZXdGbGFnKCJTRUVOIik7IC8vJE5PTi1OTFMtMSQKIAogCQkJZmluYWwgTWFwPE9iamVjdElkLCBTdHJpbmc+IG1pc3NpbmcgPSBuZXcgSGFzaE1hcDw+KCk7CiAJCQlmaW5hbCBMaXN0PFJldk9iamVjdD4gY29tbWl0cyA9IG5ldyBBcnJheUxpc3Q8PigpOwotCQkJZm9yIChmaW5hbCBNYXAuRW50cnk8T2JqZWN0SWQsIFN0cmluZz4gZSA6IHByZXJlcXMuZW50cnlTZXQoKSkgeworCQkJZm9yIChNYXAuRW50cnk8T2JqZWN0SWQsIFN0cmluZz4gZSA6IHByZXJlcXMuZW50cnlTZXQoKSkgewogCQkJCU9iamVjdElkIHAgPSBlLmdldEtleSgpOwogCQkJCXRyeSB7CiAJCQkJCWZpbmFsIFJldkNvbW1pdCBjID0gcncucGFyc2VDb21taXQocCk7CkBAIC0yNTQsMTMgKzI1MiwxMyBAQAogCQkJCXRocm93IG5ldyBNaXNzaW5nQnVuZGxlUHJlcmVxdWlzaXRlRXhjZXB0aW9uKHRyYW5zcG9ydC51cmksCiAJCQkJCQltaXNzaW5nKTsKIAotCQkJTWFwPFN0cmluZywgUmVmPiBsb2NhbFJlZnM7CisJCQlMaXN0PFJlZj4gbG9jYWxSZWZzOwogCQkJdHJ5IHsKLQkJCQlsb2NhbFJlZnMgPSB0cmFuc3BvcnQubG9jYWwuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKEFMTCk7CisJCQkJbG9jYWxSZWZzID0gdHJhbnNwb3J0LmxvY2FsLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpOwogCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogCQkJCXRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24odHJhbnNwb3J0LnVyaSwgZS5nZXRNZXNzYWdlKCksIGUpOwogCQkJfQotCQkJZm9yIChmaW5hbCBSZWYgciA6IGxvY2FsUmVmcy52YWx1ZXMoKSkgeworCQkJZm9yIChSZWYgciA6IGxvY2FsUmVmcykgewogCQkJCXRyeSB7CiAJCQkJCXJ3Lm1hcmtTdGFydChydy5wYXJzZUNvbW1pdChyLmdldE9iamVjdElkKCkpKTsKIAkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiByZWFkRXJyb3IpIHsKQEAgLTI4NCw3ICsyODIsNyBAQAogCQkJfQogCiAJCQlpZiAocmVtYWluaW5nID4gMCkgewotCQkJCWZvciAoZmluYWwgUmV2T2JqZWN0IG8gOiBjb21taXRzKSB7CisJCQkJZm9yIChSZXZPYmplY3QgbyA6IGNvbW1pdHMpIHsKIAkJCQkJaWYgKCFvLmhhcyhTRUVOKSkKIAkJCQkJCW1pc3NpbmcucHV0KG8sIHByZXJlcXMuZ2V0KG8pKTsKIAkJCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CdW5kbGVXcml0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0J1bmRsZVdyaXRlci5qYXZhCmluZGV4IDM1YWM3NzkuLmYyYTI2MWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0J1bmRsZVdyaXRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0J1bmRsZVdyaXRlci5qYXZhCkBAIC0xNTEsNyArMTUxLDcgQEAKIAkgKiBAcGFyYW0gaWQKIAkgKiAgICAgICAgICAgIG9iamVjdCB0byBwYWNrLiBNdWx0aXBsZSByZWZzIG1heSBwb2ludCB0byB0aGUgc2FtZSBvYmplY3QuCiAJICovCi0JcHVibGljIHZvaWQgaW5jbHVkZShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgQW55T2JqZWN0SWQgaWQpIHsKKwlwdWJsaWMgdm9pZCBpbmNsdWRlKFN0cmluZyBuYW1lLCBBbnlPYmplY3RJZCBpZCkgewogCQlib29sZWFuIHZhbGlkUmVmTmFtZSA9IFJlcG9zaXRvcnkuaXNWYWxpZFJlZk5hbWUobmFtZSkgfHwgQ29uc3RhbnRzLkhFQUQuZXF1YWxzKG5hbWUpOwogCQlpZiAoIXZhbGlkUmVmTmFtZSkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuaW52YWxpZFJlZk5hbWUsIG5hbWUpKTsKQEAgLTE2OSw3ICsxNjksNyBAQAogCSAqIEBwYXJhbSByCiAJICogICAgICAgICAgICB0aGUgcmVmIHRvIGluY2x1ZGUuCiAJICovCi0JcHVibGljIHZvaWQgaW5jbHVkZShmaW5hbCBSZWYgcikgeworCXB1YmxpYyB2b2lkIGluY2x1ZGUoUmVmIHIpIHsKIAkJaW5jbHVkZShyLmdldE5hbWUoKSwgci5nZXRPYmplY3RJZCgpKTsKIAogCQlpZiAoci5nZXRQZWVsZWRPYmplY3RJZCgpICE9IG51bGwpCkBAIC0xOTIsNyArMTkyLDcgQEAKIAkgKiAgICAgICAgICAgIHBhcnNlZCBhbmQgbm90IGRpc3Bvc2VkIGluIG9yZGVyIHRvIG1heGltaXplIHRoZSBhbW91bnQgb2YKIAkgKiAgICAgICAgICAgIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBhdmFpbGFibGUgaW4gdGhlIGJ1bmRsZSBzdHJlYW0uCiAJICovCi0JcHVibGljIHZvaWQgYXNzdW1lKGZpbmFsIFJldkNvbW1pdCBjKSB7CisJcHVibGljIHZvaWQgYXNzdW1lKFJldkNvbW1pdCBjKSB7CiAJCWlmIChjICE9IG51bGwpCiAJCQlhc3N1bWUuYWRkKGMpOwogCX0KQEAgLTIyMSw3ICsyMjEsNyBAQAogCQkJZmluYWwgSGFzaFNldDxPYmplY3RJZD4gaW5jID0gbmV3IEhhc2hTZXQ8PigpOwogCQkJZmluYWwgSGFzaFNldDxPYmplY3RJZD4gZXhjID0gbmV3IEhhc2hTZXQ8PigpOwogCQkJaW5jLmFkZEFsbChpbmNsdWRlLnZhbHVlcygpKTsKLQkJCWZvciAoZmluYWwgUmV2Q29tbWl0IHIgOiBhc3N1bWUpCisJCQlmb3IgKFJldkNvbW1pdCByIDogYXNzdW1lKQogCQkJCWV4Yy5hZGQoci5nZXRJZCgpKTsKIAkJCXBhY2tXcml0ZXIuc2V0SW5kZXhEaXNhYmxlZCh0cnVlKTsKIAkJCXBhY2tXcml0ZXIuc2V0RGVsdGFCYXNlQXNPZmZzZXQodHJ1ZSk7CkBAIC0yMzYsNyArMjM2LDcgQEAKIAkJCXcud3JpdGUoJ1xuJyk7CiAKIAkJCWZpbmFsIGNoYXJbXSB0bXAgPSBuZXcgY2hhcltDb25zdGFudHMuT0JKRUNUX0lEX1NUUklOR19MRU5HVEhdOwotCQkJZm9yIChmaW5hbCBSZXZDb21taXQgYSA6IGFzc3VtZSkgeworCQkJZm9yIChSZXZDb21taXQgYSA6IGFzc3VtZSkgewogCQkJCXcud3JpdGUoJy0nKTsKIAkJCQlhLmNvcHlUbyh0bXAsIHcpOwogCQkJCWlmIChhLmdldFJhd0J1ZmZlcigpICE9IG51bGwpIHsKQEAgLTI0NSw3ICsyNDUsNyBAQAogCQkJCX0KIAkJCQl3LndyaXRlKCdcbicpOwogCQkJfQotCQkJZm9yIChmaW5hbCBNYXAuRW50cnk8U3RyaW5nLCBPYmplY3RJZD4gZSA6IGluY2x1ZGUuZW50cnlTZXQoKSkgeworCQkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBPYmplY3RJZD4gZSA6IGluY2x1ZGUuZW50cnlTZXQoKSkgewogCQkJCWUuZ2V0VmFsdWUoKS5jb3B5VG8odG1wLCB3KTsKIAkJCQl3LndyaXRlKCcgJyk7CiAJCQkJdy53cml0ZShlLmdldEtleSgpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Nvbm5lY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Nvbm5lY3Rpb24uamF2YQppbmRleCBiY2M1MTEwLi5kNGM1MTRlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Db25uZWN0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQ29ubmVjdGlvbi5qYXZhCkBAIC05NSw3ICs5NSw3IEBACiAJICogICAgICAgICAgICBuYW1lIG9mIHRoZSByZWYgdG8gb2J0YWluLgogCSAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCByZWY7IG51bGwgaWYgdGhlIHJlbW90ZSBkaWQgbm90IGFkdmVydGlzZSB0aGlzIHJlZi4KIAkgKi8KLQlwdWJsaWMgUmVmIGdldFJlZihmaW5hbCBTdHJpbmcgbmFtZSk7CisJcHVibGljIFJlZiBnZXRSZWYoU3RyaW5nIG5hbWUpOwogCiAJLyoqCiAJICoge0Bpbmhlcml0RG9jfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvRGFlbW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9EYWVtb24uamF2YQppbmRleCAyZmM1ZWIyLi43Mjg5Y2U3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9EYWVtb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9EYWVtb24uamF2YQpAQCAtNTMsNyArNTMsOSBAQAogaW1wb3J0IGphdmEubmV0LlNvY2tldEFkZHJlc3M7CiBpbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9ucy5OdWxsYWJsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5QZXJzb25JZGVudDsKQEAgLTEwNyw3ICsxMDksNyBAQAogCSAqICAgICAgICAgICAgcG9ydCB3aWxsIGJlIGNob3NlbiBvbiBhbGwgbmV0d29yayBpbnRlcmZhY2VzLgogCSAqLwogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBEYWVtb24oZmluYWwgSW5ldFNvY2tldEFkZHJlc3MgYWRkcikgeworCXB1YmxpYyBEYWVtb24oSW5ldFNvY2tldEFkZHJlc3MgYWRkcikgewogCQlteUFkZHJlc3MgPSBhZGRyOwogCQlwcm9jZXNzb3JzID0gbmV3IFRocmVhZEdyb3VwKCJHaXQtRGFlbW9uIik7IC8vJE5PTi1OTFMtMSQKIApAQCAtMTUzLDEyICsxNTUsMTcgQEAKIAogCQkJCQlAT3ZlcnJpZGUKIAkJCQkJcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShmaW5hbCBEYWVtb25DbGllbnQgZGMsCi0JCQkJCQkJZmluYWwgUmVwb3NpdG9yeSBkYikgdGhyb3dzIElPRXhjZXB0aW9uLAorCQkJCQkJCWZpbmFsIFJlcG9zaXRvcnkgZGIsCisJCQkJCQkJQE51bGxhYmxlIENvbGxlY3Rpb248U3RyaW5nPiBleHRyYVBhcmFtZXRlcnMpCisJCQkJCQkJdGhyb3dzIElPRXhjZXB0aW9uLAogCQkJCQkJCVNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uLAogCQkJCQkJCVNlcnZpY2VOb3RBdXRob3JpemVkRXhjZXB0aW9uIHsKIAkJCQkJCVVwbG9hZFBhY2sgdXAgPSB1cGxvYWRQYWNrRmFjdG9yeS5jcmVhdGUoZGMsIGRiKTsKIAkJCQkJCUlucHV0U3RyZWFtIGluID0gZGMuZ2V0SW5wdXRTdHJlYW0oKTsKIAkJCQkJCU91dHB1dFN0cmVhbSBvdXQgPSBkYy5nZXRPdXRwdXRTdHJlYW0oKTsKKwkJCQkJCWlmIChleHRyYVBhcmFtZXRlcnMgIT0gbnVsbCkgeworCQkJCQkJCXVwLnNldEV4dHJhUGFyYW1ldGVycyhleHRyYVBhcmFtZXRlcnMpOworCQkJCQkJfQogCQkJCQkJdXAudXBsb2FkKGluLCBvdXQsIG51bGwpOwogCQkJCQl9CiAJCQkJfSwgbmV3IERhZW1vblNlcnZpY2UoInJlY2VpdmUtcGFjayIsICJyZWNlaXZlcGFjayIpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCkBAIC0xNjgsNyArMTc1LDkgQEAKIAogCQkJCQlAT3ZlcnJpZGUKIAkJCQkJcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShmaW5hbCBEYWVtb25DbGllbnQgZGMsCi0JCQkJCQkJZmluYWwgUmVwb3NpdG9yeSBkYikgdGhyb3dzIElPRXhjZXB0aW9uLAorCQkJCQkJCWZpbmFsIFJlcG9zaXRvcnkgZGIsCisJCQkJCQkJQE51bGxhYmxlIENvbGxlY3Rpb248U3RyaW5nPiBleHRyYVBhcmFtZXRlcnMpCisJCQkJCQkJdGhyb3dzIElPRXhjZXB0aW9uLAogCQkJCQkJCVNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uLAogCQkJCQkJCVNlcnZpY2VOb3RBdXRob3JpemVkRXhjZXB0aW9uIHsKIAkJCQkJCVJlY2VpdmVQYWNrIHJwID0gcmVjZWl2ZVBhY2tGYWN0b3J5LmNyZWF0ZShkYywgZGIpOwpAQCAtMjAwLDcgKzIwOSw3IEBACiAJcHVibGljIHN5bmNocm9uaXplZCBEYWVtb25TZXJ2aWNlIGdldFNlcnZpY2UoU3RyaW5nIG5hbWUpIHsKIAkJaWYgKCFuYW1lLnN0YXJ0c1dpdGgoImdpdC0iKSkgLy8kTk9OLU5MUy0xJAogCQkJbmFtZSA9ICJnaXQtIiArIG5hbWU7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChmaW5hbCBEYWVtb25TZXJ2aWNlIHMgOiBzZXJ2aWNlcykgeworCQlmb3IgKERhZW1vblNlcnZpY2UgcyA6IHNlcnZpY2VzKSB7CiAJCQlpZiAocy5nZXRDb21tYW5kTmFtZSgpLmVxdWFscyhuYW1lKSkKIAkJCQlyZXR1cm4gczsKIAkJfQpAQCAtMjI0LDcgKzIzMyw3IEBACiAJICogICAgICAgICAgICBiZWZvcmUgYWJvcnRpbmcgYW4gSU8gcmVhZCBvciB3cml0ZSBvcGVyYXRpb24gd2l0aCB0aGUKIAkgKiAgICAgICAgICAgIGNvbm5lY3RlZCBjbGllbnQuCiAJICovCi0JcHVibGljIHZvaWQgc2V0VGltZW91dChmaW5hbCBpbnQgc2Vjb25kcykgeworCXB1YmxpYyB2b2lkIHNldFRpbWVvdXQoaW50IHNlY29uZHMpIHsKIAkJdGltZW91dCA9IHNlY29uZHM7CiAJfQogCkBAIC00MTEsNyArNDIwLDcgQEAKIAkJfQogCX0KIAotCXZvaWQgc3RhcnRDbGllbnQoZmluYWwgU29ja2V0IHMpIHsKKwl2b2lkIHN0YXJ0Q2xpZW50KFNvY2tldCBzKSB7CiAJCWZpbmFsIERhZW1vbkNsaWVudCBkYyA9IG5ldyBEYWVtb25DbGllbnQodGhpcyk7CiAKIAkJZmluYWwgU29ja2V0QWRkcmVzcyBwZWVyID0gcy5nZXRSZW1vdGVTb2NrZXRBZGRyZXNzKCk7CkBAIC00NDUsOCArNDU0LDggQEAKIAkJfS5zdGFydCgpOwogCX0KIAotCXN5bmNocm9uaXplZCBEYWVtb25TZXJ2aWNlIG1hdGNoU2VydmljZShmaW5hbCBTdHJpbmcgY21kKSB7Ci0JCWZvciAoZmluYWwgRGFlbW9uU2VydmljZSBkIDogc2VydmljZXMpIHsKKwlzeW5jaHJvbml6ZWQgRGFlbW9uU2VydmljZSBtYXRjaFNlcnZpY2UoU3RyaW5nIGNtZCkgeworCQlmb3IgKERhZW1vblNlcnZpY2UgZCA6IHNlcnZpY2VzKSB7CiAJCQlpZiAoZC5oYW5kbGVzKGNtZCkpCiAJCQkJcmV0dXJuIGQ7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0RhZW1vbkNsaWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvRGFlbW9uQ2xpZW50LmphdmEKaW5kZXggYTk3MzFhYy4uNTFjNDkxOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvRGFlbW9uQ2xpZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvRGFlbW9uQ2xpZW50LmphdmEKQEAgLTUwLDYgKzUwLDggQEAKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKIGltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyLlNlcnZpY2VOb3RBdXRob3JpemVkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyLlNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uOwpAQCAtNjYsMTEgKzY4LDExIEBACiAKIAlwcml2YXRlIE91dHB1dFN0cmVhbSByYXdPdXQ7CiAKLQlEYWVtb25DbGllbnQoZmluYWwgRGFlbW9uIGQpIHsKKwlEYWVtb25DbGllbnQoRGFlbW9uIGQpIHsKIAkJZGFlbW9uID0gZDsKIAl9CiAKLQl2b2lkIHNldFJlbW90ZUFkZHJlc3MoZmluYWwgSW5ldEFkZHJlc3MgaWEpIHsKKwl2b2lkIHNldFJlbW90ZUFkZHJlc3MoSW5ldEFkZHJlc3MgaWEpIHsKIAkJcGVlciA9IGlhOwogCX0KIApAQCAtMTEwLDcgKzExMiw3IEBACiAJCXJldHVybiByYXdPdXQ7CiAJfQogCi0Jdm9pZCBleGVjdXRlKGZpbmFsIFNvY2tldCBzb2NrKSB0aHJvd3MgSU9FeGNlcHRpb24sCisJdm9pZCBleGVjdXRlKFNvY2tldCBzb2NrKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAJCQlTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbiwgU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb24gewogCQlyYXdJbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHNvY2suZ2V0SW5wdXRTdHJlYW0oKSk7CiAJCXJhd091dCA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShzb2NrLmdldE91dHB1dFN0cmVhbSgpKTsKQEAgLTExOCw2ICsxMjAsMTQgQEAKIAkJaWYgKDAgPCBkYWVtb24uZ2V0VGltZW91dCgpKQogCQkJc29jay5zZXRTb1RpbWVvdXQoZGFlbW9uLmdldFRpbWVvdXQoKSAqIDEwMDApOwogCQlTdHJpbmcgY21kID0gbmV3IFBhY2tldExpbmVJbihyYXdJbikucmVhZFN0cmluZ1JhdygpOworCisJCUNvbGxlY3Rpb248U3RyaW5nPiBleHRyYVBhcmFtZXRlcnMgPSBudWxsOworCisJCWludCBudWxudWwgPSBjbWQuaW5kZXhPZigiXDBcMCIpOyAvLyROT04tTkxTLTEkCisJCWlmIChudWxudWwgIT0gLTEpIHsKKwkJCWV4dHJhUGFyYW1ldGVycyA9IEFycmF5cy5hc0xpc3QoY21kLnN1YnN0cmluZyhudWxudWwgKyAyKS5zcGxpdCgiXDAiKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCiAJCWZpbmFsIGludCBudWwgPSBjbWQuaW5kZXhPZignXDAnKTsKIAkJaWYgKG51bCA+PSAwKSB7CiAJCQkvLyBOZXdlciBjbGllbnRzIGhpZGUgYSAiaG9zdCIgaGVhZGVyIGJlaGluZCB0aGlzIGJ5dGUuCkBAIC0xMzEsNiArMTQxLDYgQEAKIAkJaWYgKHNydiA9PSBudWxsKQogCQkJcmV0dXJuOwogCQlzb2NrLnNldFNvVGltZW91dCgwKTsKLQkJc3J2LmV4ZWN1dGUodGhpcywgY21kKTsKKwkJc3J2LmV4ZWN1dGUodGhpcywgY21kLCBleHRyYVBhcmFtZXRlcnMpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0RhZW1vblNlcnZpY2UuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0RhZW1vblNlcnZpY2UuamF2YQppbmRleCA3MTJlYjIyLi42ZDJiZWU4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9EYWVtb25TZXJ2aWNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvRGFlbW9uU2VydmljZS5qYXZhCkBAIC00NSw3ICs0NSw5IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnMuTnVsbGFibGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZy5TZWN0aW9uUGFyc2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CkBAIC02NSw3ICs2Nyw3IEBACiAKIAlwcml2YXRlIGJvb2xlYW4gb3ZlcnJpZGFibGU7CiAKLQlEYWVtb25TZXJ2aWNlKGZpbmFsIFN0cmluZyBjbWROYW1lLCBmaW5hbCBTdHJpbmcgY2ZnTmFtZSkgeworCURhZW1vblNlcnZpY2UoU3RyaW5nIGNtZE5hbWUsIFN0cmluZyBjZmdOYW1lKSB7CiAJCWNvbW1hbmQgPSBjbWROYW1lLnN0YXJ0c1dpdGgoImdpdC0iKSA/IGNtZE5hbWUgOiAiZ2l0LSIgKyBjbWROYW1lOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJY29uZmlnS2V5ID0gY2ZnIC0+IG5ldyBTZXJ2aWNlQ29uZmlnKERhZW1vblNlcnZpY2UudGhpcywgY2ZnLCBjZmdOYW1lKTsKIAkJb3ZlcnJpZGFibGUgPSB0cnVlOwpAQCAtOTYsNyArOTgsNyBAQAogCSAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IHRvIGFsbG93IHRoaXMgc2VydmljZSB0byBiZSB1c2VkOyB7QGNvZGUgZmFsc2V9CiAJICogICAgICAgICAgICB0byBkZW55IGl0LgogCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoZmluYWwgYm9vbGVhbiBvbikgeworCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBvbikgewogCQllbmFibGVkID0gb247CiAJfQogCkBAIC0xMjAsNyArMTIyLDcgQEAKIAkgKiAgICAgICAgICAgIGVuYWJsZWQgc3RhdGUgd2l0aCB0aGUgPGNvZGU+ZGFlbW9uLnNlcnZpY2VuYW1lPC9jb2RlPiBjb25maWcKIAkgKiAgICAgICAgICAgIHNldHRpbmcuCiAJICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcnJpZGFibGUoZmluYWwgYm9vbGVhbiBvbikgeworCXB1YmxpYyB2b2lkIHNldE92ZXJyaWRhYmxlKGJvb2xlYW4gb24pIHsKIAkJb3ZlcnJpZGFibGUgPSBvbjsKIAl9CiAKQEAgLTE0MCwxOSArMTQyLDIwIEBACiAJICogICAgICAgICAgICBpbnB1dCBsaW5lIGZyb20gdGhlIGNsaWVudC4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBjb21tYW5kIGNhbiBhY2NlcHQgdGhlIGdpdmVuIGNvbW1hbmQgbGluZS4KIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYW5kbGVzKGZpbmFsIFN0cmluZyBjb21tYW5kTGluZSkgeworCXB1YmxpYyBib29sZWFuIGhhbmRsZXMoU3RyaW5nIGNvbW1hbmRMaW5lKSB7CiAJCXJldHVybiBjb21tYW5kLmxlbmd0aCgpICsgMSA8IGNvbW1hbmRMaW5lLmxlbmd0aCgpCiAJCQkJJiYgY29tbWFuZExpbmUuY2hhckF0KGNvbW1hbmQubGVuZ3RoKCkpID09ICcgJwogCQkJCSYmIGNvbW1hbmRMaW5lLnN0YXJ0c1dpdGgoY29tbWFuZCk7CiAJfQogCi0Jdm9pZCBleGVjdXRlKGZpbmFsIERhZW1vbkNsaWVudCBjbGllbnQsIGZpbmFsIFN0cmluZyBjb21tYW5kTGluZSkKKwl2b2lkIGV4ZWN1dGUoRGFlbW9uQ2xpZW50IGNsaWVudCwgU3RyaW5nIGNvbW1hbmRMaW5lLAorCQkJQE51bGxhYmxlIENvbGxlY3Rpb248U3RyaW5nPiBleHRyYVBhcmFtZXRlcnMpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uLAogCQkJU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmcgbmFtZSA9IGNvbW1hbmRMaW5lLnN1YnN0cmluZyhjb21tYW5kLmxlbmd0aCgpICsgMSk7CiAJCXRyeSAoUmVwb3NpdG9yeSBkYiA9IGNsaWVudC5nZXREYWVtb24oKS5vcGVuUmVwb3NpdG9yeShjbGllbnQsIG5hbWUpKSB7CiAJCQlpZiAoaXNFbmFibGVkRm9yKGRiKSkgewotCQkJCWV4ZWN1dGUoY2xpZW50LCBkYik7CisJCQkJZXhlY3V0ZShjbGllbnQsIGRiLCBleHRyYVBhcmFtZXRlcnMpOwogCQkJfQogCQl9IGNhdGNoIChTZXJ2aWNlTWF5Tm90Q29udGludWVFeGNlcHRpb24gZSkgewogCQkJLy8gQW4gZXJyb3Igd2hlbiBvcGVuaW5nIHRoZSByZXBvIG1lYW5zIHRoZSBjbGllbnQgaXMgZXhwZWN0aW5nIGEgcmVmCkBAIC0xNjIsMTMgKzE2NSwxNCBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBib29sZWFuIGlzRW5hYmxlZEZvcihmaW5hbCBSZXBvc2l0b3J5IGRiKSB7CisJcHJpdmF0ZSBib29sZWFuIGlzRW5hYmxlZEZvcihSZXBvc2l0b3J5IGRiKSB7CiAJCWlmIChpc092ZXJyaWRhYmxlKCkpCiAJCQlyZXR1cm4gZGIuZ2V0Q29uZmlnKCkuZ2V0KGNvbmZpZ0tleSkuZW5hYmxlZDsKIAkJcmV0dXJuIGlzRW5hYmxlZCgpOwogCX0KIAotCWFic3RyYWN0IHZvaWQgZXhlY3V0ZShEYWVtb25DbGllbnQgY2xpZW50LCBSZXBvc2l0b3J5IGRiKQorCWFic3RyYWN0IHZvaWQgZXhlY3V0ZShEYWVtb25DbGllbnQgY2xpZW50LCBSZXBvc2l0b3J5IGRiLAorCQkJQE51bGxhYmxlIENvbGxlY3Rpb248U3RyaW5nPiBleHRyYVBhcmFtZXRlcnMpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uLAogCQkJU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb247CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9EZWZhdWx0U3NoU2Vzc2lvbkZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0RlZmF1bHRTc2hTZXNzaW9uRmFjdG9yeS5qYXZhCmluZGV4IGE3NDlmYmMuLjVmNzRlNzIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0RlZmF1bHRTc2hTZXNzaW9uRmFjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0RlZmF1bHRTc2hTZXNzaW9uRmFjdG9yeS5qYXZhCkBAIC02MSw3ICs2MSw3IEBACiBjbGFzcyBEZWZhdWx0U3NoU2Vzc2lvbkZhY3RvcnkgZXh0ZW5kcyBKc2NoQ29uZmlnU2Vzc2lvbkZhY3RvcnkgewogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKGZpbmFsIE9wZW5Tc2hDb25maWcuSG9zdCBoYywgZmluYWwgU2Vzc2lvbiBzZXNzaW9uKSB7CisJcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKE9wZW5Tc2hDb25maWcuSG9zdCBoYywgU2Vzc2lvbiBzZXNzaW9uKSB7CiAJCS8vIE5vIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiByZXF1aXJlZC4KIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9GZXRjaEhlYWRSZWNvcmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0ZldGNoSGVhZFJlY29yZC5qYXZhCmluZGV4IDQyMWVmMjEuLjM0YWIzNjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0ZldGNoSGVhZFJlY29yZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0ZldGNoSGVhZFJlY29yZC5qYXZhCkBAIC02Myw3ICs2Myw3IEBACiAKIAlVUklpc2ggc291cmNlVVJJOwogCi0Jdm9pZCB3cml0ZShmaW5hbCBXcml0ZXIgcHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJdm9pZCB3cml0ZShXcml0ZXIgcHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZyB0eXBlOwogCQlmaW5hbCBTdHJpbmcgbmFtZTsKIAkJaWYgKHNvdXJjZU5hbWUuc3RhcnRzV2l0aChSX0hFQURTKSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvRmV0Y2hQcm9jZXNzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9GZXRjaFByb2Nlc3MuamF2YQppbmRleCAxMTdlODQ0Li5jNDNhYjE4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9GZXRjaFByb2Nlc3MuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9GZXRjaFByb2Nlc3MuamF2YQpAQCAtMTA2LDEyICsxMDYsMTIgQEAKIAogCXByaXZhdGUgTWFwPFN0cmluZywgUmVmPiBsb2NhbFJlZnM7CiAKLQlGZXRjaFByb2Nlc3MoZmluYWwgVHJhbnNwb3J0IHQsIGZpbmFsIENvbGxlY3Rpb248UmVmU3BlYz4gZikgeworCUZldGNoUHJvY2VzcyhUcmFuc3BvcnQgdCwgQ29sbGVjdGlvbjxSZWZTcGVjPiBmKSB7CiAJCXRyYW5zcG9ydCA9IHQ7CiAJCXRvRmV0Y2ggPSBmOwogCX0KIAotCXZvaWQgZXhlY3V0ZShmaW5hbCBQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgZmluYWwgRmV0Y2hSZXN1bHQgcmVzdWx0KQorCXZvaWQgZXhlY3V0ZShQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgRmV0Y2hSZXN1bHQgcmVzdWx0KQogCQkJdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiwgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJYXNrRm9yLmNsZWFyKCk7CiAJCWxvY2FsVXBkYXRlcy5jbGVhcigpOwpAQCAtMTIzLDcgKzEyMyw3IEBACiAJCQlleGVjdXRlSW1wKG1vbml0b3IsIHJlc3VsdCk7CiAJCX0gZmluYWxseSB7CiAJCQl0cnkgewotCQkJZm9yIChmaW5hbCBQYWNrTG9jayBsb2NrIDogcGFja0xvY2tzKQorCQkJZm9yIChQYWNrTG9jayBsb2NrIDogcGFja0xvY2tzKQogCQkJCWxvY2sudW5sb2NrKCk7CiAJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAJCQkJdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CkBAIC0xMzksNyArMTM5LDcgQEAKIAkJCXJlc3VsdC5zZXRBZHZlcnRpc2VkUmVmcyh0cmFuc3BvcnQuZ2V0VVJJKCksIGNvbm4uZ2V0UmVmc01hcCgpKTsKIAkJCXJlc3VsdC5wZWVyVXNlckFnZW50ID0gY29ubi5nZXRQZWVyVXNlckFnZW50KCk7CiAJCQlmaW5hbCBTZXQ8UmVmPiBtYXRjaGVkID0gbmV3IEhhc2hTZXQ8PigpOwotCQkJZm9yIChmaW5hbCBSZWZTcGVjIHNwZWMgOiB0b0ZldGNoKSB7CisJCQlmb3IgKFJlZlNwZWMgc3BlYyA6IHRvRmV0Y2gpIHsKIAkJCQlpZiAoc3BlYy5nZXRTb3VyY2UoKSA9PSBudWxsKQogCQkJCQl0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAogCQkJCQkJCUpHaXRUZXh0LmdldCgpLnNvdXJjZVJlZk5vdFNwZWNpZmllZEZvclJlZnNwZWMsIHNwZWMpKTsKQEAgLTE3Niw3ICsxNzYsNyBAQAogCQkJCS8vCiAJCQkJaGF2ZS5hZGRBbGwoYXNrRm9yLmtleVNldCgpKTsKIAkJCQlhc2tGb3IuY2xlYXIoKTsKLQkJCQlmb3IgKGZpbmFsIFJlZiByIDogYWRkaXRpb25hbFRhZ3MpIHsKKwkJCQlmb3IgKFJlZiByIDogYWRkaXRpb25hbFRhZ3MpIHsKIAkJCQkJT2JqZWN0SWQgaWQgPSByLmdldFBlZWxlZE9iamVjdElkKCk7CiAJCQkJCWlmIChpZCA9PSBudWxsKQogCQkJCQkJaWQgPSByLmdldE9iamVjdElkKCk7CkBAIC0xOTgsNyArMTk4LDcgQEAKIAkJCQkubmV3QmF0Y2hVcGRhdGUoKQogCQkJCS5zZXRBbGxvd05vbkZhc3RGb3J3YXJkcyh0cnVlKQogCQkJCS5zZXRSZWZMb2dNZXNzYWdlKCJmZXRjaCIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCXRyeSAoZmluYWwgUmV2V2FsayB3YWxrID0gbmV3IFJldldhbGsodHJhbnNwb3J0LmxvY2FsKSkgeworCQl0cnkgKFJldldhbGsgd2FsayA9IG5ldyBSZXZXYWxrKHRyYW5zcG9ydC5sb2NhbCkpIHsKIAkJCWlmIChtb25pdG9yIGluc3RhbmNlb2YgQmF0Y2hpbmdQcm9ncmVzc01vbml0b3IpIHsKIAkJCQkoKEJhdGNoaW5nUHJvZ3Jlc3NNb25pdG9yKSBtb25pdG9yKS5zZXREZWxheVN0YXJ0KAogCQkJCQkJMjUwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwpAQCAtMjU3LDcgKzI1Nyw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgZmV0Y2hPYmplY3RzKGZpbmFsIFByb2dyZXNzTW9uaXRvciBtb25pdG9yKQorCXByaXZhdGUgdm9pZCBmZXRjaE9iamVjdHMoUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCiAJCQl0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCWNvbm4uc2V0UGFja0xvY2tNZXNzYWdlKCJqZ2l0IGZldGNoICIgKyB0cmFuc3BvcnQudXJpKTsgLy8kTk9OLU5MUy0xJApAQCAtMjcxLDcgKzI3MSw3IEBACiAJCQkJCUpHaXRUZXh0LmdldCgpLnBlZXJEaWROb3RTdXBwbHlBQ29tcGxldGVPYmplY3RHcmFwaCk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGNsb3NlQ29ubmVjdGlvbihmaW5hbCBGZXRjaFJlc3VsdCByZXN1bHQpIHsKKwlwcml2YXRlIHZvaWQgY2xvc2VDb25uZWN0aW9uKEZldGNoUmVzdWx0IHJlc3VsdCkgewogCQlpZiAoY29ubiAhPSBudWxsKSB7CiAJCQljb25uLmNsb3NlKCk7CiAJCQlyZXN1bHQuYWRkTWVzc2FnZXMoY29ubi5nZXRNZXNzYWdlcygpKTsKQEAgLTI5NSwxMiArMjk1LDEyIEBACiAJCS8vIG5ldyBjb25uZWN0aW9uIGhhcyBvZmZlcmVkIHRvIHVzLgogCQkvLwogCQlmaW5hbCBIYXNoTWFwPE9iamVjdElkLCBSZWY+IGF2YWlsID0gbmV3IEhhc2hNYXA8PigpOwotCQlmb3IgKGZpbmFsIFJlZiByIDogY29ubi5nZXRSZWZzKCkpCisJCWZvciAoUmVmIHIgOiBjb25uLmdldFJlZnMoKSkKIAkJCWF2YWlsLnB1dChyLmdldE9iamVjdElkKCksIHIpOwogCiAJCWZpbmFsIENvbGxlY3Rpb248UmVmPiB3YW50cyA9IG5ldyBBcnJheUxpc3Q8Pihhc2tGb3IudmFsdWVzKCkpOwogCQlhc2tGb3IuY2xlYXIoKTsKLQkJZm9yIChmaW5hbCBSZWYgd2FudCA6IHdhbnRzKSB7CisJCWZvciAoUmVmIHdhbnQgOiB3YW50cykgewogCQkJZmluYWwgUmVmIG5ld1JlZiA9IGF2YWlsLmdldCh3YW50LmdldE9iamVjdElkKCkpOwogCQkJaWYgKG5ld1JlZiAhPSBudWxsKSB7CiAJCQkJYXNrRm9yLnB1dChuZXdSZWYuZ2V0T2JqZWN0SWQoKSwgbmV3UmVmKTsKQEAgLTMxMSw3ICszMTEsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVRyYWNraW5nUmVmVXBkYXRlKGZpbmFsIE9iamVjdElkIHdhbnQpIHsKKwlwcml2YXRlIHZvaWQgcmVtb3ZlVHJhY2tpbmdSZWZVcGRhdGUoT2JqZWN0SWQgd2FudCkgewogCQlmaW5hbCBJdGVyYXRvcjxUcmFja2luZ1JlZlVwZGF0ZT4gaSA9IGxvY2FsVXBkYXRlcy5pdGVyYXRvcigpOwogCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKIAkJCWZpbmFsIFRyYWNraW5nUmVmVXBkYXRlIHUgPSBpLm5leHQoKTsKQEAgLTMyMCw3ICszMjAsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUZldGNoSGVhZFJlY29yZChmaW5hbCBPYmplY3RJZCB3YW50KSB7CisJcHJpdmF0ZSB2b2lkIHJlbW92ZUZldGNoSGVhZFJlY29yZChPYmplY3RJZCB3YW50KSB7CiAJCWZpbmFsIEl0ZXJhdG9yPEZldGNoSGVhZFJlY29yZD4gaSA9IGZldGNoSGVhZFVwZGF0ZXMuaXRlcmF0b3IoKTsKIAkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7CiAJCQlmaW5hbCBGZXRjaEhlYWRSZWNvcmQgZmggPSBpLm5leHQoKTsKQEAgLTMyOSw3ICszMjksNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUZFVENIX0hFQUQoZmluYWwgRmV0Y2hSZXN1bHQgcmVzdWx0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgdm9pZCB1cGRhdGVGRVRDSF9IRUFEKEZldGNoUmVzdWx0IHJlc3VsdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJRmlsZSBtZXRhID0gdHJhbnNwb3J0LmxvY2FsLmdldERpcmVjdG9yeSgpOwogCQlpZiAobWV0YSA9PSBudWxsKQogCQkJcmV0dXJuOwpAQCAtMzM4LDcgKzMzOCw3IEBACiAJCQlpZiAobG9jay5sb2NrKCkpIHsKIAkJCQl0cnkgKFdyaXRlciB3ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcigKIAkJCQkJCWxvY2suZ2V0T3V0cHV0U3RyZWFtKCkpKSB7Ci0JCQkJCWZvciAoZmluYWwgRmV0Y2hIZWFkUmVjb3JkIGggOiBmZXRjaEhlYWRVcGRhdGVzKSB7CisJCQkJCWZvciAoRmV0Y2hIZWFkUmVjb3JkIGggOiBmZXRjaEhlYWRVcGRhdGVzKSB7CiAJCQkJCQloLndyaXRlKHcpOwogCQkJCQkJcmVzdWx0LmFkZChoKTsKIAkJCQkJfQpAQCAtMzUyLDEwICszNTIsMTAgQEAKIAogCXByaXZhdGUgYm9vbGVhbiBhc2tGb3JJc0NvbXBsZXRlKCkgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCXRyeSB7Ci0JCQl0cnkgKGZpbmFsIE9iamVjdFdhbGsgb3cgPSBuZXcgT2JqZWN0V2Fsayh0cmFuc3BvcnQubG9jYWwpKSB7Ci0JCQkJZm9yIChmaW5hbCBPYmplY3RJZCB3YW50IDogYXNrRm9yLmtleVNldCgpKQorCQkJdHJ5IChPYmplY3RXYWxrIG93ID0gbmV3IE9iamVjdFdhbGsodHJhbnNwb3J0LmxvY2FsKSkgeworCQkJCWZvciAoT2JqZWN0SWQgd2FudCA6IGFza0Zvci5rZXlTZXQoKSkKIAkJCQkJb3cubWFya1N0YXJ0KG93LnBhcnNlQW55KHdhbnQpKTsKLQkJCQlmb3IgKGZpbmFsIFJlZiByZWYgOiBsb2NhbFJlZnMoKS52YWx1ZXMoKSkKKwkJCQlmb3IgKFJlZiByZWYgOiBsb2NhbFJlZnMoKS52YWx1ZXMoKSkKIAkJCQkJb3cubWFya1VuaW50ZXJlc3Rpbmcob3cucGFyc2VBbnkocmVmLmdldE9iamVjdElkKCkpKTsKIAkJCQlvdy5jaGVja0Nvbm5lY3Rpdml0eSgpOwogCQkJfQpAQCAtMzY3LDE1ICszNjcsMTUgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBleHBhbmRXaWxkY2FyZChmaW5hbCBSZWZTcGVjIHNwZWMsIGZpbmFsIFNldDxSZWY+IG1hdGNoZWQpCisJcHJpdmF0ZSB2b2lkIGV4cGFuZFdpbGRjYXJkKFJlZlNwZWMgc3BlYywgU2V0PFJlZj4gbWF0Y2hlZCkKIAkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewotCQlmb3IgKGZpbmFsIFJlZiBzcmMgOiBjb25uLmdldFJlZnMoKSkgeworCQlmb3IgKFJlZiBzcmMgOiBjb25uLmdldFJlZnMoKSkgewogCQkJaWYgKHNwZWMubWF0Y2hTb3VyY2Uoc3JjKSAmJiBtYXRjaGVkLmFkZChzcmMpKQogCQkJCXdhbnQoc3JjLCBzcGVjLmV4cGFuZEZyb21Tb3VyY2Uoc3JjKSk7CiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgZXhwYW5kU2luZ2xlKGZpbmFsIFJlZlNwZWMgc3BlYywgZmluYWwgU2V0PFJlZj4gbWF0Y2hlZCkKKwlwcml2YXRlIHZvaWQgZXhwYW5kU2luZ2xlKFJlZlNwZWMgc3BlYywgU2V0PFJlZj4gbWF0Y2hlZCkKIAkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQlTdHJpbmcgd2FudCA9IHNwZWMuZ2V0U291cmNlKCk7CiAJCWlmIChPYmplY3RJZC5pc0lkKHdhbnQpKSB7CkBAIC0zOTUsNyArMzk1LDcgQEAKIAlwcml2YXRlIENvbGxlY3Rpb248UmVmPiBleHBhbmRBdXRvRm9sbG93VGFncygpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQlmaW5hbCBDb2xsZWN0aW9uPFJlZj4gYWRkaXRpb25hbFRhZ3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAkJZmluYWwgTWFwPFN0cmluZywgUmVmPiBoYXZlUmVmcyA9IGxvY2FsUmVmcygpOwotCQlmb3IgKGZpbmFsIFJlZiByIDogY29ubi5nZXRSZWZzKCkpIHsKKwkJZm9yIChSZWYgciA6IGNvbm4uZ2V0UmVmcygpKSB7CiAJCQlpZiAoIWlzVGFnKHIpKQogCQkJCWNvbnRpbnVlOwogCkBAIC00MTksNyArNDE5LDcgQEAKIAogCXByaXZhdGUgdm9pZCBleHBhbmRGZXRjaFRhZ3MoKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJZmluYWwgTWFwPFN0cmluZywgUmVmPiBoYXZlUmVmcyA9IGxvY2FsUmVmcygpOwotCQlmb3IgKGZpbmFsIFJlZiByIDogY29ubi5nZXRSZWZzKCkpIHsKKwkJZm9yIChSZWYgciA6IGNvbm4uZ2V0UmVmcygpKSB7CiAJCQlpZiAoIWlzVGFnKHIpKSB7CiAJCQkJY29udGludWU7CiAJCQl9CkBAIC00MzQsMTIgKzQzNCwxMiBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHdhbnRUYWcoZmluYWwgUmVmIHIpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24geworCXByaXZhdGUgdm9pZCB3YW50VGFnKFJlZiByKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJd2FudChyLCBuZXcgUmVmU3BlYygpLnNldFNvdXJjZShyLmdldE5hbWUoKSkKIAkJCQkuc2V0RGVzdGluYXRpb24oci5nZXROYW1lKCkpLnNldEZvcmNlVXBkYXRlKHRydWUpKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgd2FudChmaW5hbCBSZWYgc3JjLCBmaW5hbCBSZWZTcGVjIHNwZWMpCisJcHJpdmF0ZSB2b2lkIHdhbnQoUmVmIHNyYywgUmVmU3BlYyBzcGVjKQogCQkJdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCWZpbmFsIE9iamVjdElkIG5ld0lkID0gc3JjLmdldE9iamVjdElkKCk7CiAJCWlmIChuZXdJZCA9PSBudWxsKSB7CkBAIC00OTcsMTIgKzQ5NywxNSBAQAogCiAJcHJpdmF0ZSB2b2lkIGRlbGV0ZVN0YWxlVHJhY2tpbmdSZWZzKEZldGNoUmVzdWx0IHJlc3VsdCwKIAkJCUJhdGNoUmVmVXBkYXRlIGJhdGNoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmaW5hbCBTZXQ8UmVmPiBwcm9jZXNzZWQgPSBuZXcgSGFzaFNldDw+KCk7Ci0JCWZvciAoZmluYWwgUmVmIHJlZiA6IGxvY2FsUmVmcygpLnZhbHVlcygpKSB7Ci0JCQlmaW5hbCBTdHJpbmcgcmVmbmFtZSA9IHJlZi5nZXROYW1lKCk7Ci0JCQlmb3IgKGZpbmFsIFJlZlNwZWMgc3BlYyA6IHRvRmV0Y2gpIHsKKwkJU2V0PFJlZj4gcHJvY2Vzc2VkID0gbmV3IEhhc2hTZXQ8PigpOworCQlmb3IgKFJlZiByZWYgOiBsb2NhbFJlZnMoKS52YWx1ZXMoKSkgeworCQkJaWYgKHJlZi5pc1N5bWJvbGljKCkpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCVN0cmluZyByZWZuYW1lID0gcmVmLmdldE5hbWUoKTsKKwkJCWZvciAoUmVmU3BlYyBzcGVjIDogdG9GZXRjaCkgewogCQkJCWlmIChzcGVjLm1hdGNoRGVzdGluYXRpb24ocmVmbmFtZSkpIHsKLQkJCQkJZmluYWwgUmVmU3BlYyBzID0gc3BlYy5leHBhbmRGcm9tRGVzdGluYXRpb24ocmVmbmFtZSk7CisJCQkJCVJlZlNwZWMgcyA9IHNwZWMuZXhwYW5kRnJvbURlc3RpbmF0aW9uKHJlZm5hbWUpOwogCQkJCQlpZiAocmVzdWx0LmdldEFkdmVydGlzZWRSZWYocy5nZXRTb3VyY2UoKSkgPT0gbnVsbAogCQkJCQkJCSYmIHByb2Nlc3NlZC5hZGQocmVmKSkgewogCQkJCQkJZGVsZXRlVHJhY2tpbmdSZWYocmVzdWx0LCBiYXRjaCwgcywgcmVmKTsKQEAgLTUyNiwxMSArNTI5LDExIEBACiAJCWJhdGNoLmFkZENvbW1hbmQodXBkYXRlLmFzUmVjZWl2ZUNvbW1hbmQoKSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1RhZyhmaW5hbCBSZWYgcikgeworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUYWcoUmVmIHIpIHsKIAkJcmV0dXJuIGlzVGFnKHIuZ2V0TmFtZSgpKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVGFnKGZpbmFsIFN0cmluZyBuYW1lKSB7CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1RhZyhTdHJpbmcgbmFtZSkgewogCQlyZXR1cm4gbmFtZS5zdGFydHNXaXRoKENvbnN0YW50cy5SX1RBR1MpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvRmV0Y2hSZXN1bHQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0ZldGNoUmVzdWx0LmphdmEKaW5kZXggMjY2N2VjMy4uYWQ0YzVlOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvRmV0Y2hSZXN1bHQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9GZXRjaFJlc3VsdC5qYXZhCkBAIC02OCw3ICs2OCw3IEBACiAJCXN1Ym1vZHVsZXMgPSBuZXcgSGFzaE1hcDw+KCk7CiAJfQogCi0Jdm9pZCBhZGQoZmluYWwgRmV0Y2hIZWFkUmVjb3JkIHIpIHsKKwl2b2lkIGFkZChGZXRjaEhlYWRSZWNvcmQgcikgewogCQlpZiAoIXIubm90Rm9yTWVyZ2UpCiAJCQlmb3JNZXJnZS5hZGQocik7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvR2l0UHJvdG9jb2xDb25zdGFudHMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0dpdFByb3RvY29sQ29uc3RhbnRzLmphdmEKaW5kZXggMjAzMTE0Ny4uMTBjZDc3NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvR2l0UHJvdG9jb2xDb25zdGFudHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9HaXRQcm90b2NvbENvbnN0YW50cy5qYXZhCkBAIC0xMDgsNiArMTA4LDE0IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1NIQUxMT1cgPSAic2hhbGxvdyI7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgorCSAqIFRoZSBjbGllbnQgd2FudHMgdGhlICJkZWVwZW4iIGNvbW1hbmQgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgcmVsYXRpdmUgdG8KKwkgKiB0aGUgY2xpZW50J3Mgc2hhbGxvdyBjb21taXRzLgorCSAqCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9ERUVQRU5fUkVMQVRJVkUgPSAiZGVlcGVuLXJlbGF0aXZlIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCiAJICogVGhlIGNsaWVudCBkb2VzIG5vdCB3YW50IHByb2dyZXNzIG1lc3NhZ2VzIGFuZCB3aWxsIGlnbm9yZSB0aGVtLgogCSAqCiAJICogQHNpbmNlIDMuMgpAQCAtMTUyLDYgKzE2MCwxMyBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9QVVNIX0NFUlQgPSAicHVzaC1jZXJ0IjsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCisJICogVGhlIGNsaWVudCBzcGVjaWZpZWQgYSBmaWx0ZXIgZXhwcmVzc2lvbi4KKwkgKgorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fRklMVEVSID0gImZpbHRlciI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgogCSAqIFRoZSBjbGllbnQgc3VwcG9ydHMgYXRvbWljIHB1c2hlcy4gSWYgdGhpcyBvcHRpb24gaXMgdXNlZCwgdGhlIHNlcnZlcgogCSAqIHdpbGwgdXBkYXRlIGFsbCByZWZzIHdpdGhpbiBvbmUgYXRvbWljIHRyYW5zYWN0aW9uLgogCSAqCkBAIC0yMTUsNiArMjMwLDIwIEBACiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FQQUJJTElUWV9QVVNIX09QVElPTlMgPSAicHVzaC1vcHRpb25zIjsgLy8kTk9OLU5MUy0xJAogCisJLyoqCisJICogVGhlIHNlcnZlciBzdXBwb3J0cyBsaXN0aW5nIHJlZnMgdXNpbmcgcHJvdG9jb2wgdjIuCisJICoKKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9MU19SRUZTID0gImxzLXJlZnMiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGUgc2VydmVyIHN1cHBvcnRzIGZldGNoIHVzaW5nIHByb3RvY29sIHYyLgorCSAqCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfRkVUQ0ggPSAiZmV0Y2giOyAvLyROT04tTkxTLTEkCisKIAlzdGF0aWMgZW51bSBNdWx0aUFjayB7CiAJCU9GRiwgQ09OVElOVUUsIERFVEFJTEVEOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0hNQUNTSEExTm9uY2VHZW5lcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0hNQUNTSEExTm9uY2VHZW5lcmF0b3IuamF2YQppbmRleCA2YzI2YjcwLi4xNDE1MzM0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9ITUFDU0hBMU5vbmNlR2VuZXJhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvSE1BQ1NIQTFOb25jZUdlbmVyYXRvci5qYXZhCkBAIC00Myw3ICs0Myw3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0OwogCiBpbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5JU09fODg1OV8xOwotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEtleUV4Y2VwdGlvbjsKQEAgLTEwMiw3ICsxMDIsNyBAQAogCQl9CiAKIAkJU3RyaW5nIGlucHV0ID0gcGF0aCArICI6IiArIFN0cmluZy52YWx1ZU9mKHRpbWVzdGFtcCk7IC8vJE5PTi1OTFMtMSQKLQkJYnl0ZVtdIHJhd0htYWMgPSBtYWMuZG9GaW5hbChpbnB1dC5nZXRCeXRlcyhVVEZfOCkpOworCQlieXRlW10gcmF3SG1hYyA9IG1hYy5kb0ZpbmFsKGlucHV0LmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJcmV0dXJuIExvbmcudG9TdHJpbmcodGltZXN0YW1wKSArICItIiArIHRvSGV4KHJhd0htYWMpOyAvLyROT04tTkxTLTEkCiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9IdHRwQXV0aE1ldGhvZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvSHR0cEF1dGhNZXRob2QuamF2YQppbmRleCBjNDBkOTYzLi5mYjAzMTkwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9IdHRwQXV0aE1ldGhvZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0h0dHBBdXRoTWV0aG9kLmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuSHR0cFN1cHBvcnQuSERSX0FVVEhPUklaQVRJT047CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5IdHRwU3VwcG9ydC5IRFJfV1dXX0FVVEhFTlRJQ0FURTsKIApAQCAtNTEsNiArNTEsNyBAQAogaW1wb3J0IGphdmEubmV0LlVSTDsKIGltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb207CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwpAQCAtNTksNyArNjAsNiBAQAogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotaW1wb3J0IGphdmEudXRpbC5SYW5kb207CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLkh0dHBDb25uZWN0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5CYXNlNjQ7CkBAIC0xNjAsMTAgKzE2MCwxMCBAQAogCQlmaW5hbCBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGhlYWRlcnMgPSBjb25uLmdldEhlYWRlckZpZWxkcygpOwogCQlIdHRwQXV0aE1ldGhvZCBhdXRoZW50aWNhdGlvbiA9IFR5cGUuTk9ORS5tZXRob2QoRU1QVFlfU1RSSU5HKTsKIAotCQlmb3IgKGZpbmFsIEVudHJ5PFN0cmluZywgTGlzdDxTdHJpbmc+PiBlbnRyeSA6IGhlYWRlcnMuZW50cnlTZXQoKSkgeworCQlmb3IgKEVudHJ5PFN0cmluZywgTGlzdDxTdHJpbmc+PiBlbnRyeSA6IGhlYWRlcnMuZW50cnlTZXQoKSkgewogCQkJaWYgKEhEUl9XV1dfQVVUSEVOVElDQVRFLmVxdWFsc0lnbm9yZUNhc2UoZW50cnkuZ2V0S2V5KCkpKSB7CiAJCQkJaWYgKGVudHJ5LmdldFZhbHVlKCkgIT0gbnVsbCkgewotCQkJCQlmb3IgKGZpbmFsIFN0cmluZyB2YWx1ZSA6IGVudHJ5LmdldFZhbHVlKCkpIHsKKwkJCQkJZm9yIChTdHJpbmcgdmFsdWUgOiBlbnRyeS5nZXRWYWx1ZSgpKSB7CiAJCQkJCQlpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5sZW5ndGgoKSAhPSAwKSB7CiAJCQkJCQkJZmluYWwgU3RyaW5nW10gdmFsdWVQYXJ0ID0gdmFsdWUuc3BsaXQoCiAJCQkJCQkJCQlTQ0hFTUFfTkFNRV9TRVBBUkFUT1IsIDIpOwpAQCAtMzA3LDE1ICszMDcsMTUgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQl2b2lkIGF1dGhvcml6ZShmaW5hbCBTdHJpbmcgdXNlcm5hbWUsIGZpbmFsIFN0cmluZyBwYXNzd29yZCkgeworCQl2b2lkIGF1dGhvcml6ZShTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCkgewogCQkJdGhpcy51c2VyID0gdXNlcm5hbWU7CiAJCQl0aGlzLnBhc3MgPSBwYXNzd29yZDsKIAkJfQogCiAJCUBPdmVycmlkZQotCQl2b2lkIGNvbmZpZ3VyZVJlcXVlc3QoZmluYWwgSHR0cENvbm5lY3Rpb24gY29ubikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdm9pZCBjb25maWd1cmVSZXF1ZXN0KEh0dHBDb25uZWN0aW9uIGNvbm4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlTdHJpbmcgaWRlbnQgPSB1c2VyICsgIjoiICsgcGFzczsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGVuYyA9IEJhc2U2NC5lbmNvZGVCeXRlcyhpZGVudC5nZXRCeXRlcyhVVEZfOCkpOworCQkJU3RyaW5nIGVuYyA9IEJhc2U2NC5lbmNvZGVCeXRlcyhpZGVudC5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCQljb25uLnNldFJlcXVlc3RQcm9wZXJ0eShIRFJfQVVUSE9SSVpBVElPTiwgdHlwZS5nZXRTY2hlbWVOYW1lKCkKIAkJCQkJKyAiICIgKyBlbmMpOyAvLyROT04tTkxTLTEkCiAJCX0KQEAgLTMyMyw3ICszMjMsNyBAQAogCiAJLyoqIFBlcmZvcm1zIEhUVFAgZGlnZXN0IGF1dGhlbnRpY2F0aW9uLiAqLwogCXByaXZhdGUgc3RhdGljIGNsYXNzIERpZ2VzdCBleHRlbmRzIEh0dHBBdXRoTWV0aG9kIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmFuZG9tIFBSTkcgPSBuZXcgUmFuZG9tKCk7CisJCXByaXZhdGUgc3RhdGljIGZpbmFsIFNlY3VyZVJhbmRvbSBQUk5HID0gbmV3IFNlY3VyZVJhbmRvbSgpOwogCiAJCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXM7CiAKQEAgLTM0NiwxNCArMzQ2LDE0IEBACiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJdm9pZCBhdXRob3JpemUoZmluYWwgU3RyaW5nIHVzZXJuYW1lLCBmaW5hbCBTdHJpbmcgcGFzc3dvcmQpIHsKKwkJdm9pZCBhdXRob3JpemUoU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpIHsKIAkJCXRoaXMudXNlciA9IHVzZXJuYW1lOwogCQkJdGhpcy5wYXNzID0gcGFzc3dvcmQ7CiAJCX0KIAogCQlAU3VwcHJlc3NXYXJuaW5ncygiYm94aW5nIikKIAkJQE92ZXJyaWRlCi0JCXZvaWQgY29uZmlndXJlUmVxdWVzdChmaW5hbCBIdHRwQ29ubmVjdGlvbiBjb25uKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl2b2lkIGNvbmZpZ3VyZVJlcXVlc3QoSHR0cENvbm5lY3Rpb24gY29ubikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCWZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gciA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKIAogCQkJZmluYWwgU3RyaW5nIHJlYWxtID0gcGFyYW1zLmdldCgicmVhbG0iKTsgLy8kTk9OLU5MUy0xJApAQCAtNDMwLDE1ICs0MzAsMTUgQEAKIAogCQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgSChTdHJpbmcgZGF0YSkgewogCQkJTWVzc2FnZURpZ2VzdCBtZCA9IG5ld01ENSgpOwotCQkJbWQudXBkYXRlKGRhdGEuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCW1kLnVwZGF0ZShkYXRhLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJCXJldHVybiBMSEVYKG1kLmRpZ2VzdCgpKTsKIAkJfQogCiAJCXByaXZhdGUgc3RhdGljIFN0cmluZyBLRChTdHJpbmcgc2VjcmV0LCBTdHJpbmcgZGF0YSkgewogCQkJTWVzc2FnZURpZ2VzdCBtZCA9IG5ld01ENSgpOwotCQkJbWQudXBkYXRlKHNlY3JldC5nZXRCeXRlcyhVVEZfOCkpOworCQkJbWQudXBkYXRlKHNlY3JldC5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCQltZC51cGRhdGUoKGJ5dGUpICc6Jyk7Ci0JCQltZC51cGRhdGUoZGF0YS5nZXRCeXRlcyhVVEZfOCkpOworCQkJbWQudXBkYXRlKGRhdGEuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQkJcmV0dXJuIExIRVgobWQuZGlnZXN0KCkpOwogCQl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0luc2VjdXJlQ2lwaGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvSW5zZWN1cmVDaXBoZXJGYWN0b3J5LmphdmEKaW5kZXggNzMzODRhMS4uZDQ5NDI3MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvSW5zZWN1cmVDaXBoZXJGYWN0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvSW5zZWN1cmVDaXBoZXJGYWN0b3J5LmphdmEKQEAgLTU0LDcgKzU0LDcgQEAKICAqIFRoaXMgaXMgYSBoYWNrIGZvciB7QGxpbmsgV2Fsa0VuY3J5cHRpb259IHRvIGNyZWF0ZSBhbnkgY2lwaGVyIGNvbmZpZ3VyZWQgYnkKICAqIHRoZSBlbmQtdXNlci4gVXNpbmcgdGhpcyBjbGFzcyBhbGxvd3MgSkdpdCB0byB2aW9sYXRlIEVycm9yUHJvbmUncyBzZWN1cml0eQogICogcmVjb21tZW5kYXRpb25zICg8YQotICogaHJlZj0iaHR0cDovL2Vycm9ycHJvbmUuaW5mby9idWdwYXR0ZXJuL0luc2VjdXJlQ3J5cHRvVXNhZ2UiCisgKiBocmVmPSJodHRwczovL2Vycm9ycHJvbmUuaW5mby9idWdwYXR0ZXJuL0luc2VjdXJlQ3J5cHRvVXNhZ2UiCiAgKiA+SW5zZWN1cmVDcnlwdG9Vc2FnZTwvYT4pLCB3aGljaCBpcyBub3Qgc2VjdXJlLgogICovCiBjbGFzcyBJbnNlY3VyZUNpcGhlckZhY3RvcnkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvSnNjaENvbmZpZ1Nlc3Npb25GYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Kc2NoQ29uZmlnU2Vzc2lvbkZhY3RvcnkuamF2YQppbmRleCAyYTIyMmZiLi5lYWIzYjNjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Kc2NoQ29uZmlnU2Vzc2lvbkZhY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Kc2NoQ29uZmlnU2Vzc2lvbkZhY3RvcnkuamF2YQpAQCAtNzAsNiArNzAsNyBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBpbXBvcnQgY29tLmpjcmFmdC5qc2NoLkNvbmZpZ1JlcG9zaXRvcnk7CitpbXBvcnQgY29tLmpjcmFmdC5qc2NoLkNvbmZpZ1JlcG9zaXRvcnkuQ29uZmlnOwogaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5KU2NoOwogaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5KU2NoRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5TZXNzaW9uOwpAQCAtMjIyLDEwICsyMjMsMzAgQEAKIAkJCXNlc3Npb24uc2V0VXNlckluZm8obmV3IENyZWRlbnRpYWxzUHJvdmlkZXJVc2VySW5mbyhzZXNzaW9uLAogCQkJCQljcmVkZW50aWFsc1Byb3ZpZGVyKSk7CiAJCX0KKwkJc2FmZUNvbmZpZyhzZXNzaW9uLCBoYy5nZXRDb25maWcoKSk7CiAJCWNvbmZpZ3VyZShoYywgc2Vzc2lvbik7CiAJCXJldHVybiBzZXNzaW9uOwogCX0KIAorCXByaXZhdGUgdm9pZCBzYWZlQ29uZmlnKFNlc3Npb24gc2Vzc2lvbiwgQ29uZmlnIGNmZykgeworCQkvLyBFbnN1cmUgdGhhdCBKc2NoIGNoZWNrcyBhbGwgY29uZmlndXJlZCBhbGdvcml0aG1zLCBub3QganVzdCBpdHMKKwkJLy8gYnVpbHQtaW4gb25lcy4gT3RoZXJ3aXNlIGl0IG1heSBwcm9wb3NlIGFuIGFsZ29yaXRobSBmb3Igd2hpY2ggaXQKKwkJLy8gZG9lc24ndCBoYXZlIGFuIGltcGxlbWVudGF0aW9uLCBhbmQgdGhlbiBydW4gaW50byBhbiBOUEUgaWYgdGhhdAorCQkvLyBhbGdvcml0aG0gZW5kcyB1cCBiZWluZyBjaG9zZW4uCisJCWNvcHlDb25maWdWYWx1ZVRvU2Vzc2lvbihzZXNzaW9uLCBjZmcsICJDaXBoZXJzIiwgIkNoZWNrQ2lwaGVycyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJY29weUNvbmZpZ1ZhbHVlVG9TZXNzaW9uKHNlc3Npb24sIGNmZywgIktleEFsZ29yaXRobXMiLCAiQ2hlY2tLZXhlcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJY29weUNvbmZpZ1ZhbHVlVG9TZXNzaW9uKHNlc3Npb24sIGNmZywgIkhvc3RLZXlBbGdvcml0aG1zIiwgLy8kTk9OLU5MUy0xJAorCQkJCSJDaGVja1NpZ25hdHVyZXMiKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCXByaXZhdGUgdm9pZCBjb3B5Q29uZmlnVmFsdWVUb1Nlc3Npb24oU2Vzc2lvbiBzZXNzaW9uLCBDb25maWcgY2ZnLAorCQkJU3RyaW5nIGZyb20sIFN0cmluZyB0bykgeworCQlTdHJpbmcgdmFsdWUgPSBjZmcuZ2V0VmFsdWUoZnJvbSk7CisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQlzZXNzaW9uLnNldENvbmZpZyh0bywgdmFsdWUpOworCQl9CisJfQorCiAJcHJpdmF0ZSB2b2lkIHNldFVzZXJOYW1lKFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIHVzZXJOYW1lKSB7CiAJCS8vIEpzY2ggMC4xLjU0IHBpY2tzIHVwIHRoZSB1c2VyIG5hbWUgZnJvbSB0aGUgc3NoIGNvbmZpZywgZXZlbiBpZiBhbgogCQkvLyBleHBsaWNpdCB1c2VyIG5hbWUgd2FzIGdpdmVuISBXZSBtdXN0IGNvcnJlY3QgdGhhdCBpZiB+Ly5zc2gvY29uZmlnCkBAIC0zMDksNyArMzMwLDcgQEAKIAkgKiBAdGhyb3dzIGNvbS5qY3JhZnQuanNjaC5KU2NoRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIHVzZXIgY29uZmlndXJhdGlvbiBjb3VsZCBub3QgYmUgY3JlYXRlZC4KIAkgKi8KLQlwcm90ZWN0ZWQgSlNjaCBnZXRKU2NoKGZpbmFsIE9wZW5Tc2hDb25maWcuSG9zdCBoYywgRlMgZnMpIHRocm93cyBKU2NoRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgSlNjaCBnZXRKU2NoKE9wZW5Tc2hDb25maWcuSG9zdCBoYywgRlMgZnMpIHRocm93cyBKU2NoRXhjZXB0aW9uIHsKIAkJaWYgKGRlZmF1bHRKU2NoID09IG51bGwpIHsKIAkJCWRlZmF1bHRKU2NoID0gY3JlYXRlRGVmYXVsdEpTY2goZnMpOwogCQkJaWYgKGRlZmF1bHRKU2NoLmdldENvbmZpZ1JlcG9zaXRvcnkoKSA9PSBudWxsKSB7CkBAIC0zNTEsMTMgKzM3MiwxNSBAQAogCSAqLwogCXByb3RlY3RlZCBKU2NoIGNyZWF0ZURlZmF1bHRKU2NoKEZTIGZzKSB0aHJvd3MgSlNjaEV4Y2VwdGlvbiB7CiAJCWZpbmFsIEpTY2gganNjaCA9IG5ldyBKU2NoKCk7CisJCUpTY2guc2V0Q29uZmlnKCJzc2gtcnNhIiwgSlNjaC5nZXRDb25maWcoInNpZ25hdHVyZS5yc2EiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlKU2NoLnNldENvbmZpZygic3NoLWRzcyIsIEpTY2guZ2V0Q29uZmlnKCJzaWduYXR1cmUuZHNzIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJY29uZmlndXJlSlNjaChqc2NoKTsKIAkJa25vd25Ib3N0cyhqc2NoLCBmcyk7CiAJCWlkZW50aXRpZXMoanNjaCwgZnMpOwogCQlyZXR1cm4ganNjaDsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGtub3duSG9zdHMoZmluYWwgSlNjaCBzY2gsIEZTIGZzKSB0aHJvd3MgSlNjaEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBrbm93bkhvc3RzKEpTY2ggc2NoLCBGUyBmcykgdGhyb3dzIEpTY2hFeGNlcHRpb24gewogCQlmaW5hbCBGaWxlIGhvbWUgPSBmcy51c2VySG9tZSgpOwogCQlpZiAoaG9tZSA9PSBudWxsKQogCQkJcmV0dXJuOwpAQCAtMzcxLDcgKzM5NCw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGlkZW50aXRpZXMoZmluYWwgSlNjaCBzY2gsIEZTIGZzKSB7CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBpZGVudGl0aWVzKEpTY2ggc2NoLCBGUyBmcykgewogCQlmaW5hbCBGaWxlIGhvbWUgPSBmcy51c2VySG9tZSgpOwogCQlpZiAoaG9tZSA9PSBudWxsKQogCQkJcmV0dXJuOwpAQCAtMzgzLDcgKzQwNiw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGxvYWRJZGVudGl0eShmaW5hbCBKU2NoIHNjaCwgZmluYWwgRmlsZSBwcml2KSB7CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2FkSWRlbnRpdHkoSlNjaCBzY2gsIEZpbGUgcHJpdikgewogCQlpZiAocHJpdi5pc0ZpbGUoKSkgewogCQkJdHJ5IHsKIAkJCQlzY2guYWRkSWRlbnRpdHkocHJpdi5nZXRBYnNvbHV0ZVBhdGgoKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Kc2NoU2Vzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvSnNjaFNlc3Npb24uamF2YQppbmRleCAwODFkMDU3Li5lM2VmODMyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Kc2NoU2Vzc2lvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0pzY2hTZXNzaW9uLmphdmEKQEAgLTgyLDcgKzgyLDcgQEAKIAkgKiBAcGFyYW0gdXJpCiAJICogICAgICAgICAgICB0aGUgVVJJIGluZm9ybWF0aW9uIGZvciB0aGUgcmVtb3RlIGNvbm5lY3Rpb24KIAkgKi8KLQlwdWJsaWMgSnNjaFNlc3Npb24oZmluYWwgU2Vzc2lvbiBzZXNzaW9uLCBVUklpc2ggdXJpKSB7CisJcHVibGljIEpzY2hTZXNzaW9uKFNlc3Npb24gc2Vzc2lvbiwgVVJJaXNoIHVyaSkgewogCQlzb2NrID0gc2Vzc2lvbjsKIAkJdGhpcy51cmkgPSB1cmk7CiAJfQpAQCAtMTQ1LDcgKzE0NSw3IEBACiAJCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KIAkJICogICAgICAgICAgICAgb24gcHJvYmxlbXMgb3BlbmluZyBzdHJlYW1zCiAJCSAqLwotCQlKc2NoUHJvY2VzcyhmaW5hbCBTdHJpbmcgY29tbWFuZE5hbWUsIGludCB0bXMpCisJCUpzY2hQcm9jZXNzKFN0cmluZyBjb21tYW5kTmFtZSwgaW50IHRtcykKIAkJCQl0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCQl0aW1lb3V0ID0gdG1zOwogCQkJdHJ5IHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L05ldFJDLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9OZXRSQy5qYXZhCmluZGV4IGUzZjI4N2IuLmU2ODhmNjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L05ldFJDLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvTmV0UkMuamF2YQpAQCAtMjExLDkgKzIxMSw3IEBACiAJCXRoaXMuaG9zdHMuY2xlYXIoKTsKIAkJdGhpcy5sYXN0TW9kaWZpZWQgPSB0aGlzLm5ldHJjLmxhc3RNb2RpZmllZCgpOwogCi0JCUJ1ZmZlcmVkUmVhZGVyIHIgPSBudWxsOwotCQl0cnkgewotCQkJciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihuZXRyYykpOworCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIHIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIobmV0cmMpKSkgewogCQkJU3RyaW5nIGxpbmUgPSBudWxsOwogCiAJCQlOZXRSQ0VudHJ5IGVudHJ5ID0gbmV3IE5ldFJDRW50cnkoKTsKQEAgLTMxNSwxMyArMzEzLDYgQEAKIAkJCQlob3N0cy5wdXQoZW50cnkubWFjaGluZSwgZW50cnkpOwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKHIgIT0gbnVsbCkKLQkJCQkJci5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQkJfQogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvT3BlblNzaENvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvT3BlblNzaENvbmZpZy5qYXZhCmluZGV4IDQ2NjBjNDAuLmY1Y2NkYzggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L09wZW5Tc2hDb25maWcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9PcGVuU3NoQ29uZmlnLmphdmEKQEAgLTE4Niw3ICsxODYsNyBAQAogCS8qKiBTdGF0ZSByZWFkIGZyb20gdGhlIGNvbmZpZyBmaWxlLCBwbHVzIHtAbGluayBIb3N0fXMgY3JlYXRlZCBmcm9tIGl0LiAqLwogCXByaXZhdGUgU3RhdGUgc3RhdGU7CiAKLQlPcGVuU3NoQ29uZmlnKGZpbmFsIEZpbGUgaCwgZmluYWwgRmlsZSBjZmcpIHsKKwlPcGVuU3NoQ29uZmlnKEZpbGUgaCwgRmlsZSBjZmcpIHsKIAkJaG9tZSA9IGg7CiAJCWNvbmZpZ0ZpbGUgPSBjZmc7CiAJCXN0YXRlID0gbmV3IFN0YXRlKCk7CkBAIC0yMDEsNyArMjAxLDcgQEAKIAkgKiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gZmlsZS4KIAkgKiBAcmV0dXJuIHIgY29uZmlndXJhdGlvbiBmb3IgdGhlIHJlcXVlc3RlZCBuYW1lLiBOZXZlciBudWxsLgogCSAqLwotCXB1YmxpYyBIb3N0IGxvb2t1cChmaW5hbCBTdHJpbmcgaG9zdE5hbWUpIHsKKwlwdWJsaWMgSG9zdCBsb29rdXAoU3RyaW5nIGhvc3ROYW1lKSB7CiAJCWZpbmFsIFN0YXRlIGNhY2hlID0gcmVmcmVzaCgpOwogCQlIb3N0IGggPSBjYWNoZS5ob3N0cy5nZXQoaG9zdE5hbWUpOwogCQlpZiAoaCAhPSBudWxsKSB7CkBAIC0yMTEsNyArMjExLDcgQEAKIAkJLy8gSW5pdGlhbGl6ZSB3aXRoIGRlZmF1bHQgZW50cmllcyBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlLCBiZWZvcmUgdGhlCiAJCS8vIGZpcnN0IEhvc3QgYmxvY2suCiAJCWZ1bGxDb25maWcubWVyZ2UoY2FjaGUuZW50cmllcy5nZXQoSG9zdEVudHJ5LkRFRkFVTFRfTkFNRSkpOwotCQlmb3IgKGZpbmFsIE1hcC5FbnRyeTxTdHJpbmcsIEhvc3RFbnRyeT4gZSA6IGNhY2hlLmVudHJpZXMuZW50cnlTZXQoKSkgeworCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEhvc3RFbnRyeT4gZSA6IGNhY2hlLmVudHJpZXMuZW50cnlTZXQoKSkgewogCQkJU3RyaW5nIGtleSA9IGUuZ2V0S2V5KCk7CiAJCQlpZiAoaXNIb3N0TWF0Y2goa2V5LCBob3N0TmFtZSkpIHsKIAkJCQlmdWxsQ29uZmlnLm1lcmdlKGUuZ2V0VmFsdWUoKSk7CkBAIC0yMzgsNyArMjM4LDcgQEAKIAkJcmV0dXJuIHN0YXRlOwogCX0KIAotCXByaXZhdGUgTWFwPFN0cmluZywgSG9zdEVudHJ5PiBwYXJzZShmaW5hbCBJbnB1dFN0cmVhbSBpbikKKwlwcml2YXRlIE1hcDxTdHJpbmcsIEhvc3RFbnRyeT4gcGFyc2UoSW5wdXRTdHJlYW0gaW4pCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBNYXA8U3RyaW5nLCBIb3N0RW50cnk+IG0gPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7CiAJCWZpbmFsIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbikpOwpAQCAtMzMyLDE0ICszMzIsMTQgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkZXF1b3RlKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworCXByaXZhdGUgc3RhdGljIFN0cmluZyBkZXF1b3RlKFN0cmluZyB2YWx1ZSkgewogCQlpZiAodmFsdWUuc3RhcnRzV2l0aCgiXCIiKSAmJiB2YWx1ZS5lbmRzV2l0aCgiXCIiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCQkmJiB2YWx1ZS5sZW5ndGgoKSA+IDEpCiAJCQlyZXR1cm4gdmFsdWUuc3Vic3RyaW5nKDEsIHZhbHVlLmxlbmd0aCgpIC0gMSk7CiAJCXJldHVybiB2YWx1ZTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbm93cyhmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbm93cyhTdHJpbmcgdmFsdWUpIHsKIAkJZmluYWwgU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGgoKTsgaSsrKSB7CiAJCQlpZiAoIUNoYXJhY3Rlci5pc1NwYWNlQ2hhcih2YWx1ZS5jaGFyQXQoaSkpKQpAQCAtMzQ4LDcgKzM0OCw3IEBACiAJCXJldHVybiBiLnRvU3RyaW5nKCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgQm9vbGVhbiB5ZXNubyhmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKwlwcml2YXRlIHN0YXRpYyBCb29sZWFuIHllc25vKFN0cmluZyB2YWx1ZSkgewogCQlpZiAoU3RyaW5nVXRpbHMuZXF1YWxzSWdub3JlQ2FzZSgieWVzIiwgdmFsdWUpKSAvLyROT04tTkxTLTEkCiAJCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwogCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKQEAgLTM2NSw3ICszNjUsNyBAQAogCQlyZXR1cm4gbmV3IEZpbGUoaG9tZSwgcGF0aCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgaW50IHBvc2l0aXZlKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworCXByaXZhdGUgc3RhdGljIGludCBwb3NpdGl2ZShTdHJpbmcgdmFsdWUpIHsKIAkJaWYgKHZhbHVlICE9IG51bGwpIHsKIAkJCXRyeSB7CiAJCQkJcmV0dXJuIEludGVnZXIucGFyc2VVbnNpZ25lZEludCh2YWx1ZSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9PcGVyYXRpb25SZXN1bHQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L09wZXJhdGlvblJlc3VsdC5qYXZhCmluZGV4IDQyMzE3OTguLjA4ZjdmMGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L09wZXJhdGlvblJlc3VsdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L09wZXJhdGlvblJlc3VsdC5qYXZhCkBAIC0xMDcsNyArMTA3LDcgQEAKIAkgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIHJlZiB0byBvYnRhaW4uCiAJICogQHJldHVybiB0aGUgcmVxdWVzdGVkIHJlZjsgbnVsbCBpZiB0aGUgcmVtb3RlIGRpZCBub3QgYWR2ZXJ0aXNlIHRoaXMgcmVmLgogCSAqLwotCXB1YmxpYyBmaW5hbCBSZWYgZ2V0QWR2ZXJ0aXNlZFJlZihmaW5hbCBTdHJpbmcgbmFtZSkgeworCXB1YmxpYyBmaW5hbCBSZWYgZ2V0QWR2ZXJ0aXNlZFJlZihTdHJpbmcgbmFtZSkgewogCQlyZXR1cm4gYWR2ZXJ0aXNlZFJlZnMuZ2V0KG5hbWUpOwogCX0KIApAQCAtMTI5LDE2ICsxMjksMTYgQEAKIAkgKiBAcmV0dXJuIHN0YXR1cyBvZiB0aGUgbG9jYWwgcmVmOyBudWxsIGlmIHRoaXMgbG9jYWwgcmVmIHdhcyBub3QgdG91Y2hlZAogCSAqICAgICAgICAgZHVyaW5nIHRoaXMgb3BlcmF0aW9uLgogCSAqLwotCXB1YmxpYyBUcmFja2luZ1JlZlVwZGF0ZSBnZXRUcmFja2luZ1JlZlVwZGF0ZShmaW5hbCBTdHJpbmcgbG9jYWxOYW1lKSB7CisJcHVibGljIFRyYWNraW5nUmVmVXBkYXRlIGdldFRyYWNraW5nUmVmVXBkYXRlKFN0cmluZyBsb2NhbE5hbWUpIHsKIAkJcmV0dXJuIHVwZGF0ZXMuZ2V0KGxvY2FsTmFtZSk7CiAJfQogCi0Jdm9pZCBzZXRBZHZlcnRpc2VkUmVmcyhmaW5hbCBVUklpc2ggdSwgZmluYWwgTWFwPFN0cmluZywgUmVmPiBhcikgeworCXZvaWQgc2V0QWR2ZXJ0aXNlZFJlZnMoVVJJaXNoIHUsIE1hcDxTdHJpbmcsIFJlZj4gYXIpIHsKIAkJdXJpID0gdTsKIAkJYWR2ZXJ0aXNlZFJlZnMgPSBhcjsKIAl9CiAKLQl2b2lkIGFkZChmaW5hbCBUcmFja2luZ1JlZlVwZGF0ZSB1KSB7CisJdm9pZCBhZGQoVHJhY2tpbmdSZWZVcGRhdGUgdSkgewogCQl1cGRhdGVzLnB1dCh1LmdldExvY2FsTmFtZSgpLCB1KTsKIAl9CiAKQEAgLTE1OCw3ICsxNTgsNyBAQAogCQlyZXR1cm4gbWVzc2FnZUJ1ZmZlciAhPSBudWxsID8gbWVzc2FnZUJ1ZmZlci50b1N0cmluZygpIDogIiI7IC8vJE5PTi1OTFMtMSQKIAl9CiAKLQl2b2lkIGFkZE1lc3NhZ2VzKGZpbmFsIFN0cmluZyBtc2cpIHsKKwl2b2lkIGFkZE1lc3NhZ2VzKFN0cmluZyBtc2cpIHsKIAkJaWYgKG1zZyAhPSBudWxsICYmIG1zZy5sZW5ndGgoKSA+IDApIHsKIAkJCWlmIChtZXNzYWdlQnVmZmVyID09IG51bGwpCiAJCQkJbWVzc2FnZUJ1ZmZlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrUGFyc2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrUGFyc2VyLmphdmEKaW5kZXggYWY1YTBiNy4uNDlhY2I0ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja1BhcnNlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tQYXJzZXIuamF2YQpAQCAtMjAwLDcgKzIwMCw3IEBACiAJICogQHBhcmFtIHNyYwogCSAqICAgICAgICAgICAgdGhlIHN0cmVhbSB0aGUgcGFyc2VyIHdpbGwgcmVhZC4KIAkgKi8KLQlwcm90ZWN0ZWQgUGFja1BhcnNlcihmaW5hbCBPYmplY3REYXRhYmFzZSBvZGIsIGZpbmFsIElucHV0U3RyZWFtIHNyYykgeworCXByb3RlY3RlZCBQYWNrUGFyc2VyKE9iamVjdERhdGFiYXNlIG9kYiwgSW5wdXRTdHJlYW0gc3JjKSB7CiAJCW9iamVjdERhdGFiYXNlID0gb2RiLm5ld0NhY2hlZERhdGFiYXNlKCk7CiAJCWluID0gc3JjOwogCkBAIC0yMzIsNyArMjMyLDcgQEAKIAkgKiBAcGFyYW0gYWxsb3cKIAkgKiAgICAgICAgICAgIHRydWUgdG8gZW5hYmxlIGEgdGhpbiBwYWNrLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsbG93VGhpbihmaW5hbCBib29sZWFuIGFsbG93KSB7CisJcHVibGljIHZvaWQgc2V0QWxsb3dUaGluKGJvb2xlYW4gYWxsb3cpIHsKIAkJYWxsb3dUaGluID0gYWxsb3c7CiAJfQogCkBAIC0zNzksNyArMzc5LDcgQEAKIAkgKiBAcGFyYW0gb2MKIAkgKiAgICAgICAgICAgIHRoZSBjaGVja2VyIGluc3RhbmNlOyBudWxsIHRvIGRpc2FibGUgb2JqZWN0IGNoZWNraW5nLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldE9iamVjdENoZWNrZXIoZmluYWwgT2JqZWN0Q2hlY2tlciBvYykgeworCXB1YmxpYyB2b2lkIHNldE9iamVjdENoZWNrZXIoT2JqZWN0Q2hlY2tlciBvYykgewogCQlvYmpDaGVjayA9IG9jOwogCX0KIApAQCAtMzk5LDcgKzM5OSw3IEBACiAJICogQHBhcmFtIG9uCiAJICogICAgICAgICAgICB0cnVlIHRvIGVuYWJsZSB0aGUgZGVmYXVsdCBjaGVja2VyOyBmYWxzZSB0byBkaXNhYmxlIGl0LgogCSAqLwotCXB1YmxpYyB2b2lkIHNldE9iamVjdENoZWNraW5nKGZpbmFsIGJvb2xlYW4gb24pIHsKKwlwdWJsaWMgdm9pZCBzZXRPYmplY3RDaGVja2luZyhib29sZWFuIG9uKSB7CiAJCXNldE9iamVjdENoZWNrZXIob24gPyBuZXcgT2JqZWN0Q2hlY2tlcigpIDogbnVsbCk7CiAJfQogCkBAIC02MjksNyArNjI5LDcgQEAKIAkJcmVzb2x2aW5nLmVuZFRhc2soKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgcmVzb2x2ZURlbHRhcyhmaW5hbCBQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpCisJcHJpdmF0ZSB2b2lkIHJlc29sdmVEZWx0YXMoUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgaW50IGxhc3QgPSBlbnRyeUNvdW50OwogCQlmb3IgKGludCBpID0gMDsgaSA8IGxhc3Q7IGkrKykgewpAQCAtODE5LDcgKzgxOSw3IEBACiAJCXJldHVybiBpbmZvOwogCX0KIAotCXByaXZhdGUgVW5yZXNvbHZlZERlbHRhIHJlbW92ZUJhc2VCeUlkKGZpbmFsIEFueU9iamVjdElkIGlkKSB7CisJcHJpdmF0ZSBVbnJlc29sdmVkRGVsdGEgcmVtb3ZlQmFzZUJ5SWQoQW55T2JqZWN0SWQgaWQpIHsKIAkJZmluYWwgRGVsdGFDaGFpbiBkID0gYmFzZUJ5SWQuZ2V0KGlkKTsKIAkJcmV0dXJuIGQgIT0gbnVsbCA/IGQucmVtb3ZlKCkgOiBudWxsOwogCX0KQEAgLTg2NSw3ICs4NjUsNyBAQAogCQlyZXR1cm4gZmlyc3Q7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHJlc29sdmVEZWx0YXNXaXRoRXh0ZXJuYWxCYXNlcyhmaW5hbCBQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpCisJcHJpdmF0ZSB2b2lkIHJlc29sdmVEZWx0YXNXaXRoRXh0ZXJuYWxCYXNlcyhQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlncm93RW50cmllcyhiYXNlQnlJZC5zaXplKCkpOwogCkBAIC04NzMsNyArODczLDcgQEAKIAkJCWJhc2VPYmplY3RJZHMgPSBuZXcgT2JqZWN0SWRTdWJjbGFzc01hcDw+KCk7CiAKIAkJZmluYWwgTGlzdDxEZWx0YUNoYWluPiBtaXNzaW5nID0gbmV3IEFycmF5TGlzdDw+KDY0KTsKLQkJZm9yIChmaW5hbCBEZWx0YUNoYWluIGJhc2VJZCA6IGJhc2VCeUlkKSB7CisJCWZvciAoRGVsdGFDaGFpbiBiYXNlSWQgOiBiYXNlQnlJZCkgewogCQkJaWYgKGJhc2VJZC5oZWFkID09IG51bGwpCiAJCQkJY29udGludWU7CiAKQEAgLTkwNSw3ICs5MDUsNyBAQAogCQkJCQkJSkdpdFRleHQuZ2V0KCkuZG93bmxvYWRDYW5jZWxsZWREdXJpbmdJbmRleGluZyk7CiAJCX0KIAotCQlmb3IgKGZpbmFsIERlbHRhQ2hhaW4gYmFzZSA6IG1pc3NpbmcpIHsKKwkJZm9yIChEZWx0YUNoYWluIGJhc2UgOiBtaXNzaW5nKSB7CiAJCQlpZiAoYmFzZS5oZWFkICE9IG51bGwpCiAJCQkJdGhyb3cgbmV3IE1pc3NpbmdPYmplY3RFeGNlcHRpb24oYmFzZSwgImRlbHRhIGJhc2UiKTsgLy8kTk9OLU5MUy0xJAogCQl9CkBAIC0xMDY1LDcgKzEwNjUsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHdob2xlKGZpbmFsIGxvbmcgcG9zLCBmaW5hbCBpbnQgdHlwZSwgZmluYWwgbG9uZyBzeikKKwlwcml2YXRlIHZvaWQgd2hvbGUobG9uZyBwb3MsIGludCB0eXBlLCBsb25nIHN6KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJU0hBMSBvYmplY3REaWdlc3QgPSBvYmplY3RIYXNoZXIucmVzZXQoKTsKIAkJb2JqZWN0RGlnZXN0LnVwZGF0ZShDb25zdGFudHMuZW5jb2RlZFR5cGVTdHJpbmcodHlwZSkpOwpAQCAtMTA3Niw3ICsxMDc2LDYgQEAKIAkJZmluYWwgYnl0ZVtdIGRhdGE7CiAJCWlmICh0eXBlID09IENvbnN0YW50cy5PQkpfQkxPQikgewogCQkJYnl0ZVtdIHJlYWRCdWZmZXIgPSBidWZmZXIoKTsKLQkJCUlucHV0U3RyZWFtIGluZiA9IGluZmxhdGUoU291cmNlLklOUFVULCBzeik7CiAJCQlCbG9iT2JqZWN0Q2hlY2tlciBjaGVja2VyID0gbnVsbDsKIAkJCWlmIChvYmpDaGVjayAhPSBudWxsKSB7CiAJCQkJY2hlY2tlciA9IG9iakNoZWNrLm5ld0Jsb2JPYmplY3RDaGVja2VyKCk7CkBAIC0xMDg1LDE1ICsxMDg0LDE2IEBACiAJCQkJY2hlY2tlciA9IEJsb2JPYmplY3RDaGVja2VyLk5VTExfQ0hFQ0tFUjsKIAkJCX0KIAkJCWxvbmcgY250ID0gMDsKLQkJCXdoaWxlIChjbnQgPCBzeikgewotCQkJCWludCByID0gaW5mLnJlYWQocmVhZEJ1ZmZlcik7Ci0JCQkJaWYgKHIgPD0gMCkKLQkJCQkJYnJlYWs7Ci0JCQkJb2JqZWN0RGlnZXN0LnVwZGF0ZShyZWFkQnVmZmVyLCAwLCByKTsKLQkJCQljaGVja2VyLnVwZGF0ZShyZWFkQnVmZmVyLCAwLCByKTsKLQkJCQljbnQgKz0gcjsKKwkJCXRyeSAoSW5wdXRTdHJlYW0gaW5mID0gaW5mbGF0ZShTb3VyY2UuSU5QVVQsIHN6KSkgeworCQkJCXdoaWxlIChjbnQgPCBzeikgeworCQkJCQlpbnQgciA9IGluZi5yZWFkKHJlYWRCdWZmZXIpOworCQkJCQlpZiAociA8PSAwKQorCQkJCQkJYnJlYWs7CisJCQkJCW9iamVjdERpZ2VzdC51cGRhdGUocmVhZEJ1ZmZlciwgMCwgcik7CisJCQkJCWNoZWNrZXIudXBkYXRlKHJlYWRCdWZmZXIsIDAsIHIpOworCQkJCQljbnQgKz0gcjsKKwkJCQl9CiAJCQl9Ci0JCQlpbmYuY2xvc2UoKTsKIAkJCW9iamVjdERpZ2VzdC5kaWdlc3QodGVtcE9iamVjdElkKTsKIAkJCWNoZWNrZXIuZW5kQmxvYih0ZW1wT2JqZWN0SWQpOwogCQkJZGF0YSA9IG51bGw7CkBAIC0xMTYyLDMzICsxMTYyLDI5IEBACiAJCWZpbmFsIGJ5dGVbXSByZWFkQnVmZmVyID0gYnVmZmVyKCk7CiAJCWZpbmFsIGJ5dGVbXSBjdXJCdWZmZXIgPSBuZXcgYnl0ZVtyZWFkQnVmZmVyLmxlbmd0aF07CiAJCWxvbmcgc3ogPSBpbmZvLnNpemU7Ci0JCUlucHV0U3RyZWFtIHBjayA9IG51bGw7CiAJCXRyeSAoT2JqZWN0U3RyZWFtIGN1ciA9IHJlYWRDdXJzLm9wZW4ob2JqLCBpbmZvLnR5cGUpLm9wZW5TdHJlYW0oKSkgewogCQkJaWYgKGN1ci5nZXRTaXplKCkgIT0gc3opIHsKIAkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCiAJCQkJCQlKR2l0VGV4dC5nZXQoKS5jb2xsaXNpb25Pbiwgb2JqLm5hbWUoKSkpOwogCQkJfQotCQkJcGNrID0gaW5mbGF0ZShTb3VyY2UuREFUQUJBU0UsIHN6KTsKLQkJCXdoaWxlICgwIDwgc3opIHsKLQkJCQlpbnQgbiA9IChpbnQpIE1hdGgubWluKHJlYWRCdWZmZXIubGVuZ3RoLCBzeik7Ci0JCQkJSU8ucmVhZEZ1bGx5KGN1ciwgY3VyQnVmZmVyLCAwLCBuKTsKLQkJCQlJTy5yZWFkRnVsbHkocGNrLCByZWFkQnVmZmVyLCAwLCBuKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQkJCQlpZiAoY3VyQnVmZmVyW2ldICE9IHJlYWRCdWZmZXJbaV0pIHsKLQkJCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dAotCQkJCQkJCQkuZ2V0KCkuY29sbGlzaW9uT24sIG9iai5uYW1lKCkpKTsKKwkJCXRyeSAoSW5wdXRTdHJlYW0gcGNrID0gaW5mbGF0ZShTb3VyY2UuREFUQUJBU0UsIHN6KSkgeworCQkJCXdoaWxlICgwIDwgc3opIHsKKwkJCQkJaW50IG4gPSAoaW50KSBNYXRoLm1pbihyZWFkQnVmZmVyLmxlbmd0aCwgc3opOworCQkJCQlJTy5yZWFkRnVsbHkoY3VyLCBjdXJCdWZmZXIsIDAsIG4pOworCQkJCQlJTy5yZWFkRnVsbHkocGNrLCByZWFkQnVmZmVyLCAwLCBuKTsKKwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJCQkJCWlmIChjdXJCdWZmZXJbaV0gIT0gcmVhZEJ1ZmZlcltpXSkgeworCQkJCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJCQkJCUpHaXRUZXh0LmdldCgpLmNvbGxpc2lvbk9uLCBvYmoubmFtZSgpKSk7CisJCQkJCQl9CiAJCQkJCX0KKwkJCQkJc3ogLT0gbjsKIAkJCQl9Ci0JCQkJc3ogLT0gbjsKIAkJCX0KIAkJfSBjYXRjaCAoTWlzc2luZ09iamVjdEV4Y2VwdGlvbiBub3RMb2NhbCkgewogCQkJLy8gVGhpcyBpcyBPSywgd2UgZG9uJ3QgaGF2ZSBhIGNvcHkgb2YgdGhlIG9iamVjdCBsb2NhbGx5Ci0JCQkvLyBidXQgdGhlIEFQSSB0aHJvd3Mgd2hlbiB3ZSB0cnkgdG8gcmVhZCBpdCBhcyB1c3VhbGx5IGl0cworCQkJLy8gYnV0IHRoZSBBUEkgdGhyb3dzIHdoZW4gd2UgdHJ5IHRvIHJlYWQgaXQgYXMgdXN1YWxseSBpdCdzCiAJCQkvLyBhbiBlcnJvciB0byByZWFkIHNvbWV0aGluZyB0aGF0IGRvZXNuJ3QgZXhpc3QuCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAocGNrICE9IG51bGwpIHsKLQkJCQlwY2suY2xvc2UoKTsKLQkJCX0KIAkJfQogCX0KIApAQCAtMTIyOCw3ICsxMjI0LDcgQEAKIAl9CiAKIAkvLyBDb25zdW1lIGV4YWN0bHkgb25lIGJ5dGUgZnJvbSB0aGUgYnVmZmVyIGFuZCByZXR1cm4gaXQuCi0JcHJpdmF0ZSBpbnQgcmVhZEZyb20oZmluYWwgU291cmNlIHNyYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIGludCByZWFkRnJvbShTb3VyY2Ugc3JjKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAoYkF2YWlsID09IDApCiAJCQlmaWxsKHNyYywgMSk7CiAJCWJBdmFpbC0tOwpAQCAtMTIzNiwxMyArMTIzMiwxMyBAQAogCX0KIAogCS8vIENvbnN1bWUgY250IGJ5dGVzIGZyb20gdGhlIGJ1ZmZlci4KLQl2b2lkIHVzZShmaW5hbCBpbnQgY250KSB7CisJdm9pZCB1c2UoaW50IGNudCkgewogCQliT2Zmc2V0ICs9IGNudDsKIAkJYkF2YWlsIC09IGNudDsKIAl9CiAKIAkvLyBFbnN1cmUgYXQgbGVhc3QgbmVlZCBieXRlcyBhcmUgYXZhaWxhYmxlIGluIGluIHtAbGluayAjYnVmfS4KLQlpbnQgZmlsbChmaW5hbCBTb3VyY2Ugc3JjLCBmaW5hbCBpbnQgbmVlZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlpbnQgZmlsbChTb3VyY2Ugc3JjLCBpbnQgbmVlZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJd2hpbGUgKGJBdmFpbCA8IG5lZWQpIHsKIAkJCWludCBuZXh0ID0gYk9mZnNldCArIGJBdmFpbDsKIAkJCWludCBmcmVlID0gYnVmLmxlbmd0aCAtIG5leHQ7CkBAIC0xNjQwLDIzICsxNjM2LDIzIEBACiAJCXB1YmxpYyBsb25nIHNpemU7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGluZmxhdGVBbmRTa2lwKGZpbmFsIFNvdXJjZSBzcmMsIGZpbmFsIGxvbmcgaW5mbGF0ZWRTaXplKQorCXByaXZhdGUgdm9pZCBpbmZsYXRlQW5kU2tpcChTb3VyY2Ugc3JjLCBsb25nIGluZmxhdGVkU2l6ZSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZpbmFsIElucHV0U3RyZWFtIGluZiA9IGluZmxhdGUoc3JjLCBpbmZsYXRlZFNpemUpOwotCQlJTy5za2lwRnVsbHkoaW5mLCBpbmZsYXRlZFNpemUpOwotCQlpbmYuY2xvc2UoKTsKKwkJdHJ5IChJbnB1dFN0cmVhbSBpbmYgPSBpbmZsYXRlKHNyYywgaW5mbGF0ZWRTaXplKSkgeworCQkJSU8uc2tpcEZ1bGx5KGluZiwgaW5mbGF0ZWRTaXplKTsKKwkJfQogCX0KIAotCXByaXZhdGUgYnl0ZVtdIGluZmxhdGVBbmRSZXR1cm4oZmluYWwgU291cmNlIHNyYywgZmluYWwgbG9uZyBpbmZsYXRlZFNpemUpCisJcHJpdmF0ZSBieXRlW10gaW5mbGF0ZUFuZFJldHVybihTb3VyY2Ugc3JjLCBsb25nIGluZmxhdGVkU2l6ZSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGJ5dGVbXSBkc3QgPSBuZXcgYnl0ZVsoaW50KSBpbmZsYXRlZFNpemVdOwotCQlmaW5hbCBJbnB1dFN0cmVhbSBpbmYgPSBpbmZsYXRlKHNyYywgaW5mbGF0ZWRTaXplKTsKLQkJSU8ucmVhZEZ1bGx5KGluZiwgZHN0LCAwLCBkc3QubGVuZ3RoKTsKLQkJaW5mLmNsb3NlKCk7CisJCXRyeSAoSW5wdXRTdHJlYW0gaW5mID0gaW5mbGF0ZShzcmMsIGluZmxhdGVkU2l6ZSkpIHsKKwkJCUlPLnJlYWRGdWxseShpbmYsIGRzdCwgMCwgZHN0Lmxlbmd0aCk7CisJCX0KIAkJcmV0dXJuIGRzdDsKIAl9CiAKLQlwcml2YXRlIElucHV0U3RyZWFtIGluZmxhdGUoZmluYWwgU291cmNlIHNyYywgZmluYWwgbG9uZyBpbmZsYXRlZFNpemUpCisJcHJpdmF0ZSBJbnB1dFN0cmVhbSBpbmZsYXRlKFNvdXJjZSBzcmMsIGxvbmcgaW5mbGF0ZWRTaXplKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaW5mbGF0ZXIub3BlbihzcmMsIGluZmxhdGVkU2l6ZSk7CiAJCXJldHVybiBpbmZsYXRlcjsKQEAgLTE2NjUsNyArMTY2MSw3IEBACiAJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGVsdGFDaGFpbiBleHRlbmRzIE9iamVjdElkT3duZXJNYXAuRW50cnkgewogCQlVbnJlc29sdmVkRGVsdGEgaGVhZDsKIAotCQlEZWx0YUNoYWluKGZpbmFsIEFueU9iamVjdElkIGlkKSB7CisJCURlbHRhQ2hhaW4oQW55T2JqZWN0SWQgaWQpIHsKIAkJCXN1cGVyKGlkKTsKIAkJfQogCkBAIC0xNjc2LDcgKzE2NzIsNyBAQAogCQkJcmV0dXJuIHI7CiAJCX0KIAotCQl2b2lkIGFkZChmaW5hbCBVbnJlc29sdmVkRGVsdGEgZCkgeworCQl2b2lkIGFkZChVbnJlc29sdmVkRGVsdGEgZCkgewogCQkJZC5uZXh0ID0gaGVhZDsKIAkJCWhlYWQgPSBkOwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrZWRPYmplY3RJbmZvLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrZWRPYmplY3RJbmZvLmphdmEKaW5kZXggODBmYzBiNC4uNTlkMWI3OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja2VkT2JqZWN0SW5mby5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tlZE9iamVjdEluZm8uamF2YQpAQCAtNzUsNyArNzUsNyBAQAogCSAqIEBwYXJhbSBpZAogCSAqICAgICAgICAgICAgdGhlIGlkZW50aXR5IG9mIHRoZSBvYmplY3QgdGhlIG5ldyBpbnN0YW5jZSB0cmFja3MuCiAJICovCi0JcHVibGljIFBhY2tlZE9iamVjdEluZm8oZmluYWwgQW55T2JqZWN0SWQgaWQpIHsKKwlwdWJsaWMgUGFja2VkT2JqZWN0SW5mbyhBbnlPYmplY3RJZCBpZCkgewogCQlzdXBlcihpZCk7CiAJfQogCkBAIC05NSw3ICs5NSw3IEBACiAJICogQHBhcmFtIG9mZnNldAogCSAqICAgICAgICAgICAgb2Zmc2V0IHdoZXJlIHdyaXR0ZW4gb2JqZWN0IHN0YXJ0cwogCSAqLwotCXB1YmxpYyB2b2lkIHNldE9mZnNldChmaW5hbCBsb25nIG9mZnNldCkgeworCXB1YmxpYyB2b2lkIHNldE9mZnNldChsb25nIG9mZnNldCkgewogCQl0aGlzLm9mZnNldCA9IG9mZnNldDsKIAl9CiAKQEAgLTExNiw3ICsxMTYsNyBAQAogCSAqICAgICAgICAgICAgaW5mbGF0ZWQgbGVuZ3RoIGFuZCBkZWx0YSBiYXNlIHJlZmVyZW5jZSkgYXMgY29tcHV0ZWQgYnkKIAkgKiAgICAgICAgICAgIHtAbGluayBqYXZhLnV0aWwuemlwLkNSQzMyfS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDUkMoZmluYWwgaW50IGNyYykgeworCXB1YmxpYyB2b2lkIHNldENSQyhpbnQgY3JjKSB7CiAJCXRoaXMuY3JjID0gY3JjOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja2V0TGluZUluLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrZXRMaW5lSW4uamF2YQppbmRleCA4NzA2NGUxLi5jYzU1NmY4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrZXRMaW5lSW4uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrZXRMaW5lSW4uamF2YQpAQCAtNzQsNiArNzQsMTMgQEAKIAkvKiogTWFnaWMgcmV0dXJuIGZyb20ge0BsaW5rICNyZWFkU3RyaW5nKCl9IHdoZW4gYSBmbHVzaCBwYWNrZXQgaXMgZm91bmQuICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EID0gbmV3IFN0cmluZ0J1aWxkZXIoMCkudG9TdHJpbmcoKTsgCS8qIG11c3Qgbm90IHN0cmluZyBwb29sICovCiAKKwkvKioKKwkgKiBNYWdpYyByZXR1cm4gZnJvbSB7QGxpbmsgI3JlYWRTdHJpbmcoKX0gd2hlbiBhIGRlbGltIHBhY2tldCBpcyBmb3VuZC4KKwkgKgorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxJTSA9IG5ldyBTdHJpbmdCdWlsZGVyKDApLnRvU3RyaW5nKCk7IAkvKiBtdXN0IG5vdCBzdHJpbmcgcG9vbCAqLworCiAJc3RhdGljIGVudW0gQWNrTmFja1Jlc3VsdCB7CiAJCS8qKiBOQUsgKi8KIAkJTkFLLApAQCAtMTE1LDcgKzEyMiw3IEBACiAJCXRoaXMubGltaXQgPSBsaW1pdDsKIAl9CiAKLQlBY2tOYWNrUmVzdWx0IHJlYWRBQ0soZmluYWwgTXV0YWJsZU9iamVjdElkIHJldHVybmVkSWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJQWNrTmFja1Jlc3VsdCByZWFkQUNLKE11dGFibGVPYmplY3RJZCByZXR1cm5lZElkKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmcgbGluZSA9IHJlYWRTdHJpbmcoKTsKIAkJaWYgKGxpbmUubGVuZ3RoKCkgPT0gMCkKIAkJCXRocm93IG5ldyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkuZXhwZWN0ZWRBQ0tOQUtGb3VuZEVPRik7CkBAIC0xNDcsNiArMTU0LDcgQEAKIAkgKiB1c2Uge0BsaW5rICNyZWFkU3RyaW5nUmF3KCl9IGluc3RlYWQuCiAJICoKIAkgKiBAcmV0dXJuIHRoZSBzdHJpbmcuIHtAbGluayAjRU5EfSBpZiB0aGUgc3RyaW5nIHdhcyB0aGUgbWFnaWMgZmx1c2gKKwkgKiAgICAgICAgIHBhY2tldCwge0BsaW5rICNERUxJTX0gaWYgdGhlIHN0cmluZyB3YXMgdGhlIG1hZ2ljIERFTElNCiAJICogICAgICAgICBwYWNrZXQuCiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIHN0cmVhbSBjYW5ub3QgYmUgcmVhZC4KQEAgLTE1Nyw2ICsxNjUsMTAgQEAKIAkJCWxvZy5kZWJ1ZygiZ2l0PCAwMDAwIik7IC8vJE5PTi1OTFMtMSQKIAkJCXJldHVybiBFTkQ7CiAJCX0KKwkJaWYgKGxlbiA9PSAxKSB7CisJCQlsb2cuZGVidWcoImdpdDwgMDAwMSIpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gREVMSU07CisJCX0KIAogCQlsZW4gLT0gNDsgLy8gbGVuZ3RoIGhlYWRlciAoNCBieXRlcykKIAkJaWYgKGxlbiA9PSAwKSB7CkBAIC0yMzIsNiArMjQ0LDggQEAKIAogCQlpZiAobGVuID09IDApIHsKIAkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKGxlbiA9PSAxKSB7CisJCQlyZXR1cm4gMTsKIAkJfSBlbHNlIGlmIChsZW4gPCA0KSB7CiAJCQl0aHJvdyBpbnZhbGlkSGVhZGVyKCk7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tldExpbmVPdXQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tldExpbmVPdXQuamF2YQppbmRleCA0OGJkZDAxLi5hMjZkMWQ3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrZXRMaW5lT3V0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja2V0TGluZU91dC5qYXZhCkBAIC03OCw3ICs3OCw3IEBACiAJICogQHBhcmFtIG91dHB1dFN0cmVhbQogCSAqICAgICAgICAgICAgc3RyZWFtLgogCSAqLwotCXB1YmxpYyBQYWNrZXRMaW5lT3V0KGZpbmFsIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pIHsKKwlwdWJsaWMgUGFja2V0TGluZU91dChPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB7CiAJCW91dCA9IG91dHB1dFN0cmVhbTsKIAkJbGVuYnVmZmVyID0gbmV3IGJ5dGVbNV07CiAJCWZsdXNoT25FbmQgPSB0cnVlOwpAQCAtMTA0LDcgKzEwNCw3IEBACiAJICogICAgICAgICAgICAgdGhlIHBhY2tldCBjb3VsZCBub3QgYmUgd3JpdHRlbiwgdGhlIHN0cmVhbSBpcyBjb3JydXB0ZWQgYXMKIAkgKiAgICAgICAgICAgICB0aGUgcGFja2V0IG1heSBoYXZlIGJlZW4gb25seSBwYXJ0aWFsbHkgd3JpdHRlbi4KIAkgKi8KLQlwdWJsaWMgdm9pZCB3cml0ZVN0cmluZyhmaW5hbCBTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJd3JpdGVQYWNrZXQoQ29uc3RhbnRzLmVuY29kZShzKSk7CiAJfQogCkBAIC0xNDcsNiArMTQ3LDIwIEBACiAJfQogCiAJLyoqCisJICogV3JpdGUgYSBwYWNrZXQgZGVsaW0gbWFya2VyICgwMDAxKS4KKwkgKgorCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIHRoZSBtYXJrZXIgY291bGQgbm90IGJlIHdyaXR0ZW4sIHRoZSBzdHJlYW0gaXMgY29ycnVwdGVkCisJICogICAgICAgICAgICAgYXMgdGhlIG1hcmtlciBtYXkgaGF2ZSBiZWVuIG9ubHkgcGFydGlhbGx5IHdyaXR0ZW4uCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyB2b2lkIHdyaXRlRGVsaW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlmb3JtYXRMZW5ndGgoMSk7CisJCW91dC53cml0ZShsZW5idWZmZXIsIDAsIDQpOworCQlsb2cuZGVidWcoImdpdD4gMDAwMSIpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCiAJICogV3JpdGUgYSBwYWNrZXQgZW5kIG1hcmtlciwgc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIGEgZmx1c2ggY29tbWFuZC4KIAkgKiA8cD4KIAkgKiBUZWNobmljYWxseSB0aGlzIGlzIGEgbWFnaWNhbCBwYWNrZXQgdHlwZSB3aGljaCBjYW4gYmUgZGV0ZWN0ZWQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1Byb2dyZXNzU3Bpbm5lci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHJvZ3Jlc3NTcGlubmVyLmphdmEKaW5kZXggNDFhZjgwNy4uMjM2NDQzNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHJvZ3Jlc3NTcGlubmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHJvZ3Jlc3NTcGlubmVyLmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKQEAgLTE0MSw3ICsxNDEsNyBAQAogCXByaXZhdGUgdm9pZCB3cml0ZShTdHJpbmcgcykgewogCQlpZiAod3JpdGUpIHsKIAkJCXRyeSB7Ci0JCQkJb3V0LndyaXRlKHMuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCQlvdXQud3JpdGUocy5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCQkJb3V0LmZsdXNoKCk7CiAJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAJCQkJd3JpdGUgPSBmYWxzZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hDZXJ0aWZpY2F0ZUlkZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoQ2VydGlmaWNhdGVJZGVudC5qYXZhCmluZGV4IGY5ZmRkYmUuLjE3OGM4MGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hDZXJ0aWZpY2F0ZUlkZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaENlcnRpZmljYXRlSWRlbnQuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0OwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5SYXdQYXJzZVV0aWxzLmxhc3RJbmRleE9mVHJpbTsKIAogaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwpAQCAtOTUsNyArOTUsNyBAQAogCSAqLwogCXB1YmxpYyBzdGF0aWMgUHVzaENlcnRpZmljYXRlSWRlbnQgcGFyc2UoU3RyaW5nIHN0cikgewogCQlNdXRhYmxlSW50ZWdlciBwID0gbmV3IE11dGFibGVJbnRlZ2VyKCk7Ci0JCWJ5dGVbXSByYXcgPSBzdHIuZ2V0Qnl0ZXMoVVRGXzgpOworCQlieXRlW10gcmF3ID0gc3RyLmdldEJ5dGVzKENIQVJTRVQpOwogCQlpbnQgdHpCZWdpbiA9IHJhdy5sZW5ndGggLSAxOwogCQl0ekJlZ2luID0gbGFzdEluZGV4T2ZUcmltKHJhdywgJyAnLCB0ekJlZ2luKTsKIAkJaWYgKHR6QmVnaW4gPCAwIHx8IHJhd1t0ekJlZ2luXSAhPSAnICcpIHsKQEAgLTEyOSw3ICsxMjksNyBAQAogCQkJCWlkRW5kID0gcmF3Lmxlbmd0aDsKIAkJCX0KIAkJfQotCQlTdHJpbmcgaWQgPSBuZXcgU3RyaW5nKHJhdywgMCwgaWRFbmQsIFVURl84KTsKKwkJU3RyaW5nIGlkID0gbmV3IFN0cmluZyhyYXcsIDAsIGlkRW5kLCBDSEFSU0VUKTsKIAogCQlyZXR1cm4gbmV3IFB1c2hDZXJ0aWZpY2F0ZUlkZW50KHN0ciwgaWQsIHdoZW4gKiAxMDAwTCwgdHopOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hDZXJ0aWZpY2F0ZVN0b3JlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoQ2VydGlmaWNhdGVTdG9yZS5qYXZhCmluZGV4IGFiNThhMzMuLjdmNWEzNDAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hDZXJ0aWZpY2F0ZVN0b3JlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaENlcnRpZmljYXRlU3RvcmUuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0OwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpfQkxPQjsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSl9DT01NSVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkZpbGVNb2RlLlRZUEVfRklMRTsKQEAgLTE5Miw3ICsxOTIsNyBAQAogCSAqIEByZXR1cm4gaXRlcmFibGUgb3ZlciBjZXJ0aWZpY2F0ZXM7IG11c3QgYmUgZnVsbHkgaXRlcmF0ZWQgaW4gb3JkZXIgdG8KIAkgKiAgICAgICAgIGNsb3NlIHJlc291cmNlcy4KIAkgKi8KLQlwdWJsaWMgSXRlcmFibGU8UHVzaENlcnRpZmljYXRlPiBnZXRBbGwoZmluYWwgU3RyaW5nIHJlZk5hbWUpIHsKKwlwdWJsaWMgSXRlcmFibGU8UHVzaENlcnRpZmljYXRlPiBnZXRBbGwoU3RyaW5nIHJlZk5hbWUpIHsKIAkJcmV0dXJuIG5ldyBJdGVyYWJsZTxQdXNoQ2VydGlmaWNhdGU+KCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8UHVzaENlcnRpZmljYXRlPiBpdGVyYXRvcigpIHsKQEAgLTI5Miw3ICsyOTIsNyBAQAogCQlPYmplY3RMb2FkZXIgbG9hZGVyID0KIAkJCQl0dy5nZXRPYmplY3RSZWFkZXIoKS5vcGVuKHR3LmdldE9iamVjdElkKDApLCBPQkpfQkxPQik7CiAJCXRyeSAoSW5wdXRTdHJlYW0gaW4gPSBsb2FkZXIub3BlblN0cmVhbSgpOwotCQkJCVJlYWRlciByID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbiwgVVRGXzgpKSkgeworCQkJCVJlYWRlciByID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbiwgQ0hBUlNFVCkpKSB7CiAJCQlyZXR1cm4gUHVzaENlcnRpZmljYXRlUGFyc2VyLmZyb21SZWFkZXIocik7CiAJCX0KIAl9CkBAIC00NzMsNyArNDczLDcgQEAKIAogCQlEaXJDYWNoZUVkaXRvciBlZGl0b3IgPSBkYy5lZGl0b3IoKTsKIAkJU3RyaW5nIGNlcnRUZXh0ID0gcGMuY2VydC50b1RleHQoKSArIHBjLmNlcnQuZ2V0U2lnbmF0dXJlKCk7Ci0JCWZpbmFsIE9iamVjdElkIGNlcnRJZCA9IGluc2VydGVyLmluc2VydChPQkpfQkxPQiwgY2VydFRleHQuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJZmluYWwgT2JqZWN0SWQgY2VydElkID0gaW5zZXJ0ZXIuaW5zZXJ0KE9CSl9CTE9CLCBjZXJ0VGV4dC5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWJvb2xlYW4gYW55ID0gZmFsc2U7CiAJCWZvciAoUmVjZWl2ZUNvbW1hbmQgY21kIDogcGMuY2VydC5nZXRDb21tYW5kcygpKSB7CiAJCQlpZiAoYnlSZWYgIT0gbnVsbCAmJiAhY29tbWFuZHNFcXVhbChjbWQsIGJ5UmVmLmdldChjbWQuZ2V0UmVmTmFtZSgpKSkpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hQcm9jZXNzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoUHJvY2Vzcy5qYXZhCmluZGV4IDMyMDE3MzIuLjQ3MGEzYzAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hQcm9jZXNzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaFByb2Nlc3MuamF2YQpAQCAtNDgsNyArNDgsNyBAQAogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCkBAIC0xMjQsMTAgKzEyNCwxMCBAQAogCQkJdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCXRoaXMud2Fsa2VyID0gbmV3IFJldldhbGsodHJhbnNwb3J0LmxvY2FsKTsKIAkJdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7Ci0JCXRoaXMudG9QdXNoID0gbmV3IEhhc2hNYXA8PigpOworCQl0aGlzLnRvUHVzaCA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKIAkJdGhpcy5vdXQgPSBvdXQ7CiAJCXRoaXMucHVzaE9wdGlvbnMgPSB0cmFuc3BvcnQuZ2V0UHVzaE9wdGlvbnMoKTsKLQkJZm9yIChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgcnJ1IDogdG9QdXNoKSB7CisJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHJydSA6IHRvUHVzaCkgewogCQkJaWYgKHRoaXMudG9QdXNoLnB1dChycnUuZ2V0UmVtb3RlTmFtZSgpLCBycnUpICE9IG51bGwpCiAJCQkJdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQkJCUpHaXRUZXh0LmdldCgpLmR1cGxpY2F0ZVJlbW90ZVJlZlVwZGF0ZUlzSWxsZWdhbCwgcnJ1LmdldFJlbW90ZU5hbWUoKSkpOwpAQCAtMTUwLDcgKzE1MCw3IEBACiAJICogICAgICAgICAgICAgd2hlbiBzb21lIGVycm9yIG9jY3VycmVkIGR1cmluZyBvcGVyYXRpb24sIGxpa2UgSS9PLCBwcm90b2NvbAogCSAqICAgICAgICAgICAgIGVycm9yLCBvciBsb2NhbCBkYXRhYmFzZSBjb25zaXN0ZW5jeSBlcnJvci4KIAkgKi8KLQlQdXNoUmVzdWx0IGV4ZWN1dGUoZmluYWwgUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCisJUHVzaFJlc3VsdCBleGVjdXRlKFByb2dyZXNzTW9uaXRvciBtb25pdG9yKQogCQkJdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiwgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCW1vbml0b3IuYmVnaW5UYXNrKFBST0dSRVNTX09QRU5JTkdfQ09OTkVDVElPTiwKQEAgLTE3Niw3ICsxNzYsNyBAQAogCQkJfQogCQkJaWYgKCF0cmFuc3BvcnQuaXNEcnlSdW4oKSkKIAkJCQl1cGRhdGVUcmFja2luZ1JlZnMoKTsKLQkJCWZvciAoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHJydSA6IHRvUHVzaC52YWx1ZXMoKSkgeworCQkJZm9yIChSZW1vdGVSZWZVcGRhdGUgcnJ1IDogdG9QdXNoLnZhbHVlcygpKSB7CiAJCQkJZmluYWwgVHJhY2tpbmdSZWZVcGRhdGUgdHJ1ID0gcnJ1LmdldFRyYWNraW5nUmVmVXBkYXRlKCk7CiAJCQkJaWYgKHRydSAhPSBudWxsKQogCQkJCQlyZXMuYWRkKHRydSk7CkBAIC0xOTAsOCArMTkwLDggQEAKIAlwcml2YXRlIE1hcDxTdHJpbmcsIFJlbW90ZVJlZlVwZGF0ZT4gcHJlcGFyZVJlbW90ZVVwZGF0ZXMoKQogCQkJdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCWJvb2xlYW4gYXRvbWljID0gdHJhbnNwb3J0LmlzUHVzaEF0b21pYygpOwotCQlmaW5hbCBNYXA8U3RyaW5nLCBSZW1vdGVSZWZVcGRhdGU+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPD4oKTsKLQkJZm9yIChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgcnJ1IDogdG9QdXNoLnZhbHVlcygpKSB7CisJCWZpbmFsIE1hcDxTdHJpbmcsIFJlbW90ZVJlZlVwZGF0ZT4gcmVzdWx0ID0gbmV3IExpbmtlZEhhc2hNYXA8PigpOworCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSBycnUgOiB0b1B1c2gudmFsdWVzKCkpIHsKIAkJCWZpbmFsIFJlZiBhZHZlcnRpc2VkUmVmID0gY29ubmVjdGlvbi5nZXRSZWYocnJ1LmdldFJlbW90ZU5hbWUoKSk7CiAJCQlPYmplY3RJZCBhZHZlcnRpc2VkT2xkID0gbnVsbDsKIAkJCWlmIChhZHZlcnRpc2VkUmVmICE9IG51bGwpIHsKQEAgLTI3NywxMyArMjc3LDEzIEBACiAJfQogCiAJcHJpdmF0ZSB2b2lkIG1vZGlmeVVwZGF0ZXNGb3JEcnlSdW4oKSB7Ci0JCWZvciAoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHJydSA6IHRvUHVzaC52YWx1ZXMoKSkKKwkJZm9yIChSZW1vdGVSZWZVcGRhdGUgcnJ1IDogdG9QdXNoLnZhbHVlcygpKQogCQkJaWYgKHJydS5nZXRTdGF0dXMoKSA9PSBTdGF0dXMuTk9UX0FUVEVNUFRFRCkKIAkJCQlycnUuc2V0U3RhdHVzKFN0YXR1cy5PSyk7CiAJfQogCiAJcHJpdmF0ZSB2b2lkIHVwZGF0ZVRyYWNraW5nUmVmcygpIHsKLQkJZm9yIChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgcnJ1IDogdG9QdXNoLnZhbHVlcygpKSB7CisJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHJydSA6IHRvUHVzaC52YWx1ZXMoKSkgewogCQkJZmluYWwgU3RhdHVzIHN0YXR1cyA9IHJydS5nZXRTdGF0dXMoKTsKIAkJCWlmIChycnUuaGFzVHJhY2tpbmdSZWZVcGRhdGUoKQogCQkJCQkmJiAoc3RhdHVzID09IFN0YXR1cy5VUF9UT19EQVRFIHx8IHN0YXR1cyA9PSBTdGF0dXMuT0spKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoUmVzdWx0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoUmVzdWx0LmphdmEKaW5kZXggOGJhZTVhNS4uNTQ1MjcwNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaFJlc3VsdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hSZXN1bHQuamF2YQpAQCAtODIsNyArODIsNyBAQAogCSAqICAgICAgICAgICAgcmVtb3RlIHJlZiBuYW1lCiAJICogQHJldHVybiBzdGF0dXMgb2YgcmVtb3RlIHJlZiB1cGRhdGUKIAkgKi8KLQlwdWJsaWMgUmVtb3RlUmVmVXBkYXRlIGdldFJlbW90ZVVwZGF0ZShmaW5hbCBTdHJpbmcgcmVmTmFtZSkgeworCXB1YmxpYyBSZW1vdGVSZWZVcGRhdGUgZ2V0UmVtb3RlVXBkYXRlKFN0cmluZyByZWZOYW1lKSB7CiAJCXJldHVybiByZW1vdGVVcGRhdGVzLmdldChyZWZOYW1lKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlY2VpdmVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWNlaXZlQ29tbWFuZC5qYXZhCmluZGV4IGUxNGQxOGYuLmQ2MWFlYjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlY2VpdmVDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVjZWl2ZUNvbW1hbmQuamF2YQpAQCAtNzEzLDcgKzcxMyw3IEBACiAJICogQHBhcmFtIHMKIAkgKiAgICAgICAgICAgIHRoZSBuZXcgc3RhdHVzIGNvZGUgZm9yIHRoaXMgY29tbWFuZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXN1bHQoZmluYWwgUmVzdWx0IHMpIHsKKwlwdWJsaWMgdm9pZCBzZXRSZXN1bHQoUmVzdWx0IHMpIHsKIAkJc2V0UmVzdWx0KHMsIG51bGwpOwogCX0KIApAQCAtNzI1LDcgKzcyNSw3IEBACiAJICogQHBhcmFtIG0KIAkgKiAgICAgICAgICAgIG9wdGlvbmFsIG1lc3NhZ2UgZXhwbGFpbmluZyB0aGUgbmV3IHN0YXR1cy4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXN1bHQoZmluYWwgUmVzdWx0IHMsIGZpbmFsIFN0cmluZyBtKSB7CisJcHVibGljIHZvaWQgc2V0UmVzdWx0KFJlc3VsdCBzLCBTdHJpbmcgbSkgewogCQlzdGF0dXMgPSBzOwogCQltZXNzYWdlID0gbTsKIAl9CkBAIC03NzAsNyArNzcwLDcgQEAKIAkgKiAgICAgICAgICAgIHJlY2VpdmUtcGFjayBzZXNzaW9uLgogCSAqIEBzaW5jZSAyLjAKIAkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKGZpbmFsIEJhc2VSZWNlaXZlUGFjayBycCkgeworCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQmFzZVJlY2VpdmVQYWNrIHJwKSB7CiAJCXRyeSB7CiAJCQlTdHJpbmcgZXhwVGFyZ2V0ID0gZ2V0T2xkU3ltcmVmKCk7CiAJCQlib29sZWFuIGRldGFjaCA9IGdldE5ld1N5bXJlZigpICE9IG51bGwKQEAgLTgxOCwxMSArODE4LDExIEBACiAJCX0KIAl9CiAKLQl2b2lkIHNldFJlZihmaW5hbCBSZWYgcikgeworCXZvaWQgc2V0UmVmKFJlZiByKSB7CiAJCXJlZiA9IHI7CiAJfQogCi0Jdm9pZCBzZXRUeXBlKGZpbmFsIFR5cGUgdCkgeworCXZvaWQgc2V0VHlwZShUeXBlIHQpIHsKIAkJdHlwZSA9IHQ7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWNlaXZlUGFjay5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVjZWl2ZVBhY2suamF2YQppbmRleCA3YzVmMzJhLi4zNWZiMGIxNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVjZWl2ZVBhY2suamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWNlaXZlUGFjay5qYXZhCkBAIC04OCw3ICs4OCw3IEBACiAJICogQHBhcmFtIGludG8KIAkgKiAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiByZXBvc2l0b3J5LgogCSAqLwotCXB1YmxpYyBSZWNlaXZlUGFjayhmaW5hbCBSZXBvc2l0b3J5IGludG8pIHsKKwlwdWJsaWMgUmVjZWl2ZVBhY2soUmVwb3NpdG9yeSBpbnRvKSB7CiAJCXN1cGVyKGludG8pOwogCQlwcmVSZWNlaXZlID0gUHJlUmVjZWl2ZUhvb2suTlVMTDsKIAkJcG9zdFJlY2VpdmUgPSBQb3N0UmVjZWl2ZUhvb2suTlVMTDsKQEAgLTE1NCw3ICsxNTQsNyBAQAogCSAqIEBwYXJhbSBoCiAJICogICAgICAgICAgICB0aGUgaG9vayBpbnN0YW5jZTsgbWF5IGJlIG51bGwgdG8gZGlzYWJsZSB0aGUgaG9vay4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVSZWNlaXZlSG9vayhmaW5hbCBQcmVSZWNlaXZlSG9vayBoKSB7CisJcHVibGljIHZvaWQgc2V0UHJlUmVjZWl2ZUhvb2soUHJlUmVjZWl2ZUhvb2sgaCkgewogCQlwcmVSZWNlaXZlID0gaCAhPSBudWxsID8gaCA6IFByZVJlY2VpdmVIb29rLk5VTEw7CiAJfQogCkBAIC0xNzgsNyArMTc4LDcgQEAKIAkgKiBAcGFyYW0gaAogCSAqICAgICAgICAgICAgdGhlIGhvb2sgaW5zdGFuY2U7IG1heSBiZSBudWxsIHRvIGRpc2FibGUgdGhlIGhvb2suCiAJICovCi0JcHVibGljIHZvaWQgc2V0UG9zdFJlY2VpdmVIb29rKGZpbmFsIFBvc3RSZWNlaXZlSG9vayBoKSB7CisJcHVibGljIHZvaWQgc2V0UG9zdFJlY2VpdmVIb29rKFBvc3RSZWNlaXZlSG9vayBoKSB7CiAJCXBvc3RSZWNlaXZlID0gaCAhPSBudWxsID8gaCA6IFBvc3RSZWNlaXZlSG9vay5OVUxMOwogCX0KIApAQCAtMjg4LDcgKzI4OCw3IEBACiAJCQkJaWYgKGVjaG9Db21tYW5kRmFpbHVyZXMgJiYgbXNnT3V0ICE9IG51bGwpIHsKIAkJCQkJc2VuZFN0YXR1c1JlcG9ydChmYWxzZSwgdW5wYWNrRXJyb3IsIG5ldyBSZXBvcnRlcigpIHsKIAkJCQkJCUBPdmVycmlkZQotCQkJCQkJdm9pZCBzZW5kU3RyaW5nKGZpbmFsIFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJCQkJdm9pZCBzZW5kU3RyaW5nKFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCQkJCW1zZ091dC53cml0ZShDb25zdGFudHMuZW5jb2RlKHMgKyAiXG4iKSk7IC8vJE5PTi1OTFMtMSQKIAkJCQkJCX0KIAkJCQkJfSk7CkBAIC0zMDEsNyArMzAxLDcgQEAKIAkJCQl9CiAJCQkJc2VuZFN0YXR1c1JlcG9ydCh0cnVlLCB1bnBhY2tFcnJvciwgbmV3IFJlcG9ydGVyKCkgewogCQkJCQlAT3ZlcnJpZGUKLQkJCQkJdm9pZCBzZW5kU3RyaW5nKGZpbmFsIFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJCQl2b2lkIHNlbmRTdHJpbmcoU3RyaW5nIHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJCQlwY2tPdXQud3JpdGVTdHJpbmcocyArICJcbiIpOyAvLyROT04tTkxTLTEkCiAJCQkJCX0KIAkJCQl9KTsKQEAgLTMwOSw3ICszMDksNyBAQAogCQkJfSBlbHNlIGlmIChtc2dPdXQgIT0gbnVsbCkgewogCQkJCXNlbmRTdGF0dXNSZXBvcnQoZmFsc2UsIHVucGFja0Vycm9yLCBuZXcgUmVwb3J0ZXIoKSB7CiAJCQkJCUBPdmVycmlkZQotCQkJCQl2b2lkIHNlbmRTdHJpbmcoZmluYWwgU3RyaW5nIHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQkJCXZvaWQgc2VuZFN0cmluZyhTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCQkJCW1zZ091dC53cml0ZShDb25zdGFudHMuZW5jb2RlKHMgKyAiXG4iKSk7IC8vJE5PTi1OTFMtMSQKIAkJCQkJfQogCQkJCX0pOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVmQWR2ZXJ0aXNlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVmQWR2ZXJ0aXNlci5qYXZhCmluZGV4IDVlYjE2NjEuLmRjMTg3MWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlZkFkdmVydGlzZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWZBZHZlcnRpc2VyLmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKRUNUX0lEX1NUUklOR19MRU5HVEg7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkdpdFByb3RvY29sQ29uc3RhbnRzLk9QVElPTl9TWU1SRUY7CiAKQEAgLTUzLDExICs1MywxMiBAQAogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldEVuY29kZXI7CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5Db2RlclJlc3VsdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkFueU9iamVjdElkOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKQEAgLTY1LDcgKzY2LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmQ29tcGFyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5SZWZNYXA7CiAKIC8qKgogICogU3VwcG9ydCBmb3IgdGhlIHN0YXJ0IG9mIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5VcGxvYWRQYWNrfSBhbmQKQEAgLTc0LDcgKzc0LDcgQEAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZWZBZHZlcnRpc2VyIHsKIAkvKiogQWR2ZXJ0aXNlciB3aGljaCBmcmFtZXMgbGluZXMgaW4gYSB7QGxpbmsgUGFja2V0TGluZU91dH0gZm9ybWF0LiAqLwogCXB1YmxpYyBzdGF0aWMgY2xhc3MgUGFja2V0TGluZU91dFJlZkFkdmVydGlzZXIgZXh0ZW5kcyBSZWZBZHZlcnRpc2VyIHsKLQkJcHJpdmF0ZSBmaW5hbCBDaGFyc2V0RW5jb2RlciB1dGY4ID0gVVRGXzgubmV3RW5jb2RlcigpOworCQlwcml2YXRlIGZpbmFsIENoYXJzZXRFbmNvZGVyIHV0ZjggPSBDSEFSU0VULm5ld0VuY29kZXIoKTsKIAkJcHJpdmF0ZSBmaW5hbCBQYWNrZXRMaW5lT3V0IHBja091dDsKIAogCQlwcml2YXRlIGJ5dGVbXSBiaW5BcnIgPSBuZXcgYnl0ZVsyNTZdOwpAQCAtMTUyLDcgKzE1Miw3IEBACiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgd3JpdGVPbmUoZmluYWwgQ2hhclNlcXVlbmNlIGxpbmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXByb3RlY3RlZCB2b2lkIHdyaXRlT25lKENoYXJTZXF1ZW5jZSBsaW5lKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJcGNrT3V0LndyaXRlU3RyaW5nKGxpbmUudG9TdHJpbmcoKSk7CiAJCX0KIApAQCAtMTc2LDYgKzE3NiwxMSBAQAogCiAJYm9vbGVhbiBmaXJzdCA9IHRydWU7CiAKKwlwcml2YXRlIGJvb2xlYW4gdXNlUHJvdG9jb2xWMjsKKworCS8qIG9ubHkgdXNlZCBpbiBwcm90b2NvbCB2MiAqLworCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBzeW1yZWZzID0gbmV3IEhhc2hNYXA8PigpOworCiAJLyoqCiAJICogSW5pdGlhbGl6ZSB0aGlzIGFkdmVydGlzZXIgd2l0aCBhIHJlcG9zaXRvcnkgZm9yIHBlZWxpbmcgdGFncy4KIAkgKgpAQCAtMTg3LDYgKzE5MiwxNiBAQAogCX0KIAogCS8qKgorCSAqIEBwYXJhbSBiCisJICogICAgICAgICAgICAgIHRydWUgaWYgdGhpcyBhZHZlcnRpc2VyIHNob3VsZCBhZHZlcnRpc2UgdXNpbmcgdGhlIHByb3RvY29sCisJICogICAgICAgICAgICAgIHYyIGZvcm1hdCwgZmFsc2Ugb3RoZXJ3aXNlCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyB2b2lkIHNldFVzZVByb3RvY29sVjIoYm9vbGVhbiBiKSB7CisJCXVzZVByb3RvY29sVjIgPSBiOworCX0KKworCS8qKgogCSAqIFRvZ2dsZSB0YWcgcGVlbGluZy4KIAkgKiA8cD4KIAkgKiA8cD4KQEAgLTE5OSw3ICsyMTQsNyBAQAogCSAqICAgICAgICAgICAgdHJ1ZSB0byBzaG93IHRoZSBkZXJlZmVyZW5jZWQgdmFsdWUgb2YgYSB0YWcgYXMgdGhlIHNwZWNpYWwKIAkgKiAgICAgICAgICAgIHJlZiA8Y29kZT4kdGFnXnt9PC9jb2RlPiA7IGZhbHNlIHRvIG9taXQgaXQgZnJvbSB0aGUgb3V0cHV0LgogCSAqLwotCXB1YmxpYyB2b2lkIHNldERlcmVmVGFncyhmaW5hbCBib29sZWFuIGRlcmVmKSB7CisJcHVibGljIHZvaWQgc2V0RGVyZWZUYWdzKGJvb2xlYW4gZGVyZWYpIHsKIAkJZGVyZWZUYWdzID0gZGVyZWY7CiAJfQogCkBAIC0yNTMsNyArMjY4LDExIEBACiAJICogQHNpbmNlIDMuNgogCSAqLwogCXB1YmxpYyB2b2lkIGFkZFN5bXJlZihTdHJpbmcgZnJvbSwgU3RyaW5nIHRvKSB7Ci0JCWFkdmVydGlzZUNhcGFiaWxpdHkoT1BUSU9OX1NZTVJFRiwgZnJvbSArICc6JyArIHRvKTsKKwkJaWYgKHVzZVByb3RvY29sVjIpIHsKKwkJCXN5bXJlZnMucHV0KGZyb20sIHRvKTsKKwkJfSBlbHNlIHsKKwkJCWFkdmVydGlzZUNhcGFiaWxpdHkoT1BUSU9OX1NZTVJFRiwgZnJvbSArICc6JyArIHRvKTsKKwkJfQogCX0KIAogCS8qKgpAQCAtMjY3LDEzICsyODYsNTUgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgdW5kZXJseWluZyBvdXRwdXQgc3RyZWFtIGZhaWxlZCB0byB3cml0ZSBvdXQgYW4KIAkgKiAgICAgICAgICAgICBhZHZlcnRpc2VtZW50IHJlY29yZC4KKwkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNzZW5kKENvbGxlY3Rpb24pfSBpbnN0ZWFkLgogCSAqLworCUBEZXByZWNhdGVkCiAJcHVibGljIFNldDxPYmplY3RJZD4gc2VuZChNYXA8U3RyaW5nLCBSZWY+IHJlZnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZvciAoUmVmIHJlZiA6IGdldFNvcnRlZFJlZnMocmVmcykpIHsKLQkJCWlmIChyZWYuZ2V0T2JqZWN0SWQoKSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOworCQlyZXR1cm4gc2VuZChyZWZzLnZhbHVlcygpKTsKKwl9CiAKLQkJCWFkdmVydGlzZUFueShyZWYuZ2V0T2JqZWN0SWQoKSwgcmVmLmdldE5hbWUoKSk7CisJLyoqCisJICogRm9ybWF0IGFuIGFkdmVydGlzZW1lbnQgZm9yIHRoZSBzdXBwbGllZCByZWZzLgorCSAqCisJICogQHBhcmFtIHJlZnMKKwkgKiAgICAgICAgICAgIHplcm8gb3IgbW9yZSByZWZzIHRvIGZvcm1hdCBmb3IgdGhlIGNsaWVudC4gVGhlIGNvbGxlY3Rpb24gaXMKKwkgKiAgICAgICAgICAgIHNvcnRlZCBiZWZvcmUgZGlzcGxheSBpZiBuZWNlc3NhcnksIGFuZCB0aGVyZWZvcmUgbWF5IGFwcGVhcgorCSAqICAgICAgICAgICAgaW4gYW55IG9yZGVyLgorCSAqIEByZXR1cm4gc2V0IG9mIE9iamVjdElkcyB0aGF0IHdlcmUgYWR2ZXJ0aXNlZCB0byB0aGUgY2xpZW50LgorCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIHRoZSB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0gZmFpbGVkIHRvIHdyaXRlIG91dCBhbgorCSAqICAgICAgICAgICAgIGFkdmVydGlzZW1lbnQgcmVjb3JkLgorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgU2V0PE9iamVjdElkPiBzZW5kKENvbGxlY3Rpb248UmVmPiByZWZzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlmb3IgKFJlZiByZWYgOiBSZWZDb21wYXJhdG9yLnNvcnQocmVmcykpIHsKKwkJCS8vIFRPRE8oanJuKSByZXZpdmUgdGhlIFNvcnRlZE1hcCBvcHRpbWl6YXRpb24gZS5nLiBieSBpbnRyb2R1Y2luZworCQkJLy8gU29ydGVkTGlzdAorCQkJT2JqZWN0SWQgb2JqZWN0SWQgPSByZWYuZ2V0T2JqZWN0SWQoKTsKKwkJCWlmIChvYmplY3RJZCA9PSBudWxsKSB7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmICh1c2VQcm90b2NvbFYyKSB7CisJCQkJU3RyaW5nIHN5bXJlZlBhcnQgPSBzeW1yZWZzLmNvbnRhaW5zS2V5KHJlZi5nZXROYW1lKCkpCisJCQkJCQk/ICgiIHN5bXJlZi10YXJnZXQ6IiArIHN5bXJlZnMuZ2V0KHJlZi5nZXROYW1lKCkpKSAvLyROT04tTkxTLTEkCisJCQkJCQk6ICIiOyAvLyROT04tTkxTLTEkCisJCQkJU3RyaW5nIHBlZWxQYXJ0ID0gIiI7IC8vJE5PTi1OTFMtMSQKKwkJCQlpZiAoZGVyZWZUYWdzKSB7CisJCQkJCWlmICghcmVmLmlzUGVlbGVkKCkgJiYgcmVwb3NpdG9yeSAhPSBudWxsKSB7CisJCQkJCQlyZWYgPSByZXBvc2l0b3J5LmdldFJlZkRhdGFiYXNlKCkucGVlbChyZWYpOworCQkJCQl9CisJCQkJCU9iamVjdElkIHBlZWxlZE9iamVjdElkID0gcmVmLmdldFBlZWxlZE9iamVjdElkKCk7CisJCQkJCWlmIChwZWVsZWRPYmplY3RJZCAhPSBudWxsKSB7CisJCQkJCQlwZWVsUGFydCA9ICIgcGVlbGVkOiIgKyBwZWVsZWRPYmplY3RJZC5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfQorCQkJCX0KKwkJCQl3cml0ZU9uZShvYmplY3RJZC5nZXROYW1lKCkgKyAiICIgKyByZWYuZ2V0TmFtZSgpICsgc3ltcmVmUGFydCAvLyROT04tTkxTLTEkCisJCQkJCQkrIHBlZWxQYXJ0ICsgIlxuIik7IC8vJE5PTi1OTFMtMSQKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJYWR2ZXJ0aXNlQW55KG9iamVjdElkLCByZWYuZ2V0TmFtZSgpKTsKIAogCQkJaWYgKCFkZXJlZlRhZ3MpCiAJCQkJY29udGludWU7CkBAIC0yODEsNyArMzQyLDcgQEAKIAkJCWlmICghcmVmLmlzUGVlbGVkKCkpIHsKIAkJCQlpZiAocmVwb3NpdG9yeSA9PSBudWxsKQogCQkJCQljb250aW51ZTsKLQkJCQlyZWYgPSByZXBvc2l0b3J5LnBlZWwocmVmKTsKKwkJCQlyZWYgPSByZXBvc2l0b3J5LmdldFJlZkRhdGFiYXNlKCkucGVlbChyZWYpOwogCQkJfQogCiAJCQlpZiAocmVmLmdldFBlZWxlZE9iamVjdElkKCkgIT0gbnVsbCkKQEAgLTI5MCwxMyArMzUxLDYgQEAKIAkJcmV0dXJuIHNlbnQ7CiAJfQogCi0JcHJpdmF0ZSBJdGVyYWJsZTxSZWY+IGdldFNvcnRlZFJlZnMoTWFwPFN0cmluZywgUmVmPiBhbGwpIHsKLQkJaWYgKGFsbCBpbnN0YW5jZW9mIFJlZk1hcAotCQkJCXx8IChhbGwgaW5zdGFuY2VvZiBTb3J0ZWRNYXAgJiYgKChTb3J0ZWRNYXApIGFsbCkuY29tcGFyYXRvcigpID09IG51bGwpKQotCQkJcmV0dXJuIGFsbC52YWx1ZXMoKTsKLQkJcmV0dXJuIFJlZkNvbXBhcmF0b3Iuc29ydChhbGwudmFsdWVzKCkpOwotCX0KLQogCS8qKgogCSAqIEFkdmVydGlzZSBvbmUgb2JqZWN0IGlzIGF2YWlsYWJsZSB1c2luZyB0aGUgbWFnaWMge0Bjb2RlIC5oYXZlfS4KIAkgKiA8cD4KQEAgLTMyNCwxMyArMzc4LDEzIEBACiAJCXJldHVybiBmaXJzdDsKIAl9CiAKLQlwcml2YXRlIHZvaWQgYWR2ZXJ0aXNlQW55T25jZShBbnlPYmplY3RJZCBvYmosIGZpbmFsIFN0cmluZyByZWZOYW1lKQorCXByaXZhdGUgdm9pZCBhZHZlcnRpc2VBbnlPbmNlKEFueU9iamVjdElkIG9iaiwgU3RyaW5nIHJlZk5hbWUpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAoIXNlbnQuY29udGFpbnMob2JqKSkKIAkJCWFkdmVydGlzZUFueShvYmosIHJlZk5hbWUpOwogCX0KIAotCXByaXZhdGUgdm9pZCBhZHZlcnRpc2VBbnkoQW55T2JqZWN0SWQgb2JqLCBmaW5hbCBTdHJpbmcgcmVmTmFtZSkKKwlwcml2YXRlIHZvaWQgYWR2ZXJ0aXNlQW55KEFueU9iamVjdElkIG9iaiwgU3RyaW5nIHJlZk5hbWUpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlzZW50LmFkZChvYmoudG9PYmplY3RJZCgpKTsKIAkJYWR2ZXJ0aXNlSWQob2JqLCByZWZOYW1lKTsKQEAgLTM1MSw3ICs0MDUsNyBAQAogCSAqICAgICAgICAgICAgIHRoZSB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0gZmFpbGVkIHRvIHdyaXRlIG91dCBhbgogCSAqICAgICAgICAgICAgIGFkdmVydGlzZW1lbnQgcmVjb3JkLgogCSAqLwotCXB1YmxpYyB2b2lkIGFkdmVydGlzZUlkKGZpbmFsIEFueU9iamVjdElkIGlkLCBmaW5hbCBTdHJpbmcgcmVmTmFtZSkKKwlwdWJsaWMgdm9pZCBhZHZlcnRpc2VJZChBbnlPYmplY3RJZCBpZCwgU3RyaW5nIHJlZk5hbWUpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0bXBMaW5lLnNldExlbmd0aCgwKTsKIAkJaWQuY29weVRvKHRtcElkLCB0bXBMaW5lKTsKQEAgLTM2MSw3ICs0MTUsNyBAQAogCQkJZmlyc3QgPSBmYWxzZTsKIAkJCWlmICghY2FwYWJsaXRpZXMuaXNFbXB0eSgpKSB7CiAJCQkJdG1wTGluZS5hcHBlbmQoJ1wwJyk7Ci0JCQkJZm9yIChmaW5hbCBTdHJpbmcgY2FwTmFtZSA6IGNhcGFibGl0aWVzKSB7CisJCQkJZm9yIChTdHJpbmcgY2FwTmFtZSA6IGNhcGFibGl0aWVzKSB7CiAJCQkJCXRtcExpbmUuYXBwZW5kKCcgJyk7CiAJCQkJCXRtcExpbmUuYXBwZW5kKGNhcE5hbWUpOwogCQkJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlZkZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVmRmlsdGVyLmphdmEKaW5kZXggYmJlNGY4NC4uOTkyZGRjNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVmRmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVmRmlsdGVyLmphdmEKQEAgLTYzLDcgKzYzLDcgQEAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFJlZkZpbHRlciBERUZBVUxUID0gbmV3IFJlZkZpbHRlcigpIHsKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBNYXA8U3RyaW5nLCBSZWY+IGZpbHRlciAoZmluYWwgTWFwPFN0cmluZywgUmVmPiByZWZzKSB7CisJCXB1YmxpYyBNYXA8U3RyaW5nLCBSZWY+IGZpbHRlciAoTWFwPFN0cmluZywgUmVmPiByZWZzKSB7CiAJCQlyZXR1cm4gcmVmczsKIAkJfQogCX07CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWZTcGVjLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWZTcGVjLmphdmEKaW5kZXggZTFiMzA2ZS4uYWZkM2FkYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVmU3BlYy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlZlNwZWMuamF2YQpAQCAtNzIsNyArNzIsNyBAQAogCSAqICAgICAgICAgICAgcmVmIHNwZWMgY29tcG9uZW50IC0gc3RyaW5nIHRvIHRlc3QuIENhbiBiZSBudWxsLgogCSAqIEByZXR1cm4gdHJ1ZSBpZiBwcm92aWRlZCBzdHJpbmcgaXMgYSB3aWxkY2FyZCByZWYgc3BlYyBjb21wb25lbnQuCiAJICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzV2lsZGNhcmQoZmluYWwgU3RyaW5nIHMpIHsKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXaWxkY2FyZChTdHJpbmcgcykgewogCQlyZXR1cm4gcyAhPSBudWxsICYmIHMuY29udGFpbnMoIioiKTsgLy8kTk9OLU5MUy0xJAogCX0KIApAQCAtMjIyLDExICsyMjIsMTEgQEAKIAkgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgc3BlY2lmaWNhdGlvbiBpcyBpbnZhbGlkLgogCSAqLwotCXB1YmxpYyBSZWZTcGVjKGZpbmFsIFN0cmluZyBzcGVjKSB7CisJcHVibGljIFJlZlNwZWMoU3RyaW5nIHNwZWMpIHsKIAkJdGhpcyhzcGVjLCBXaWxkY2FyZE1vZGUuUkVRVUlSRV9NQVRDSCk7CiAJfQogCi0JcHJpdmF0ZSBSZWZTcGVjKGZpbmFsIFJlZlNwZWMgcCkgeworCXByaXZhdGUgUmVmU3BlYyhSZWZTcGVjIHApIHsKIAkJZm9yY2UgPSBwLmlzRm9yY2VVcGRhdGUoKTsKIAkJd2lsZGNhcmQgPSBwLmlzV2lsZGNhcmQoKTsKIAkJc3JjTmFtZSA9IHAuZ2V0U291cmNlKCk7CkBAIC0yNTAsNyArMjUwLDcgQEAKIAkgKiAgICAgICAgICAgIG5ldyB2YWx1ZSBmb3IgZm9yY2UgdXBkYXRlIGluIHRoZSByZXR1cm5lZCBpbnN0YW5jZS4KIAkgKiBAcmV0dXJuIGEgbmV3IFJlZlNwZWMgd2l0aCBmb3JjZSB1cGRhdGUgYXMgc3BlY2lmaWVkLgogCSAqLwotCXB1YmxpYyBSZWZTcGVjIHNldEZvcmNlVXBkYXRlKGZpbmFsIGJvb2xlYW4gZm9yY2VVcGRhdGUpIHsKKwlwdWJsaWMgUmVmU3BlYyBzZXRGb3JjZVVwZGF0ZShib29sZWFuIGZvcmNlVXBkYXRlKSB7CiAJCWZpbmFsIFJlZlNwZWMgciA9IG5ldyBSZWZTcGVjKHRoaXMpOwogCQlyLmZvcmNlID0gZm9yY2VVcGRhdGU7CiAJCXJldHVybiByOwpAQCAtMjkzLDcgKzI5Myw3IEBACiAJICogICAgICAgICAgICAgc3RhdHVzIG9mIHRoZSBleGlzdGluZyBkZXN0aW5hdGlvbiBkaXNhZ3JlZXMgd2l0aCB0aGUKIAkgKiAgICAgICAgICAgICB3aWxkY2FyZCBzdGF0dXMgb2YgdGhlIG5ldyBzb3VyY2UuCiAJICovCi0JcHVibGljIFJlZlNwZWMgc2V0U291cmNlKGZpbmFsIFN0cmluZyBzb3VyY2UpIHsKKwlwdWJsaWMgUmVmU3BlYyBzZXRTb3VyY2UoU3RyaW5nIHNvdXJjZSkgewogCQlmaW5hbCBSZWZTcGVjIHIgPSBuZXcgUmVmU3BlYyh0aGlzKTsKIAkJci5zcmNOYW1lID0gY2hlY2tWYWxpZChzb3VyY2UpOwogCQlpZiAoaXNXaWxkY2FyZChyLnNyY05hbWUpICYmIHIuZHN0TmFtZSA9PSBudWxsKQpAQCAtMzMyLDcgKzMzMiw3IEBACiAJICogICAgICAgICAgICAgb2YgdGhlIGV4aXN0aW5nIHNvdXJjZSBkaXNhZ3JlZXMgd2l0aCB0aGUgd2lsZGNhcmQgc3RhdHVzIG9mCiAJICogICAgICAgICAgICAgdGhlIG5ldyBkZXN0aW5hdGlvbi4KIAkgKi8KLQlwdWJsaWMgUmVmU3BlYyBzZXREZXN0aW5hdGlvbihmaW5hbCBTdHJpbmcgZGVzdGluYXRpb24pIHsKKwlwdWJsaWMgUmVmU3BlYyBzZXREZXN0aW5hdGlvbihTdHJpbmcgZGVzdGluYXRpb24pIHsKIAkJZmluYWwgUmVmU3BlYyByID0gbmV3IFJlZlNwZWModGhpcyk7CiAJCXIuZHN0TmFtZSA9IGNoZWNrVmFsaWQoZGVzdGluYXRpb24pOwogCQlpZiAoaXNXaWxkY2FyZChyLmRzdE5hbWUpICYmIHIuc3JjTmFtZSA9PSBudWxsKQpAQCAtMzcyLDcgKzM3Miw3IEBACiAJICogICAgICAgICAgICByZWYgbmFtZSB0aGF0IHNob3VsZCBiZSB0ZXN0ZWQuCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBuYW1lcyBtYXRjaDsgZmFsc2Ugb3RoZXJ3aXNlLgogCSAqLwotCXB1YmxpYyBib29sZWFuIG1hdGNoU291cmNlKGZpbmFsIFN0cmluZyByKSB7CisJcHVibGljIGJvb2xlYW4gbWF0Y2hTb3VyY2UoU3RyaW5nIHIpIHsKIAkJcmV0dXJuIG1hdGNoKHIsIGdldFNvdXJjZSgpKTsKIAl9CiAKQEAgLTM4Myw3ICszODMsNyBAQAogCSAqICAgICAgICAgICAgcmVmIHdob3NlIG5hbWUgc2hvdWxkIGJlIHRlc3RlZC4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG5hbWVzIG1hdGNoOyBmYWxzZSBvdGhlcndpc2UuCiAJICovCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hTb3VyY2UoZmluYWwgUmVmIHIpIHsKKwlwdWJsaWMgYm9vbGVhbiBtYXRjaFNvdXJjZShSZWYgcikgewogCQlyZXR1cm4gbWF0Y2goci5nZXROYW1lKCksIGdldFNvdXJjZSgpKTsKIAl9CiAKQEAgLTM5NCw3ICszOTQsNyBAQAogCSAqICAgICAgICAgICAgcmVmIG5hbWUgdGhhdCBzaG91bGQgYmUgdGVzdGVkLgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbmFtZXMgbWF0Y2g7IGZhbHNlIG90aGVyd2lzZS4KIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaERlc3RpbmF0aW9uKGZpbmFsIFN0cmluZyByKSB7CisJcHVibGljIGJvb2xlYW4gbWF0Y2hEZXN0aW5hdGlvbihTdHJpbmcgcikgewogCQlyZXR1cm4gbWF0Y2gociwgZ2V0RGVzdGluYXRpb24oKSk7CiAJfQogCkBAIC00MDUsNyArNDA1LDcgQEAKIAkgKiAgICAgICAgICAgIHJlZiB3aG9zZSBuYW1lIHNob3VsZCBiZSB0ZXN0ZWQuCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBuYW1lcyBtYXRjaDsgZmFsc2Ugb3RoZXJ3aXNlLgogCSAqLwotCXB1YmxpYyBib29sZWFuIG1hdGNoRGVzdGluYXRpb24oZmluYWwgUmVmIHIpIHsKKwlwdWJsaWMgYm9vbGVhbiBtYXRjaERlc3RpbmF0aW9uKFJlZiByKSB7CiAJCXJldHVybiBtYXRjaChyLmdldE5hbWUoKSwgZ2V0RGVzdGluYXRpb24oKSk7CiAJfQogCkBAIC00MjUsNyArNDI1LDcgQEAKIAkgKiAgICAgICAgICAgICB3aGVuIHRoZSBSZWZTcGVjIHdhcyBjb25zdHJ1Y3RlZCB3aXRoIHdpbGRjYXJkIG1vZGUgdGhhdAogCSAqICAgICAgICAgICAgIGRvZXNuJ3QgcmVxdWlyZSBtYXRjaGluZyB3aWxkY2FyZHMuCiAJICovCi0JcHVibGljIFJlZlNwZWMgZXhwYW5kRnJvbVNvdXJjZShmaW5hbCBTdHJpbmcgcikgeworCXB1YmxpYyBSZWZTcGVjIGV4cGFuZEZyb21Tb3VyY2UoU3RyaW5nIHIpIHsKIAkJaWYgKGFsbG93TWlzbWF0Y2hlZFdpbGRjYXJkcyAhPSBXaWxkY2FyZE1vZGUuUkVRVUlSRV9NQVRDSCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKIAkJCQkJSkdpdFRleHQuZ2V0KCkuaW52YWxpZEV4cGFuZFdpbGRjYXJkKTsKQEAgLTQzMyw3ICs0MzMsNyBAQAogCQlyZXR1cm4gaXNXaWxkY2FyZCgpID8gbmV3IFJlZlNwZWModGhpcykuZXhwYW5kRnJvbVNvdXJjZUltcChyKSA6IHRoaXM7CiAJfQogCi0JcHJpdmF0ZSBSZWZTcGVjIGV4cGFuZEZyb21Tb3VyY2VJbXAoZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlwcml2YXRlIFJlZlNwZWMgZXhwYW5kRnJvbVNvdXJjZUltcChTdHJpbmcgbmFtZSkgewogCQlmaW5hbCBTdHJpbmcgcHNyYyA9IHNyY05hbWUsIHBkc3QgPSBkc3ROYW1lOwogCQl3aWxkY2FyZCA9IGZhbHNlOwogCQlzcmNOYW1lID0gbmFtZTsKQEAgLTQ1Nyw3ICs0NTcsNyBAQAogCSAqICAgICAgICAgICAgIHdoZW4gdGhlIFJlZlNwZWMgd2FzIGNvbnN0cnVjdGVkIHdpdGggd2lsZGNhcmQgbW9kZSB0aGF0CiAJICogICAgICAgICAgICAgZG9lc24ndCByZXF1aXJlIG1hdGNoaW5nIHdpbGRjYXJkcy4KIAkgKi8KLQlwdWJsaWMgUmVmU3BlYyBleHBhbmRGcm9tU291cmNlKGZpbmFsIFJlZiByKSB7CisJcHVibGljIFJlZlNwZWMgZXhwYW5kRnJvbVNvdXJjZShSZWYgcikgewogCQlyZXR1cm4gZXhwYW5kRnJvbVNvdXJjZShyLmdldE5hbWUoKSk7CiAJfQogCkBAIC00NzcsNyArNDc3LDcgQEAKIAkgKiAgICAgICAgICAgICB3aGVuIHRoZSBSZWZTcGVjIHdhcyBjb25zdHJ1Y3RlZCB3aXRoIHdpbGRjYXJkIG1vZGUgdGhhdAogCSAqICAgICAgICAgICAgIGRvZXNuJ3QgcmVxdWlyZSBtYXRjaGluZyB3aWxkY2FyZHMuCiAJICovCi0JcHVibGljIFJlZlNwZWMgZXhwYW5kRnJvbURlc3RpbmF0aW9uKGZpbmFsIFN0cmluZyByKSB7CisJcHVibGljIFJlZlNwZWMgZXhwYW5kRnJvbURlc3RpbmF0aW9uKFN0cmluZyByKSB7CiAJCWlmIChhbGxvd01pc21hdGNoZWRXaWxkY2FyZHMgIT0gV2lsZGNhcmRNb2RlLlJFUVVJUkVfTUFUQ0gpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCiAJCQkJCUpHaXRUZXh0LmdldCgpLmludmFsaWRFeHBhbmRXaWxkY2FyZCk7CkBAIC00ODUsNyArNDg1LDcgQEAKIAkJcmV0dXJuIGlzV2lsZGNhcmQoKSA/IG5ldyBSZWZTcGVjKHRoaXMpLmV4cGFuZEZyb21Ec3RJbXAocikgOiB0aGlzOwogCX0KIAotCXByaXZhdGUgUmVmU3BlYyBleHBhbmRGcm9tRHN0SW1wKGZpbmFsIFN0cmluZyBuYW1lKSB7CisJcHJpdmF0ZSBSZWZTcGVjIGV4cGFuZEZyb21Ec3RJbXAoU3RyaW5nIG5hbWUpIHsKIAkJZmluYWwgU3RyaW5nIHBzcmMgPSBzcmNOYW1lLCBwZHN0ID0gZHN0TmFtZTsKIAkJd2lsZGNhcmQgPSBmYWxzZTsKIAkJc3JjTmFtZSA9IGV4cGFuZFdpbGRjYXJkKG5hbWUsIHBkc3QsIHBzcmMpOwpAQCAtNTA4LDExICs1MDgsMTEgQEAKIAkgKiAgICAgICAgICAgICB3aGVuIHRoZSBSZWZTcGVjIHdhcyBjb25zdHJ1Y3RlZCB3aXRoIHdpbGRjYXJkIG1vZGUgdGhhdAogCSAqICAgICAgICAgICAgIGRvZXNuJ3QgcmVxdWlyZSBtYXRjaGluZyB3aWxkY2FyZHMuCiAJICovCi0JcHVibGljIFJlZlNwZWMgZXhwYW5kRnJvbURlc3RpbmF0aW9uKGZpbmFsIFJlZiByKSB7CisJcHVibGljIFJlZlNwZWMgZXhwYW5kRnJvbURlc3RpbmF0aW9uKFJlZiByKSB7CiAJCXJldHVybiBleHBhbmRGcm9tRGVzdGluYXRpb24oci5nZXROYW1lKCkpOwogCX0KIAotCXByaXZhdGUgYm9vbGVhbiBtYXRjaChmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIHMpIHsKKwlwcml2YXRlIGJvb2xlYW4gbWF0Y2goU3RyaW5nIG5hbWUsIFN0cmluZyBzKSB7CiAJCWlmIChzID09IG51bGwpCiAJCQlyZXR1cm4gZmFsc2U7CiAJCWlmIChpc1dpbGRjYXJkKHMpKSB7CkBAIC01NDEsNyArNTQxLDcgQEAKIAkJcmV0dXJuIHNwZWM7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkKGZpbmFsIFN0cmluZyBzKSB7CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkKFN0cmluZyBzKSB7CiAJCWlmIChzLnN0YXJ0c1dpdGgoIi8iKSkgLy8kTk9OLU5MUy0xJAogCQkJcmV0dXJuIGZhbHNlOwogCQlpZiAocy5jb250YWlucygiLy8iKSkgLy8kTk9OLU5MUy0xJApAQCAtNTY5LDcgKzU2OSw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3Qgb2JqKSB7CisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKIAkJaWYgKCEob2JqIGluc3RhbmNlb2YgUmVmU3BlYykpCiAJCQlyZXR1cm4gZmFsc2U7CiAJCWZpbmFsIFJlZlNwZWMgYiA9IChSZWZTcGVjKSBvYmo7CkBAIC01ODQsNyArNTg0LDcgQEAKIAkJcmV0dXJuIHRydWU7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcShmaW5hbCBTdHJpbmcgYSwgZmluYWwgU3RyaW5nIGIpIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxKFN0cmluZyBhLCBTdHJpbmcgYikgewogCQlpZiAoYSA9PSBiKQogCQkJcmV0dXJuIHRydWU7CiAJCWlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVtb3RlQ29uZmlnLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZW1vdGVDb25maWcuamF2YQppbmRleCA3Yjg4MmVjLi4wYTYyMWYxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZW1vdGVDb25maWcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZW1vdGVDb25maWcuamF2YQpAQCAtMTEyLDcgKzExMiw3IEBACiAJICogQHRocm93cyBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBvbmUgb2YgdGhlIFVSSXMgd2l0aGluIHRoZSByZW1vdGUncyBjb25maWd1cmF0aW9uIGlzIGludmFsaWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBMaXN0PFJlbW90ZUNvbmZpZz4gZ2V0QWxsUmVtb3RlQ29uZmlncyhmaW5hbCBDb25maWcgcmMpCisJcHVibGljIHN0YXRpYyBMaXN0PFJlbW90ZUNvbmZpZz4gZ2V0QWxsUmVtb3RlQ29uZmlncyhDb25maWcgcmMpCiAJCQl0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKIAkJZmluYWwgTGlzdDxTdHJpbmc+IG5hbWVzID0gbmV3IEFycmF5TGlzdDw+KHJjCiAJCQkJLmdldFN1YnNlY3Rpb25zKFNFQ1RJT04pKTsKQEAgLTEyMCw3ICsxMjAsNyBAQAogCiAJCWZpbmFsIExpc3Q8UmVtb3RlQ29uZmlnPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4obmFtZXMKIAkJCQkuc2l6ZSgpKTsKLQkJZm9yIChmaW5hbCBTdHJpbmcgbmFtZSA6IG5hbWVzKQorCQlmb3IgKFN0cmluZyBuYW1lIDogbmFtZXMpCiAJCQlyZXN1bHQuYWRkKG5ldyBSZW1vdGVDb25maWcocmMsIG5hbWUpKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CkBAIC0xNjAsNyArMTYwLDcgQEAKIAkgKiBAdGhyb3dzIGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIG9uZSBvZiB0aGUgVVJJcyB3aXRoaW4gdGhlIHJlbW90ZSdzIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZC4KIAkgKi8KLQlwdWJsaWMgUmVtb3RlQ29uZmlnKGZpbmFsIENvbmZpZyByYywgZmluYWwgU3RyaW5nIHJlbW90ZU5hbWUpCisJcHVibGljIFJlbW90ZUNvbmZpZyhDb25maWcgcmMsIFN0cmluZyByZW1vdGVOYW1lKQogCQkJdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CiAJCW5hbWUgPSByZW1vdGVOYW1lOwogCkBAIC0xNzAsMTIgKzE3MCwxMiBAQAogCQl2bHN0ID0gcmMuZ2V0U3RyaW5nTGlzdChTRUNUSU9OLCBuYW1lLCBLRVlfVVJMKTsKIAkJTWFwPFN0cmluZywgU3RyaW5nPiBpbnN0ZWFkT2YgPSBnZXRSZXBsYWNlbWVudHMocmMsIEtFWV9JTlNURUFET0YpOwogCQl1cmlzID0gbmV3IEFycmF5TGlzdDw+KHZsc3QubGVuZ3RoKTsKLQkJZm9yIChmaW5hbCBTdHJpbmcgcyA6IHZsc3QpIHsKKwkJZm9yIChTdHJpbmcgcyA6IHZsc3QpIHsKIAkJCXVyaXMuYWRkKG5ldyBVUklpc2gocmVwbGFjZVVyaShzLCBpbnN0ZWFkT2YpKSk7CiAJCX0KIAkJU3RyaW5nW10gcGxzdCA9IHJjLmdldFN0cmluZ0xpc3QoU0VDVElPTiwgbmFtZSwgS0VZX1BVU0hVUkwpOwogCQlwdXNoVVJJcyA9IG5ldyBBcnJheUxpc3Q8PihwbHN0Lmxlbmd0aCk7Ci0JCWZvciAoZmluYWwgU3RyaW5nIHMgOiBwbHN0KSB7CisJCWZvciAoU3RyaW5nIHMgOiBwbHN0KSB7CiAJCQlwdXNoVVJJcy5hZGQobmV3IFVSSWlzaChzKSk7CiAJCX0KIAkJaWYgKHB1c2hVUklzLmlzRW1wdHkoKSkgewpAQCAtMjIzLDI2ICsyMjMsMjYgQEAKIAkgKiBAcGFyYW0gcmMKIAkgKiAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgdG8gc3RvcmUgb3Vyc2VsdmVzIGludG8uCiAJICovCi0JcHVibGljIHZvaWQgdXBkYXRlKGZpbmFsIENvbmZpZyByYykgeworCXB1YmxpYyB2b2lkIHVwZGF0ZShDb25maWcgcmMpIHsKIAkJZmluYWwgTGlzdDxTdHJpbmc+IHZsc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogCQl2bHN0LmNsZWFyKCk7Ci0JCWZvciAoZmluYWwgVVJJaXNoIHUgOiBnZXRVUklzKCkpCisJCWZvciAoVVJJaXNoIHUgOiBnZXRVUklzKCkpCiAJCQl2bHN0LmFkZCh1LnRvUHJpdmF0ZVN0cmluZygpKTsKIAkJcmMuc2V0U3RyaW5nTGlzdChTRUNUSU9OLCBnZXROYW1lKCksIEtFWV9VUkwsIHZsc3QpOwogCiAJCXZsc3QuY2xlYXIoKTsKLQkJZm9yIChmaW5hbCBVUklpc2ggdSA6IGdldFB1c2hVUklzKCkpCisJCWZvciAoVVJJaXNoIHUgOiBnZXRQdXNoVVJJcygpKQogCQkJdmxzdC5hZGQodS50b1ByaXZhdGVTdHJpbmcoKSk7CiAJCXJjLnNldFN0cmluZ0xpc3QoU0VDVElPTiwgZ2V0TmFtZSgpLCBLRVlfUFVTSFVSTCwgdmxzdCk7CiAKIAkJdmxzdC5jbGVhcigpOwotCQlmb3IgKGZpbmFsIFJlZlNwZWMgdSA6IGdldEZldGNoUmVmU3BlY3MoKSkKKwkJZm9yIChSZWZTcGVjIHUgOiBnZXRGZXRjaFJlZlNwZWNzKCkpCiAJCQl2bHN0LmFkZCh1LnRvU3RyaW5nKCkpOwogCQlyYy5zZXRTdHJpbmdMaXN0KFNFQ1RJT04sIGdldE5hbWUoKSwgS0VZX0ZFVENILCB2bHN0KTsKIAogCQl2bHN0LmNsZWFyKCk7Ci0JCWZvciAoZmluYWwgUmVmU3BlYyB1IDogZ2V0UHVzaFJlZlNwZWNzKCkpCisJCWZvciAoUmVmU3BlYyB1IDogZ2V0UHVzaFJlZlNwZWNzKCkpCiAJCQl2bHN0LmFkZCh1LnRvU3RyaW5nKCkpOwogCQlyYy5zZXRTdHJpbmdMaXN0KFNFQ1RJT04sIGdldE5hbWUoKSwgS0VZX1BVU0gsIHZsc3QpOwogCkBAIC0yNzcsNyArMjc3LDcgQEAKIAkJCXJjLnNldEludChTRUNUSU9OLCBnZXROYW1lKCksIGtleSwgY3VycmVudFZhbHVlKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgdW5zZXQoZmluYWwgQ29uZmlnIHJjLCBmaW5hbCBTdHJpbmcga2V5KSB7CisJcHJpdmF0ZSB2b2lkIHVuc2V0KENvbmZpZyByYywgU3RyaW5nIGtleSkgewogCQlyYy51bnNldChTRUNUSU9OLCBnZXROYW1lKCksIGtleSk7CiAJfQogCkBAIC0zMzUsNyArMzM1LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBuZXcgVVJJIHRvIGFkZCB0byB0aGlzIHJlbW90ZS4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIFVSSSB3YXMgYWRkZWQ7IGZhbHNlIGlmIGl0IGFscmVhZHkgZXhpc3RzLgogCSAqLwotCXB1YmxpYyBib29sZWFuIGFkZFVSSShmaW5hbCBVUklpc2ggdG9BZGQpIHsKKwlwdWJsaWMgYm9vbGVhbiBhZGRVUkkoVVJJaXNoIHRvQWRkKSB7CiAJCWlmICh1cmlzLmNvbnRhaW5zKHRvQWRkKSkKIAkJCXJldHVybiBmYWxzZTsKIAkJcmV0dXJuIHVyaXMuYWRkKHRvQWRkKTsKQEAgLTM0OCw3ICszNDgsNyBAQAogCSAqICAgICAgICAgICAgdGhlIFVSSSB0byByZW1vdmUgZnJvbSB0aGlzIHJlbW90ZS4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIFVSSSB3YXMgYWRkZWQ7IGZhbHNlIGlmIGl0IGFscmVhZHkgZXhpc3RzLgogCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZVVSSShmaW5hbCBVUklpc2ggdG9SZW1vdmUpIHsKKwlwdWJsaWMgYm9vbGVhbiByZW1vdmVVUkkoVVJJaXNoIHRvUmVtb3ZlKSB7CiAJCXJldHVybiB1cmlzLnJlbW92ZSh0b1JlbW92ZSk7CiAJfQogCkBAIC0zNjgsNyArMzY4LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBuZXcgVVJJIHRvIGFkZCB0byB0aGlzIHJlbW90ZS4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIFVSSSB3YXMgYWRkZWQ7IGZhbHNlIGlmIGl0IGFscmVhZHkgZXhpc3RzLgogCSAqLwotCXB1YmxpYyBib29sZWFuIGFkZFB1c2hVUkkoZmluYWwgVVJJaXNoIHRvQWRkKSB7CisJcHVibGljIGJvb2xlYW4gYWRkUHVzaFVSSShVUklpc2ggdG9BZGQpIHsKIAkJaWYgKHB1c2hVUklzLmNvbnRhaW5zKHRvQWRkKSkKIAkJCXJldHVybiBmYWxzZTsKIAkJcmV0dXJuIHB1c2hVUklzLmFkZCh0b0FkZCk7CkBAIC0zODEsNyArMzgxLDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBVUkkgdG8gcmVtb3ZlIGZyb20gdGhpcyByZW1vdGUuCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBVUkkgd2FzIGFkZGVkOyBmYWxzZSBpZiBpdCBhbHJlYWR5IGV4aXN0cy4KIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVQdXNoVVJJKGZpbmFsIFVSSWlzaCB0b1JlbW92ZSkgeworCXB1YmxpYyBib29sZWFuIHJlbW92ZVB1c2hVUkkoVVJJaXNoIHRvUmVtb3ZlKSB7CiAJCXJldHVybiBwdXNoVVJJcy5yZW1vdmUodG9SZW1vdmUpOwogCX0KIApAQCAtNDAxLDcgKzQwMSw3IEBACiAJICogICAgICAgICAgICB0aGUgbmV3IHNwZWNpZmljYXRpb24gdG8gYWRkLgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWNhdGlvbiB3YXMgYWRkZWQ7IGZhbHNlIGlmIGl0IGFscmVhZHkgZXhpc3RzLgogCSAqLwotCXB1YmxpYyBib29sZWFuIGFkZEZldGNoUmVmU3BlYyhmaW5hbCBSZWZTcGVjIHMpIHsKKwlwdWJsaWMgYm9vbGVhbiBhZGRGZXRjaFJlZlNwZWMoUmVmU3BlYyBzKSB7CiAJCWlmIChmZXRjaC5jb250YWlucyhzKSkKIAkJCXJldHVybiBmYWxzZTsKIAkJcmV0dXJuIGZldGNoLmFkZChzKTsKQEAgLTQxNCw3ICs0MTQsNyBAQAogCSAqICAgICAgICAgICAgbGlzdCBvZiBmZXRjaCBzcGVjaWZpY2F0aW9ucyB0byBzZXQuIExpc3QgaXMgY29waWVkLCBpdCBjYW4gYmUKIAkgKiAgICAgICAgICAgIG1vZGlmaWVkIGFmdGVyIHRoaXMgY2FsbC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGZXRjaFJlZlNwZWNzKGZpbmFsIExpc3Q8UmVmU3BlYz4gc3BlY3MpIHsKKwlwdWJsaWMgdm9pZCBzZXRGZXRjaFJlZlNwZWNzKExpc3Q8UmVmU3BlYz4gc3BlY3MpIHsKIAkJZmV0Y2guY2xlYXIoKTsKIAkJZmV0Y2guYWRkQWxsKHNwZWNzKTsKIAl9CkBAIC00MjYsNyArNDI2LDcgQEAKIAkgKiAgICAgICAgICAgIGxpc3Qgb2YgcHVzaCBzcGVjaWZpY2F0aW9ucyB0byBzZXQuIExpc3QgaXMgY29waWVkLCBpdCBjYW4gYmUKIAkgKiAgICAgICAgICAgIG1vZGlmaWVkIGFmdGVyIHRoaXMgY2FsbC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdXNoUmVmU3BlY3MoZmluYWwgTGlzdDxSZWZTcGVjPiBzcGVjcykgeworCXB1YmxpYyB2b2lkIHNldFB1c2hSZWZTcGVjcyhMaXN0PFJlZlNwZWM+IHNwZWNzKSB7CiAJCXB1c2guY2xlYXIoKTsKIAkJcHVzaC5hZGRBbGwoc3BlY3MpOwogCX0KQEAgLTQzOCw3ICs0MzgsNyBAQAogCSAqICAgICAgICAgICAgdGhlIHNwZWNpZmljYXRpb24gdG8gcmVtb3ZlLgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWNhdGlvbiBleGlzdGVkIGFuZCB3YXMgcmVtb3ZlZC4KIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVGZXRjaFJlZlNwZWMoZmluYWwgUmVmU3BlYyBzKSB7CisJcHVibGljIGJvb2xlYW4gcmVtb3ZlRmV0Y2hSZWZTcGVjKFJlZlNwZWMgcykgewogCQlyZXR1cm4gZmV0Y2gucmVtb3ZlKHMpOwogCX0KIApAQCAtNDU4LDcgKzQ1OCw3IEBACiAJICogICAgICAgICAgICB0aGUgbmV3IHNwZWNpZmljYXRpb24gdG8gYWRkLgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWNhdGlvbiB3YXMgYWRkZWQ7IGZhbHNlIGlmIGl0IGFscmVhZHkgZXhpc3RzLgogCSAqLwotCXB1YmxpYyBib29sZWFuIGFkZFB1c2hSZWZTcGVjKGZpbmFsIFJlZlNwZWMgcykgeworCXB1YmxpYyBib29sZWFuIGFkZFB1c2hSZWZTcGVjKFJlZlNwZWMgcykgewogCQlpZiAocHVzaC5jb250YWlucyhzKSkKIAkJCXJldHVybiBmYWxzZTsKIAkJcmV0dXJuIHB1c2guYWRkKHMpOwpAQCAtNDcxLDcgKzQ3MSw3IEBACiAJICogICAgICAgICAgICB0aGUgc3BlY2lmaWNhdGlvbiB0byByZW1vdmUuCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpY2F0aW9uIGV4aXN0ZWQgYW5kIHdhcyByZW1vdmVkLgogCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZVB1c2hSZWZTcGVjKGZpbmFsIFJlZlNwZWMgcykgeworCXB1YmxpYyBib29sZWFuIHJlbW92ZVB1c2hSZWZTcGVjKFJlZlNwZWMgcykgewogCQlyZXR1cm4gcHVzaC5yZW1vdmUocyk7CiAJfQogCkBAIC01MjAsNyArNTIwLDcgQEAKIAkgKiBAcGFyYW0gb3B0aW9uCiAJICogICAgICAgICAgICBtZXRob2QgdG8gdXNlIHdoZW4gaGFuZGxpbmcgYW5ub3RhdGVkIHRhZ3MuCiAJICovCi0JcHVibGljIHZvaWQgc2V0VGFnT3B0KGZpbmFsIFRhZ09wdCBvcHRpb24pIHsKKwlwdWJsaWMgdm9pZCBzZXRUYWdPcHQoVGFnT3B0IG9wdGlvbikgewogCQl0YWdvcHQgPSBvcHRpb24gIT0gbnVsbCA/IG9wdGlvbiA6IFRhZ09wdC5BVVRPX0ZPTExPVzsKIAl9CiAKQEAgLTU0MSw3ICs1NDEsNyBAQAogCSAqIEBwYXJhbSBtCiAJICogICAgICAgICAgICB0cnVlIHRvIGF1dG9tYXRpY2FsbHkgZGVsZXRlIHJlbW90ZSByZWZzIGR1cmluZyBwdXNoLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldE1pcnJvcihmaW5hbCBib29sZWFuIG0pIHsKKwlwdWJsaWMgdm9pZCBzZXRNaXJyb3IoYm9vbGVhbiBtKSB7CiAJCW1pcnJvciA9IG07CiAJfQogCkBAIC01NjIsNyArNTYyLDcgQEAKIAkgKiAgICAgICAgICAgIGJlZm9yZSBhYm9ydGluZyBhbiBJTyByZWFkIG9yIHdyaXRlIG9wZXJhdGlvbiB3aXRoIHRoaXMKIAkgKiAgICAgICAgICAgIHJlbW90ZS4gIEEgdGltZW91dCBvZiAwIHdpbGwgYmxvY2sgaW5kZWZpbml0ZWx5LgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpbWVvdXQoZmluYWwgaW50IHNlY29uZHMpIHsKKwlwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGludCBzZWNvbmRzKSB7CiAJCXRpbWVvdXQgPSBzZWNvbmRzOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlbW90ZVJlZlVwZGF0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVtb3RlUmVmVXBkYXRlLmphdmEKaW5kZXggM2U5YjE2ZS4uOTMxNjUzZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVtb3RlUmVmVXBkYXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVtb3RlUmVmVXBkYXRlLmphdmEKQEAgLTQ4MSw3ICs0ODEsNyBAQAogCQlleHBlY3RlZE9sZE9iamVjdElkID0gaWQ7CiAJfQogCi0Jdm9pZCBzZXRTdGF0dXMoZmluYWwgU3RhdHVzIHN0YXR1cykgeworCXZvaWQgc2V0U3RhdHVzKFN0YXR1cyBzdGF0dXMpIHsKIAkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7CiAJfQogCkBAIC00ODksNyArNDg5LDcgQEAKIAkJdGhpcy5mYXN0Rm9yd2FyZCA9IGZhc3RGb3J3YXJkOwogCX0KIAotCXZvaWQgc2V0TWVzc2FnZShmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworCXZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewogCQl0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwogCX0KIApAQCAtNTAxLDcgKzUwMSw3IEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgd2hlbiBJL08gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHVwZGF0ZQogCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVRyYWNraW5nUmVmKGZpbmFsIFJldldhbGsgd2FsaykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUcmFja2luZ1JlZihSZXZXYWxrIHdhbGspIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmIChpc0RlbGV0ZSgpKQogCQkJdHJhY2tpbmdSZWZVcGRhdGUuc2V0UmVzdWx0KGxvY2FsVXBkYXRlLmRlbGV0ZSh3YWxrKSk7CiAJCWVsc2UKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NpZGVCYW5kSW5wdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NpZGVCYW5kSW5wdXRTdHJlYW0uamF2YQppbmRleCAxNTMzOGEzLi4zMTAwY2I0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9TaWRlQmFuZElucHV0U3RyZWFtLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU2lkZUJhbmRJbnB1dFN0cmVhbS5qYXZhCkBAIC0xMzMsNyArMTMzLDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGludCByZWFkKGZpbmFsIGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBpbnQgcmVhZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaW50IHIgPSAwOwogCQl3aGlsZSAobGVuID4gMCkgewogCQkJbmVlZERhdGFQYWNrZXQoKTsKQEAgLTIwMyw3ICsyMDMsNyBAQAogCQlwcm9ncmVzc0J1ZmZlciA9IHBrdDsKIAl9CiAKLQlwcml2YXRlIHZvaWQgZG9Qcm9ncmVzc0xpbmUoZmluYWwgU3RyaW5nIG1zZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgZG9Qcm9ncmVzc0xpbmUoU3RyaW5nIG1zZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJTWF0Y2hlciBtYXRjaGVyOwogCiAJCW1hdGNoZXIgPSBQX0JPVU5ERUQubWF0Y2hlcihtc2cpOwpAQCAtMjM5LDcgKzIzOSw3IEBACiAJCQlvdXQud3JpdGUobXNnLmdldEJ5dGVzKCkpOwogCX0KIAotCXByaXZhdGUgdm9pZCBiZWdpblRhc2soZmluYWwgaW50IHRvdGFsV29ya1VuaXRzKSB7CisJcHJpdmF0ZSB2b2lkIGJlZ2luVGFzayhpbnQgdG90YWxXb3JrVW5pdHMpIHsKIAkJbW9uaXRvci5iZWdpblRhc2socmVtb3RlKGN1cnJlbnRUYXNrKSwgdG90YWxXb3JrVW5pdHMpOwogCX0KIApAQCAtMjU0LDcgKzI1NCw3IEBACiAJCXJldHVybiByLnRvU3RyaW5nKCk7CiAJfQogCi0JcHJpdmF0ZSBTdHJpbmcgcmVhZFN0cmluZyhmaW5hbCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgU3RyaW5nIHJlYWRTdHJpbmcoaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgYnl0ZVtdIHJhdyA9IG5ldyBieXRlW2xlbl07CiAJCUlPLnJlYWRGdWxseShyYXdJbiwgcmF3LCAwLCBsZW4pOwogCQlyZXR1cm4gUmF3UGFyc2VVdGlscy5kZWNvZGUoQ29uc3RhbnRzLkNIQVJTRVQsIHJhdywgMCwgbGVuKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NpZGVCYW5kT3V0cHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9TaWRlQmFuZE91dHB1dFN0cmVhbS5qYXZhCmluZGV4IGFmNjU4MjcuLmIyY2MxYjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NpZGVCYW5kT3V0cHV0U3RyZWFtLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU2lkZUJhbmRPdXRwdXRTdHJlYW0uamF2YQpAQCAtMTAyLDcgKzEwMiw3IEBACiAJICogICAgICAgICAgICBzdHJlYW0gdGhhdCB0aGUgcGFja2V0cyBhcmUgd3JpdHRlbiBvbnRvLiBUaGlzIHN0cmVhbSBzaG91bGQKIAkgKiAgICAgICAgICAgIGJlIGF0dGFjaGVkIHRvIGEgU2lkZUJhbmRJbnB1dFN0cmVhbSBvbiB0aGUgcmVtb3RlIHNpZGUuCiAJICovCi0JcHVibGljIFNpZGVCYW5kT3V0cHV0U3RyZWFtKGZpbmFsIGludCBjaGFuLCBmaW5hbCBpbnQgc3osIGZpbmFsIE91dHB1dFN0cmVhbSBvcykgeworCXB1YmxpYyBTaWRlQmFuZE91dHB1dFN0cmVhbShpbnQgY2hhbiwgaW50IHN6LCBPdXRwdXRTdHJlYW0gb3MpIHsKIAkJaWYgKGNoYW4gPD0gMCB8fCBjaGFuID4gMjU1KQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQkJSkdpdFRleHQuZ2V0KCkuY2hhbm5lbE11c3RCZUluUmFuZ2UxXzI1NSwKQEAgLTEzNiw3ICsxMzYsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJd2hpbGUgKDAgPCBsZW4pIHsKIAkJCWludCBjYXBhY2l0eSA9IGJ1ZmZlci5sZW5ndGggLSBjbnQ7CiAJCQlpZiAoY250ID09IEhEUl9TSVpFICYmIGNhcGFjaXR5IDwgbGVuKSB7CkBAIC0xNjMsNyArMTYzLDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgd3JpdGUoZmluYWwgaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmIChjbnQgPT0gYnVmZmVyLmxlbmd0aCkKIAkJCXdyaXRlQnVmZmVyKCk7CiAJCWJ1ZmZlcltjbnQrK10gPSAoYnl0ZSkgYjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NpZGVCYW5kUHJvZ3Jlc3NNb25pdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9TaWRlQmFuZFByb2dyZXNzTW9uaXRvci5qYXZhCmluZGV4IDM2NTU0NWEuLjhhM2U0ZWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NpZGVCYW5kUHJvZ3Jlc3NNb25pdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU2lkZUJhbmRQcm9ncmVzc01vbml0b3IuamF2YQpAQCAtNTUsNyArNTUsNyBAQAogCiAJcHJpdmF0ZSBib29sZWFuIHdyaXRlOwogCi0JU2lkZUJhbmRQcm9ncmVzc01vbml0b3IoZmluYWwgT3V0cHV0U3RyZWFtIG9zKSB7CisJU2lkZUJhbmRQcm9ncmVzc01vbml0b3IoT3V0cHV0U3RyZWFtIG9zKSB7CiAJCW91dCA9IG9zOwogCQl3cml0ZSA9IHRydWU7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU3NoU2Vzc2lvbkZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NzaFNlc3Npb25GYWN0b3J5LmphdmEKaW5kZXggZTAwMjIzMy4uYWUzNTdkZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU3NoU2Vzc2lvbkZhY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Tc2hTZXNzaW9uRmFjdG9yeS5qYXZhCkBAIC04MCw3ICs4MCw3IEBACiAJICogICAgICAgICAgICBmYWN0b3J5IGZvciBmdXR1cmUgc2Vzc2lvbnMgdG8gYmUgY3JlYXRlZCB0aHJvdWdoLiBJZiBudWxsIHRoZQogCSAqICAgICAgICAgICAgZGVmYXVsdCBmYWN0b3J5IHdpbGwgYmUgcmVzdG9yZWQucwogCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbnN0YW5jZShmaW5hbCBTc2hTZXNzaW9uRmFjdG9yeSBuZXdGYWN0b3J5KSB7CisJcHVibGljIHN0YXRpYyB2b2lkIHNldEluc3RhbmNlKFNzaFNlc3Npb25GYWN0b3J5IG5ld0ZhY3RvcnkpIHsKIAkJaWYgKG5ld0ZhY3RvcnkgIT0gbnVsbCkKIAkJCUlOU1RBTkNFID0gbmV3RmFjdG9yeTsKIAkJZWxzZQpAQCAtMTIxLDcgKzEyMSw3IEBACiAJICogICAgICAgICAgICB7QGxpbmsgI2dldFNlc3Npb24oVVJJaXNoLCBDcmVkZW50aWFsc1Byb3ZpZGVyLCBGUywgaW50KX0KIAkgKiAgICAgICAgICAgIG1ldGhvZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlU2Vzc2lvbihmaW5hbCBSZW1vdGVTZXNzaW9uIHNlc3Npb24pIHsKKwlwdWJsaWMgdm9pZCByZWxlYXNlU2Vzc2lvbihSZW1vdGVTZXNzaW9uIHNlc3Npb24pIHsKIAkJc2Vzc2lvbi5kaXNjb25uZWN0KCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVGFnT3B0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UYWdPcHQuamF2YQppbmRleCBlMTEzNGU4Li5jZDE3OTEzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UYWdPcHQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UYWdPcHQuamF2YQpAQCAtODQsNyArODQsNyBAQAogCiAJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgb3B0aW9uOwogCi0JcHJpdmF0ZSBUYWdPcHQoZmluYWwgU3RyaW5nIG8pIHsKKwlwcml2YXRlIFRhZ09wdChTdHJpbmcgbykgewogCQlvcHRpb24gPSBvOwogCX0KIApAQCAtMTA0LDEwICsxMDQsMTAgQEAKIAkgKiAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgdGV4dCB2YWx1ZS4KIAkgKiBAcmV0dXJuIHRoZSBvcHRpb24gdGhhdCBtYXRjaGVzIHRoZSBwYXNzZWQgcGFyYW1ldGVyLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgVGFnT3B0IGZyb21PcHRpb24oZmluYWwgU3RyaW5nIG8pIHsKKwlwdWJsaWMgc3RhdGljIFRhZ09wdCBmcm9tT3B0aW9uKFN0cmluZyBvKSB7CiAJCWlmIChvID09IG51bGwgfHwgby5sZW5ndGgoKSA9PSAwKQogCQkJcmV0dXJuIEFVVE9fRk9MTE9XOwotCQlmb3IgKGZpbmFsIFRhZ09wdCB0YWdvcHQgOiB2YWx1ZXMoKSkgeworCQlmb3IgKFRhZ09wdCB0YWdvcHQgOiB2YWx1ZXMoKSkgewogCQkJaWYgKHRhZ29wdC5vcHRpb24oKS5lcXVhbHMobykpCiAJCQkJcmV0dXJuIHRhZ29wdDsKIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNmZXJDb25maWcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zZmVyQ29uZmlnLmphdmEKaW5kZXggNGM3MDcyNS4uNGFlMWNjYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNmZXJDb25maWcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc2ZlckNvbmZpZy5qYXZhCkBAIC02Miw4ICs2Miw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlN5c3RlbVJlYWRlcjsKIAogLyoqCi0gKiBUaGUgc3RhbmRhcmQgInRyYW5zZmVyIiwgImZldGNoIiwgInJlY2VpdmUiLCBhbmQgInVwbG9hZHBhY2siIGNvbmZpZ3VyYXRpb24KLSAqIHBhcmFtZXRlcnMuCisgKiBUaGUgc3RhbmRhcmQgInRyYW5zZmVyIiwgImZldGNoIiwgInByb3RvY29sIiwgInJlY2VpdmUiLCBhbmQgInVwbG9hZHBhY2siCisgKiBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuCiAgKi8KIHB1YmxpYyBjbGFzcyBUcmFuc2ZlckNvbmZpZyB7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZTQ0sgPSAiZnNjayI7IC8vJE5PTi1OTFMtMSQKQEAgLTkyLDYgKzkyLDMzIEBACiAJCUlHTk9SRTsKIAl9CiAKKwkvKioKKwkgKiBBIGdpdCBjb25maWd1cmF0aW9uIHZhcmlhYmxlIGZvciB3aGljaCB2ZXJzaW9ucyBvZiB0aGUgR2l0IHByb3RvY29sIHRvIHByZWZlci4KKwkgKiBVc2VkIGluIHByb3RvY29sLnZlcnNpb24uCisJICovCisJZW51bSBQcm90b2NvbFZlcnNpb24geworCQlWMCgiMCIpLCAvLyROT04tTkxTLTEkCisJCVYyKCIyIik7IC8vJE5PTi1OTFMtMSQKKworCQlmaW5hbCBTdHJpbmcgbmFtZTsKKworCQlQcm90b2NvbFZlcnNpb24oU3RyaW5nIG5hbWUpIHsKKwkJCXRoaXMubmFtZSA9IG5hbWU7CisJCX0KKworCQlzdGF0aWMgQE51bGxhYmxlIFByb3RvY29sVmVyc2lvbiBwYXJzZShATnVsbGFibGUgU3RyaW5nIG5hbWUpIHsKKwkJCWlmIChuYW1lID09IG51bGwpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCWZvciAoUHJvdG9jb2xWZXJzaW9uIHYgOiBQcm90b2NvbFZlcnNpb24udmFsdWVzKCkpIHsKKwkJCQlpZiAodi5uYW1lLmVxdWFscyhuYW1lKSkgeworCQkJCQlyZXR1cm4gdjsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKwogCXByaXZhdGUgZmluYWwgYm9vbGVhbiBmZXRjaEZzY2s7CiAJcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJlY2VpdmVGc2NrOwogCXByaXZhdGUgZmluYWwgU3RyaW5nIGZzY2tTa2lwTGlzdDsKQEAgLTEwMSwzMiArMTI4LDM2IEBACiAJcHJpdmF0ZSBmaW5hbCBib29sZWFuIHNhZmVGb3JNYWNPUzsKIAlwcml2YXRlIGZpbmFsIGJvb2xlYW4gYWxsb3dUaXBTaGExSW5XYW50OwogCXByaXZhdGUgZmluYWwgYm9vbGVhbiBhbGxvd1JlYWNoYWJsZVNoYTFJbldhbnQ7CisJcHJpdmF0ZSBmaW5hbCBib29sZWFuIGFsbG93RmlsdGVyOworCWZpbmFsIEBOdWxsYWJsZSBQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uOwogCWZpbmFsIFN0cmluZ1tdIGhpZGVSZWZzOwogCi0JVHJhbnNmZXJDb25maWcoZmluYWwgUmVwb3NpdG9yeSBkYikgeworCVRyYW5zZmVyQ29uZmlnKFJlcG9zaXRvcnkgZGIpIHsKIAkJdGhpcyhkYi5nZXRDb25maWcoKSk7CiAJfQogCi0JVHJhbnNmZXJDb25maWcoZmluYWwgQ29uZmlnIHJjKSB7Ci0JCWJvb2xlYW4gZnNjayA9IHJjLmdldEJvb2xlYW4oInRyYW5zZmVyIiwgImZzY2tvYmplY3RzIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmV0Y2hGc2NrID0gcmMuZ2V0Qm9vbGVhbigiZmV0Y2giLCAiZnNja29iamVjdHMiLCBmc2NrKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXJlY2VpdmVGc2NrID0gcmMuZ2V0Qm9vbGVhbigicmVjZWl2ZSIsICJmc2Nrb2JqZWN0cyIsIGZzY2spOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZnNja1NraXBMaXN0ID0gcmMuZ2V0U3RyaW5nKEZTQ0ssIG51bGwsICJza2lwTGlzdCIpOyAvLyROT04tTkxTLTEkCi0JCWFsbG93SW52YWxpZFBlcnNvbklkZW50ID0gcmMuZ2V0Qm9vbGVhbihGU0NLLCAiYWxsb3dJbnZhbGlkUGVyc29uSWRlbnQiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJc2FmZUZvcldpbmRvd3MgPSByYy5nZXRCb29sZWFuKEZTQ0ssICJzYWZlRm9yV2luZG93cyIsIC8vJE5PTi1OTFMtMSQKKwlAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKKwlUcmFuc2ZlckNvbmZpZyhDb25maWcgcmMpIHsKKwkJYm9vbGVhbiBmc2NrID0gcmMuZ2V0Qm9vbGVhbigidHJhbnNmZXIiLCAiZnNja29iamVjdHMiLCBmYWxzZSk7CisJCWZldGNoRnNjayA9IHJjLmdldEJvb2xlYW4oImZldGNoIiwgImZzY2tvYmplY3RzIiwgZnNjayk7CisJCXJlY2VpdmVGc2NrID0gcmMuZ2V0Qm9vbGVhbigicmVjZWl2ZSIsICJmc2Nrb2JqZWN0cyIsIGZzY2spOworCQlmc2NrU2tpcExpc3QgPSByYy5nZXRTdHJpbmcoRlNDSywgbnVsbCwgInNraXBMaXN0Iik7CisJCWFsbG93SW52YWxpZFBlcnNvbklkZW50ID0gcmMuZ2V0Qm9vbGVhbihGU0NLLCAiYWxsb3dJbnZhbGlkUGVyc29uSWRlbnQiLAorCQkJCWZhbHNlKTsKKwkJc2FmZUZvcldpbmRvd3MgPSByYy5nZXRCb29sZWFuKEZTQ0ssICJzYWZlRm9yV2luZG93cyIsCiAJCQkJCQlTeXN0ZW1SZWFkZXIuZ2V0SW5zdGFuY2UoKS5pc1dpbmRvd3MoKSk7Ci0JCXNhZmVGb3JNYWNPUyA9IHJjLmdldEJvb2xlYW4oRlNDSywgInNhZmVGb3JNYWNPUyIsIC8vJE5PTi1OTFMtMSQKKwkJc2FmZUZvck1hY09TID0gcmMuZ2V0Qm9vbGVhbihGU0NLLCAic2FmZUZvck1hY09TIiwKIAkJCQkJCVN5c3RlbVJlYWRlci5nZXRJbnN0YW5jZSgpLmlzTWFjT1MoKSk7CiAKIAkJaWdub3JlID0gRW51bVNldC5ub25lT2YoT2JqZWN0Q2hlY2tlci5FcnJvclR5cGUuY2xhc3MpOwogCQlFbnVtU2V0PE9iamVjdENoZWNrZXIuRXJyb3JUeXBlPiBzZXQgPSBFbnVtU2V0CiAJCQkJLm5vbmVPZihPYmplY3RDaGVja2VyLkVycm9yVHlwZS5jbGFzcyk7CiAJCWZvciAoU3RyaW5nIGtleSA6IHJjLmdldE5hbWVzKEZTQ0spKSB7Ci0JCQlpZiAoZXF1YWxzSWdub3JlQ2FzZShrZXksICJza2lwTGlzdCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJfHwgZXF1YWxzSWdub3JlQ2FzZShrZXksICJhbGxvd0xlYWRpbmdaZXJvRmlsZU1vZGUiKSAvLyROT04tTkxTLTEkCi0JCQkJCXx8IGVxdWFsc0lnbm9yZUNhc2Uoa2V5LCAiYWxsb3dJbnZhbGlkUGVyc29uSWRlbnQiKSAvLyROT04tTkxTLTEkCi0JCQkJCXx8IGVxdWFsc0lnbm9yZUNhc2Uoa2V5LCAic2FmZUZvcldpbmRvd3MiKSAvLyROT04tTkxTLTEkCi0JCQkJCXx8IGVxdWFsc0lnbm9yZUNhc2Uoa2V5LCAic2FmZUZvck1hY09TIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKGVxdWFsc0lnbm9yZUNhc2Uoa2V5LCAic2tpcExpc3QiKQorCQkJCQl8fCBlcXVhbHNJZ25vcmVDYXNlKGtleSwgImFsbG93TGVhZGluZ1plcm9GaWxlTW9kZSIpCisJCQkJCXx8IGVxdWFsc0lnbm9yZUNhc2Uoa2V5LCAiYWxsb3dJbnZhbGlkUGVyc29uSWRlbnQiKQorCQkJCQl8fCBlcXVhbHNJZ25vcmVDYXNlKGtleSwgInNhZmVGb3JXaW5kb3dzIikKKwkJCQkJfHwgZXF1YWxzSWdub3JlQ2FzZShrZXksICJzYWZlRm9yTWFjT1MiKSkgewogCQkJCWNvbnRpbnVlOwogCQkJfQogCkBAIC0xNDUsMTUgKzE3NiwxOCBAQAogCQkJfQogCQl9CiAJCWlmICghc2V0LmNvbnRhaW5zKE9iamVjdENoZWNrZXIuRXJyb3JUeXBlLlpFUk9fUEFEREVEX0ZJTEVNT0RFKQotCQkJCSYmIHJjLmdldEJvb2xlYW4oRlNDSywgImFsbG93TGVhZGluZ1plcm9GaWxlTW9kZSIsIGZhbHNlKSkgeyAvLyROT04tTkxTLTEkCisJCQkJJiYgcmMuZ2V0Qm9vbGVhbihGU0NLLCAiYWxsb3dMZWFkaW5nWmVyb0ZpbGVNb2RlIiwgZmFsc2UpKSB7CiAJCQlpZ25vcmUuYWRkKE9iamVjdENoZWNrZXIuRXJyb3JUeXBlLlpFUk9fUEFEREVEX0ZJTEVNT0RFKTsKIAkJfQogCiAJCWFsbG93VGlwU2hhMUluV2FudCA9IHJjLmdldEJvb2xlYW4oCi0JCQkJInVwbG9hZHBhY2siLCAiYWxsb3d0aXBzaGExaW53YW50IiwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkidXBsb2FkcGFjayIsICJhbGxvd3RpcHNoYTFpbndhbnQiLCBmYWxzZSk7CiAJCWFsbG93UmVhY2hhYmxlU2hhMUluV2FudCA9IHJjLmdldEJvb2xlYW4oCi0JCQkJInVwbG9hZHBhY2siLCAiYWxsb3dyZWFjaGFibGVzaGExaW53YW50IiwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaGlkZVJlZnMgPSByYy5nZXRTdHJpbmdMaXN0KCJ1cGxvYWRwYWNrIiwgbnVsbCwgImhpZGVyZWZzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCSJ1cGxvYWRwYWNrIiwgImFsbG93cmVhY2hhYmxlc2hhMWlud2FudCIsIGZhbHNlKTsKKwkJYWxsb3dGaWx0ZXIgPSByYy5nZXRCb29sZWFuKAorCQkJCSJ1cGxvYWRwYWNrIiwgImFsbG93ZmlsdGVyIiwgZmFsc2UpOworCQlwcm90b2NvbFZlcnNpb24gPSBQcm90b2NvbFZlcnNpb24ucGFyc2UocmMuZ2V0U3RyaW5nKCJwcm90b2NvbCIsIG51bGwsICJ2ZXJzaW9uIikpOworCQloaWRlUmVmcyA9IHJjLmdldFN0cmluZ0xpc3QoInVwbG9hZHBhY2siLCBudWxsLCAiaGlkZXJlZnMiKTsKIAl9CiAKIAkvKioKQEAgLTIyMCw2ICsyNTQsMTQgQEAKIAl9CiAKIAkvKioKKwkgKiBAcmV0dXJuIHRydWUgaWYgY2xpZW50cyBhcmUgYWxsb3dlZCB0byBzcGVjaWZ5IGEgImZpbHRlciIgbGluZQorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0FsbG93RmlsdGVyKCkgeworCQlyZXR1cm4gYWxsb3dGaWx0ZXI7CisJfQorCisJLyoqCiAJICogR2V0IHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5SZWZGaWx0ZXJ9IHJlc3BlY3RpbmcgY29uZmlndXJlZAogCSAqIGhpZGRlbiByZWZzLgogCSAqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydC5qYXZhCmluZGV4IDhkYjc5NmEuLmQzNDJlZjQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydC5qYXZhCkBAIC00NiwxMSArNDYsMTAgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDsKIAotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZEYXRhYmFzZS5BTEw7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwpAQCAtNjQsNyArNjMsNyBAQAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKQEAgLTE0NCwxNyArMTQzLDggQEAKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyB2b2lkIHNjYW4oQ2xhc3NMb2FkZXIgbGRyLCBVUkwgdXJsKSB7Ci0JCUJ1ZmZlcmVkUmVhZGVyIGJyOwotCQl0cnkgewotCQkJSW5wdXRTdHJlYW0gdXJsSW4gPSB1cmwub3BlblN0cmVhbSgpOwotCQkJYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHVybEluLCAiVVRGLTgiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXJyKSB7Ci0JCQkvLyBJZiB3ZSBjYW5ub3QgcmVhZCBmcm9tIHRoZSBzZXJ2aWNlIGxpc3QsIGdvIHRvIHRoZSBuZXh0LgotCQkJLy8KLQkJCXJldHVybjsKLQkJfQotCi0JCXRyeSB7CisJCXRyeSAoQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCisJCQkJbmV3IElucHV0U3RyZWFtUmVhZGVyKHVybC5vcGVuU3RyZWFtKCksIENIQVJTRVQpKSkgewogCQkJU3RyaW5nIGxpbmU7CiAJCQl3aGlsZSAoKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7CiAJCQkJbGluZSA9IGxpbmUudHJpbSgpOwpAQCAtMTY3LDE1ICsxNTcsOCBAQAogCQkJCQlsaW5lID0gbGluZS5zdWJzdHJpbmcoMCwgY29tbWVudCkudHJpbSgpOwogCQkJCWxvYWQobGRyLCBsaW5lKTsKIAkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXJyKSB7Ci0JCQkvLyBJZiB3ZSBmYWlsZWQgZHVyaW5nIGEgcmVhZCwgaWdub3JlIHRoZSBlcnJvci4KLQkJCS8vCi0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWJyLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gSWdub3JlIHRoZSBjbG9zZSBlcnJvcjsgd2UgYXJlIG9ubHkgcmVhZGluZy4KLQkJCX0KKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJLy8gSWdub3JlIGVycm9ycwogCQl9CiAJfQogCkBAIC0yODgsNyArMjcxLDcgQEAKIAkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlRyYW5zcG9ydEV4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSB0cmFuc3BvcnQgY2Fubm90IG9wZW4gdGhpcyBVUkkuCiAJICovCi0JcHVibGljIHN0YXRpYyBUcmFuc3BvcnQgb3BlbihmaW5hbCBSZXBvc2l0b3J5IGxvY2FsLCBmaW5hbCBTdHJpbmcgcmVtb3RlKQorCXB1YmxpYyBzdGF0aWMgVHJhbnNwb3J0IG9wZW4oUmVwb3NpdG9yeSBsb2NhbCwgU3RyaW5nIHJlbW90ZSkKIAkJCXRocm93cyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24sIFVSSVN5bnRheEV4Y2VwdGlvbiwKIAkJCVRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCXJldHVybiBvcGVuKGxvY2FsLCByZW1vdGUsIE9wZXJhdGlvbi5GRVRDSCk7CkBAIC00MTAsNyArMzkzLDcgQEAKIAkgKiAgICAgICAgICAgICBpZiBwcm92aWRlZCByZW1vdGUgY29uZmlndXJhdGlvbiBkb2Vzbid0IGhhdmUgYW55IFVSSQogCSAqICAgICAgICAgICAgIGFzc29jaWF0ZWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBUcmFuc3BvcnQgb3BlbihmaW5hbCBSZXBvc2l0b3J5IGxvY2FsLCBmaW5hbCBSZW1vdGVDb25maWcgY2ZnKQorCXB1YmxpYyBzdGF0aWMgVHJhbnNwb3J0IG9wZW4oUmVwb3NpdG9yeSBsb2NhbCwgUmVtb3RlQ29uZmlnIGNmZykKIAkJCXRocm93cyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24sIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCXJldHVybiBvcGVuKGxvY2FsLCBjZmcsIE9wZXJhdGlvbi5GRVRDSCk7CiAJfQpAQCAtNDk1LDcgKzQ3OCw3IEBACiAJCQl0aHJvd3MgTm90U3VwcG9ydGVkRXhjZXB0aW9uLCBUcmFuc3BvcnRFeGNlcHRpb24gewogCQlmaW5hbCBMaXN0PFVSSWlzaD4gdXJpcyA9IGdldFVSSXMoY2ZnLCBvcCk7CiAJCWZpbmFsIExpc3Q8VHJhbnNwb3J0PiB0cmFuc3BvcnRzID0gbmV3IEFycmF5TGlzdDw+KHVyaXMuc2l6ZSgpKTsKLQkJZm9yIChmaW5hbCBVUklpc2ggdXJpIDogdXJpcykgeworCQlmb3IgKFVSSWlzaCB1cmkgOiB1cmlzKSB7CiAJCQlmaW5hbCBUcmFuc3BvcnQgdG4gPSBvcGVuKGxvY2FsLCB1cmksIGNmZy5nZXROYW1lKCkpOwogCQkJdG4uYXBwbHlDb25maWcoY2ZnKTsKIAkJCXRyYW5zcG9ydHMuYWRkKHRuKTsKQEAgLTUxOSw3ICs1MDIsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkb2VzTm90RXhpc3QoZmluYWwgUmVtb3RlQ29uZmlnIGNmZykgeworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZG9lc05vdEV4aXN0KFJlbW90ZUNvbmZpZyBjZmcpIHsKIAkJcmV0dXJuIGNmZy5nZXRVUklzKCkuaXNFbXB0eSgpICYmIGNmZy5nZXRQdXNoVVJJcygpLmlzRW1wdHkoKTsKIAl9CiAKQEAgLTUzNiw3ICs1MTksNyBAQAogCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuVHJhbnNwb3J0RXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIHRyYW5zcG9ydCBjYW5ub3Qgb3BlbiB0aGlzIFVSSS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFRyYW5zcG9ydCBvcGVuKGZpbmFsIFJlcG9zaXRvcnkgbG9jYWwsIGZpbmFsIFVSSWlzaCB1cmkpCisJcHVibGljIHN0YXRpYyBUcmFuc3BvcnQgb3BlbihSZXBvc2l0b3J5IGxvY2FsLCBVUklpc2ggdXJpKQogCQkJdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiwgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJcmV0dXJuIG9wZW4obG9jYWwsIHVyaSwgbnVsbCk7CiAJfQpAQCAtNjM4LDcgKzYyMSw3IEBACiAJCWZpbmFsIExpc3Q8UmVtb3RlUmVmVXBkYXRlPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDw+KCk7CiAJCWZpbmFsIENvbGxlY3Rpb248UmVmU3BlYz4gcHJvY1JlZnMgPSBleHBhbmRQdXNoV2lsZGNhcmRzRm9yKGRiLCBzcGVjcyk7CiAKLQkJZm9yIChmaW5hbCBSZWZTcGVjIHNwZWMgOiBwcm9jUmVmcykgeworCQlmb3IgKFJlZlNwZWMgc3BlYyA6IHByb2NSZWZzKSB7CiAJCQlTdHJpbmcgc3JjU3BlYyA9IHNwZWMuZ2V0U291cmNlKCk7CiAJCQlmaW5hbCBSZWYgc3JjUmVmID0gZGIuZmluZFJlZihzcmNTcGVjKTsKIAkJCWlmIChzcmNSZWYgIT0gbnVsbCkKQEAgLTcwNSwxMiArNjg4LDEyIEBACiAJcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxSZWZTcGVjPiBleHBhbmRQdXNoV2lsZGNhcmRzRm9yKAogCQkJZmluYWwgUmVwb3NpdG9yeSBkYiwgZmluYWwgQ29sbGVjdGlvbjxSZWZTcGVjPiBzcGVjcykKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZpbmFsIE1hcDxTdHJpbmcsIFJlZj4gbG9jYWxSZWZzID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKEFMTCk7Ci0JCWZpbmFsIENvbGxlY3Rpb248UmVmU3BlYz4gcHJvY1JlZnMgPSBuZXcgSGFzaFNldDw+KCk7CisJCWZpbmFsIExpc3Q8UmVmPiBsb2NhbFJlZnMgPSBkYi5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoKTsKKwkJZmluYWwgQ29sbGVjdGlvbjxSZWZTcGVjPiBwcm9jUmVmcyA9IG5ldyBMaW5rZWRIYXNoU2V0PD4oKTsKIAotCQlmb3IgKGZpbmFsIFJlZlNwZWMgc3BlYyA6IHNwZWNzKSB7CisJCWZvciAoUmVmU3BlYyBzcGVjIDogc3BlY3MpIHsKIAkJCWlmIChzcGVjLmlzV2lsZGNhcmQoKSkgewotCQkJCWZvciAoZmluYWwgUmVmIGxvY2FsUmVmIDogbG9jYWxSZWZzLnZhbHVlcygpKSB7CisJCQkJZm9yIChSZWYgbG9jYWxSZWYgOiBsb2NhbFJlZnMpIHsKIAkJCQkJaWYgKHNwZWMubWF0Y2hTb3VyY2UobG9jYWxSZWYpKQogCQkJCQkJcHJvY1JlZnMuYWRkKHNwZWMuZXhwYW5kRnJvbVNvdXJjZShsb2NhbFJlZikpOwogCQkJCX0KQEAgLTcyNCw3ICs3MDcsNyBAQAogCXByaXZhdGUgc3RhdGljIFN0cmluZyBmaW5kVHJhY2tpbmdSZWZOYW1lKGZpbmFsIFN0cmluZyByZW1vdGVOYW1lLAogCQkJZmluYWwgQ29sbGVjdGlvbjxSZWZTcGVjPiBmZXRjaFNwZWNzKSB7CiAJCS8vIHRyeSB0byBmaW5kIG1hdGNoaW5nIHRyYWNraW5nIHJlZnMKLQkJZm9yIChmaW5hbCBSZWZTcGVjIGZldGNoU3BlYyA6IGZldGNoU3BlY3MpIHsKKwkJZm9yIChSZWZTcGVjIGZldGNoU3BlYyA6IGZldGNoU3BlY3MpIHsKIAkJCWlmIChmZXRjaFNwZWMubWF0Y2hTb3VyY2UocmVtb3RlTmFtZSkpIHsKIAkJCQlpZiAoZmV0Y2hTcGVjLmlzV2lsZGNhcmQoKSkKIAkJCQkJcmV0dXJuIGZldGNoU3BlYy5leHBhbmRGcm9tU291cmNlKHJlbW90ZU5hbWUpCkBAIC04MDcsNiArNzkwLDggQEAKIAkvKiogU2hvdWxkIHJlZnMgbm8gbG9uZ2VyIG9uIHRoZSBzb3VyY2UgYmUgcHJ1bmVkIGZyb20gdGhlIGRlc3RpbmF0aW9uPyAqLwogCXByaXZhdGUgYm9vbGVhbiByZW1vdmVEZWxldGVkUmVmczsKIAorCXByaXZhdGUgbG9uZyBmaWx0ZXJCbG9iTGltaXQgPSAtMTsKKwogCS8qKiBUaW1lb3V0IGluIHNlY29uZHMgdG8gd2FpdCBiZWZvcmUgYWJvcnRpbmcgYW4gSU8gcmVhZCBvciB3cml0ZS4gKi8KIAlwcml2YXRlIGludCB0aW1lb3V0OwogCkBAIC04MzMsNyArODE4LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBVUkkgdXNlZCB0byBhY2Nlc3MgdGhlIHJlbW90ZSByZXBvc2l0b3J5LiBUaGlzIG11c3QgYmUgdGhlCiAJICogICAgICAgICAgICBVUkkgcGFzc2VkIHRvIHtAbGluayAjb3BlbihSZXBvc2l0b3J5LCBVUklpc2gpfS4KIAkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNwb3J0KGZpbmFsIFJlcG9zaXRvcnkgbG9jYWwsIGZpbmFsIFVSSWlzaCB1cmkpIHsKKwlwcm90ZWN0ZWQgVHJhbnNwb3J0KFJlcG9zaXRvcnkgbG9jYWwsIFVSSWlzaCB1cmkpIHsKIAkJZmluYWwgVHJhbnNmZXJDb25maWcgdGMgPSBsb2NhbC5nZXRDb25maWcoKS5nZXQoVHJhbnNmZXJDb25maWcuS0VZKTsKIAkJdGhpcy5sb2NhbCA9IGxvY2FsOwogCQl0aGlzLnVyaSA9IHVyaTsKQEAgLTg0OCw3ICs4MzMsNyBAQAogCSAqIEBwYXJhbSB1cmkKIAkgKiAgICAgICAgICAgIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlVSSWlzaH0gb2JqZWN0LgogCSAqLwotCXByb3RlY3RlZCBUcmFuc3BvcnQoZmluYWwgVVJJaXNoIHVyaSkgeworCXByb3RlY3RlZCBUcmFuc3BvcnQoVVJJaXNoIHVyaSkgewogCQl0aGlzLnVyaSA9IHVyaTsKIAkJdGhpcy5sb2NhbCA9IG51bGw7CiAJCXRoaXMub2JqZWN0Q2hlY2tlciA9IG5ldyBPYmplY3RDaGVja2VyKCk7CkBAIC04ODEsNyArODY2LDcgQEAKIAkgKiBAcGFyYW0gd2hlcmUKIAkgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIGV4ZWN1dGFibGUuCiAJICovCi0JcHVibGljIHZvaWQgc2V0T3B0aW9uVXBsb2FkUGFjayhmaW5hbCBTdHJpbmcgd2hlcmUpIHsKKwlwdWJsaWMgdm9pZCBzZXRPcHRpb25VcGxvYWRQYWNrKFN0cmluZyB3aGVyZSkgewogCQlpZiAod2hlcmUgIT0gbnVsbCAmJiB3aGVyZS5sZW5ndGgoKSA+IDApCiAJCQlvcHRpb25VcGxvYWRQYWNrID0gd2hlcmU7CiAJCWVsc2UKQEAgLTkwMyw3ICs4ODgsNyBAQAogCSAqIEBwYXJhbSBvcHRpb24KIAkgKiAgICAgICAgICAgIG1ldGhvZCB0byB1c2Ugd2hlbiBoYW5kbGluZyBhbm5vdGF0ZWQgdGFncy4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYWdPcHQoZmluYWwgVGFnT3B0IG9wdGlvbikgeworCXB1YmxpYyB2b2lkIHNldFRhZ09wdChUYWdPcHQgb3B0aW9uKSB7CiAJCXRhZ29wdCA9IG9wdGlvbiAhPSBudWxsID8gb3B0aW9uIDogVGFnT3B0LkFVVE9fRk9MTE9XOwogCX0KIApAQCAtOTI3LDcgKzkxMiw3IEBACiAJICogICAgICAgICAgICB3aGVuIGl0IHNob3VsZG4ndAogCSAqIEBzZWUgUGFja1RyYW5zcG9ydAogCSAqLwotCXB1YmxpYyB2b2lkIHNldEZldGNoVGhpbihmaW5hbCBib29sZWFuIGZldGNoVGhpbikgeworCXB1YmxpYyB2b2lkIHNldEZldGNoVGhpbihib29sZWFuIGZldGNoVGhpbikgewogCQl0aGlzLmZldGNoVGhpbiA9IGZldGNoVGhpbjsKIAl9CiAKQEAgLTk1MCw3ICs5MzUsNyBAQAogCSAqICAgICAgICAgICAgcmVjZWl2ZWQgb2JqZWN0cyBhcmUgdmFsaWQuCiAJICogQHNlZSAjc2V0T2JqZWN0Q2hlY2tlcihPYmplY3RDaGVja2VyKQogCSAqLwotCXB1YmxpYyB2b2lkIHNldENoZWNrRmV0Y2hlZE9iamVjdHMoZmluYWwgYm9vbGVhbiBjaGVjaykgeworCXB1YmxpYyB2b2lkIHNldENoZWNrRmV0Y2hlZE9iamVjdHMoYm9vbGVhbiBjaGVjaykgewogCQlpZiAoY2hlY2sgJiYgb2JqZWN0Q2hlY2tlciA9PSBudWxsKQogCQkJc2V0T2JqZWN0Q2hlY2tlcihuZXcgT2JqZWN0Q2hlY2tlcigpKTsKIAkJZWxzZSBpZiAoIWNoZWNrICYmIG9iamVjdENoZWNrZXIgIT0gbnVsbCkKQEAgLTEwMjUsNyArMTAxMCw3IEBACiAJICogICAgICAgICAgICBmYWxzZSB3aGVuIGl0IHNob3VsZG4ndAogCSAqIEBzZWUgUGFja1RyYW5zcG9ydAogCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1c2hUaGluKGZpbmFsIGJvb2xlYW4gcHVzaFRoaW4pIHsKKwlwdWJsaWMgdm9pZCBzZXRQdXNoVGhpbihib29sZWFuIHB1c2hUaGluKSB7CiAJCXRoaXMucHVzaFRoaW4gPSBwdXNoVGhpbjsKIAl9CiAKQEAgLTEwNTAsNyArMTAzNSw3IEBACiAJICogQHNlZSBQYWNrVHJhbnNwb3J0CiAJICogQHNpbmNlIDQuMgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1c2hBdG9taWMoZmluYWwgYm9vbGVhbiBhdG9taWMpIHsKKwlwdWJsaWMgdm9pZCBzZXRQdXNoQXRvbWljKGJvb2xlYW4gYXRvbWljKSB7CiAJCXRoaXMucHVzaEF0b21pYyA9IGF0b21pYzsKIAl9CiAKQEAgLTEwNzcsMTcgKzEwNjIsMzQgQEAKIAkgKgogCSAqIEBwYXJhbSByZW1vdmUgdHJ1ZSB0byByZW1vdmUgcmVmcyB0aGF0IG5vIGxvbmdlciBleGlzdC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZW1vdmVEZWxldGVkUmVmcyhmaW5hbCBib29sZWFuIHJlbW92ZSkgeworCXB1YmxpYyB2b2lkIHNldFJlbW92ZURlbGV0ZWRSZWZzKGJvb2xlYW4gcmVtb3ZlKSB7CiAJCXJlbW92ZURlbGV0ZWRSZWZzID0gcmVtb3ZlOwogCX0KIAogCS8qKgorCSAqIEByZXR1cm4gdGhlIGxhc3QgdmFsdWUgcGFzc2VkIHRvIHtAbGluayAjc2V0RmlsdGVyQmxvYkxpbWl0fSwgb3IgLTEgaWYKKwkgKiAgICAgICAgIGl0IHdhcyBuZXZlciBpbnZva2VkLgorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgbG9uZyBnZXRGaWx0ZXJCbG9iTGltaXQoKSB7CisJCXJldHVybiBmaWx0ZXJCbG9iTGltaXQ7CisJfQorCisJLyoqCisJICogQHBhcmFtIGJ5dGVzIGV4Y2x1ZGUgYmxvYnMgb2Ygc2l6ZSBncmVhdGVyIHRoYW4gdGhpcworCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRGaWx0ZXJCbG9iTGltaXQobG9uZyBieXRlcykgeworCQlmaWx0ZXJCbG9iTGltaXQgPSBieXRlczsKKwl9CisKKwkvKioKIAkgKiBBcHBseSBwcm92aWRlZCByZW1vdGUgY29uZmlndXJhdGlvbiBvbiB0aGlzIHRyYW5zcG9ydC4KIAkgKgogCSAqIEBwYXJhbSBjZmcKIAkgKiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gdG8gYXBwbHkgb24gdGhpcyB0cmFuc3BvcnQuCiAJICovCi0JcHVibGljIHZvaWQgYXBwbHlDb25maWcoZmluYWwgUmVtb3RlQ29uZmlnIGNmZykgeworCXB1YmxpYyB2b2lkIGFwcGx5Q29uZmlnKFJlbW90ZUNvbmZpZyBjZmcpIHsKIAkJc2V0T3B0aW9uVXBsb2FkUGFjayhjZmcuZ2V0VXBsb2FkUGFjaygpKTsKIAkJc2V0T3B0aW9uUmVjZWl2ZVBhY2soY2ZnLmdldFJlY2VpdmVQYWNrKCkpOwogCQlzZXRUYWdPcHQoY2ZnLmdldFRhZ09wdCgpKTsKQEAgLTExMTYsNyArMTExOCw3IEBACiAJICogICAgICAgICAgICBhbmQgbm90IHJlYWxseSB1cGRhdGUgcmVtb3RlIHJlZnMsIGZhbHNlIG90aGVyd2lzZSAtIHdoZW4gcHVzaAogCSAqICAgICAgICAgICAgc2hvdWxkIGFjdCBub3JtYWxseS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXREcnlSdW4oZmluYWwgYm9vbGVhbiBkcnlSdW4pIHsKKwlwdWJsaWMgdm9pZCBzZXREcnlSdW4oYm9vbGVhbiBkcnlSdW4pIHsKIAkJdGhpcy5kcnlSdW4gPSBkcnlSdW47CiAJfQogCkBAIC0xMTM3LDcgKzExMzksNyBAQAogCSAqICAgICAgICAgICAgYmVmb3JlIGFib3J0aW5nIGFuIElPIHJlYWQgb3Igd3JpdGUgb3BlcmF0aW9uIHdpdGggdGhpcwogCSAqICAgICAgICAgICAgcmVtb3RlLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpbWVvdXQoZmluYWwgaW50IHNlY29uZHMpIHsKKwlwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGludCBzZWNvbmRzKSB7CiAJCXRpbWVvdXQgPSBzZWNvbmRzOwogCX0KIApAQCAtMTIwNCw3ICsxMjA2LDcgQEAKIAkgKiAgICAgICAgICAgIG51bGwgaWYgcHVzaCBvcHRpb25zIGFyZSB1bnN1cHBvcnRlZAogCSAqIEBzaW5jZSA0LjUKIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdXNoT3B0aW9ucyhmaW5hbCBMaXN0PFN0cmluZz4gcHVzaE9wdGlvbnMpIHsKKwlwdWJsaWMgdm9pZCBzZXRQdXNoT3B0aW9ucyhMaXN0PFN0cmluZz4gcHVzaE9wdGlvbnMpIHsKIAkJdGhpcy5wdXNoT3B0aW9ucyA9IHB1c2hPcHRpb25zOwogCX0KIApAQCAtMTI1MSw5ICsxMjUzLDkgQEAKIAkJCS8vIG9iamVjdCB0cmFuc2ZlciBvdmVyaGVhZHMuCiAJCQkvLwogCQkJZmluYWwgQ29sbGVjdGlvbjxSZWZTcGVjPiB0bXAgPSBuZXcgQXJyYXlMaXN0PD4odG9GZXRjaCk7Ci0JCQlmb3IgKGZpbmFsIFJlZlNwZWMgcmVxdWVzdGVkIDogdG9GZXRjaCkgeworCQkJZm9yIChSZWZTcGVjIHJlcXVlc3RlZCA6IHRvRmV0Y2gpIHsKIAkJCQlmaW5hbCBTdHJpbmcgcmVxU3JjID0gcmVxdWVzdGVkLmdldFNvdXJjZSgpOwotCQkJCWZvciAoZmluYWwgUmVmU3BlYyBjb25maWd1cmVkIDogZmV0Y2gpIHsKKwkJCQlmb3IgKFJlZlNwZWMgY29uZmlndXJlZCA6IGZldGNoKSB7CiAJCQkJCWZpbmFsIFN0cmluZyBjZmdTcmMgPSBjb25maWd1cmVkLmdldFNvdXJjZSgpOwogCQkJCQlmaW5hbCBTdHJpbmcgY2ZnRHN0ID0gY29uZmlndXJlZC5nZXREZXN0aW5hdGlvbigpOwogCQkJCQlpZiAoY2ZnU3JjLmVxdWFscyhyZXFTcmMpICYmIGNmZ0RzdCAhPSBudWxsKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRBbWF6b25TMy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0QW1hem9uUzMuamF2YQppbmRleCBjNjE5MWVjZWIuLjYxMThjYjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydEFtYXpvblMzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0QW1hem9uUzMuamF2YQpAQCAtMjY3LDcgKzI2Nyw3IEBACiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJV2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlIG9wZW5BbHRlcm5hdGUoZmluYWwgU3RyaW5nIGxvY2F0aW9uKQorCQlXYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2Ugb3BlbkFsdGVybmF0ZShTdHJpbmcgbG9jYXRpb24pCiAJCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXJldHVybiBuZXcgRGF0YWJhc2VTMyhidWNrZXROYW1lLCByZXNvbHZlS2V5KGxvY2F0aW9uKSk7CiAJCX0KQEAgLTI3OCw3ICsyNzgsNyBAQAogCQkJaGF2ZS5hZGRBbGwoczMubGlzdChidWNrZXQsIHJlc29sdmVLZXkoInBhY2siKSkpOyAvLyROT04tTkxTLTEkCiAKIAkJCWZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiBwYWNrcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotCQkJZm9yIChmaW5hbCBTdHJpbmcgbiA6IGhhdmUpIHsKKwkJCWZvciAoU3RyaW5nIG4gOiBoYXZlKSB7CiAJCQkJaWYgKCFuLnN0YXJ0c1dpdGgoInBhY2stIikgfHwgIW4uZW5kc1dpdGgoIi5wYWNrIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJCQljb250aW51ZTsKIApAQCAtMjkwLDcgKzI5MCw3IEBACiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJRmlsZVN0cmVhbSBvcGVuKGZpbmFsIFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlGaWxlU3RyZWFtIG9wZW4oU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlmaW5hbCBVUkxDb25uZWN0aW9uIGMgPSBzMy5nZXQoYnVja2V0LCByZXNvbHZlS2V5KHBhdGgpKTsKIAkJCWZpbmFsIElucHV0U3RyZWFtIHJhdyA9IGMuZ2V0SW5wdXRTdHJlYW0oKTsKIAkJCWZpbmFsIElucHV0U3RyZWFtIGluID0gczMuZGVjcnlwdChjKTsKQEAgLTI5OSw3ICsyOTksNyBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXZvaWQgZGVsZXRlRmlsZShmaW5hbCBTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdm9pZCBkZWxldGVGaWxlKFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJczMuZGVsZXRlKGJ1Y2tldCwgcmVzb2x2ZUtleShwYXRoKSk7CiAJCX0KIApAQCAtMzExLDcgKzMxMSw3IEBACiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJdm9pZCB3cml0ZUZpbGUoZmluYWwgU3RyaW5nIHBhdGgsIGZpbmFsIGJ5dGVbXSBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl2b2lkIHdyaXRlRmlsZShTdHJpbmcgcGF0aCwgYnl0ZVtdIGRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlzMy5wdXQoYnVja2V0LCByZXNvbHZlS2V5KHBhdGgpLCBkYXRhKTsKIAkJfQogCkBAIC0zMjMsNyArMzIzLDcgQEAKIAkJCXJldHVybiBhdmFpbDsKIAkJfQogCi0JCXByaXZhdGUgdm9pZCByZWFkTG9vc2VSZWZzKGZpbmFsIFRyZWVNYXA8U3RyaW5nLCBSZWY+IGF2YWlsKQorCQlwcml2YXRlIHZvaWQgcmVhZExvb3NlUmVmcyhUcmVlTWFwPFN0cmluZywgUmVmPiBhdmFpbCkKIAkJCQl0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJCXRyeSB7CiAJCQkJZm9yIChmaW5hbCBTdHJpbmcgbiA6IHMzLmxpc3QoYnVja2V0LCByZXNvbHZlS2V5KFJPT1RfRElSCkBAIC0zMzQsMTYgKzMzNCwxMyBAQAogCQkJfQogCQl9CiAKLQkJcHJpdmF0ZSBSZWYgcmVhZFJlZihmaW5hbCBUcmVlTWFwPFN0cmluZywgUmVmPiBhdmFpbCwgZmluYWwgU3RyaW5nIHJuKQorCQlwcml2YXRlIFJlZiByZWFkUmVmKFRyZWVNYXA8U3RyaW5nLCBSZWY+IGF2YWlsLCBTdHJpbmcgcm4pCiAJCQkJdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCQlmaW5hbCBTdHJpbmcgczsKIAkJCVN0cmluZyByZWYgPSBST09UX0RJUiArIHJuOwogCQkJdHJ5IHsKLQkJCQlmaW5hbCBCdWZmZXJlZFJlYWRlciBiciA9IG9wZW5SZWFkZXIocmVmKTsKLQkJCQl0cnkgeworCQkJCXRyeSAoQnVmZmVyZWRSZWFkZXIgYnIgPSBvcGVuUmVhZGVyKHJlZikpIHsKIAkJCQkJcyA9IGJyLnJlYWRMaW5lKCk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJYnIuY2xvc2UoKTsKIAkJCQl9CiAJCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gbm9SZWYpIHsKIAkJCQlyZXR1cm4gbnVsbDsKQEAgLTM3Nyw3ICszNzQsNyBAQAogCQkJdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbihnZXRVUkkoKSwgTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkudHJhbnNwb3J0RXhjZXB0aW9uQmFkUmVmLCBybiwgcykpOwogCQl9CiAKLQkJcHJpdmF0ZSBTdG9yYWdlIGxvb3NlKGZpbmFsIFJlZiByKSB7CisJCXByaXZhdGUgU3RvcmFnZSBsb29zZShSZWYgcikgewogCQkJaWYgKHIgIT0gbnVsbCAmJiByLmdldFN0b3JhZ2UoKSA9PSBTdG9yYWdlLlBBQ0tFRCkKIAkJCQlyZXR1cm4gU3RvcmFnZS5MT09TRV9QQUNLRUQ7CiAJCQlyZXR1cm4gU3RvcmFnZS5MT09TRTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydEdpdEFub24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydEdpdEFub24uamF2YQppbmRleCA4MTYxODdlLi4xMTMyNTAzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRHaXRBbm9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0R2l0QW5vbi5qYXZhCkBAIC0xMTMsMTEgKzExMywxMSBAQAogCQl9CiAJfTsKIAotCVRyYW5zcG9ydEdpdEFub24oZmluYWwgUmVwb3NpdG9yeSBsb2NhbCwgZmluYWwgVVJJaXNoIHVyaSkgeworCVRyYW5zcG9ydEdpdEFub24oUmVwb3NpdG9yeSBsb2NhbCwgVVJJaXNoIHVyaSkgewogCQlzdXBlcihsb2NhbCwgdXJpKTsKIAl9CiAKLQlUcmFuc3BvcnRHaXRBbm9uKGZpbmFsIFVSSWlzaCB1cmkpIHsKKwlUcmFuc3BvcnRHaXRBbm9uKFVSSWlzaCB1cmkpIHsKIAkJc3VwZXIodXJpKTsKIAl9CiAKQEAgLTE0Miw2ICsxNDIsNyBAQAogCVNvY2tldCBvcGVuQ29ubmVjdGlvbigpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQlmaW5hbCBpbnQgdG1zID0gZ2V0VGltZW91dCgpID4gMCA/IGdldFRpbWVvdXQoKSAqIDEwMDAgOiAwOwogCQlmaW5hbCBpbnQgcG9ydCA9IHVyaS5nZXRQb3J0KCkgPiAwID8gdXJpLmdldFBvcnQoKSA6IEdJVF9QT1JUOworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBDbG9zZWQgYnkgdGhlIGNhbGxlcgogCQlmaW5hbCBTb2NrZXQgcyA9IG5ldyBTb2NrZXQoKTsKIAkJdHJ5IHsKIAkJCWZpbmFsIEluZXRBZGRyZXNzIGhvc3QgPSBJbmV0QWRkcmVzcy5nZXRCeU5hbWUodXJpLmdldEhvc3QoKSk7CkBAIC0xNjIsNyArMTYzLDcgQEAKIAkJcmV0dXJuIHM7CiAJfQogCi0Jdm9pZCBzZXJ2aWNlKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBQYWNrZXRMaW5lT3V0IHBja091dCkKKwl2b2lkIHNlcnZpY2UoU3RyaW5nIG5hbWUsIFBhY2tldExpbmVPdXQgcGNrT3V0KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nQnVpbGRlciBjbWQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQljbWQuYXBwZW5kKG5hbWUpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0R2l0U3NoLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRHaXRTc2guamF2YQppbmRleCBiYzg1ZTZmLi5kNTlmZTMzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRHaXRTc2guamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRHaXRTc2guamF2YQpAQCAtMTQxLDEyICsxNDEsMTIgQEAKIAkJfQogCX07CiAKLQlUcmFuc3BvcnRHaXRTc2goZmluYWwgUmVwb3NpdG9yeSBsb2NhbCwgZmluYWwgVVJJaXNoIHVyaSkgeworCVRyYW5zcG9ydEdpdFNzaChSZXBvc2l0b3J5IGxvY2FsLCBVUklpc2ggdXJpKSB7CiAJCXN1cGVyKGxvY2FsLCB1cmkpOwogCQlpbml0U3NoU2Vzc2lvbkZhY3RvcnkoKTsKIAl9CiAKLQlUcmFuc3BvcnRHaXRTc2goZmluYWwgVVJJaXNoIHVyaSkgeworCVRyYW5zcG9ydEdpdFNzaChVUklpc2ggdXJpKSB7CiAJCXN1cGVyKHVyaSk7CiAJCWluaXRTc2hTZXNzaW9uRmFjdG9yeSgpOwogCX0KQEAgLTE3Niw3ICsxNzYsNyBAQAogCQlyZXR1cm4gbmV3IFNzaFB1c2hDb25uZWN0aW9uKCk7CiAJfQogCi0JU3RyaW5nIGNvbW1hbmRGb3IoZmluYWwgU3RyaW5nIGV4ZSkgeworCVN0cmluZyBjb21tYW5kRm9yKFN0cmluZyBleGUpIHsKIAkJU3RyaW5nIHBhdGggPSB1cmkuZ2V0UGF0aCgpOwogCQlpZiAodXJpLmdldFNjaGVtZSgpICE9IG51bGwgJiYgdXJpLmdldFBhdGgoKS5zdGFydHNXaXRoKCIvfiIpKSAvLyROT04tTkxTLTEkCiAJCQlwYXRoID0gKHVyaS5nZXRQYXRoKCkuc3Vic3RyaW5nKDEpKTsKQEAgLTMxMSw2ICszMTEsOSBAQAogCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKIAkJCWVuZE91dCgpOwogCisJCQlpZiAocHJvY2VzcyAhPSBudWxsKSB7CisJCQkJcHJvY2Vzcy5kZXN0cm95KCk7CisJCQl9CiAJCQlpZiAoZXJyb3JUaHJlYWQgIT0gbnVsbCkgewogCQkJCXRyeSB7CiAJCQkJCWVycm9yVGhyZWFkLmhhbHQoKTsKQEAgLTMyMiw4ICszMjUsNiBAQAogCQkJfQogCiAJCQlzdXBlci5jbG9zZSgpOwotCQkJaWYgKHByb2Nlc3MgIT0gbnVsbCkKLQkJCQlwcm9jZXNzLmRlc3Ryb3koKTsKIAkJfQogCX0KIApAQCAtMzc3LDYgKzM3OCw5IEBACiAJCXB1YmxpYyB2b2lkIGNsb3NlKCkgewogCQkJZW5kT3V0KCk7CiAKKwkJCWlmIChwcm9jZXNzICE9IG51bGwpIHsKKwkJCQlwcm9jZXNzLmRlc3Ryb3koKTsKKwkJCX0KIAkJCWlmIChlcnJvclRocmVhZCAhPSBudWxsKSB7CiAJCQkJdHJ5IHsKIAkJCQkJZXJyb3JUaHJlYWQuaGFsdCgpOwpAQCAtMzg4LDggKzM5Miw2IEBACiAJCQl9CiAKIAkJCXN1cGVyLmNsb3NlKCk7Ci0JCQlpZiAocHJvY2VzcyAhPSBudWxsKQotCQkJCXByb2Nlc3MuZGVzdHJveSgpOwogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0SHR0cC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0SHR0cC5qYXZhCmluZGV4IGExODI2MjMuLmMwOGY0MDAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydEh0dHAuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRIdHRwLmphdmEKQEAgLTI3Myw3ICsyNzMsNyBAQAogCiAJcHJpdmF0ZSBib29sZWFuIHNzbEZhaWx1cmUgPSBmYWxzZTsKIAotCVRyYW5zcG9ydEh0dHAoZmluYWwgUmVwb3NpdG9yeSBsb2NhbCwgZmluYWwgVVJJaXNoIHVyaSkKKwlUcmFuc3BvcnRIdHRwKFJlcG9zaXRvcnkgbG9jYWwsIFVSSWlzaCB1cmkpCiAJCQl0aHJvd3MgTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKIAkJc3VwZXIobG9jYWwsIHVyaSk7CiAJCXNldFVSSSh1cmkpOwpAQCAtMjk4LDcgKzI5OCw3IEBACiAJICogQHRocm93cyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Ob3RTdXBwb3J0ZWRFeGNlcHRpb24KIAkgKiBAc2luY2UgNC45CiAJICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VVJJKGZpbmFsIFVSSWlzaCB1cmkpIHRocm93cyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24geworCXByb3RlY3RlZCB2b2lkIHNldFVSSShVUklpc2ggdXJpKSB0aHJvd3MgTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCWN1cnJlbnRVcmkgPSB1cmk7CiAJCQliYXNlVXJsID0gdG9VUkwodXJpKTsKQEAgLTMxNCw3ICszMTQsNyBAQAogCSAqIEBwYXJhbSB1cmkKIAkgKiBAdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbgogCSAqLwotCVRyYW5zcG9ydEh0dHAoZmluYWwgVVJJaXNoIHVyaSkgdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CisJVHJhbnNwb3J0SHR0cChVUklpc2ggdXJpKSB0aHJvd3MgTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKIAkJc3VwZXIodXJpKTsKIAkJc2V0VVJJKHVyaSk7CiAJCWh0dHAgPSBuZXcgSHR0cENvbmZpZyh1cmkpOwpAQCAtMzMyLDEwICszMzIsMjYgQEAKIAkgKiBAcGFyYW0gb24KIAkgKiAgICAgICAgICAgIGlmIHtAY29kZSB0cnVlfSAoZGVmYXVsdCksIHNtYXJ0IEhUVFAgaXMgZW5hYmxlZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVc2VTbWFydEh0dHAoZmluYWwgYm9vbGVhbiBvbikgeworCXB1YmxpYyB2b2lkIHNldFVzZVNtYXJ0SHR0cChib29sZWFuIG9uKSB7CiAJCXVzZVNtYXJ0SHR0cCA9IG9uOwogCX0KIAorCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIENsb3NlZCBieSBjYWxsZXIKKwlwcml2YXRlIEZldGNoQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKEh0dHBDb25uZWN0aW9uIGMsIElucHV0U3RyZWFtIGluLAorCQkJU3RyaW5nIHNlcnZpY2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUJhc2VDb25uZWN0aW9uIGY7CisJCWlmIChpc1NtYXJ0SHR0cChjLCBzZXJ2aWNlKSkgeworCQkJcmVhZFNtYXJ0SGVhZGVycyhpbiwgc2VydmljZSk7CisJCQlmID0gbmV3IFNtYXJ0SHR0cEZldGNoQ29ubmVjdGlvbihpbik7CisJCX0gZWxzZSB7CisJCQkvLyBBc3N1bWUgdGhpcyBzZXJ2ZXIgZG9lc24ndCBzdXBwb3J0IHNtYXJ0IEhUVFAgZmV0Y2gKKwkJCS8vIGFuZCBmYWxsIGJhY2sgb24gZHVtYiBvYmplY3Qgd2Fsa2luZy4KKwkJCWYgPSBuZXdEdW1iQ29ubmVjdGlvbihpbik7CisJCX0KKwkJZi5zZXRQZWVyVXNlckFnZW50KGMuZ2V0SGVhZGVyRmllbGQoSHR0cFN1cHBvcnQuSERSX1NFUlZFUikpOworCQlyZXR1cm4gKEZldGNoQ29ubmVjdGlvbikgZjsKKwl9CisKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQogCXB1YmxpYyBGZXRjaENvbm5lY3Rpb24gb3BlbkZldGNoKCkgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiwKQEAgLTM0MywyMSArMzU5LDggQEAKIAkJZmluYWwgU3RyaW5nIHNlcnZpY2UgPSBTVkNfVVBMT0FEX1BBQ0s7CiAJCXRyeSB7CiAJCQlmaW5hbCBIdHRwQ29ubmVjdGlvbiBjID0gY29ubmVjdChzZXJ2aWNlKTsKLQkJCWZpbmFsIElucHV0U3RyZWFtIGluID0gb3BlbklucHV0U3RyZWFtKGMpOwotCQkJdHJ5IHsKLQkJCQlCYXNlQ29ubmVjdGlvbiBmOwotCQkJCWlmIChpc1NtYXJ0SHR0cChjLCBzZXJ2aWNlKSkgewotCQkJCQlyZWFkU21hcnRIZWFkZXJzKGluLCBzZXJ2aWNlKTsKLQkJCQkJZiA9IG5ldyBTbWFydEh0dHBGZXRjaENvbm5lY3Rpb24oaW4pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIEFzc3VtZSB0aGlzIHNlcnZlciBkb2Vzbid0IHN1cHBvcnQgc21hcnQgSFRUUCBmZXRjaAotCQkJCQkvLyBhbmQgZmFsbCBiYWNrIG9uIGR1bWIgb2JqZWN0IHdhbGtpbmcuCi0JCQkJCWYgPSBuZXdEdW1iQ29ubmVjdGlvbihpbik7Ci0JCQkJfQotCQkJCWYuc2V0UGVlclVzZXJBZ2VudChjLmdldEhlYWRlckZpZWxkKEh0dHBTdXBwb3J0LkhEUl9TRVJWRVIpKTsKLQkJCQlyZXR1cm4gKEZldGNoQ29ubmVjdGlvbikgZjsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaW4uY2xvc2UoKTsKKwkJCXRyeSAoSW5wdXRTdHJlYW0gaW4gPSBvcGVuSW5wdXRTdHJlYW0oYykpIHsKKwkJCQlyZXR1cm4gZ2V0Q29ubmVjdGlvbihjLCBpbiwgc2VydmljZSk7CiAJCQl9CiAJCX0gY2F0Y2ggKE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlcnIpIHsKIAkJCXRocm93IGVycjsKQEAgLTQ4MCw3ICs0ODMsNyBAQAogCQl0aGlzLmhlYWRlcnMgPSBoZWFkZXJzOwogCX0KIAotCXByaXZhdGUgSHR0cENvbm5lY3Rpb24gY29ubmVjdChmaW5hbCBTdHJpbmcgc2VydmljZSkKKwlwcml2YXRlIEh0dHBDb25uZWN0aW9uIGNvbm5lY3QoU3RyaW5nIHNlcnZpY2UpCiAJCQl0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uLCBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gewogCQlVUkwgdSA9IGdldFNlcnZpY2VVUkwoc2VydmljZSk7CiAJCWludCBhdXRoQXR0ZW1wdHMgPSAxOwpAQCAtNzcyLDcgKzc3NSw3IEBACiAJCXJldHVybiB0cnVlOwogCX0KIAotCXByaXZhdGUgVVJMIGdldFNlcnZpY2VVUkwoZmluYWwgU3RyaW5nIHNlcnZpY2UpCisJcHJpdmF0ZSBVUkwgZ2V0U2VydmljZVVSTChTdHJpbmcgc2VydmljZSkKIAkJCXRocm93cyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gewogCQl0cnkgewogCQkJZmluYWwgU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKQEAgLTc5NiwyMSArNzk5LDYgQEAKIAl9CiAKIAkvKioKLQkgKiBPcGVuIGFuIEhUVFAgY29ubmVjdGlvbiwgc2V0dGluZyB0aGUgYWNjZXB0LWVuY29kaW5nIHJlcXVlc3QgaGVhZGVyIHRvIGd6aXAuCi0JICoKLQkgKiBAcGFyYW0gbWV0aG9kIEhUVFAgcmVxdWVzdCBtZXRob2QKLQkgKiBAcGFyYW0gdSB1cmwgb2YgdGhlIEhUVFAgY29ubmVjdGlvbgotCSAqIEByZXR1cm4gdGhlIEhUVFAgY29ubmVjdGlvbgotCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotCSAqIEBzaW5jZSAzLjMKLQkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNodHRwT3BlbihTdHJpbmcsIFVSTCwgQWNjZXB0RW5jb2RpbmcpfSBpbnN0ZWFkLgotCSAqLwotCUBEZXByZWNhdGVkCi0JcHJvdGVjdGVkIEh0dHBDb25uZWN0aW9uIGh0dHBPcGVuKFN0cmluZyBtZXRob2QsIFVSTCB1KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gaHR0cE9wZW4obWV0aG9kLCB1LCBBY2NlcHRFbmNvZGluZy5HWklQKTsKLQl9Ci0KLQkvKioKIAkgKiBPcGVuIGFuIEhUVFAgY29ubmVjdGlvbi4KIAkgKgogCSAqIEBwYXJhbSBtZXRob2QgSFRUUCByZXF1ZXN0IG1ldGhvZApAQCAtODczLDE4ICs4NjEsMTggQEAKIAkJcmV0dXJuIG5ldyBUcmFuc3BvcnRFeGNlcHRpb24odXJpLCB3aHkpOwogCX0KIAotCXByaXZhdGUgYm9vbGVhbiBpc1NtYXJ0SHR0cChmaW5hbCBIdHRwQ29ubmVjdGlvbiBjLCBmaW5hbCBTdHJpbmcgc2VydmljZSkgeworCXByaXZhdGUgYm9vbGVhbiBpc1NtYXJ0SHR0cChIdHRwQ29ubmVjdGlvbiBjLCBTdHJpbmcgc2VydmljZSkgewogCQlmaW5hbCBTdHJpbmcgZXhwVHlwZSA9ICJhcHBsaWNhdGlvbi94LSIgKyBzZXJ2aWNlICsgIi1hZHZlcnRpc2VtZW50IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCWZpbmFsIFN0cmluZyBhY3RUeXBlID0gYy5nZXRDb250ZW50VHlwZSgpOwogCQlyZXR1cm4gZXhwVHlwZS5lcXVhbHMoYWN0VHlwZSk7CiAJfQogCi0JcHJpdmF0ZSBib29sZWFuIGlzR3ppcENvbnRlbnQoZmluYWwgSHR0cENvbm5lY3Rpb24gYykgeworCXByaXZhdGUgYm9vbGVhbiBpc0d6aXBDb250ZW50KEh0dHBDb25uZWN0aW9uIGMpIHsKIAkJcmV0dXJuIEVOQ09ESU5HX0daSVAuZXF1YWxzKGMuZ2V0SGVhZGVyRmllbGQoSERSX0NPTlRFTlRfRU5DT0RJTkcpKQogCQkJCXx8IEVOQ09ESU5HX1hfR1pJUC5lcXVhbHMoYy5nZXRIZWFkZXJGaWVsZChIRFJfQ09OVEVOVF9FTkNPRElORykpOwogCX0KIAotCXByaXZhdGUgdm9pZCByZWFkU21hcnRIZWFkZXJzKGZpbmFsIElucHV0U3RyZWFtIGluLCBmaW5hbCBTdHJpbmcgc2VydmljZSkKKwlwcml2YXRlIHZvaWQgcmVhZFNtYXJ0SGVhZGVycyhJbnB1dFN0cmVhbSBpbiwgU3RyaW5nIHNlcnZpY2UpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQkvLyBBIHNtYXJ0IHJlcGx5IHdpbGwgaGF2ZSBhICcjJyBhZnRlciB0aGUgZmlyc3QgNCBieXRlcywgYnV0CiAJCS8vIGEgZHVtYiByZXBseSBjYW5ub3QgY29udGFpbiBhICcjJyB1bnRpbCBhZnRlciBieXRlIDQxLiBEbyBhCkBAIC05MTUsNyArOTAzLDcgQEAKIAljbGFzcyBIdHRwT2JqZWN0REIgZXh0ZW5kcyBXYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2UgewogCQlwcml2YXRlIGZpbmFsIFVSTCBodHRwT2JqZWN0c1VybDsKIAotCQlIdHRwT2JqZWN0REIoZmluYWwgVVJMIGIpIHsKKwkJSHR0cE9iamVjdERCKFVSTCBiKSB7CiAJCQlodHRwT2JqZWN0c1VybCA9IGI7CiAJCX0KIApAQCAtOTQyLDcgKzkzMCw3IEBACiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJV2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlIG9wZW5BbHRlcm5hdGUoZmluYWwgU3RyaW5nIGxvY2F0aW9uKQorCQlXYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2Ugb3BlbkFsdGVybmF0ZShTdHJpbmcgbG9jYXRpb24pCiAJCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXJldHVybiBuZXcgSHR0cE9iamVjdERCKG5ldyBVUkwoaHR0cE9iamVjdHNVcmwsIGxvY2F0aW9uKSk7CiAJCX0KQEAgLTk3NCw3ICs5NjIsNyBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCUZpbGVTdHJlYW0gb3BlbihmaW5hbCBTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJRmlsZVN0cmVhbSBvcGVuKFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJcmV0dXJuIG9wZW4ocGF0aCwgQWNjZXB0RW5jb2RpbmcuVU5TUEVDSUZJRUQpOwogCQl9CiAKQEAgLTEwNDIsMTUgKzEwMzAsMTUgQEAKIAkJCXJldHVybiBhdmFpbDsKIAkJfQogCi0JCXByaXZhdGUgUGFja1Byb3RvY29sRXhjZXB0aW9uIG91dE9mT3JkZXJBZHZlcnRpc2VtZW50KGZpbmFsIFN0cmluZyBuKSB7CisJCXByaXZhdGUgUGFja1Byb3RvY29sRXhjZXB0aW9uIG91dE9mT3JkZXJBZHZlcnRpc2VtZW50KFN0cmluZyBuKSB7CiAJCQlyZXR1cm4gbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5hZHZlcnRpc2VtZW50T2ZDYW1lQmVmb3JlLCBuLCBuKSk7CiAJCX0KIAotCQlwcml2YXRlIFBhY2tQcm90b2NvbEV4Y2VwdGlvbiBpbnZhbGlkQWR2ZXJ0aXNlbWVudChmaW5hbCBTdHJpbmcgbikgeworCQlwcml2YXRlIFBhY2tQcm90b2NvbEV4Y2VwdGlvbiBpbnZhbGlkQWR2ZXJ0aXNlbWVudChTdHJpbmcgbikgewogCQkJcmV0dXJuIG5ldyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuaW52YWxpZEFkdmVydGlzZW1lbnRPZiwgbikpOwogCQl9CiAKLQkJcHJpdmF0ZSBQYWNrUHJvdG9jb2xFeGNlcHRpb24gZHVwbGljYXRlQWR2ZXJ0aXNlbWVudChmaW5hbCBTdHJpbmcgbikgeworCQlwcml2YXRlIFBhY2tQcm90b2NvbEV4Y2VwdGlvbiBkdXBsaWNhdGVBZHZlcnRpc2VtZW50KFN0cmluZyBuKSB7CiAJCQlyZXR1cm4gbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5kdXBsaWNhdGVBZHZlcnRpc2VtZW50c09mLCBuKSk7CiAJCX0KIApAQCAtMTA2Myw3ICsxMDUxLDcgQEAKIAljbGFzcyBTbWFydEh0dHBGZXRjaENvbm5lY3Rpb24gZXh0ZW5kcyBCYXNlUGFja0ZldGNoQ29ubmVjdGlvbiB7CiAJCXByaXZhdGUgTXVsdGlSZXF1ZXN0U2VydmljZSBzdmM7CiAKLQkJU21hcnRIdHRwRmV0Y2hDb25uZWN0aW9uKGZpbmFsIElucHV0U3RyZWFtIGFkdmVydGlzZW1lbnQpCisJCVNtYXJ0SHR0cEZldGNoQ29ubmVjdGlvbihJbnB1dFN0cmVhbSBhZHZlcnRpc2VtZW50KQogCQkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQkJc3VwZXIoVHJhbnNwb3J0SHR0cC50aGlzKTsKIAkJCXN0YXRlbGVzc1JQQyA9IHRydWU7CkBAIC0xMDkzLDcgKzEwODEsNyBAQAogCX0KIAogCWNsYXNzIFNtYXJ0SHR0cFB1c2hDb25uZWN0aW9uIGV4dGVuZHMgQmFzZVBhY2tQdXNoQ29ubmVjdGlvbiB7Ci0JCVNtYXJ0SHR0cFB1c2hDb25uZWN0aW9uKGZpbmFsIElucHV0U3RyZWFtIGFkdmVydGlzZW1lbnQpCisJCVNtYXJ0SHR0cFB1c2hDb25uZWN0aW9uKElucHV0U3RyZWFtIGFkdmVydGlzZW1lbnQpCiAJCQkJdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCQlzdXBlcihUcmFuc3BvcnRIdHRwLnRoaXMpOwogCQkJc3RhdGVsZXNzUlBDID0gdHJ1ZTsKQEAgLTEzOTYsNyArMTM4NCw3IEBACiAJY2xhc3MgTXVsdGlSZXF1ZXN0U2VydmljZSBleHRlbmRzIFNlcnZpY2UgewogCQlib29sZWFuIGZpbmFsUmVxdWVzdDsKIAotCQlNdWx0aVJlcXVlc3RTZXJ2aWNlKGZpbmFsIFN0cmluZyBzZXJ2aWNlTmFtZSkgeworCQlNdWx0aVJlcXVlc3RTZXJ2aWNlKFN0cmluZyBzZXJ2aWNlTmFtZSkgewogCQkJc3VwZXIoc2VydmljZU5hbWUpOwogCQl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydExvY2FsLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRMb2NhbC5qYXZhCmluZGV4IDRmMTg4MGIuLmZiYjJjNDQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydExvY2FsLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0TG9jYWwuamF2YQpAQCAtMTYyLDExICsxNjIsMTEgQEAKIAkJcmVtb3RlR2l0RGlyID0gZ2l0RGlyOwogCX0KIAotCVVwbG9hZFBhY2sgY3JlYXRlVXBsb2FkUGFjayhmaW5hbCBSZXBvc2l0b3J5IGRzdCkgeworCVVwbG9hZFBhY2sgY3JlYXRlVXBsb2FkUGFjayhSZXBvc2l0b3J5IGRzdCkgewogCQlyZXR1cm4gbmV3IFVwbG9hZFBhY2soZHN0KTsKIAl9CiAKLQlSZWNlaXZlUGFjayBjcmVhdGVSZWNlaXZlUGFjayhmaW5hbCBSZXBvc2l0b3J5IGRzdCkgeworCVJlY2VpdmVQYWNrIGNyZWF0ZVJlY2VpdmVQYWNrKFJlcG9zaXRvcnkgZHN0KSB7CiAJCXJldHVybiBuZXcgUmVjZWl2ZVBhY2soZHN0KTsKIAl9CiAKQEAgLTIyOSw3ICsyMjksNyBAQAogCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuVHJhbnNwb3J0RXhjZXB0aW9uCiAJICogICAgICAgICAgICAgaWYgYW55LgogCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzIHNwYXduKGZpbmFsIFN0cmluZyBjbWQpCisJcHJvdGVjdGVkIFByb2Nlc3Mgc3Bhd24oU3RyaW5nIGNtZCkKIAkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQl0cnkgewogCQkJU3RyaW5nW10gYXJncyA9IHsgIi4iIH07IC8vJE5PTi1OTFMtMSQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydFNmdHAuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydFNmdHAuamF2YQppbmRleCAzOWY5ODk3Li5mMTI5YmEzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRTZnRwLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0U2Z0cC5qYXZhCkBAIC0xMzYsNyArMTM2LDcgQEAKIAkJfQogCX07CiAKLQlUcmFuc3BvcnRTZnRwKGZpbmFsIFJlcG9zaXRvcnkgbG9jYWwsIGZpbmFsIFVSSWlzaCB1cmkpIHsKKwlUcmFuc3BvcnRTZnRwKFJlcG9zaXRvcnkgbG9jYWwsIFVSSWlzaCB1cmkpIHsKIAkJc3VwZXIobG9jYWwsIHVyaSk7CiAJfQogCkBAIC0xOTcsNyArMTk3LDcgQEAKIAkJCX0KIAkJfQogCi0JCVNmdHBPYmplY3REQihmaW5hbCBTZnRwT2JqZWN0REIgcGFyZW50LCBmaW5hbCBTdHJpbmcgcCkKKwkJU2Z0cE9iamVjdERCKFNmdHBPYmplY3REQiBwYXJlbnQsIFN0cmluZyBwKQogCQkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQkJdHJ5IHsKIAkJCQlmdHAgPSBuZXdTZnRwKCk7CkBAIC0yMjksNyArMjI5LDcgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQlXYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2Ugb3BlbkFsdGVybmF0ZShmaW5hbCBTdHJpbmcgbG9jYXRpb24pCisJCVdhbGtSZW1vdGVPYmplY3REYXRhYmFzZSBvcGVuQWx0ZXJuYXRlKFN0cmluZyBsb2NhdGlvbikKIAkJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJcmV0dXJuIG5ldyBTZnRwT2JqZWN0REIodGhpcywgbG9jYXRpb24pOwogCQl9CkBAIC0yNDYsOSArMjQ2LDkgQEAKIAkJCQlmaWxlcyA9IG5ldyBIYXNoTWFwPD4oKTsKIAkJCQltdGltZXMgPSBuZXcgSGFzaE1hcDw+KCk7CiAKLQkJCQlmb3IgKGZpbmFsIENoYW5uZWxTZnRwLkxzRW50cnkgZW50IDogbGlzdCkKKwkJCQlmb3IgKENoYW5uZWxTZnRwLkxzRW50cnkgZW50IDogbGlzdCkKIAkJCQkJZmlsZXMucHV0KGVudC5nZXRGaWxlbmFtZSgpLCBlbnQpOwotCQkJCWZvciAoZmluYWwgQ2hhbm5lbFNmdHAuTHNFbnRyeSBlbnQgOiBsaXN0KSB7CisJCQkJZm9yIChDaGFubmVsU2Z0cC5Mc0VudHJ5IGVudCA6IGxpc3QpIHsKIAkJCQkJZmluYWwgU3RyaW5nIG4gPSBlbnQuZ2V0RmlsZW5hbWUoKTsKIAkJCQkJaWYgKCFuLnN0YXJ0c1dpdGgoInBhY2stIikgfHwgIW4uZW5kc1dpdGgoIi5wYWNrIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJCQkJY29udGludWU7CkBAIC0yNjMsNyArMjYzLDcgQEAKIAogCQkJCUNvbGxlY3Rpb25zLnNvcnQocGFja3MsIG5ldyBDb21wYXJhdG9yPFN0cmluZz4oKSB7CiAJCQkJCUBPdmVycmlkZQotCQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoZmluYWwgU3RyaW5nIG8xLCBmaW5hbCBTdHJpbmcgbzIpIHsKKwkJCQkJcHVibGljIGludCBjb21wYXJlKFN0cmluZyBvMSwgU3RyaW5nIG8yKSB7CiAJCQkJCQlyZXR1cm4gbXRpbWVzLmdldChvMikuaW50VmFsdWUoKQogCQkJCQkJCQktIG10aW1lcy5nZXQobzEpLmludFZhbHVlKCk7CiAJCQkJCX0KQEAgLTI3OCw3ICsyNzgsNyBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCUZpbGVTdHJlYW0gb3BlbihmaW5hbCBTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJRmlsZVN0cmVhbSBvcGVuKFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJdHJ5IHsKIAkJCQlmaW5hbCBTZnRwQVRUUlMgYSA9IGZ0cC5sc3RhdChwYXRoKTsKIAkJCQlyZXR1cm4gbmV3IEZpbGVTdHJlYW0oZnRwLmdldChwYXRoKSwgYS5nZXRTaXplKCkpOwpAQCAtMjkyLDcgKzI5Miw3IEBACiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJdm9pZCBkZWxldGVGaWxlKGZpbmFsIFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl2b2lkIGRlbGV0ZUZpbGUoU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQl0cnkgewogCQkJCWZ0cC5ybShwYXRoKTsKIAkJCX0gY2F0Y2ggKFNmdHBFeGNlcHRpb24gamUpIHsKQEAgLTM0NSw3ICszNDUsNyBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXZvaWQgd3JpdGVGaWxlKGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBieXRlW10gZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdm9pZCB3cml0ZUZpbGUoU3RyaW5nIHBhdGgsIGJ5dGVbXSBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJZmluYWwgU3RyaW5nIGxvY2sgPSBwYXRoICsgTE9DS19TVUZGSVg7CiAJCQl0cnkgewogCQkJCXN1cGVyLndyaXRlRmlsZShsb2NrLCBkYXRhKTsKQEAgLTQxMyw3ICs0MTMsNyBAQAogCQkJCQkJamUuZ2V0TWVzc2FnZSgpKSwgamUpOwogCQkJfQogCi0JCQlmb3IgKGZpbmFsIENoYW5uZWxTZnRwLkxzRW50cnkgZW50IDogbGlzdCkgeworCQkJZm9yIChDaGFubmVsU2Z0cC5Mc0VudHJ5IGVudCA6IGxpc3QpIHsKIAkJCQlmaW5hbCBTdHJpbmcgbiA9IGVudC5nZXRGaWxlbmFtZSgpOwogCQkJCWlmICgiLiIuZXF1YWxzKG4pIHx8ICIuLiIuZXF1YWxzKG4pKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCQkJY29udGludWU7CkBAIC00NjYsNyArNDY2LDcgQEAKIAkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuYmFkUmVmLCBuYW1lLCBsaW5lKSk7CiAJCX0KIAotCQlwcml2YXRlIFN0b3JhZ2UgbG9vc2UoZmluYWwgUmVmIHIpIHsKKwkJcHJpdmF0ZSBTdG9yYWdlIGxvb3NlKFJlZiByKSB7CiAJCQlpZiAociAhPSBudWxsICYmIHIuZ2V0U3RvcmFnZSgpID09IFN0b3JhZ2UuUEFDS0VEKQogCQkJCXJldHVybiBTdG9yYWdlLkxPT1NFX1BBQ0tFRDsKIAkJCXJldHVybiBTdG9yYWdlLkxPT1NFOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVVJJaXNoLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VUklpc2guamF2YQppbmRleCBhMDQ4ZmUzLi4wMjZmZDgxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VUklpc2guamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VUklpc2guamF2YQpAQCAtMzg3LDcgKzM4Nyw3IEBACiAJICogQHBhcmFtIHUKIAkgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgVVJMIHRvIGNvbnZlcnQgZnJvbS4KIAkgKi8KLQlwdWJsaWMgVVJJaXNoKGZpbmFsIFVSTCB1KSB7CisJcHVibGljIFVSSWlzaChVUkwgdSkgewogCQlzY2hlbWUgPSB1LmdldFByb3RvY29sKCk7CiAJCXBhdGggPSB1LmdldFBhdGgoKTsKIAkJcGF0aCA9IGNsZWFuTGVhZGluZ1NsYXNoZXMocGF0aCwgc2NoZW1lKTsKQEAgLTQxNiw3ICs0MTYsNyBAQAogCQkvLyBDb25maWd1cmUgbm90aGluZy4KIAl9CiAKLQlwcml2YXRlIFVSSWlzaChmaW5hbCBVUklpc2ggdSkgeworCXByaXZhdGUgVVJJaXNoKFVSSWlzaCB1KSB7CiAJCXRoaXMuc2NoZW1lID0gdS5zY2hlbWU7CiAJCXRoaXMucmF3UGF0aCA9IHUucmF3UGF0aDsKIAkJdGhpcy5wYXRoID0gdS5wYXRoOwpAQCAtNDUxLDcgKzQ1MSw3IEBACiAJICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciBob3N0LgogCSAqIEByZXR1cm4gYSBuZXcgVVJJIHdpdGggdGhlIHVwZGF0ZWQgdmFsdWUuCiAJICovCi0JcHVibGljIFVSSWlzaCBzZXRIb3N0KGZpbmFsIFN0cmluZyBuKSB7CisJcHVibGljIFVSSWlzaCBzZXRIb3N0KFN0cmluZyBuKSB7CiAJCWZpbmFsIFVSSWlzaCByID0gbmV3IFVSSWlzaCh0aGlzKTsKIAkJci5ob3N0ID0gbjsKIAkJcmV0dXJuIHI7CkBAIC00NzMsNyArNDczLDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHNjaGVtZS4KIAkgKiBAcmV0dXJuIGEgbmV3IFVSSSB3aXRoIHRoZSB1cGRhdGVkIHZhbHVlLgogCSAqLwotCXB1YmxpYyBVUklpc2ggc2V0U2NoZW1lKGZpbmFsIFN0cmluZyBuKSB7CisJcHVibGljIFVSSWlzaCBzZXRTY2hlbWUoU3RyaW5nIG4pIHsKIAkJZmluYWwgVVJJaXNoIHIgPSBuZXcgVVJJaXNoKHRoaXMpOwogCQlyLnNjaGVtZSA9IG47CiAJCXJldHVybiByOwpAQCAtNTA0LDcgKzUwNCw3IEBACiAJICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciBwYXRoLgogCSAqIEByZXR1cm4gYSBuZXcgVVJJIHdpdGggdGhlIHVwZGF0ZWQgdmFsdWUuCiAJICovCi0JcHVibGljIFVSSWlzaCBzZXRQYXRoKGZpbmFsIFN0cmluZyBuKSB7CisJcHVibGljIFVSSWlzaCBzZXRQYXRoKFN0cmluZyBuKSB7CiAJCWZpbmFsIFVSSWlzaCByID0gbmV3IFVSSWlzaCh0aGlzKTsKIAkJci5wYXRoID0gbjsKIAkJci5yYXdQYXRoID0gbjsKQEAgLTUxOSw3ICs1MTksNyBAQAogCSAqIEByZXR1cm4gYSBuZXcgVVJJIHdpdGggdGhlIHVwZGF0ZWQgdmFsdWUuCiAJICogQHRocm93cyBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgVVJJaXNoIHNldFJhd1BhdGgoZmluYWwgU3RyaW5nIG4pIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworCXB1YmxpYyBVUklpc2ggc2V0UmF3UGF0aChTdHJpbmcgbikgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CiAJCWZpbmFsIFVSSWlzaCByID0gbmV3IFVSSWlzaCh0aGlzKTsKIAkJci5wYXRoID0gdW5lc2NhcGUobik7CiAJCXIucmF3UGF0aCA9IG47CkBAIC01NDIsNyArNTQyLDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHVzZXIuCiAJICogQHJldHVybiBhIG5ldyBVUkkgd2l0aCB0aGUgdXBkYXRlZCB2YWx1ZS4KIAkgKi8KLQlwdWJsaWMgVVJJaXNoIHNldFVzZXIoZmluYWwgU3RyaW5nIG4pIHsKKwlwdWJsaWMgVVJJaXNoIHNldFVzZXIoU3RyaW5nIG4pIHsKIAkJZmluYWwgVVJJaXNoIHIgPSBuZXcgVVJJaXNoKHRoaXMpOwogCQlyLnVzZXIgPSBuOwogCQlyZXR1cm4gcjsKQEAgLTU2NCw3ICs1NjQsNyBAQAogCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgcGFzc3dvcmQuCiAJICogQHJldHVybiBhIG5ldyBVUkkgd2l0aCB0aGUgdXBkYXRlZCB2YWx1ZS4KIAkgKi8KLQlwdWJsaWMgVVJJaXNoIHNldFBhc3MoZmluYWwgU3RyaW5nIG4pIHsKKwlwdWJsaWMgVVJJaXNoIHNldFBhc3MoU3RyaW5nIG4pIHsKIAkJZmluYWwgVVJJaXNoIHIgPSBuZXcgVVJJaXNoKHRoaXMpOwogCQlyLnBhc3MgPSBuOwogCQlyZXR1cm4gcjsKQEAgLTU4Niw3ICs1ODYsNyBAQAogCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgcG9ydC4KIAkgKiBAcmV0dXJuIGEgbmV3IFVSSSB3aXRoIHRoZSB1cGRhdGVkIHZhbHVlLgogCSAqLwotCXB1YmxpYyBVUklpc2ggc2V0UG9ydChmaW5hbCBpbnQgbikgeworCXB1YmxpYyBVUklpc2ggc2V0UG9ydChpbnQgbikgewogCQlmaW5hbCBVUklpc2ggciA9IG5ldyBVUklpc2godGhpcyk7CiAJCXIucG9ydCA9IG4gPiAwID8gbiA6IC0xOwogCQlyZXR1cm4gcjsKQEAgLTYxMyw3ICs2MTMsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG9iaikgeworCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CiAJCWlmICghKG9iaiBpbnN0YW5jZW9mIFVSSWlzaCkpCiAJCQlyZXR1cm4gZmFsc2U7CiAJCWZpbmFsIFVSSWlzaCBiID0gKFVSSWlzaCkgb2JqOwpAQCAtNjMyLDcgKzYzMiw3IEBACiAJCXJldHVybiB0cnVlOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXEoZmluYWwgU3RyaW5nIGEsIGZpbmFsIFN0cmluZyBiKSB7CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcShTdHJpbmcgYSwgU3RyaW5nIGIpIHsKIAkJaWYgKGEgPT0gYikKIAkJCXJldHVybiB0cnVlOwogCQlpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eU9yTnVsbChhKSAmJiBTdHJpbmdVdGlscy5pc0VtcHR5T3JOdWxsKGIpKQpAQCAtNjU3LDcgKzY1Nyw3IEBACiAJCXJldHVybiBmb3JtYXQoZmFsc2UsIGZhbHNlKTsKIAl9CiAKLQlwcml2YXRlIFN0cmluZyBmb3JtYXQoZmluYWwgYm9vbGVhbiBpbmNsdWRlUGFzc3dvcmQsIGJvb2xlYW4gZXNjYXBlTm9uQXNjaWkpIHsKKwlwcml2YXRlIFN0cmluZyBmb3JtYXQoYm9vbGVhbiBpbmNsdWRlUGFzc3dvcmQsIGJvb2xlYW4gZXNjYXBlTm9uQXNjaWkpIHsKIAkJZmluYWwgU3RyaW5nQnVpbGRlciByID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJaWYgKGdldFNjaGVtZSgpICE9IG51bGwpIHsKIAkJCXIuYXBwZW5kKGdldFNjaGVtZSgpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VwbG9hZFBhY2suamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VwbG9hZFBhY2suamF2YQppbmRleCAwMjA5YmUxLi43ZGUwNTA2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VcGxvYWRQYWNrLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVXBsb2FkUGFjay5qYXZhCkBAIC00MywxMCArNDMsMTUgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuUl9UQUdTOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZEYXRhYmFzZS5BTEw7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkdpdFByb3RvY29sQ29uc3RhbnRzLkNPTU1BTkRfRkVUQ0g7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkdpdFByb3RvY29sQ29uc3RhbnRzLkNPTU1BTkRfTFNfUkVGUzsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuR2l0UHJvdG9jb2xDb25zdGFudHMuT1BUSU9OX0FHRU5UOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5HaXRQcm90b2NvbENvbnN0YW50cy5PUFRJT05fQUxMT1dfUkVBQ0hBQkxFX1NIQTFfSU5fV0FOVDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuR2l0UHJvdG9jb2xDb25zdGFudHMuT1BUSU9OX0FMTE9XX1RJUF9TSEExX0lOX1dBTlQ7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkdpdFByb3RvY29sQ29uc3RhbnRzLk9QVElPTl9ERUVQRU5fUkVMQVRJVkU7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkdpdFByb3RvY29sQ29uc3RhbnRzLk9QVElPTl9GSUxURVI7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkdpdFByb3RvY29sQ29uc3RhbnRzLk9QVElPTl9JTkNMVURFX1RBRzsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuR2l0UHJvdG9jb2xDb25zdGFudHMuT1BUSU9OX01VTFRJX0FDSzsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuR2l0UHJvdG9jb2xDb25zdGFudHMuT1BUSU9OX01VTFRJX0FDS19ERVRBSUxFRDsKQEAgLTY3LDEwICs3MiwxMyBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnMuTnVsbGFibGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQ29ycnVwdE9iamVjdEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5JbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLk1pc3NpbmdPYmplY3RFeGNlcHRpb247CkBAIC04NSw3ICs5Myw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0UmVhZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlByb2dyZXNzTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmRGF0YWJhc2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuQXN5bmNSZXZPYmplY3RRdWV1ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuQml0bWFwV2Fsa2VyOwpAQCAtMTAyLDYgKzEwOSw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLnBhY2suUGFja1N0YXRpc3RpY3M7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuR2l0UHJvdG9jb2xDb25zdGFudHMuTXVsdGlBY2s7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUmVmQWR2ZXJ0aXNlci5QYWNrZXRMaW5lT3V0UmVmQWR2ZXJ0aXNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5UcmFuc2ZlckNvbmZpZy5Qcm90b2NvbFZlcnNpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvLkludGVycnVwdFRpbWVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pby5OdWxsT3V0cHV0U3RyZWFtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pby5UaW1lb3V0SW5wdXRTdHJlYW07CkBAIC0yMzcsNiArMjQ1LDEyIEBACiAJLyoqIFRpbWVyIHRvIG1hbmFnZSB7QGxpbmsgI3RpbWVvdXR9LiAqLwogCXByaXZhdGUgSW50ZXJydXB0VGltZXIgdGltZXI7CiAKKwkvKioKKwkgKiBXaGV0aGVyIHRoZSBjbGllbnQgcmVxdWVzdGVkIHRvIHVzZSBwcm90b2NvbCBWMiB0aHJvdWdoIGEgc2lkZQorCSAqIGNoYW5uZWwgKHN1Y2ggYXMgdGhlIEdpdC1Qcm90b2NvbCBIVFRQIGhlYWRlcikuCisJICovCisJcHJpdmF0ZSBib29sZWFuIGNsaWVudFJlcXVlc3RlZFYyOworCiAJcHJpdmF0ZSBJbnB1dFN0cmVhbSByYXdJbjsKIAogCXByaXZhdGUgUmVzcG9uc2VCdWZmZXJlZE91dHB1dFN0cmVhbSByYXdPdXQ7CkBAIC0yNzgsMTIgKzI5MiwyMiBAQAogCS8qKiBTaGFsbG93IGNvbW1pdHMgdGhlIGNsaWVudCBhbHJlYWR5IGhhcy4gKi8KIAlwcml2YXRlIGZpbmFsIFNldDxPYmplY3RJZD4gY2xpZW50U2hhbGxvd0NvbW1pdHMgPSBuZXcgSGFzaFNldDw+KCk7CiAKLQkvKiogU2hhbGxvdyBjb21taXRzIG9uIHRoZSBjbGllbnQgd2hpY2ggYXJlIG5vdyBiZWNvbWluZyB1bnNoYWxsb3cgKi8KLQlwcml2YXRlIGZpbmFsIExpc3Q8T2JqZWN0SWQ+IHVuc2hhbGxvd0NvbW1pdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQogCS8qKiBEZXNpcmVkIGRlcHRoIGZyb20gdGhlIGNsaWVudCBvbiBhIHNoYWxsb3cgcmVxdWVzdC4gKi8KIAlwcml2YXRlIGludCBkZXB0aDsKIAorCS8qKgorCSAqIENvbW1pdCB0aW1lIG9mIHRoZSBuZXdlc3Qgb2JqZWN0cyB0aGUgY2xpZW50IGhhcyBhc2tlZCB1cyB1c2luZworCSAqIC0tc2hhbGxvdy1zaW5jZSBub3QgdG8gc2VuZC4gQ2Fubm90IGJlIG5vbnplcm8gaWYgZGVwdGggaXMgbm9uemVyby4KKwkgKi8KKwlwcml2YXRlIGludCBzaGFsbG93U2luY2U7CisKKwkvKioKKwkgKiAoUG9zc2libHkgc2hvcnQpIHJlZiBuYW1lcywgYW5jZXN0b3JzIG9mIHdoaWNoIHRoZSBjbGllbnQgaGFzIGFza2VkIHVzCisJICogbm90IHRvIHNlbmQgdXNpbmcgLS1zaGFsbG93LWV4Y2x1ZGUuIENhbm5vdCBiZSBub24tbnVsbCBpZiBkZXB0aCBpcworCSAqIG5vbnplcm8uCisJICovCisJcHJpdmF0ZSBATnVsbGFibGUgTGlzdDxTdHJpbmc+IHNoYWxsb3dFeGNsdWRlUmVmczsKKwogCS8qKiBDb21taXQgdGltZSBvZiB0aGUgb2xkZXN0IGNvbW1vbiBjb21taXQsIGluIHNlY29uZHMuICovCiAJcHJpdmF0ZSBpbnQgb2xkZXN0VGltZTsKIApAQCAtMzE3LDggKzM0MSw3IEBACiAKIAlwcml2YXRlIFBhY2tTdGF0aXN0aWNzIHN0YXRpc3RpY3M7CiAKLQlAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotCXByaXZhdGUgVXBsb2FkUGFja0xvZ2dlciBsb2dnZXIgPSBVcGxvYWRQYWNrTG9nZ2VyLk5VTEw7CisJcHJpdmF0ZSBsb25nIGZpbHRlckJsb2JMaW1pdCA9IC0xOwogCiAJLyoqCiAJICogQ3JlYXRlIGEgbmV3IHBhY2sgdXBsb2FkIGZvciBhbiBvcGVuIHJlcG9zaXRvcnkuCkBAIC0zMjYsNyArMzQ5LDcgQEAKIAkgKiBAcGFyYW0gY29weUZyb20KIAkgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgcmVwb3NpdG9yeS4KIAkgKi8KLQlwdWJsaWMgVXBsb2FkUGFjayhmaW5hbCBSZXBvc2l0b3J5IGNvcHlGcm9tKSB7CisJcHVibGljIFVwbG9hZFBhY2soUmVwb3NpdG9yeSBjb3B5RnJvbSkgewogCQlkYiA9IGNvcHlGcm9tOwogCQl3YWxrID0gbmV3IFJldldhbGsoZGIpOwogCQl3YWxrLnNldFJldGFpbkJvZHkoZmFsc2UpOwpAQCAtNDE1LDcgKzQzOCw3IEBACiAJICogICAgICAgICAgICBiZWZvcmUgYWJvcnRpbmcgYW4gSU8gcmVhZCBvciB3cml0ZSBvcGVyYXRpb24gd2l0aCB0aGUKIAkgKiAgICAgICAgICAgIGNvbm5lY3RlZCBjbGllbnQuCiAJICovCi0JcHVibGljIHZvaWQgc2V0VGltZW91dChmaW5hbCBpbnQgc2Vjb25kcykgeworCXB1YmxpYyB2b2lkIHNldFRpbWVvdXQoaW50IHNlY29uZHMpIHsKIAkJdGltZW91dCA9IHNlY29uZHM7CiAJfQogCkBAIC00NDIsNyArNDY1LDcgQEAKIAkgKiAgICAgICAgICAgIGNvbW1hbmRzIGJlZm9yZSB3cml0aW5nIG91dHB1dCBhbmQgZG9lcyBub3QgcGVyZm9ybSB0aGUKIAkgKiAgICAgICAgICAgIGluaXRpYWwgYWR2ZXJ0aXNpbmcuCiAJICovCi0JcHVibGljIHZvaWQgc2V0QmlEaXJlY3Rpb25hbFBpcGUoZmluYWwgYm9vbGVhbiB0d29XYXkpIHsKKwlwdWJsaWMgdm9pZCBzZXRCaURpcmVjdGlvbmFsUGlwZShib29sZWFuIHR3b1dheSkgewogCQliaURpcmVjdGlvbmFsUGlwZSA9IHR3b1dheTsKIAl9CiAKQEAgLTU0NSw3ICs1NjgsNyBAQAogCSAqIEBwYXJhbSBhZHZlcnRpc2VSZWZzSG9vawogCSAqICAgICAgICAgICAgdGhlIGhvb2s7IG1heSBiZSBudWxsIHRvIHNob3cgYWxsIHJlZnMuCiAJICovCi0JcHVibGljIHZvaWQgc2V0QWR2ZXJ0aXNlUmVmc0hvb2soZmluYWwgQWR2ZXJ0aXNlUmVmc0hvb2sgYWR2ZXJ0aXNlUmVmc0hvb2spIHsKKwlwdWJsaWMgdm9pZCBzZXRBZHZlcnRpc2VSZWZzSG9vayhBZHZlcnRpc2VSZWZzSG9vayBhZHZlcnRpc2VSZWZzSG9vaykgewogCQlpZiAoYWR2ZXJ0aXNlUmVmc0hvb2sgIT0gbnVsbCkKIAkJCXRoaXMuYWR2ZXJ0aXNlUmVmc0hvb2sgPSBhZHZlcnRpc2VSZWZzSG9vazsKIAkJZWxzZQpAQCAtNTY0LDcgKzU4Nyw3IEBACiAJICogQHBhcmFtIHJlZkZpbHRlcgogCSAqICAgICAgICAgICAgdGhlIGZpbHRlcjsgbWF5IGJlIG51bGwgdG8gc2hvdyBhbGwgcmVmcy4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWZGaWx0ZXIoZmluYWwgUmVmRmlsdGVyIHJlZkZpbHRlcikgeworCXB1YmxpYyB2b2lkIHNldFJlZkZpbHRlcihSZWZGaWx0ZXIgcmVmRmlsdGVyKSB7CiAJCXRoaXMucmVmRmlsdGVyID0gcmVmRmlsdGVyICE9IG51bGwgPyByZWZGaWx0ZXIgOiBSZWZGaWx0ZXIuREVGQVVMVDsKIAl9CiAKQEAgLTYzOSwyOSArNjYyLDYgQEAKIAl9CiAKIAkvKioKLQkgKiBHZXQgdGhlIGNvbmZpZ3VyZWQgbG9nZ2VyLgotCSAqCi0JICogQHJldHVybiB0aGUgY29uZmlndXJlZCBsb2dnZXIuCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0UHJlVXBsb2FkSG9vaygpfS4KLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBVcGxvYWRQYWNrTG9nZ2VyIGdldExvZ2dlcigpIHsKLQkJcmV0dXJuIGxvZ2dlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGxvZ2dlci4KLQkgKgotCSAqIEBwYXJhbSBsb2dnZXIKLQkgKiAgICAgICAgICAgIHRoZSBsb2dnZXIgaW5zdGFuY2UuIElmIG51bGwsIG5vIGxvZ2dpbmcgb2NjdXJzLgotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI3NldFByZVVwbG9hZEhvb2soUHJlVXBsb2FkSG9vayl9LgotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHZvaWQgc2V0TG9nZ2VyKFVwbG9hZFBhY2tMb2dnZXIgbG9nZ2VyKSB7Ci0JCXRoaXMubG9nZ2VyID0gbG9nZ2VyOwotCX0KLQotCS8qKgogCSAqIENoZWNrIHdoZXRoZXIgdGhlIGNsaWVudCBleHBlY3RzIGEgc2lkZS1iYW5kIHN0cmVhbS4KIAkgKgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY2xpZW50IGhhcyBhZHZlcnRpc2VkIGEgc2lkZS1iYW5kIGNhcGFiaWxpdHksIGZhbHNlCkBAIC02ODAsOCArNjgwLDM0IEBACiAJfQogCiAJLyoqCisJICogU2V0IHRoZSBFeHRyYSBQYXJhbWV0ZXJzIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQuCisJICoKKwkgKiA8cD5UaGVzZSBhcmUgcGFyYW1ldGVycyBwYXNzZWQgYnkgdGhlIGNsaWVudCB0aHJvdWdoIGEgc2lkZSBjaGFubmVsCisJICogc3VjaCBhcyB0aGUgR2l0LVByb3RvY29sIEhUVFAgaGVhZGVyLCB0byBhbGxvdyBhIGNsaWVudCB0byByZXF1ZXN0CisJICogYSBuZXdlciByZXNwb25zZSBmb3JtYXQgd2hpbGUgcmVtYWluaW5nIGNvbXBhdGlibGUgd2l0aCBvbGRlciBzZXJ2ZXJzCisJICogdGhhdCBkbyBub3QgdW5kZXJzdGFuZCBkaWZmZXJlbnQgcmVxdWVzdCBmb3JtYXRzLgorCSAqCisJICogQHBhcmFtIHBhcmFtcworCSAqICAgICAgICAgICAgcGFyYW1ldGVycyBzdXBwbGllZCBieSB0aGUgY2xpZW50LCBzcGxpdCBhdCBjb2xvbnMgb3IgTlVMCisJICogICAgICAgICAgICBieXRlcy4KKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIHZvaWQgc2V0RXh0cmFQYXJhbWV0ZXJzKENvbGxlY3Rpb248U3RyaW5nPiBwYXJhbXMpIHsKKwkJdGhpcy5jbGllbnRSZXF1ZXN0ZWRWMiA9IHBhcmFtcy5jb250YWlucygidmVyc2lvbj0yIik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gdXNlUHJvdG9jb2xWMigpIHsKKwkJcmV0dXJuIFByb3RvY29sVmVyc2lvbi5WMi5lcXVhbHModHJhbnNmZXJDb25maWcucHJvdG9jb2xWZXJzaW9uKQorCQkJCSYmIGNsaWVudFJlcXVlc3RlZFYyOworCX0KKworCS8qKgogCSAqIEV4ZWN1dGUgdGhlIHVwbG9hZCB0YXNrIG9uIHRoZSBzb2NrZXQuCiAJICoKKwkgKiA8cD5JZiB0aGUgY2xpZW50IHBhc3NlZCBleHRyYSBwYXJhbWV0ZXJzIChlLmcuLCAidmVyc2lvbj0yIikgdGhyb3VnaCBhCisJICogc2lkZSBjaGFubmVsLCB0aGUgY2FsbGVyIG11c3QgY2FsbCBzZXRFeHRyYVBhcmFtZXRlcnMgZmlyc3QgdG8gc3VwcGx5CisJICogdGhlbS4KKwkgKgogCSAqIEBwYXJhbSBpbnB1dAogCSAqICAgICAgICAgICAgcmF3IGlucHV0IHRvIHJlYWQgY2xpZW50IGNvbW1hbmRzIGZyb20uIENhbGxlciBtdXN0IGVuc3VyZSB0aGUKIAkgKiAgICAgICAgICAgIGlucHV0IGlzIGJ1ZmZlcmVkLCBvdGhlcndpc2UgcmVhZCBwZXJmb3JtYW5jZSBtYXkgc3VmZmVyLgpAQCAtNzIyLDcgKzc0OCwxMSBAQAogCiAJCQlwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmF3SW4pOwogCQkJcGNrT3V0ID0gbmV3IFBhY2tldExpbmVPdXQocmF3T3V0KTsKLQkJCXNlcnZpY2UoKTsKKwkJCWlmICh1c2VQcm90b2NvbFYyKCkpIHsKKwkJCQlzZXJ2aWNlVjIoKTsKKwkJCX0gZWxzZSB7CisJCQkJc2VydmljZSgpOworCQkJfQogCQl9IGZpbmFsbHkgewogCQkJbXNnT3V0ID0gTnVsbE91dHB1dFN0cmVhbS5JTlNUQU5DRTsKIAkJCXdhbGsuY2xvc2UoKTsKQEAgLTc0MiwyMSArNzcyLDYgQEAKIAkgKiBAcmV0dXJuIHN0YXRpc3RpY3MgYWJvdXQgcGFjayBvdXRwdXQsIGlmIGEgcGFjayB3YXMgc2VudC4gTnVsbCBpZiBubyBwYWNrCiAJICogICAgICAgICB3YXMgc2VudCwgc3VjaCBhcyBkdXJpbmcgdGhlIG5lZ290aWF0aW9uIHBoYXNlIG9mIGEgc21hcnQgSFRUUAogCSAqICAgICAgICAgY29ubmVjdGlvbiwgb3IgaWYgdGhlIGNsaWVudCB3YXMgYWxyZWFkeSB1cC10by1kYXRlLgotCSAqIEBzaW5jZSAzLjAKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRTdGF0aXN0aWNzKCl9LgotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIFBhY2tXcml0ZXIuU3RhdGlzdGljcyBnZXRQYWNrU3RhdGlzdGljcygpIHsKLQkJcmV0dXJuIHN0YXRpc3RpY3MgPT0gbnVsbCA/IG51bGwKLQkJCQk6IG5ldyBQYWNrV3JpdGVyLlN0YXRpc3RpY3Moc3RhdGlzdGljcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBQYWNrV3JpdGVyJ3Mgc3RhdGlzdGljcyBpZiBhIHBhY2sgd2FzIHNlbnQgdG8gdGhlIGNsaWVudC4KLQkgKgotCSAqIEByZXR1cm4gc3RhdGlzdGljcyBhYm91dCBwYWNrIG91dHB1dCwgaWYgYSBwYWNrIHdhcyBzZW50LiBOdWxsIGlmIG5vIHBhY2sKLQkgKiAgICAgICAgIHdhcyBzZW50LCBzdWNoIGFzIGR1cmluZyB0aGUgbmVnb3RpYXRpb24gcGhhc2Ugb2YgYSBzbWFydCBIVFRQCi0JICogICAgICAgICBjb25uZWN0aW9uLCBvciBpZiB0aGUgY2xpZW50IHdhcyBhbHJlYWR5IHVwLXRvLWRhdGUuCiAJICogQHNpbmNlIDQuMQogCSAqLwogCXB1YmxpYyBQYWNrU3RhdGlzdGljcyBnZXRTdGF0aXN0aWNzKCkgewpAQCAtNzY1LDcgKzc4MCw3IEBACiAKIAlwcml2YXRlIE1hcDxTdHJpbmcsIFJlZj4gZ2V0QWR2ZXJ0aXNlZE9yRGVmYXVsdFJlZnMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAocmVmcyA9PSBudWxsKQotCQkJc2V0QWR2ZXJ0aXNlZFJlZnMoZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKFJlZkRhdGFiYXNlLkFMTCkpOworCQkJc2V0QWR2ZXJ0aXNlZFJlZnMoZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKEFMTCkpOwogCQlyZXR1cm4gcmVmczsKIAl9CiAKQEAgLTc3NCw2ICs3ODksNyBAQAogCQkvLyBJZiBpdCdzIGEgbm9uLWJpZGkgcmVxdWVzdCwgd2UgbmVlZCB0byByZWFkIHRoZSBlbnRpcmUgcmVxdWVzdCBiZWZvcmUKIAkJLy8gd3JpdGluZyBhIHJlc3BvbnNlLiBCdWZmZXIgdGhlIHJlc3BvbnNlIHVudGlsIHRoZW4uCiAJCVBhY2tTdGF0aXN0aWNzLkFjY3VtdWxhdG9yIGFjY3VtdWxhdG9yID0gbmV3IFBhY2tTdGF0aXN0aWNzLkFjY3VtdWxhdG9yKCk7CisJCUxpc3Q8T2JqZWN0SWQ+IHVuc2hhbGxvd0NvbW1pdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAkJdHJ5IHsKIAkJCWlmIChiaURpcmVjdGlvbmFsUGlwZSkKIAkJCQlzZW5kQWR2ZXJ0aXNlZFJlZnMobmV3IFBhY2tldExpbmVPdXRSZWZBZHZlcnRpc2VyKHBja091dCkpOwpAQCAtODAzLDcgKzgxOSw3IEBACiAJCQlpZiAoIWNsaWVudFNoYWxsb3dDb21taXRzLmlzRW1wdHkoKSkKIAkJCQl2ZXJpZnlDbGllbnRTaGFsbG93KCk7CiAJCQlpZiAoZGVwdGggIT0gMCkKLQkJCQlwcm9jZXNzU2hhbGxvdygpOworCQkJCXByb2Nlc3NTaGFsbG93KG51bGwsIHVuc2hhbGxvd0NvbW1pdHMsIHRydWUpOwogCQkJaWYgKCFjbGllbnRTaGFsbG93Q29tbWl0cy5pc0VtcHR5KCkpCiAJCQkJd2Fsay5hc3N1bWVTaGFsbG93KGNsaWVudFNoYWxsb3dDb21taXRzKTsKIAkJCXNlbmRQYWNrID0gbmVnb3RpYXRlKGFjY3VtdWxhdG9yKTsKQEAgLTg1NSw4ICs4NzEsMjg4IEBACiAJCQlyYXdPdXQuc3RvcEJ1ZmZlcmluZygpOwogCQl9CiAKLQkJaWYgKHNlbmRQYWNrKQotCQkJc2VuZFBhY2soYWNjdW11bGF0b3IpOworCQlpZiAoc2VuZFBhY2spIHsKKwkJCXNlbmRQYWNrKGFjY3VtdWxhdG9yLCByZWZzID09IG51bGwgPyBudWxsIDogcmVmcy52YWx1ZXMoKSwgdW5zaGFsbG93Q29tbWl0cyk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgbHNSZWZzVjIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlQYWNrZXRMaW5lT3V0UmVmQWR2ZXJ0aXNlciBhZHYgPSBuZXcgUGFja2V0TGluZU91dFJlZkFkdmVydGlzZXIocGNrT3V0KTsKKwkJU3RyaW5nIGxpbmU7CisJCUFycmF5TGlzdDxTdHJpbmc+IHJlZlByZWZpeGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWJvb2xlYW4gbmVlZFRvRmluZFN5bXJlZnMgPSBmYWxzZTsKKworCQlhZHYuc2V0VXNlUHJvdG9jb2xWMih0cnVlKTsKKworCQlsaW5lID0gcGNrSW4ucmVhZFN0cmluZygpOworCisJCS8vIEN1cnJlbnRseSwgd2UgZG8gbm90IHN1cHBvcnQgYW55IGNhcGFiaWxpdGllcywgc28gdGhlIG5leHQKKwkJLy8gbGluZSBpcyBERUxJTSBpZiB0aGVyZSBhcmUgYXJndW1lbnRzIG9yIEVORCBpZiBub3QuCisJCWlmIChsaW5lID09IFBhY2tldExpbmVJbi5ERUxJTSkgeworCQkJd2hpbGUgKChsaW5lID0gcGNrSW4ucmVhZFN0cmluZygpKSAhPSBQYWNrZXRMaW5lSW4uRU5EKSB7CisJCQkJaWYgKGxpbmUuZXF1YWxzKCJwZWVsIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQlhZHYuc2V0RGVyZWZUYWdzKHRydWUpOworCQkJCX0gZWxzZSBpZiAobGluZS5lcXVhbHMoInN5bXJlZnMiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCW5lZWRUb0ZpbmRTeW1yZWZzID0gdHJ1ZTsKKwkJCQl9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aCgicmVmLXByZWZpeCAiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCXJlZlByZWZpeGVzLmFkZChsaW5lLnN1YnN0cmluZygicmVmLXByZWZpeCAiLmxlbmd0aCgpKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQl9IGVsc2UgeworCQkJCQl0aHJvdyBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQKKwkJCQkJCQkuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnVuZXhwZWN0ZWRQYWNrZXRMaW5lLCBsaW5lKSk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYgKGxpbmUgIT0gUGFja2V0TGluZUluLkVORCkgeworCQkJdGhyb3cgbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0CisJCQkJCS5mb3JtYXQoSkdpdFRleHQuZ2V0KCkudW5leHBlY3RlZFBhY2tldExpbmUsIGxpbmUpKTsKKwkJfQorCQlyYXdPdXQuc3RvcEJ1ZmZlcmluZygpOworCisJCU1hcDxTdHJpbmcsIFJlZj4gcmVmc1RvU2VuZDsKKwkJaWYgKHJlZlByZWZpeGVzLmlzRW1wdHkoKSkgeworCQkJcmVmc1RvU2VuZCA9IGdldEFkdmVydGlzZWRPckRlZmF1bHRSZWZzKCk7CisJCX0gZWxzZSB7CisJCQlyZWZzVG9TZW5kID0gbmV3IEhhc2hNYXA8PigpOworCQkJZm9yIChTdHJpbmcgcmVmUHJlZml4IDogcmVmUHJlZml4ZXMpIHsKKwkJCQlmb3IgKFJlZiByZWYgOiBkYi5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnNCeVByZWZpeChyZWZQcmVmaXgpKSB7CisJCQkJCXJlZnNUb1NlbmQucHV0KHJlZi5nZXROYW1lKCksIHJlZik7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKG5lZWRUb0ZpbmRTeW1yZWZzKSB7CisJCQlmaW5kU3ltcmVmcyhhZHYsIHJlZnNUb1NlbmQpOworCQl9CisKKwkJYWR2LnNlbmQocmVmc1RvU2VuZCk7CisJCWFkdi5lbmQoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZmV0Y2hWMigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCW9wdGlvbnMgPSBuZXcgSGFzaFNldDw+KCk7CisKKwkJLy8gUGFja3MgYXJlIGFsd2F5cyBzZW50IG11bHRpcGxleGVkIGFuZCB1c2luZyBmdWxsIDY0SworCQkvLyBsZW5ndGhzLgorCQlvcHRpb25zLmFkZChPUFRJT05fU0lERV9CQU5EXzY0Syk7CisKKwkJLy8gRGVwZW5kaW5nIG9uIHRoZSByZXF1ZXN0VmFsaWRhdG9yLCAjcHJvY2Vzc0hhdmVMaW5lcyBtYXkKKwkJLy8gcmVxdWlyZSB0aGF0IGFkdmVydGlzZWQgYmUgc2V0LiBTZXQgaXQgb25seSBpbiB0aGUgcmVxdWlyZWQKKwkJLy8gY2lyY3Vtc3RhbmNlcyAodG8gYXZvaWQgYSBmdWxsIHJlZiBsb29rdXAgaW4gdGhlIGNhc2UgdGhhdAorCQkvLyB3ZSBkb24ndCBuZWVkIGl0KS4KKwkJaWYgKHJlcXVlc3RWYWxpZGF0b3IgaW5zdGFuY2VvZiBUaXBSZXF1ZXN0VmFsaWRhdG9yIHx8CisJCQkJcmVxdWVzdFZhbGlkYXRvciBpbnN0YW5jZW9mIFJlYWNoYWJsZUNvbW1pdFRpcFJlcXVlc3RWYWxpZGF0b3IgfHwKKwkJCQlyZXF1ZXN0VmFsaWRhdG9yIGluc3RhbmNlb2YgQW55UmVxdWVzdFZhbGlkYXRvcikgeworCQkJYWR2ZXJ0aXNlZCA9IENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CisJCX0gZWxzZSB7CisJCQlhZHZlcnRpc2VkID0gcmVmSWRTZXQoZ2V0QWR2ZXJ0aXNlZE9yRGVmYXVsdFJlZnMoKS52YWx1ZXMoKSk7CisJCX0KKworCQlTdHJpbmcgbGluZTsKKwkJTGlzdDxPYmplY3RJZD4gcGVlckhhcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlib29sZWFuIGRvbmVSZWNlaXZlZCA9IGZhbHNlOworCisJCS8vIEN1cnJlbnRseSwgd2UgZG8gbm90IHN1cHBvcnQgYW55IGNhcGFiaWxpdGllcywgc28gdGhlIG5leHQKKwkJLy8gbGluZSBpcyBERUxJTS4KKwkJaWYgKChsaW5lID0gcGNrSW4ucmVhZFN0cmluZygpKSAhPSBQYWNrZXRMaW5lSW4uREVMSU0pIHsKKwkJCXRocm93IG5ldyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oTWVzc2FnZUZvcm1hdAorCQkJCQkuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnVuZXhwZWN0ZWRQYWNrZXRMaW5lLCBsaW5lKSk7CisJCX0KKworCQlib29sZWFuIGluY2x1ZGVUYWcgPSBmYWxzZTsKKwkJYm9vbGVhbiBmaWx0ZXJSZWNlaXZlZCA9IGZhbHNlOworCQl3aGlsZSAoKGxpbmUgPSBwY2tJbi5yZWFkU3RyaW5nKCkpICE9IFBhY2tldExpbmVJbi5FTkQpIHsKKwkJCWlmIChsaW5lLnN0YXJ0c1dpdGgoIndhbnQgIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXdhbnRJZHMuYWRkKE9iamVjdElkLmZyb21TdHJpbmcobGluZS5zdWJzdHJpbmcoNSkpKTsKKwkJCX0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCJoYXZlICIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlwZWVySGFzLmFkZChPYmplY3RJZC5mcm9tU3RyaW5nKGxpbmUuc3Vic3RyaW5nKDUpKSk7CisJCQl9IGVsc2UgaWYgKGxpbmUuZXF1YWxzKCJkb25lIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCWRvbmVSZWNlaXZlZCA9IHRydWU7CisJCQl9IGVsc2UgaWYgKGxpbmUuZXF1YWxzKE9QVElPTl9USElOX1BBQ0spKSB7CisJCQkJb3B0aW9ucy5hZGQoT1BUSU9OX1RISU5fUEFDSyk7CisJCQl9IGVsc2UgaWYgKGxpbmUuZXF1YWxzKE9QVElPTl9OT19QUk9HUkVTUykpIHsKKwkJCQlvcHRpb25zLmFkZChPUFRJT05fTk9fUFJPR1JFU1MpOworCQkJfSBlbHNlIGlmIChsaW5lLmVxdWFscyhPUFRJT05fSU5DTFVERV9UQUcpKSB7CisJCQkJb3B0aW9ucy5hZGQoT1BUSU9OX0lOQ0xVREVfVEFHKTsKKwkJCQlpbmNsdWRlVGFnID0gdHJ1ZTsKKwkJCX0gZWxzZSBpZiAobGluZS5lcXVhbHMoT1BUSU9OX09GU19ERUxUQSkpIHsKKwkJCQlvcHRpb25zLmFkZChPUFRJT05fT0ZTX0RFTFRBKTsKKwkJCX0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCJzaGFsbG93ICIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQljbGllbnRTaGFsbG93Q29tbWl0cy5hZGQoT2JqZWN0SWQuZnJvbVN0cmluZyhsaW5lLnN1YnN0cmluZyg4KSkpOworCQkJfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoImRlZXBlbiAiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJZGVwdGggPSBJbnRlZ2VyLnBhcnNlSW50KGxpbmUuc3Vic3RyaW5nKDcpKTsKKwkJCQlpZiAoZGVwdGggPD0gMCkgeworCQkJCQl0aHJvdyBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKAorCQkJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmludmFsaWREZXB0aCwKKwkJCQkJCQkJCUludGVnZXIudmFsdWVPZihkZXB0aCkpKTsKKwkJCQl9CisJCQkJaWYgKHNoYWxsb3dTaW5jZSAhPSAwKSB7CisJCQkJCXRocm93IG5ldyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oCisJCQkJCQkJSkdpdFRleHQuZ2V0KCkuZGVlcGVuU2luY2VXaXRoRGVlcGVuKTsKKwkJCQl9CisJCQkJaWYgKHNoYWxsb3dFeGNsdWRlUmVmcyAhPSBudWxsKSB7CisJCQkJCXRocm93IG5ldyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oCisJCQkJCQkJSkdpdFRleHQuZ2V0KCkuZGVlcGVuTm90V2l0aERlZXBlbik7CisJCQkJfQorCQkJfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoImRlZXBlbi1ub3QgIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCUxpc3Q8U3RyaW5nPiBleGNsdWRlID0gc2hhbGxvd0V4Y2x1ZGVSZWZzOworCQkJCWlmIChleGNsdWRlID09IG51bGwpIHsKKwkJCQkJZXhjbHVkZSA9IHNoYWxsb3dFeGNsdWRlUmVmcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkJCX0KKwkJCQlleGNsdWRlLmFkZChsaW5lLnN1YnN0cmluZygxMSkpOworCQkJCWlmIChkZXB0aCAhPSAwKSB7CisJCQkJCXRocm93IG5ldyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oCisJCQkJCQkJSkdpdFRleHQuZ2V0KCkuZGVlcGVuTm90V2l0aERlZXBlbik7CisJCQkJfQorCQkJfSBlbHNlIGlmIChsaW5lLmVxdWFscyhPUFRJT05fREVFUEVOX1JFTEFUSVZFKSkgeworCQkJCW9wdGlvbnMuYWRkKE9QVElPTl9ERUVQRU5fUkVMQVRJVkUpOworCQkJfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoImRlZXBlbi1zaW5jZSAiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJc2hhbGxvd1NpbmNlID0gSW50ZWdlci5wYXJzZUludChsaW5lLnN1YnN0cmluZygxMykpOworCQkJCWlmIChzaGFsbG93U2luY2UgPD0gMCkgeworCQkJCQl0aHJvdyBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKAorCQkJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQkJCQkJSkdpdFRleHQuZ2V0KCkuaW52YWxpZFRpbWVzdGFtcCwgbGluZSkpOworCQkJCX0KKwkJCQlpZiAoZGVwdGggIT0gIDApIHsKKwkJCQkJdGhyb3cgbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbigKKwkJCQkJCQlKR2l0VGV4dC5nZXQoKS5kZWVwZW5TaW5jZVdpdGhEZWVwZW4pOworCQkJCX0KKwkJCX0gZWxzZSBpZiAodHJhbnNmZXJDb25maWcuaXNBbGxvd0ZpbHRlcigpCisJCQkJCSYmIGxpbmUuc3RhcnRzV2l0aChPUFRJT05fRklMVEVSICsgJyAnKSkgeworCQkJCWlmIChmaWx0ZXJSZWNlaXZlZCkgeworCQkJCQl0aHJvdyBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLnRvb01hbnlGaWx0ZXJzKTsKKwkJCQl9CisJCQkJZmlsdGVyUmVjZWl2ZWQgPSB0cnVlOworCQkJCXBhcnNlRmlsdGVyKGxpbmUuc3Vic3RyaW5nKE9QVElPTl9GSUxURVIubGVuZ3RoKCkgKyAxKSk7CisJCQl9IGVsc2UgeworCQkJCXRocm93IG5ldyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oTWVzc2FnZUZvcm1hdAorCQkJCQkJLmZvcm1hdChKR2l0VGV4dC5nZXQoKS51bmV4cGVjdGVkUGFja2V0TGluZSwgbGluZSkpOworCQkJfQorCQl9CisJCXJhd091dC5zdG9wQnVmZmVyaW5nKCk7CisKKwkJYm9vbGVhbiBzZWN0aW9uU2VudCA9IGZhbHNlOworCQlATnVsbGFibGUgTGlzdDxPYmplY3RJZD4gc2hhbGxvd0NvbW1pdHMgPSBudWxsOworCQlMaXN0PE9iamVjdElkPiB1bnNoYWxsb3dDb21taXRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKwkJaWYgKCFjbGllbnRTaGFsbG93Q29tbWl0cy5pc0VtcHR5KCkpIHsKKwkJCXZlcmlmeUNsaWVudFNoYWxsb3coKTsKKwkJfQorCQlpZiAoZGVwdGggIT0gMCB8fCBzaGFsbG93U2luY2UgIT0gMCB8fCBzaGFsbG93RXhjbHVkZVJlZnMgIT0gbnVsbCkgeworCQkJc2hhbGxvd0NvbW1pdHMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdElkPigpOworCQkJcHJvY2Vzc1NoYWxsb3coc2hhbGxvd0NvbW1pdHMsIHVuc2hhbGxvd0NvbW1pdHMsIGZhbHNlKTsKKwkJfQorCQlpZiAoIWNsaWVudFNoYWxsb3dDb21taXRzLmlzRW1wdHkoKSkKKwkJCXdhbGsuYXNzdW1lU2hhbGxvdyhjbGllbnRTaGFsbG93Q29tbWl0cyk7CisKKwkJaWYgKGRvbmVSZWNlaXZlZCkgeworCQkJcHJvY2Vzc0hhdmVMaW5lcyhwZWVySGFzLCBPYmplY3RJZC56ZXJvSWQoKSwgbmV3IFBhY2tldExpbmVPdXQoTnVsbE91dHB1dFN0cmVhbS5JTlNUQU5DRSkpOworCQl9IGVsc2UgeworCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJhY2tub3dsZWRnbWVudHNcbiIpOyAvLyROT04tTkxTLTEkCisJCQlmb3IgKE9iamVjdElkIGlkIDogcGVlckhhcykgeworCQkJCWlmICh3YWxrLmdldE9iamVjdFJlYWRlcigpLmhhcyhpZCkpIHsKKwkJCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJBQ0sgIiArIGlkLmdldE5hbWUoKSArICJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQl9CisJCQl9CisJCQlwcm9jZXNzSGF2ZUxpbmVzKHBlZXJIYXMsIE9iamVjdElkLnplcm9JZCgpLCBuZXcgUGFja2V0TGluZU91dChOdWxsT3V0cHV0U3RyZWFtLklOU1RBTkNFKSk7CisJCQlpZiAob2tUb0dpdmVVcCgpKSB7CisJCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJyZWFkeVxuIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0gZWxzZSBpZiAoY29tbW9uQmFzZS5pc0VtcHR5KCkpIHsKKwkJCQlwY2tPdXQud3JpdGVTdHJpbmcoIk5BS1xuIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCXNlY3Rpb25TZW50ID0gdHJ1ZTsKKwkJfQorCisJCWlmIChkb25lUmVjZWl2ZWQgfHwgb2tUb0dpdmVVcCgpKSB7CisJCQlpZiAoc2hhbGxvd0NvbW1pdHMgIT0gbnVsbCkgeworCQkJCWlmIChzZWN0aW9uU2VudCkKKwkJCQkJcGNrT3V0LndyaXRlRGVsaW0oKTsKKwkJCQlwY2tPdXQud3JpdGVTdHJpbmcoInNoYWxsb3ctaW5mb1xuIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlmb3IgKE9iamVjdElkIG8gOiBzaGFsbG93Q29tbWl0cykgeworCQkJCQlwY2tPdXQud3JpdGVTdHJpbmcoInNoYWxsb3cgIiArIG8uZ2V0TmFtZSgpICsgJ1xuJyk7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQkJZm9yIChPYmplY3RJZCBvIDogdW5zaGFsbG93Q29tbWl0cykgeworCQkJCQlwY2tPdXQud3JpdGVTdHJpbmcoInVuc2hhbGxvdyAiICsgby5nZXROYW1lKCkgKyAnXG4nKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCQlzZWN0aW9uU2VudCA9IHRydWU7CisJCQl9CisKKwkJCWlmIChzZWN0aW9uU2VudCkKKwkJCQlwY2tPdXQud3JpdGVEZWxpbSgpOworCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJwYWNrZmlsZVxuIik7IC8vJE5PTi1OTFMtMSQKKwkJCXNlbmRQYWNrKG5ldyBQYWNrU3RhdGlzdGljcy5BY2N1bXVsYXRvcigpLAorCQkJCQlpbmNsdWRlVGFnCisJCQkJCQk/IGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmc0J5UHJlZml4KFJfVEFHUykKKwkJCQkJCTogbnVsbCwKKwkJCQkJdW5zaGFsbG93Q29tbWl0cyk7CisJCX0KKwkJcGNrT3V0LmVuZCgpOworCX0KKworCS8qCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgdGhlIGxhc3QgY29tbWFuZCBhbmQgd2Ugc2hvdWxkIHRlYXIgZG93biB0aGUKKwkgKiBjb25uZWN0aW9uLgorCSAqLworCXByaXZhdGUgYm9vbGVhbiBzZXJ2ZU9uZUNvbW1hbmRWMigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCVN0cmluZyBjb21tYW5kOworCQl0cnkgeworCQkJY29tbWFuZCA9IHBja0luLnJlYWRTdHJpbmcoKTsKKwkJfSBjYXRjaCAoRU9GRXhjZXB0aW9uIGVvZikgeworCQkJLyogRU9GIHdoZW4gYXdhaXRpbmcgY29tbWFuZCBpcyBmaW5lICovCisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAoY29tbWFuZCA9PSBQYWNrZXRMaW5lSW4uRU5EKSB7CisJCQkvLyBBIGJsYW5rIHJlcXVlc3QgaXMgdmFsaWQgYWNjb3JkaW5nCisJCQkvLyB0byB0aGUgcHJvdG9jb2w7IGRvIG5vdGhpbmcgaW4gdGhpcworCQkJLy8gY2FzZS4KKwkJCXJldHVybiB0cnVlOworCQl9CisJCWlmIChjb21tYW5kLmVxdWFscygiY29tbWFuZD0iICsgQ09NTUFORF9MU19SRUZTKSkgeyAvLyROT04tTkxTLTEkCisJCQlsc1JlZnNWMigpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmIChjb21tYW5kLmVxdWFscygiY29tbWFuZD0iICsgQ09NTUFORF9GRVRDSCkpIHsgLy8kTk9OLU5MUy0xJAorCQkJZmV0Y2hWMigpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXRocm93IG5ldyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oTWVzc2FnZUZvcm1hdAorCQkJCS5mb3JtYXQoSkdpdFRleHQuZ2V0KCkudW5rbm93blRyYW5zcG9ydENvbW1hbmQsIGNvbW1hbmQpKTsKKwl9CisKKwlwcml2YXRlIExpc3Q8U3RyaW5nPiBnZXRWMkNhcGFiaWxpdHlBZHZlcnRpc2VtZW50KCkgeworCQlBcnJheUxpc3Q8U3RyaW5nPiBjYXBzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWNhcHMuYWRkKCJ2ZXJzaW9uIDIiKTsgLy8kTk9OLU5MUy0xJAorCQljYXBzLmFkZChDT01NQU5EX0xTX1JFRlMpOworCQljYXBzLmFkZCgKKwkJCQlDT01NQU5EX0ZFVENIICsgJz0nICsKKwkJCQkodHJhbnNmZXJDb25maWcuaXNBbGxvd0ZpbHRlcigpID8gT1BUSU9OX0ZJTFRFUiArICcgJyA6ICIiKSArIC8vJE5PTi1OTFMtMSQKKwkJCQlPUFRJT05fU0hBTExPVyk7CisJCXJldHVybiBjYXBzOworCX0KKworCXByaXZhdGUgdm9pZCBzZXJ2aWNlVjIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAoYmlEaXJlY3Rpb25hbFBpcGUpIHsKKwkJCS8vIEp1c3QgbGlrZSBpbiBzZXJ2aWNlKCksIHRoZSBjYXBhYmlsaXR5IGFkdmVydGlzZW1lbnQKKwkJCS8vIGlzIHNlbnQgb25seSBpZiB0aGlzIGlzIGEgYmlkaXJlY3Rpb25hbCBwaXBlLiAoSWYKKwkJCS8vIG5vdCwgdGhlIGNsaWVudCBpcyBleHBlY3RlZCB0byBjYWxsCisJCQkvLyBzZW5kQWR2ZXJ0aXNlZFJlZnMoKSBvbiBpdHMgb3duLikKKwkJCWZvciAoU3RyaW5nIHMgOiBnZXRWMkNhcGFiaWxpdHlBZHZlcnRpc2VtZW50KCkpIHsKKwkJCQlwY2tPdXQud3JpdGVTdHJpbmcocyArICJcbiIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlwY2tPdXQuZW5kKCk7CisKKwkJCXdoaWxlICghc2VydmVPbmVDb21tYW5kVjIoKSkgeworCQkJCS8vIFJlcGVhdCB1bnRpbCBhbiBlbXB0eSBjb21tYW5kIG9yIEVPRi4KKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCisJCXRyeSB7CisJCQlzZXJ2ZU9uZUNvbW1hbmRWMigpOworCQl9IGZpbmFsbHkgeworCQkJd2hpbGUgKDAgPCByYXdJbi5za2lwKDIwNDgpIHx8IDAgPD0gcmF3SW4ucmVhZCgpKSB7CisJCQkJLy8gRGlzY2FyZCB1bnRpbCBFT0YuCisJCQl9CisJCQlyYXdPdXQuc3RvcEJ1ZmZlcmluZygpOworCQl9CiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgU2V0PE9iamVjdElkPiByZWZJZFNldChDb2xsZWN0aW9uPFJlZj4gcmVmcykgewpAQCAtODc0LDcgKzExNzAsMjMgQEAKIAkJcmV0dXJuIGlkczsKIAl9CiAKLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1NoYWxsb3coKSB0aHJvd3MgSU9FeGNlcHRpb24geworCS8qCisJICogRGV0ZXJtaW5lcyB3aGF0ICJzaGFsbG93IiBhbmQgInVuc2hhbGxvdyIgbGluZXMgdG8gc2VuZCB0byB0aGUgdXNlci4KKwkgKiBUaGUgaW5mb3JtYXRpb24gaXMgd3JpdHRlbiB0byBzaGFsbG93Q29tbWl0cyAoaWYgbm90IG51bGwpIGFuZAorCSAqIHVuc2hhbGxvd0NvbW1pdHMsIGFuZCBhbHNvIHdyaXR0ZW4gdG8gI3Bja091dCAoaWYgd3JpdGVUb1Bja091dCBpcworCSAqIHRydWUpLgorCSAqLworCXByaXZhdGUgdm9pZCBwcm9jZXNzU2hhbGxvdyhATnVsbGFibGUgTGlzdDxPYmplY3RJZD4gc2hhbGxvd0NvbW1pdHMsCisJCQlMaXN0PE9iamVjdElkPiB1bnNoYWxsb3dDb21taXRzLAorCQkJYm9vbGVhbiB3cml0ZVRvUGNrT3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAob3B0aW9ucy5jb250YWlucyhPUFRJT05fREVFUEVOX1JFTEFUSVZFKSB8fAorCQkJCXNoYWxsb3dTaW5jZSAhPSAwIHx8CisJCQkJc2hhbGxvd0V4Y2x1ZGVSZWZzICE9IG51bGwpIHsKKwkJCS8vIFRPRE8oam9uYXRoYW50YW5teSk6IEltcGxlbWVudCBkZWVwZW4tcmVsYXRpdmUsIGRlZXBlbi1zaW5jZSwKKwkJCS8vIGFuZCBkZWVwZW4tbm90LgorCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJCX0KKwogCQlpbnQgd2Fsa0RlcHRoID0gZGVwdGggLSAxOwogCQl0cnkgKERlcHRoV2Fsay5SZXZXYWxrIGRlcHRoV2FsayA9IG5ldyBEZXB0aFdhbGsuUmV2V2FsaygKIAkJCQl3YWxrLmdldE9iamVjdFJlYWRlcigpLCB3YWxrRGVwdGgpKSB7CkBAIC04OTUsMTkgKzEyMDcsMjkgQEAKIAkJCQkvLyBDb21taXRzIGF0IHRoZSBib3VuZGFyeSB3aGljaCBhcmVuJ3QgYWxyZWFkeSBzaGFsbG93IGluCiAJCQkJLy8gdGhlIGNsaWVudCBuZWVkIHRvIGJlIG1hcmtlZCBhcyBzdWNoCiAJCQkJaWYgKGMuZ2V0RGVwdGgoKSA9PSB3YWxrRGVwdGgKLQkJCQkJCSYmICFjbGllbnRTaGFsbG93Q29tbWl0cy5jb250YWlucyhjKSkKLQkJCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJzaGFsbG93ICIgKyBvLm5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCSYmICFjbGllbnRTaGFsbG93Q29tbWl0cy5jb250YWlucyhjKSkgeworCQkJCQlpZiAoc2hhbGxvd0NvbW1pdHMgIT0gbnVsbCkgeworCQkJCQkJc2hhbGxvd0NvbW1pdHMuYWRkKGMuY29weSgpKTsKKwkJCQkJfQorCQkJCQlpZiAod3JpdGVUb1Bja091dCkgeworCQkJCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJzaGFsbG93ICIgKyBvLm5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfQorCQkJCX0KIAogCQkJCS8vIENvbW1pdHMgbm90IG9uIHRoZSBib3VuZGFyeSB3aGljaCBhcmUgc2hhbGxvdyBpbiB0aGUgY2xpZW50CiAJCQkJLy8gbmVlZCB0byBiZWNvbWUgdW5zaGFsbG93ZWQKIAkJCQlpZiAoYy5nZXREZXB0aCgpIDwgd2Fsa0RlcHRoCiAJCQkJCQkmJiBjbGllbnRTaGFsbG93Q29tbWl0cy5yZW1vdmUoYykpIHsKIAkJCQkJdW5zaGFsbG93Q29tbWl0cy5hZGQoYy5jb3B5KCkpOwotCQkJCQlwY2tPdXQud3JpdGVTdHJpbmcoInVuc2hhbGxvdyAiICsgYy5uYW1lKCkpOyAvLyROT04tTkxTLTEkCisJCQkJCWlmICh3cml0ZVRvUGNrT3V0KSB7CisJCQkJCQlwY2tPdXQud3JpdGVTdHJpbmcoInVuc2hhbGxvdyAiICsgYy5uYW1lKCkpOyAvLyROT04tTkxTLTEkCisJCQkJCX0KIAkJCQl9CiAJCQl9CiAJCX0KLQkJcGNrT3V0LmVuZCgpOworCQlpZiAod3JpdGVUb1Bja091dCkgeworCQkJcGNrT3V0LmVuZCgpOworCQl9CiAJfQogCiAJcHJpdmF0ZSB2b2lkIHZlcmlmeUNsaWVudFNoYWxsb3coKQpAQCAtOTQ1LDEyICsxMjY3LDQ0IEBACiAJICogQHBhcmFtIGFkdgogCSAqICAgICAgICAgICAgdGhlIGFkdmVydGlzZW1lbnQgZm9ybWF0dGVyLgogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIHRoZSBmb3JtYXR0ZXIgZmFpbGVkIHRvIHdyaXRlIGFuIGFkdmVydGlzZW1lbnQuCisJICogICAgICAgICAgICB0aGUgZm9ybWF0dGVyIGZhaWxlZCB0byB3cml0ZSBhbiBhZHZlcnRpc2VtZW50LgogCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuU2VydmljZU1heU5vdENvbnRpbnVlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgdGhlIGhvb2sgZGVuaWVkIGFkdmVydGlzZW1lbnQuCisJICogICAgICAgICAgICB0aGUgaG9vayBkZW5pZWQgYWR2ZXJ0aXNlbWVudC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZW5kQWR2ZXJ0aXNlZFJlZnMoZmluYWwgUmVmQWR2ZXJ0aXNlciBhZHYpIHRocm93cyBJT0V4Y2VwdGlvbiwKKwlwdWJsaWMgdm9pZCBzZW5kQWR2ZXJ0aXNlZFJlZnMoUmVmQWR2ZXJ0aXNlciBhZHYpIHRocm93cyBJT0V4Y2VwdGlvbiwKIAkJCVNlcnZpY2VNYXlOb3RDb250aW51ZUV4Y2VwdGlvbiB7CisJCXNlbmRBZHZlcnRpc2VkUmVmcyhhZHYsIG51bGwpOworCX0KKworCS8qKgorCSAqIEdlbmVyYXRlIGFuIGFkdmVydGlzZW1lbnQgb2YgYXZhaWxhYmxlIHJlZnMgYW5kIGNhcGFiaWxpdGllcy4KKwkgKgorCSAqIEBwYXJhbSBhZHYKKwkgKiAgICAgICAgICAgIHRoZSBhZHZlcnRpc2VtZW50IGZvcm1hdHRlci4KKwkgKiBAcGFyYW0gc2VydmljZU5hbWUKKwkgKiAgICAgICAgICAgIGlmIG5vdCBudWxsLCBhbHNvIG91dHB1dCAiIyBzZXJ2aWNlPXNlcnZpY2VOYW1lIiBmb2xsb3dlZCBieSBhCisJICogICAgICAgICAgICBmbHVzaCBwYWNrZXQgYmVmb3JlIHRoZSBhZHZlcnRpc2VtZW50LiBUaGlzIGlzIHJlcXVpcmVkCisJICogICAgICAgICAgICBpbiB2MCBvZiB0aGUgSFRUUCBwcm90b2NvbCwgZGVzY3JpYmVkIGluIEdpdCdzCisJICogICAgICAgICAgICBEb2N1bWVudGF0aW9uL3RlY2huaWNhbC9odHRwLXByb3RvY29sLnR4dC4KKwkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKwkgKiAgICAgICAgICAgIHRoZSBmb3JtYXR0ZXIgZmFpbGVkIHRvIHdyaXRlIGFuIGFkdmVydGlzZW1lbnQuCisJICogQHRocm93cyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5TZXJ2aWNlTWF5Tm90Q29udGludWVFeGNlcHRpb24KKwkgKiAgICAgICAgICAgIHRoZSBob29rIGRlbmllZCBhZHZlcnRpc2VtZW50LgorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZW5kQWR2ZXJ0aXNlZFJlZnMoUmVmQWR2ZXJ0aXNlciBhZHYsCisJCQlATnVsbGFibGUgU3RyaW5nIHNlcnZpY2VOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24sCisJCQlTZXJ2aWNlTWF5Tm90Q29udGludWVFeGNlcHRpb24geworCQlpZiAodXNlUHJvdG9jb2xWMigpKSB7CisJCQkvLyBUaGUgZXF1aXZhbGVudCBpbiB2MiBpcyBvbmx5IHRoZSBjYXBhYmlsaXRpZXMKKwkJCS8vIGFkdmVydGlzZW1lbnQuCisJCQlmb3IgKFN0cmluZyBzIDogZ2V0VjJDYXBhYmlsaXR5QWR2ZXJ0aXNlbWVudCgpKSB7CisJCQkJYWR2LndyaXRlT25lKHMpOworCQkJfQorCQkJYWR2LmVuZCgpOworCQkJcmV0dXJuOworCQl9CisKIAkJdHJ5IHsKIAkJCWFkdmVydGlzZVJlZnNIb29rLmFkdmVydGlzZVJlZnModGhpcyk7CiAJCX0gY2F0Y2ggKFNlcnZpY2VNYXlOb3RDb250aW51ZUV4Y2VwdGlvbiBmYWlsKSB7CkBAIC05NjEsNiArMTMxNSwxMCBAQAogCQkJdGhyb3cgZmFpbDsKIAkJfQogCisJCWlmIChzZXJ2aWNlTmFtZSAhPSBudWxsKSB7CisJCQlhZHYud3JpdGVPbmUoIiMgc2VydmljZT0iICsgc2VydmljZU5hbWUgKyAnXG4nKTsgLy8kTk9OLU5MUy0xJAorCQkJYWR2LmVuZCgpOworCQl9CiAJCWFkdi5pbml0KGRiKTsKIAkJYWR2LmFkdmVydGlzZUNhcGFiaWxpdHkoT1BUSU9OX0lOQ0xVREVfVEFHKTsKIAkJYWR2LmFkdmVydGlzZUNhcGFiaWxpdHkoT1BUSU9OX01VTFRJX0FDS19ERVRBSUxFRCk7CkBAIC05ODMsNiArMTM0MSw5IEBACiAJCQkJfHwgcG9saWN5ID09IG51bGwpCiAJCQlhZHYuYWR2ZXJ0aXNlQ2FwYWJpbGl0eShPUFRJT05fQUxMT1dfUkVBQ0hBQkxFX1NIQTFfSU5fV0FOVCk7CiAJCWFkdi5hZHZlcnRpc2VDYXBhYmlsaXR5KE9QVElPTl9BR0VOVCwgVXNlckFnZW50LmdldCgpKTsKKwkJaWYgKHRyYW5zZmVyQ29uZmlnLmlzQWxsb3dGaWx0ZXIoKSkgeworCQkJYWR2LmFkdmVydGlzZUNhcGFiaWxpdHkoT1BUSU9OX0ZJTFRFUik7CisJCX0KIAkJYWR2LnNldERlcmVmVGFncyh0cnVlKTsKIAkJTWFwPFN0cmluZywgUmVmPiBhZHZlcnRpc2VkT3JEZWZhdWx0UmVmcyA9IGdldEFkdmVydGlzZWRPckRlZmF1bHRSZWZzKCk7CiAJCWZpbmRTeW1yZWZzKGFkdiwgYWR2ZXJ0aXNlZE9yRGVmYXVsdFJlZnMpOwpAQCAtMTAyMSw4ICsxMzgyLDM2IEBACiAJCXJldHVybiBtc2dPdXQ7CiAJfQogCisJcHJpdmF0ZSB2b2lkIHBhcnNlRmlsdGVyKFN0cmluZyBhcmcpIHRocm93cyBQYWNrUHJvdG9jb2xFeGNlcHRpb24geworCQlpZiAoYXJnLmVxdWFscygiYmxvYjpub25lIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJZmlsdGVyQmxvYkxpbWl0ID0gMDsKKwkJfSBlbHNlIGlmIChhcmcuc3RhcnRzV2l0aCgiYmxvYjpsaW1pdD0iKSkgeyAvLyROT04tTkxTLTEkCisJCQl0cnkgeworCQkJCWZpbHRlckJsb2JMaW1pdCA9IExvbmcucGFyc2VMb25nKAorCQkJCQkJYXJnLnN1YnN0cmluZygiYmxvYjpsaW1pdD0iLmxlbmd0aCgpKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisJCQkJdGhyb3cgbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbigKKwkJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmludmFsaWRGaWx0ZXIsCisJCQkJCQkJCWFyZykpOworCQkJfQorCQl9CisJCS8qCisJCSAqIFdlIG11c3QgaGF2ZSAoMSkgZWl0aGVyICJibG9iOm5vbmUiIG9yCisJCSAqICJibG9iOmxpbWl0PSIgc2V0IChiZWNhdXNlIHdlIG9ubHkgc3VwcG9ydAorCQkgKiBibG9iIHNpemUgbGltaXRzIGZvciBub3cpLCBhbmQgKDIpIGlmIHRoZQorCQkgKiBsYXR0ZXIsIHRoZW4gaXQgbXVzdCBiZSBub25uZWdhdGl2ZS4gVGhyb3cKKwkJICogaWYgKDEpIG9yICgyKSBpcyBub3QgbWV0LgorCQkgKi8KKwkJaWYgKGZpbHRlckJsb2JMaW1pdCA8IDApIHsKKwkJCXRocm93IG5ldyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oCisJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmludmFsaWRGaWx0ZXIsCisJCQkJCQkJYXJnKSk7CisJCX0KKwl9CisKIAlwcml2YXRlIHZvaWQgcmVjdldhbnRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJYm9vbGVhbiBpc0ZpcnN0ID0gdHJ1ZTsKKwkJYm9vbGVhbiBmaWx0ZXJSZWNlaXZlZCA9IGZhbHNlOwogCQlmb3IgKDs7KSB7CiAJCQlTdHJpbmcgbGluZTsKIAkJCXRyeSB7CkBAIC0xMDUxLDYgKzE0NDAsMTkgQEAKIAkJCQljb250aW51ZTsKIAkJCX0KIAorCQkJaWYgKHRyYW5zZmVyQ29uZmlnLmlzQWxsb3dGaWx0ZXIoKQorCQkJCQkmJiBsaW5lLnN0YXJ0c1dpdGgoT1BUSU9OX0ZJTFRFUiArICIgIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCVN0cmluZyBhcmcgPSBsaW5lLnN1YnN0cmluZyhPUFRJT05fRklMVEVSLmxlbmd0aCgpICsgMSk7CisKKwkJCQlpZiAoZmlsdGVyUmVjZWl2ZWQpIHsKKwkJCQkJdGhyb3cgbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS50b29NYW55RmlsdGVycyk7CisJCQkJfQorCQkJCWZpbHRlclJlY2VpdmVkID0gdHJ1ZTsKKworCQkJCXBhcnNlRmlsdGVyKGFyZyk7CisJCQkJY29udGludWU7CisJCQl9CisKIAkJCWlmICghbGluZS5zdGFydHNXaXRoKCJ3YW50ICIpIHx8IGxpbmUubGVuZ3RoKCkgPCA0NSkgLy8kTk9OLU5MUy0xJAogCQkJCXRocm93IG5ldyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuZXhwZWN0ZWRHb3QsICJ3YW50IiwgbGluZSkpOyAvLyROT04tTkxTLTEkCiAKQEAgLTExMjIsNyArMTUyNCw3IEBACiAJCQl9CiAKIAkJCWlmIChsaW5lID09IFBhY2tldExpbmVJbi5FTkQpIHsKLQkJCQlsYXN0ID0gcHJvY2Vzc0hhdmVMaW5lcyhwZWVySGFzLCBsYXN0KTsKKwkJCQlsYXN0ID0gcHJvY2Vzc0hhdmVMaW5lcyhwZWVySGFzLCBsYXN0LCBwY2tPdXQpOwogCQkJCWlmIChjb21tb25CYXNlLmlzRW1wdHkoKSB8fCBtdWx0aUFjayAhPSBNdWx0aUFjay5PRkYpCiAJCQkJCXBja091dC53cml0ZVN0cmluZygiTkFLXG4iKTsgLy8kTk9OLU5MUy0xJAogCQkJCWlmIChub0RvbmUgJiYgc2VudFJlYWR5KSB7CkBAIC0xMTM3LDcgKzE1MzksNyBAQAogCQkJCXBlZXJIYXMuYWRkKE9iamVjdElkLmZyb21TdHJpbmcobGluZS5zdWJzdHJpbmcoNSkpKTsKIAkJCQlhY2N1bXVsYXRvci5oYXZlcysrOwogCQkJfSBlbHNlIGlmIChsaW5lLmVxdWFscygiZG9uZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlsYXN0ID0gcHJvY2Vzc0hhdmVMaW5lcyhwZWVySGFzLCBsYXN0KTsKKwkJCQlsYXN0ID0gcHJvY2Vzc0hhdmVMaW5lcyhwZWVySGFzLCBsYXN0LCBwY2tPdXQpOwogCiAJCQkJaWYgKGNvbW1vbkJhc2UuaXNFbXB0eSgpKQogCQkJCQlwY2tPdXQud3JpdGVTdHJpbmcoIk5BS1xuIik7IC8vJE5PTi1OTFMtMSQKQEAgLTExNTMsNyArMTU1NSw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIE9iamVjdElkIHByb2Nlc3NIYXZlTGluZXMoTGlzdDxPYmplY3RJZD4gcGVlckhhcywgT2JqZWN0SWQgbGFzdCkKKwlwcml2YXRlIE9iamVjdElkIHByb2Nlc3NIYXZlTGluZXMoTGlzdDxPYmplY3RJZD4gcGVlckhhcywgT2JqZWN0SWQgbGFzdCwgUGFja2V0TGluZU91dCBvdXQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlwcmVVcGxvYWRIb29rLm9uQmVnaW5OZWdvdGlhdGVSb3VuZCh0aGlzLCB3YW50SWRzLCBwZWVySGFzLnNpemUoKSk7CiAJCWlmICh3YW50QWxsLmlzRW1wdHkoKSAmJiAhd2FudElkcy5pc0VtcHR5KCkpCkBAIC0xMTk4LDEzICsxNjAwLDEzIEBACiAJCQkJc3dpdGNoIChtdWx0aUFjaykgewogCQkJCWNhc2UgT0ZGOgogCQkJCQlpZiAoY29tbW9uQmFzZS5zaXplKCkgPT0gMSkKLQkJCQkJCXBja091dC53cml0ZVN0cmluZygiQUNLICIgKyBvYmoubmFtZSgpICsgIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJb3V0LndyaXRlU3RyaW5nKCJBQ0sgIiArIG9iai5uYW1lKCkgKyAiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgQ09OVElOVUU6Ci0JCQkJCXBja091dC53cml0ZVN0cmluZygiQUNLICIgKyBvYmoubmFtZSgpICsgIiBjb250aW51ZVxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQlvdXQud3JpdGVTdHJpbmcoIkFDSyAiICsgb2JqLm5hbWUoKSArICIgY29udGludWVcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBERVRBSUxFRDoKLQkJCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJBQ0sgIiArIG9iai5uYW1lKCkgKyAiIGNvbW1vblxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQlvdXQud3JpdGVTdHJpbmcoIkFDSyAiICsgb2JqLm5hbWUoKSArICIgY29tbW9uXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0KQEAgLTEyMzAsMTAgKzE2MzIsMTAgQEAKIAkJCQkJCWNhc2UgT0ZGOgogCQkJCQkJCWJyZWFrOwogCQkJCQkJY2FzZSBDT05USU5VRToKLQkJCQkJCQlwY2tPdXQud3JpdGVTdHJpbmcoIkFDSyAiICsgaWQubmFtZSgpICsgIiBjb250aW51ZVxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJCW91dC53cml0ZVN0cmluZygiQUNLICIgKyBpZC5uYW1lKCkgKyAiIGNvbnRpbnVlXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkJCQkJYnJlYWs7CiAJCQkJCQljYXNlIERFVEFJTEVEOgotCQkJCQkJCXBja091dC53cml0ZVN0cmluZygiQUNLICIgKyBpZC5uYW1lKCkgKyAiIHJlYWR5XG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQkJb3V0LndyaXRlU3RyaW5nKCJBQ0sgIiArIGlkLm5hbWUoKSArICIgcmVhZHlcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCQkJCQlzZW50UmVhZHkgPSB0cnVlOwogCQkJCQkJCWJyZWFrOwogCQkJCQkJfQpAQCAtMTI0NSw3ICsxNjQ3LDcgQEAKIAogCQlpZiAobXVsdGlBY2sgPT0gTXVsdGlBY2suREVUQUlMRUQgJiYgIWRpZE9rVG9HaXZlVXAgJiYgb2tUb0dpdmVVcCgpKSB7CiAJCQlPYmplY3RJZCBpZCA9IHBlZXJIYXMuZ2V0KHBlZXJIYXMuc2l6ZSgpIC0gMSk7Ci0JCQlwY2tPdXQud3JpdGVTdHJpbmcoIkFDSyAiICsgaWQubmFtZSgpICsgIiByZWFkeVxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJb3V0LndyaXRlU3RyaW5nKCJBQ0sgIiArIGlkLm5hbWUoKSArICIgcmVhZHlcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCXNlbnRSZWFkeSA9IHRydWU7CiAJCX0KIApAQCAtMTM0MCw3ICsxNzQyLDcgQEAKIAkJCQluZXcgUmVhY2hhYmxlQ29tbWl0VGlwUmVxdWVzdFZhbGlkYXRvcigpLmNoZWNrV2FudHModXAsIHdhbnRzKTsKIAkJCWVsc2UgaWYgKCF3YW50cy5pc0VtcHR5KCkpIHsKIAkJCQlTZXQ8T2JqZWN0SWQ+IHJlZklkcyA9Ci0JCQkJCXJlZklkU2V0KHVwLmdldFJlcG9zaXRvcnkoKS5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoQUxMKS52YWx1ZXMoKSk7CisJCQkJCQlyZWZJZFNldCh1cC5nZXRSZXBvc2l0b3J5KCkuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKCkpOwogCQkJCWZvciAoT2JqZWN0SWQgb2JqIDogd2FudHMpIHsKIAkJCQkJaWYgKCFyZWZJZHMuY29udGFpbnMob2JqKSkKIAkJCQkJCXRocm93IG5ldyBXYW50Tm90VmFsaWRFeGNlcHRpb24ob2JqKTsKQEAgLTEzNjAsNyArMTc2Miw3IEBACiAJCXB1YmxpYyB2b2lkIGNoZWNrV2FudHMoVXBsb2FkUGFjayB1cCwgTGlzdDxPYmplY3RJZD4gd2FudHMpCiAJCQkJdGhyb3dzIFBhY2tQcm90b2NvbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQkJY2hlY2tOb3RBZHZlcnRpc2VkV2FudHModXAsIHdhbnRzLAotCQkJCQlyZWZJZFNldCh1cC5nZXRSZXBvc2l0b3J5KCkuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKEFMTCkudmFsdWVzKCkpKTsKKwkJCQkJcmVmSWRTZXQodXAuZ2V0UmVwb3NpdG9yeSgpLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpKSk7CiAJCX0KIAl9CiAKQEAgLTE0NDMsNyArMTg0NSw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgYWRkQ29tbW9uQmFzZShmaW5hbCBSZXZPYmplY3QgbykgeworCXByaXZhdGUgdm9pZCBhZGRDb21tb25CYXNlKFJldk9iamVjdCBvKSB7CiAJCWlmICghby5oYXMoQ09NTU9OKSkgewogCQkJby5hZGQoQ09NTU9OKTsKIAkJCWNvbW1vbkJhc2UuYWRkKG8pOwpAQCAtMTQ3Miw3ICsxODc0LDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgYm9vbGVhbiB3YW50U2F0aXNmaWVkKGZpbmFsIFJldk9iamVjdCB3YW50KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgYm9vbGVhbiB3YW50U2F0aXNmaWVkKFJldk9iamVjdCB3YW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAod2FudC5oYXMoU0FUSVNGSUVEKSkKIAkJCXJldHVybiB0cnVlOwogCkBAIC0xNDkzLDEzICsxODk1LDI5IEBACiAJCXJldHVybiBmYWxzZTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgc2VuZFBhY2soUGFja1N0YXRpc3RpY3MuQWNjdW11bGF0b3IgYWNjdW11bGF0b3IpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24geworCS8qKgorCSAqIFNlbmQgdGhlIHJlcXVlc3RlZCBvYmplY3RzIHRvIHRoZSBjbGllbnQuCisJICoKKwkgKiBAcGFyYW0gYWNjdW11bGF0b3IKKwkgKiAgICAgICAgICAgICAgICB3aGVyZSB0byB3cml0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBjb250ZW50IG9mIHRoZSBwYWNrLgorCSAqIEBwYXJhbSBhbGxUYWdzCisJICogICAgICAgICAgICAgICAgcmVmcyB0byBzZWFyY2ggZm9yIGFubm90YXRlZCB0YWdzIHRvIGluY2x1ZGUgaW4gdGhlIHBhY2sKKwkgKiAgICAgICAgICAgICAgICBpZiB0aGUge0BsaW5rICNPUFRJT05fSU5DTFVERV9UQUd9IGNhcGFiaWxpdHkgd2FzCisJICogICAgICAgICAgICAgICAgcmVxdWVzdGVkLgorCSAqIEBwYXJhbSB1bnNoYWxsb3dDb21taXRzCisJICogICAgICAgICAgICAgICAgc2hhbGxvdyBjb21taXRzIG9uIHRoZSBjbGllbnQgdGhhdCBhcmUgbm93IGJlY29taW5nCisJICogICAgICAgICAgICAgICAgdW5zaGFsbG93CisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqICAgICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VyZWQgd2hpbGUgZ2VuZXJhdGluZyBvciB3cml0aW5nIHRoZSBwYWNrLgorCSAqLworCXByaXZhdGUgdm9pZCBzZW5kUGFjayhQYWNrU3RhdGlzdGljcy5BY2N1bXVsYXRvciBhY2N1bXVsYXRvciwKKwkJCUBOdWxsYWJsZSBDb2xsZWN0aW9uPFJlZj4gYWxsVGFncywKKwkJCUxpc3Q8T2JqZWN0SWQ+IHVuc2hhbGxvd0NvbW1pdHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGJvb2xlYW4gc2lkZWJhbmQgPSBvcHRpb25zLmNvbnRhaW5zKE9QVElPTl9TSURFX0JBTkQpCiAJCQkJfHwgb3B0aW9ucy5jb250YWlucyhPUFRJT05fU0lERV9CQU5EXzY0Syk7CiAJCWlmIChzaWRlYmFuZCkgewogCQkJdHJ5IHsKLQkJCQlzZW5kUGFjayh0cnVlLCBhY2N1bXVsYXRvcik7CisJCQkJc2VuZFBhY2sodHJ1ZSwgYWNjdW11bGF0b3IsIGFsbFRhZ3MsIHVuc2hhbGxvd0NvbW1pdHMpOwogCQkJfSBjYXRjaCAoU2VydmljZU1heU5vdENvbnRpbnVlRXhjZXB0aW9uIG5vUGFjaykgewogCQkJCS8vIFRoaXMgd2FzIGFscmVhZHkgcmVwb3J0ZWQgb24gKGJlbG93KS4KIAkJCQl0aHJvdyBub1BhY2s7CkBAIC0xNTIwLDcgKzE5MzgsNyBAQAogCQkJCQl0aHJvdyBlcnI7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQlzZW5kUGFjayhmYWxzZSwgYWNjdW11bGF0b3IpOworCQkJc2VuZFBhY2soZmFsc2UsIGFjY3VtdWxhdG9yLCBhbGxUYWdzLCB1bnNoYWxsb3dDb21taXRzKTsKIAkJfQogCX0KIApAQCAtMTU0MCw5ICsxOTU4LDI4IEBACiAJCX0KIAl9CiAKLQlAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQorCS8qKgorCSAqIFNlbmQgdGhlIHJlcXVlc3RlZCBvYmplY3RzIHRvIHRoZSBjbGllbnQuCisJICoKKwkgKiBAcGFyYW0gc2lkZWJhbmQKKwkgKiAgICAgICAgICAgICAgICB3aGV0aGVyIHRvIHdyYXAgdGhlIHBhY2sgaW4gc2lkZS1iYW5kIHBrdC1saW5lcywKKwkgKiAgICAgICAgICAgICAgICBpbnRlcmxlYXZlZCB3aXRoIHByb2dyZXNzIG1lc3NhZ2VzIGFuZCBlcnJvcnMuCisJICogQHBhcmFtIGFjY3VtdWxhdG9yCisJICogICAgICAgICAgICAgICAgd2hlcmUgdG8gd3JpdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgY29udGVudCBvZiB0aGUgcGFjay4KKwkgKiBAcGFyYW0gYWxsVGFncworCSAqICAgICAgICAgICAgICAgIHJlZnMgdG8gc2VhcmNoIGZvciBhbm5vdGF0ZWQgdGFncyB0byBpbmNsdWRlIGluIHRoZSBwYWNrCisJICogICAgICAgICAgICAgICAgaWYgdGhlIHtAbGluayAjT1BUSU9OX0lOQ0xVREVfVEFHfSBjYXBhYmlsaXR5IHdhcworCSAqICAgICAgICAgICAgICAgIHJlcXVlc3RlZC4KKwkgKiBAcGFyYW0gdW5zaGFsbG93Q29tbWl0cworCSAqICAgICAgICAgICAgICAgIHNoYWxsb3cgY29tbWl0cyBvbiB0aGUgY2xpZW50IHRoYXQgYXJlIG5vdyBiZWNvbWluZworCSAqICAgICAgICAgICAgICAgIHVuc2hhbGxvdworCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKiAgICAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cmVkIHdoaWxlIGdlbmVyYXRpbmcgb3Igd3JpdGluZyB0aGUgcGFjay4KKwkgKi8KIAlwcml2YXRlIHZvaWQgc2VuZFBhY2soZmluYWwgYm9vbGVhbiBzaWRlYmFuZCwKLQkJCVBhY2tTdGF0aXN0aWNzLkFjY3VtdWxhdG9yIGFjY3VtdWxhdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJUGFja1N0YXRpc3RpY3MuQWNjdW11bGF0b3IgYWNjdW11bGF0b3IsCisJCQlATnVsbGFibGUgQ29sbGVjdGlvbjxSZWY+IGFsbFRhZ3MsCisJCQlMaXN0PE9iamVjdElkPiB1bnNoYWxsb3dDb21taXRzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlQcm9ncmVzc01vbml0b3IgcG0gPSBOdWxsUHJvZ3Jlc3NNb25pdG9yLklOU1RBTkNFOwogCQlPdXRwdXRTdHJlYW0gcGFja091dCA9IHJhd091dDsKIApAQCAtMTU4MywxMSArMjAyMCwxOCBAQAogCQlQYWNrQ29uZmlnIGNmZyA9IHBhY2tDb25maWc7CiAJCWlmIChjZmcgPT0gbnVsbCkKIAkJCWNmZyA9IG5ldyBQYWNrQ29uZmlnKGRiKTsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gUGFja1dyaXRlciBpcyByZWZlcmVuY2VkIGluIHRoZSBmaW5hbGx5CisJCQkJCQkJCQkJLy8gYmxvY2ssIGFuZCBpcyBjbG9zZWQgdGhlcmUKIAkJZmluYWwgUGFja1dyaXRlciBwdyA9IG5ldyBQYWNrV3JpdGVyKGNmZywgd2Fsay5nZXRPYmplY3RSZWFkZXIoKSwKIAkJCQlhY2N1bXVsYXRvcik7CiAJCXRyeSB7CiAJCQlwdy5zZXRJbmRleERpc2FibGVkKHRydWUpOwotCQkJcHcuc2V0VXNlQ2FjaGVkUGFja3ModHJ1ZSk7CisJCQlpZiAoZmlsdGVyQmxvYkxpbWl0ID49IDApIHsKKwkJCQlwdy5zZXRGaWx0ZXJCbG9iTGltaXQoZmlsdGVyQmxvYkxpbWl0KTsKKwkJCQlwdy5zZXRVc2VDYWNoZWRQYWNrcyhmYWxzZSk7CisJCQl9IGVsc2UgeworCQkJCXB3LnNldFVzZUNhY2hlZFBhY2tzKHRydWUpOworCQkJfQogCQkJcHcuc2V0VXNlQml0bWFwcyhkZXB0aCA9PSAwICYmIGNsaWVudFNoYWxsb3dDb21taXRzLmlzRW1wdHkoKSk7CiAJCQlwdy5zZXRDbGllbnRTaGFsbG93Q29tbWl0cyhjbGllbnRTaGFsbG93Q29tbWl0cyk7CiAJCQlwdy5zZXRSZXVzZURlbHRhQ29tbWl0cyh0cnVlKTsKQEAgLTE1OTUsNiArMjAzOSw4IEBACiAJCQlwdy5zZXRUaGluKG9wdGlvbnMuY29udGFpbnMoT1BUSU9OX1RISU5fUEFDSykpOwogCQkJcHcuc2V0UmV1c2VWYWxpZGF0aW5nT2JqZWN0cyhmYWxzZSk7CiAKKwkJCS8vIE9iamVjdHMgbmFtZWQgZGlyZWN0bHkgYnkgcmVmZXJlbmNlcyBnbyBhdCB0aGUgYmVnaW5uaW5nCisJCQkvLyBvZiB0aGUgcGFjay4KIAkJCWlmIChjb21tb25CYXNlLmlzRW1wdHkoKSAmJiByZWZzICE9IG51bGwpIHsKIAkJCQlTZXQ8T2JqZWN0SWQ+IHRhZ1RhcmdldHMgPSBuZXcgSGFzaFNldDw+KCk7CiAJCQkJZm9yIChSZWYgcmVmIDogcmVmcy52YWx1ZXMoKSkgewpAQCAtMTYyNSw4ICsyMDcxLDggQEAKIAkJCQlydyA9IG93OwogCQkJfQogCi0JCQlpZiAob3B0aW9ucy5jb250YWlucyhPUFRJT05fSU5DTFVERV9UQUcpICYmIHJlZnMgIT0gbnVsbCkgewotCQkJCWZvciAoUmVmIHJlZiA6IHJlZnMudmFsdWVzKCkpIHsKKwkJCWlmIChvcHRpb25zLmNvbnRhaW5zKE9QVElPTl9JTkNMVURFX1RBRykgJiYgYWxsVGFncyAhPSBudWxsKSB7CisJCQkJZm9yIChSZWYgcmVmIDogYWxsVGFncykgewogCQkJCQlPYmplY3RJZCBvYmplY3RJZCA9IHJlZi5nZXRPYmplY3RJZCgpOwogCQkJCQlpZiAob2JqZWN0SWQgPT0gbnVsbCkgewogCQkJCQkJLy8gc2tpcCB1bmJvcm4gYnJhbmNoCkBAIC0xNjQ0LDcgKzIwOTAsNyBAQAogCQkJCQl9CiAKIAkJCQkJaWYgKCFyZWYuaXNQZWVsZWQoKSkKLQkJCQkJCXJlZiA9IGRiLnBlZWwocmVmKTsKKwkJCQkJCXJlZiA9IGRiLmdldFJlZkRhdGFiYXNlKCkucGVlbChyZWYpOwogCiAJCQkJCU9iamVjdElkIHBlZWxlZElkID0gcmVmLmdldFBlZWxlZE9iamVjdElkKCk7CiAJCQkJCW9iamVjdElkID0gcmVmLmdldE9iamVjdElkKCk7CkBAIC0xNjY5LDcgKzIxMTUsNiBAQAogCQkJc3RhdGlzdGljcyA9IHB3LmdldFN0YXRpc3RpY3MoKTsKIAkJCWlmIChzdGF0aXN0aWNzICE9IG51bGwpIHsKIAkJCQlwb3N0VXBsb2FkSG9vay5vblBvc3RVcGxvYWQoc3RhdGlzdGljcyk7Ci0JCQkJbG9nZ2VyLm9uUGFja1N0YXRpc3RpY3MobmV3IFBhY2tXcml0ZXIuU3RhdGlzdGljcyhzdGF0aXN0aWNzKSk7CiAJCQl9CiAJCQlwdy5jbG9zZSgpOwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VcGxvYWRQYWNrTG9nZ2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VcGxvYWRQYWNrTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMTQxOGQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVXBsb2FkUGFja0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSwgR29vZ2xlIEluYy4KLSAqIGFuZCBvdGhlciBjb3B5cmlnaHQgb3duZXJzIGFzIGRvY3VtZW50ZWQgaW4gdGhlIHByb2plY3QncyBJUCBsb2cuCi0gKgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2MS4wIHdoaWNoCi0gKiBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgaXMgcmVwcm9kdWNlZCBiZWxvdywgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwCi0gKgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCi0gKiB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKLSAqIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqCi0gKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgSW5jLiBub3IgdGhlCi0gKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gKiAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqICAgd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORAotICogQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKLSAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgotICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCi0gKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2suUGFja1dyaXRlcjsKLQotLyoqCi0gKiBMb2dzIGFjdGl2aXR5IHRoYXQgb2NjdXJyZWQgd2l0aGluCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuVXBsb2FkUGFja30uCi0gKiA8cD4KLSAqIEltcGxlbWVudG9ycyBvZiB0aGUgaW50ZXJmYWNlIGFyZSByZXNwb25zaWJsZSBmb3IgYXNzb2NpYXRpbmcgdGhlIGN1cnJlbnQKLSAqIHRocmVhZCB0byBhIHBhcnRpY3VsYXIgY29ubmVjdGlvbiwgaWYgdGhleSBuZWVkIHRvIGFsc28gaW5jbHVkZSBjb25uZWN0aW9uCi0gKiBpbmZvcm1hdGlvbi4gT25lIG1ldGhvZCBpcyB0byB1c2UgYSB7QGxpbmsgamF2YS5sYW5nLlRocmVhZExvY2FsfSB0byByZW1lbWJlcgotICogdGhlIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24gYmVmb3JlIGludm9raW5nIFVwbG9hZFBhY2suCi0gKgotICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5Qb3N0VXBsb2FkSG9va30gaW5zdGVhZAotICovCi1ARGVwcmVjYXRlZAotcHVibGljIGludGVyZmFjZSBVcGxvYWRQYWNrTG9nZ2VyIHsgLy8gVE9ETyByZW1vdmUgaW4gSkdpdCA1LjAKLQkvKiogQSBzaW1wbGUgbm8tb3AgbG9nZ2VyLiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVXBsb2FkUGFja0xvZ2dlciBOVUxMID0gbmV3IFVwbG9hZFBhY2tMb2dnZXIoKSB7Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBvblBhY2tTdGF0aXN0aWNzKFBhY2tXcml0ZXIuU3RhdGlzdGljcyBzdGF0cykgewotCQkJLy8gRG8gbm90aGluZy4KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBOb3RpY2UgdG8gdGhlIGxvZ2dlciBhZnRlciBhIHBhY2sgaGFzIGJlZW4gc2VudC4KLQkgKgotCSAqIEBwYXJhbSBzdGF0cwotCSAqICAgICAgICAgICAgdGhlIHN0YXRpc3RpY3MgYWZ0ZXIgc2VuZGluZyBhIHBhY2sgdG8gdGhlIGNsaWVudC4KLQkgKiBAc2luY2UgMy4wCi0JICovCi0JcHVibGljIHZvaWQgb25QYWNrU3RhdGlzdGljcyhQYWNrV3JpdGVyLlN0YXRpc3RpY3Mgc3RhdHMpOwotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVXBsb2FkUGFja0xvZ2dlckNoYWluLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VcGxvYWRQYWNrTG9nZ2VyQ2hhaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUxNDY3Mi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VcGxvYWRQYWNrTG9nZ2VyQ2hhaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEsIEdvb2dsZSBJbmMuCi0gKiBhbmQgb3RoZXIgY29weXJpZ2h0IG93bmVycyBhcyBkb2N1bWVudGVkIGluIHRoZSBwcm9qZWN0J3MgSVAgbG9nLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlCi0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgdjEuMCB3aGljaAotICogYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGlzIHJlcHJvZHVjZWQgYmVsb3csIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocAotICoKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgotICogd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCi0gKiBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKgotICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIEluYy4gbm9yIHRoZQotICogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICogICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQKLSAqIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCi0gKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKLSAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgotICogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2suUGFja1dyaXRlcjsKLQotLyoqCi0gKiBVcGxvYWRQYWNrTG9nZ2VyIHRoYXQgZGVsZWdhdGVzIHRvIGEgbGlzdCBvZiBvdGhlciBsb2dnZXJzLgotICogPHA+Ci0gKiBsb2dnZXJzIGFyZSBydW4gaW4gdGhlIG9yZGVyIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuCi0gKgotICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5Qb3N0VXBsb2FkSG9va0NoYWlufQotICogICAgICAgICAgICAgaW5zdGVhZC4KLSAqLwotQERlcHJlY2F0ZWQKLXB1YmxpYyBjbGFzcyBVcGxvYWRQYWNrTG9nZ2VyQ2hhaW4gaW1wbGVtZW50cyBVcGxvYWRQYWNrTG9nZ2VyIHsKLQlwcml2YXRlIGZpbmFsIFVwbG9hZFBhY2tMb2dnZXJbXSBsb2dnZXJzOwotCXByaXZhdGUgZmluYWwgaW50IGNvdW50OwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGxvZ2dlciBjaGFpbmluZyB0aGUgZ2l2ZW4gbG9nZ2VycyB0b2dldGhlci4KLQkgKgotCSAqIEBwYXJhbSBsb2dnZXJzCi0JICogICAgICAgICAgICBsb2dnZXJzIHRvIGV4ZWN1dGUsIGluIG9yZGVyLgotCSAqIEByZXR1cm4gYSBuZXcgbG9nZ2VyIGNoYWluIG9mIHRoZSBnaXZlbiBsb2dnZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVXBsb2FkUGFja0xvZ2dlciBuZXdDaGFpbigKLQkJCUxpc3Q8PyBleHRlbmRzIFVwbG9hZFBhY2tMb2dnZXI+IGxvZ2dlcnMpIHsKLQkJVXBsb2FkUGFja0xvZ2dlcltdIG5ld0xvZ2dlcnMgPSBuZXcgVXBsb2FkUGFja0xvZ2dlcltsb2dnZXJzLnNpemUoKV07Ci0JCWludCBpID0gMDsKLQkJZm9yIChVcGxvYWRQYWNrTG9nZ2VyIGxvZ2dlciA6IGxvZ2dlcnMpCi0JCQlpZiAobG9nZ2VyICE9IFVwbG9hZFBhY2tMb2dnZXIuTlVMTCkKLQkJCQluZXdMb2dnZXJzW2krK10gPSBsb2dnZXI7Ci0JCWlmIChpID09IDApCi0JCQlyZXR1cm4gVXBsb2FkUGFja0xvZ2dlci5OVUxMOwotCQllbHNlIGlmIChpID09IDEpCi0JCQlyZXR1cm4gbmV3TG9nZ2Vyc1swXTsKLQkJZWxzZQotCQkJcmV0dXJuIG5ldyBVcGxvYWRQYWNrTG9nZ2VyQ2hhaW4obmV3TG9nZ2VycywgaSk7Ci0JfQotCi0JLyoqIHtAaW5oZXJpdERvY30gKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBvblBhY2tTdGF0aXN0aWNzKFBhY2tXcml0ZXIuU3RhdGlzdGljcyBzdGF0cykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCi0JCQlsb2dnZXJzW2ldLm9uUGFja1N0YXRpc3RpY3Moc3RhdHMpOwotCX0KLQotCXByaXZhdGUgVXBsb2FkUGFja0xvZ2dlckNoYWluKFVwbG9hZFBhY2tMb2dnZXJbXSBsb2dnZXJzLCBpbnQgY291bnQpIHsKLQkJdGhpcy5sb2dnZXJzID0gbG9nZ2VyczsKLQkJdGhpcy5jb3VudCA9IGNvdW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1dhbGtFbmNyeXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrRW5jcnlwdGlvbi5qYXZhCmluZGV4IDYxNWU0NmIuLmI0MjQ4ZWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1dhbGtFbmNyeXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvV2Fsa0VuY3J5cHRpb24uamF2YQpAQCAtMTI4LDcgKzEyOCw3IEBACiAJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkudW5zdXBwb3J0ZWRFbmNyeXB0aW9uQWxnb3JpdGhtLCB2KSk7CiAJfQogCi0JSU9FeGNlcHRpb24gZXJyb3IoZmluYWwgVGhyb3dhYmxlIHdoeSkgeworCUlPRXhjZXB0aW9uIGVycm9yKFRocm93YWJsZSB3aHkpIHsKIAkJcmV0dXJuIG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlRm9ybWF0CiAJCQkJLmZvcm1hdChKR2l0VGV4dC5nZXQoKS5lbmNyeXB0aW9uRXJyb3IsCiAJCQkJd2h5LmdldE1lc3NhZ2UoKSksIHdoeSk7CkBAIC0xNDEsNyArMTQxLDcgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQl2b2lkIHZhbGlkYXRlKGZpbmFsIEh0dHBVUkxDb25uZWN0aW9uIHUsIGZpbmFsIFN0cmluZyBwcmVmaXgpCisJCXZvaWQgdmFsaWRhdGUoSHR0cFVSTENvbm5lY3Rpb24gdSwgU3RyaW5nIHByZWZpeCkKIAkJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJdmFsaWRhdGVJbXBsKHUsIHByZWZpeCwgIiIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCX0KQEAgLTI0MCwxOSArMjQwLDE5IEBACiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJdm9pZCByZXF1ZXN0KGZpbmFsIEh0dHBVUkxDb25uZWN0aW9uIHUsIGZpbmFsIFN0cmluZyBwcmVmaXgpIHsKKwkJdm9pZCByZXF1ZXN0KEh0dHBVUkxDb25uZWN0aW9uIHUsIFN0cmluZyBwcmVmaXgpIHsKIAkJCXUuc2V0UmVxdWVzdFByb3BlcnR5KHByZWZpeCArIEpFVFMzVF9DUllQVE9fVkVSLCBDUllQVE9fVkVSKTsKIAkJCXUuc2V0UmVxdWVzdFByb3BlcnR5KHByZWZpeCArIEpFVFMzVF9DUllQVE9fQUxHLCBjcnlwdG9BbGcpOwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXZvaWQgdmFsaWRhdGUoZmluYWwgSHR0cFVSTENvbm5lY3Rpb24gdSwgZmluYWwgU3RyaW5nIHByZWZpeCkKKwkJdm9pZCB2YWxpZGF0ZShIdHRwVVJMQ29ubmVjdGlvbiB1LCBTdHJpbmcgcHJlZml4KQogCQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQl2YWxpZGF0ZUltcGwodSwgcHJlZml4LCBDUllQVE9fVkVSLCBjcnlwdG9BbGcpOwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCU91dHB1dFN0cmVhbSBlbmNyeXB0KGZpbmFsIE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJT3V0cHV0U3RyZWFtIGVuY3J5cHQoT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJdHJ5IHsKIAkJCQlmaW5hbCBDaXBoZXIgY2lwaGVyID0gSW5zZWN1cmVDaXBoZXJGYWN0b3J5LmNyZWF0ZShjcnlwdG9BbGcpOwogCQkJCWNpcGhlci5pbml0KENpcGhlci5FTkNSWVBUX01PREUsIHNlY3JldEtleSwgcGFyYW1TcGVjKTsKQEAgLTI2Myw3ICsyNjMsNyBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCUlucHV0U3RyZWFtIGRlY3J5cHQoZmluYWwgSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUlucHV0U3RyZWFtIGRlY3J5cHQoSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQl0cnkgewogCQkJCWZpbmFsIENpcGhlciBjaXBoZXIgPSBJbnNlY3VyZUNpcGhlckZhY3RvcnkuY3JlYXRlKGNyeXB0b0FsZyk7CiAJCQkJY2lwaGVyLmluaXQoQ2lwaGVyLkRFQ1JZUFRfTU9ERSwgc2VjcmV0S2V5LCBwYXJhbVNwZWMpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvV2Fsa0ZldGNoQ29ubmVjdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvV2Fsa0ZldGNoQ29ubmVjdGlvbi5qYXZhCmluZGV4IDY3MDg5NjQuLjkzMDc5MTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1dhbGtGZXRjaENvbm5lY3Rpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrRmV0Y2hDb25uZWN0aW9uLmphdmEKQEAgLTQ0LDggKzQ0LDYgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDsKIAotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZEYXRhYmFzZS5BTEw7Ci0KIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwpAQCAtNTgsNyArNTYsNiBAQAogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Db21wb3VuZEV4Y2VwdGlvbjsKQEAgLTE5MCw3ICsxODcsNyBAQAogCS8qKiBJbnNlcnRlciB0byByZWFkIG9iamVjdHMgZnJvbSB7QGxpbmsgI2xvY2FsfS4gKi8KIAlwcml2YXRlIGZpbmFsIE9iamVjdFJlYWRlciByZWFkZXI7CiAKLQlXYWxrRmV0Y2hDb25uZWN0aW9uKGZpbmFsIFdhbGtUcmFuc3BvcnQgdCwgZmluYWwgV2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlIHcpIHsKKwlXYWxrRmV0Y2hDb25uZWN0aW9uKFdhbGtUcmFuc3BvcnQgdCwgV2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlIHcpIHsKIAkJVHJhbnNwb3J0IHd0ID0gKFRyYW5zcG9ydCl0OwogCQlsb2NhbCA9IHd0LmxvY2FsOwogCQlvYmpDaGVjayA9IHd0LmdldE9iamVjdENoZWNrZXIoKTsKQEAgLTI1OSw3ICsyNTYsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRQYWNrTG9ja01lc3NhZ2UoZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKwlwdWJsaWMgdm9pZCBzZXRQYWNrTG9ja01lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKIAkJbG9ja01lc3NhZ2UgPSBtZXNzYWdlOwogCX0KIApAQCAtMjY4LDE4ICsyNjUsMTggQEAKIAlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKIAkJaW5zZXJ0ZXIuY2xvc2UoKTsKIAkJcmVhZGVyLmNsb3NlKCk7Ci0JCWZvciAoZmluYWwgUmVtb3RlUGFjayBwIDogdW5mZXRjaGVkUGFja3MpIHsKKwkJZm9yIChSZW1vdGVQYWNrIHAgOiB1bmZldGNoZWRQYWNrcykgewogCQkJaWYgKHAudG1wSWR4ICE9IG51bGwpCiAJCQkJcC50bXBJZHguZGVsZXRlKCk7CiAJCX0KLQkJZm9yIChmaW5hbCBXYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2UgciA6IHJlbW90ZXMpCisJCWZvciAoV2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlIHIgOiByZW1vdGVzKQogCQkJci5jbG9zZSgpOwogCX0KIAotCXByaXZhdGUgdm9pZCBxdWV1ZVdhbnRzKGZpbmFsIENvbGxlY3Rpb248UmVmPiB3YW50KQorCXByaXZhdGUgdm9pZCBxdWV1ZVdhbnRzKENvbGxlY3Rpb248UmVmPiB3YW50KQogCQkJdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCWZpbmFsIEhhc2hTZXQ8T2JqZWN0SWQ+IGluV29ya1F1ZXVlID0gbmV3IEhhc2hTZXQ8PigpOwotCQlmb3IgKGZpbmFsIFJlZiByIDogd2FudCkgeworCQlmb3IgKFJlZiByIDogd2FudCkgewogCQkJZmluYWwgT2JqZWN0SWQgaWQgPSByLmdldE9iamVjdElkKCk7CiAJCQlpZiAoaWQgPT0gbnVsbCkgewogCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKQEAgLTMwMiw3ICsyOTksNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3MoZmluYWwgT2JqZWN0SWQgaWQpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24geworCXByaXZhdGUgdm9pZCBwcm9jZXNzKE9iamVjdElkIGlkKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJZmluYWwgUmV2T2JqZWN0IG9iajsKIAkJdHJ5IHsKIAkJCWlmIChpZCBpbnN0YW5jZW9mIFJldk9iamVjdCkgewpAQCAtMzQyLDcgKzMzOSw3IEBACiAJCWZldGNoRXJyb3JzLnJlbW92ZShpZCk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NCbG9iKGZpbmFsIFJldk9iamVjdCBvYmopIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24geworCXByaXZhdGUgdm9pZCBwcm9jZXNzQmxvYihSZXZPYmplY3Qgb2JqKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCWlmIChyZWFkZXIuaGFzKG9iaiwgQ29uc3RhbnRzLk9CSl9CTE9CKSkKIAkJCQlvYmouYWRkKENPTVBMRVRFKTsKQEAgLTM1Niw3ICszNTMsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NUcmVlKGZpbmFsIFJldk9iamVjdCBvYmopIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24geworCXByaXZhdGUgdm9pZCBwcm9jZXNzVHJlZShSZXZPYmplY3Qgb2JqKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCXRyZWVXYWxrLnJlc2V0KG9iaik7CiAJCQl3aGlsZSAodHJlZVdhbGsubmV4dCgpKSB7CkBAIC0zODQsMjIgKzM4MSwyMiBAQAogCQlvYmouYWRkKENPTVBMRVRFKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0NvbW1pdChmaW5hbCBSZXZPYmplY3Qgb2JqKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgcHJvY2Vzc0NvbW1pdChSZXZPYmplY3Qgb2JqKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJZmluYWwgUmV2Q29tbWl0IGNvbW1pdCA9IChSZXZDb21taXQpIG9iajsKIAkJbWFya0xvY2FsQ29tbWl0c0NvbXBsZXRlKGNvbW1pdC5nZXRDb21taXRUaW1lKCkpOwogCQluZWVkcyhjb21taXQuZ2V0VHJlZSgpKTsKLQkJZm9yIChmaW5hbCBSZXZDb21taXQgcCA6IGNvbW1pdC5nZXRQYXJlbnRzKCkpCisJCWZvciAoUmV2Q29tbWl0IHAgOiBjb21taXQuZ2V0UGFyZW50cygpKQogCQkJbmVlZHMocCk7CiAJCW9iai5hZGQoQ09NUExFVEUpOwogCX0KIAotCXByaXZhdGUgdm9pZCBwcm9jZXNzVGFnKGZpbmFsIFJldk9iamVjdCBvYmopIHsKKwlwcml2YXRlIHZvaWQgcHJvY2Vzc1RhZyhSZXZPYmplY3Qgb2JqKSB7CiAJCWZpbmFsIFJldlRhZyB0YWcgPSAoUmV2VGFnKSBvYmo7CiAJCW5lZWRzKHRhZy5nZXRPYmplY3QoKSk7CiAJCW9iai5hZGQoQ09NUExFVEUpOwogCX0KIAotCXByaXZhdGUgdm9pZCBuZWVkcyhmaW5hbCBSZXZPYmplY3Qgb2JqKSB7CisJcHJpdmF0ZSB2b2lkIG5lZWRzKFJldk9iamVjdCBvYmopIHsKIAkJaWYgKG9iai5oYXMoQ09NUExFVEUpKQogCQkJcmV0dXJuOwogCQlpZiAoIW9iai5oYXMoSU5fV09SS19RVUVVRSkpIHsKQEAgLTQwOCw3ICs0MDUsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGRvd25sb2FkT2JqZWN0KGZpbmFsIFByb2dyZXNzTW9uaXRvciBwbSwgZmluYWwgQW55T2JqZWN0SWQgaWQpCisJcHJpdmF0ZSB2b2lkIGRvd25sb2FkT2JqZWN0KFByb2dyZXNzTW9uaXRvciBwbSwgQW55T2JqZWN0SWQgaWQpCiAJCQl0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJaWYgKGFscmVhZHlIYXZlKGlkKSkKIAkJCXJldHVybjsKQEAgLTQ2Miw3ICs0NTksNyBAQAogCiAJCQkJaWYgKHBhY2tOYW1lTGlzdCA9PSBudWxsIHx8IHBhY2tOYW1lTGlzdC5pc0VtcHR5KCkpCiAJCQkJCWNvbnRpbnVlOwotCQkJCWZvciAoZmluYWwgU3RyaW5nIHBhY2tOYW1lIDogcGFja05hbWVMaXN0KSB7CisJCQkJZm9yIChTdHJpbmcgcGFja05hbWUgOiBwYWNrTmFtZUxpc3QpIHsKIAkJCQkJaWYgKHBhY2tzQ29uc2lkZXJlZC5hZGQocGFja05hbWUpKQogCQkJCQkJdW5mZXRjaGVkUGFja3MuYWRkKG5ldyBSZW1vdGVQYWNrKHdyciwgcGFja05hbWUpKTsKIAkJCQl9CkBAIC00NzQsNyArNDcxLDcgQEAKIAkJCS8vCiAJCQlDb2xsZWN0aW9uPFdhbGtSZW1vdGVPYmplY3REYXRhYmFzZT4gYWwgPSBleHBhbmRPbmVBbHRlcm5hdGUoaWQsIHBtKTsKIAkJCWlmIChhbCAhPSBudWxsICYmICFhbC5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKGZpbmFsIFdhbGtSZW1vdGVPYmplY3REYXRhYmFzZSBhbHQgOiBhbCkgeworCQkJCWZvciAoV2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlIGFsdCA6IGFsKSB7CiAJCQkJCXJlbW90ZXMuYWRkKGFsdCk7CiAJCQkJCW5vUGFja3NZZXQuYWRkKGFsdCk7CiAJCQkJCW5vQWx0ZXJuYXRlc1lldC5hZGQoYWx0KTsKQEAgLTQ5OCw3ICs0OTUsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBib29sZWFuIGFscmVhZHlIYXZlKGZpbmFsIEFueU9iamVjdElkIGlkKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKKwlwcml2YXRlIGJvb2xlYW4gYWxyZWFkeUhhdmUoQW55T2JqZWN0SWQgaWQpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQl0cnkgewogCQkJcmV0dXJuIHJlYWRlci5oYXMoaWQpOwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlcnJvcikgewpAQCAtNjg5LDIxICs2ODYsMjEgQEAKIAkJcmV0dXJuIG51bGw7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIG1hcmtMb2NhbFJlZnNDb21wbGV0ZShmaW5hbCBTZXQ8T2JqZWN0SWQ+IGhhdmUpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewotCQlNYXA8U3RyaW5nLCBSZWY+IHJlZnM7CisJcHJpdmF0ZSB2b2lkIG1hcmtMb2NhbFJlZnNDb21wbGV0ZShTZXQ8T2JqZWN0SWQ+IGhhdmUpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24geworCQlMaXN0PFJlZj4gcmVmczsKIAkJdHJ5IHsKLQkJCXJlZnMgPSBsb2NhbC5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoQUxMKTsKKwkJCXJlZnMgPSBsb2NhbC5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoKTsKIAkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogCQkJdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CiAJCX0KLQkJZm9yIChmaW5hbCBSZWYgciA6IHJlZnMudmFsdWVzKCkpIHsKKwkJZm9yIChSZWYgciA6IHJlZnMpIHsKIAkJCXRyeSB7CiAJCQkJbWFya0xvY2FsT2JqQ29tcGxldGUocmV2V2Fsay5wYXJzZUFueShyLmdldE9iamVjdElkKCkpKTsKIAkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIHJlYWRFcnJvcikgewogCQkJCXRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkubG9jYWxSZWZJc01pc3NpbmdPYmplY3RzLCByLmdldE5hbWUoKSksIHJlYWRFcnJvcik7CiAJCQl9CiAJCX0KLQkJZm9yIChmaW5hbCBPYmplY3RJZCBpZCA6IGhhdmUpIHsKKwkJZm9yIChPYmplY3RJZCBpZCA6IGhhdmUpIHsKIAkJCXRyeSB7CiAJCQkJbWFya0xvY2FsT2JqQ29tcGxldGUocmV2V2Fsay5wYXJzZUFueShpZCkpOwogCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gcmVhZEVycm9yKSB7CkBAIC03MzIsNyArNzI5LDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBtYXJrTG9jYWxDb21taXRzQ29tcGxldGUoZmluYWwgaW50IHVudGlsKQorCXByaXZhdGUgdm9pZCBtYXJrTG9jYWxDb21taXRzQ29tcGxldGUoaW50IHVudGlsKQogCQkJdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCXRyeSB7CiAJCQlmb3IgKDs7KSB7CkBAIC03NDIsNyArNzM5LDcgQEAKIAkJCQlsb2NhbENvbW1pdFF1ZXVlLm5leHQoKTsKIAogCQkJCW1hcmtUcmVlQ29tcGxldGUoYy5nZXRUcmVlKCkpOwotCQkJCWZvciAoZmluYWwgUmV2Q29tbWl0IHAgOiBjLmdldFBhcmVudHMoKSkKKwkJCQlmb3IgKFJldkNvbW1pdCBwIDogYy5nZXRQYXJlbnRzKCkpCiAJCQkJCXB1c2hMb2NhbENvbW1pdChwKTsKIAkJCX0KIAkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXJyKSB7CkBAIC03NTAsNyArNzQ3LDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBwdXNoTG9jYWxDb21taXQoZmluYWwgUmV2Q29tbWl0IHApCisJcHJpdmF0ZSB2b2lkIHB1c2hMb2NhbENvbW1pdChSZXZDb21taXQgcCkKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCWlmIChwLmhhcyhMT0NBTExZX1NFRU4pKQogCQkJcmV0dXJuOwpAQCAtNzYxLDcgKzc1OCw3IEBACiAJCWxvY2FsQ29tbWl0UXVldWUuYWRkKHApOwogCX0KIAotCXByaXZhdGUgdm9pZCBtYXJrVHJlZUNvbXBsZXRlKGZpbmFsIFJldlRyZWUgdHJlZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgbWFya1RyZWVDb21wbGV0ZShSZXZUcmVlIHRyZWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmICh0cmVlLmhhcyhDT01QTEVURSkpCiAJCQlyZXR1cm47CiAJCXRyZWUuYWRkKENPTVBMRVRFKTsKQEAgLTc5NSw3ICs3OTIsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHJlY29yZEVycm9yKGZpbmFsIEFueU9iamVjdElkIGlkLCBmaW5hbCBUaHJvd2FibGUgd2hhdCkgeworCXByaXZhdGUgdm9pZCByZWNvcmRFcnJvcihBbnlPYmplY3RJZCBpZCwgVGhyb3dhYmxlIHdoYXQpIHsKIAkJZmluYWwgT2JqZWN0SWQgb2JqSWQgPSBpZC5jb3B5KCk7CiAJCUxpc3Q8VGhyb3dhYmxlPiBlcnJvcnMgPSBmZXRjaEVycm9ycy5nZXQob2JqSWQpOwogCQlpZiAoZXJyb3JzID09IG51bGwpIHsKQEAgLTgxNiw3ICs4MTMsNyBAQAogCiAJCVBhY2tJbmRleCBpbmRleDsKIAotCQlSZW1vdGVQYWNrKGZpbmFsIFdhbGtSZW1vdGVPYmplY3REYXRhYmFzZSBjLCBmaW5hbCBTdHJpbmcgcG4pIHsKKwkJUmVtb3RlUGFjayhXYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2UgYywgU3RyaW5nIHBuKSB7CiAJCQljb25uZWN0aW9uID0gYzsKIAkJCXBhY2tOYW1lID0gcG47CiAJCQlpZHhOYW1lID0gcGFja05hbWUuc3Vic3RyaW5nKDAsIHBhY2tOYW1lLmxlbmd0aCgpIC0gNSkgKyAiLmlkeCI7IC8vJE5PTi1OTFMtMSQKQEAgLTgzNCw3ICs4MzEsNyBAQAogCQkJfQogCQl9CiAKLQkJdm9pZCBvcGVuSW5kZXgoZmluYWwgUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl2b2lkIG9wZW5JbmRleChQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlpZiAoaW5kZXggIT0gbnVsbCkKIAkJCQlyZXR1cm47CiAJCQlpZiAodG1wSWR4ID09IG51bGwpCkBAIC04NTMsMTcgKzg1MCwxMiBAQAogCQkJcG0uYmVnaW5UYXNrKCJHZXQgIiArIGlkeE5hbWUuc3Vic3RyaW5nKDAsIDEyKSArICIuLmlkeCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJCQlzLmxlbmd0aCA8IDAgPyBQcm9ncmVzc01vbml0b3IuVU5LTk9XTgogCQkJCQkJCTogKGludCkgKHMubGVuZ3RoIC8gMTAyNCkpOwotCQkJdHJ5IHsKLQkJCQlmaW5hbCBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRtcElkeCk7Ci0JCQkJdHJ5IHsKLQkJCQkJZmluYWwgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzIwNDhdOwotCQkJCQlpbnQgY250OwotCQkJCQl3aGlsZSAoIXBtLmlzQ2FuY2VsbGVkKCkgJiYgKGNudCA9IHMuaW4ucmVhZChidWYpKSA+PSAwKSB7Ci0JCQkJCQlmb3Mud3JpdGUoYnVmLCAwLCBjbnQpOwotCQkJCQkJcG0udXBkYXRlKGNudCAvIDEwMjQpOwotCQkJCQl9Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJZm9zLmNsb3NlKCk7CisJCQl0cnkgKEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odG1wSWR4KSkgeworCQkJCWZpbmFsIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsyMDQ4XTsKKwkJCQlpbnQgY250OworCQkJCXdoaWxlICghcG0uaXNDYW5jZWxsZWQoKSAmJiAoY250ID0gcy5pbi5yZWFkKGJ1ZikpID49IDApIHsKKwkJCQkJZm9zLndyaXRlKGJ1ZiwgMCwgY250KTsKKwkJCQkJcG0udXBkYXRlKGNudCAvIDEwMjQpOwogCQkJCX0KIAkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGVycikgewogCQkJCUZpbGVVdGlscy5kZWxldGUodG1wSWR4KTsKQEAgLTg4Niw3ICs4NzgsNyBAQAogCQkJfQogCQl9CiAKLQkJdm9pZCBkb3dubG9hZFBhY2soZmluYWwgUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXZvaWQgZG93bmxvYWRQYWNrKFByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJU3RyaW5nIG5hbWUgPSAicGFjay8iICsgcGFja05hbWU7IC8vJE5PTi1OTFMtMSQKIAkJCVdhbGtSZW1vdGVPYmplY3REYXRhYmFzZS5GaWxlU3RyZWFtIHMgPSBjb25uZWN0aW9uLm9wZW4obmFtZSk7CiAJCQl0cnkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvV2Fsa1B1c2hDb25uZWN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrUHVzaENvbm5lY3Rpb24uamF2YQppbmRleCBjZjUwYzUxLi40Yzc1NDI1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrUHVzaENvbm5lY3Rpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrUHVzaENvbm5lY3Rpb24uamF2YQpAQCAtMTU3LDcgKzE1Nyw3IEBACiAJCS8vIHJlZiB1c2luZyB0aGUgZGlyZWN0b3J5IG5hbWUgYmVpbmcgY3JlYXRlZC4KIAkJLy8KIAkJZmluYWwgTGlzdDxSZW1vdGVSZWZVcGRhdGU+IHVwZGF0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQkJZm9yIChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgdSA6IHJlZlVwZGF0ZXMudmFsdWVzKCkpIHsKKwkJZm9yIChSZW1vdGVSZWZVcGRhdGUgdSA6IHJlZlVwZGF0ZXMudmFsdWVzKCkpIHsKIAkJCWZpbmFsIFN0cmluZyBuID0gdS5nZXRSZW1vdGVOYW1lKCk7CiAJCQlpZiAoIW4uc3RhcnRzV2l0aCgicmVmcy8iKSB8fCAhUmVwb3NpdG9yeS5pc1ZhbGlkUmVmTmFtZShuKSkgeyAvLyROT04tTkxTLTEkCiAJCQkJdS5zZXRTdGF0dXMoU3RhdHVzLlJFSkVDVEVEX09USEVSX1JFQVNPTik7CkBAIC0xNzcsNyArMTc3LDcgQEAKIAkJLy8KIAkJaWYgKCF1cGRhdGVzLmlzRW1wdHkoKSkKIAkJCXNlbmRwYWNrKHVwZGF0ZXMsIG1vbml0b3IpOwotCQlmb3IgKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSB1IDogdXBkYXRlcykKKwkJZm9yIChSZW1vdGVSZWZVcGRhdGUgdSA6IHVwZGF0ZXMpCiAJCQl1cGRhdGVDb21tYW5kKHUpOwogCiAJCS8vIElzIHRoaXMgYSBuZXcgcmVwb3NpdG9yeT8gSWYgc28gd2Ugc2hvdWxkIGNyZWF0ZSBhZGRpdGlvbmFsCkBAIC0xOTYsMTAgKzE5NiwxMCBAQAogCQlpZiAoIXBhY2tlZFJlZlVwZGF0ZXMuaXNFbXB0eSgpKSB7CiAJCQl0cnkgewogCQkJCXJlZldyaXRlci53cml0ZVBhY2tlZFJlZnMoKTsKLQkJCQlmb3IgKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSB1IDogcGFja2VkUmVmVXBkYXRlcykKKwkJCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSB1IDogcGFja2VkUmVmVXBkYXRlcykKIAkJCQkJdS5zZXRTdGF0dXMoU3RhdHVzLk9LKTsKIAkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGVycikgewotCQkJCWZvciAoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHUgOiBwYWNrZWRSZWZVcGRhdGVzKSB7CisJCQkJZm9yIChSZW1vdGVSZWZVcGRhdGUgdSA6IHBhY2tlZFJlZlVwZGF0ZXMpIHsKIAkJCQkJdS5zZXRTdGF0dXMoU3RhdHVzLlJFSkVDVEVEX09USEVSX1JFQVNPTik7CiAJCQkJCXUuc2V0TWVzc2FnZShlcnIuZ2V0TWVzc2FnZSgpKTsKIAkJCQl9CkBAIC0yMjUsMTQgKzIyNSwxNCBAQAogCQlTdHJpbmcgcGF0aFBhY2sgPSBudWxsOwogCQlTdHJpbmcgcGF0aElkeCA9IG51bGw7CiAKLQkJdHJ5IChmaW5hbCBQYWNrV3JpdGVyIHdyaXRlciA9IG5ldyBQYWNrV3JpdGVyKHRyYW5zcG9ydC5nZXRQYWNrQ29uZmlnKCksCisJCXRyeSAoUGFja1dyaXRlciB3cml0ZXIgPSBuZXcgUGFja1dyaXRlcih0cmFuc3BvcnQuZ2V0UGFja0NvbmZpZygpLAogCQkJCWxvY2FsLm5ld09iamVjdFJlYWRlcigpKSkgewogCiAJCQlmaW5hbCBTZXQ8T2JqZWN0SWQ+IG5lZWQgPSBuZXcgSGFzaFNldDw+KCk7CiAJCQlmaW5hbCBTZXQ8T2JqZWN0SWQ+IGhhdmUgPSBuZXcgSGFzaFNldDw+KCk7Ci0JCQlmb3IgKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSByIDogdXBkYXRlcykKKwkJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHIgOiB1cGRhdGVzKQogCQkJCW5lZWQuYWRkKHIuZ2V0TmV3T2JqZWN0SWQoKSk7Ci0JCQlmb3IgKGZpbmFsIFJlZiByIDogZ2V0UmVmcygpKSB7CisJCQlmb3IgKFJlZiByIDogZ2V0UmVmcygpKSB7CiAJCQkJaGF2ZS5hZGQoci5nZXRPYmplY3RJZCgpKTsKIAkJCQlpZiAoci5nZXRQZWVsZWRPYmplY3RJZCgpICE9IG51bGwpCiAJCQkJCWhhdmUuYWRkKHIuZ2V0UGVlbGVkT2JqZWN0SWQoKSk7CkBAIC0yNDcsNyArMjQ3LDcgQEAKIAkJCQlyZXR1cm47CiAKIAkJCXBhY2tOYW1lcyA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKLQkJCWZvciAoZmluYWwgU3RyaW5nIG4gOiBkZXN0LmdldFBhY2tOYW1lcygpKQorCQkJZm9yIChTdHJpbmcgbiA6IGRlc3QuZ2V0UGFja05hbWVzKCkpCiAJCQkJcGFja05hbWVzLnB1dChuLCBuKTsKIAogCQkJZmluYWwgU3RyaW5nIGJhc2UgPSAicGFjay0iICsgd3JpdGVyLmNvbXB1dGVOYW1lKCkubmFtZSgpOyAvLyROT04tTkxTLTEkCkBAIC0yOTUsNyArMjk1LDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBzYWZlRGVsZXRlKGZpbmFsIFN0cmluZyBwYXRoKSB7CisJcHJpdmF0ZSB2b2lkIHNhZmVEZWxldGUoU3RyaW5nIHBhdGgpIHsKIAkJaWYgKHBhdGggIT0gbnVsbCkgewogCQkJdHJ5IHsKIAkJCQlkZXN0LmRlbGV0ZUZpbGUocGF0aCk7CkBAIC0zMDcsNyArMzA3LDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBkZWxldGVDb21tYW5kKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSB1KSB7CisJcHJpdmF0ZSB2b2lkIGRlbGV0ZUNvbW1hbmQoUmVtb3RlUmVmVXBkYXRlIHUpIHsKIAkJZmluYWwgUmVmIHIgPSBuZXdSZWZzLnJlbW92ZSh1LmdldFJlbW90ZU5hbWUoKSk7CiAJCWlmIChyID09IG51bGwpIHsKIAkJCS8vIEFscmVhZHkgZ29uZS4KQEAgLTMzNyw3ICszMzcsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbW1hbmQoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHUpIHsKKwlwcml2YXRlIHZvaWQgdXBkYXRlQ29tbWFuZChSZW1vdGVSZWZVcGRhdGUgdSkgewogCQl0cnkgewogCQkJZGVzdC53cml0ZVJlZih1LmdldFJlbW90ZU5hbWUoKSwgdS5nZXROZXdPYmplY3RJZCgpKTsKIAkJCW5ld1JlZnMucHV0KHUuZ2V0UmVtb3RlTmFtZSgpLCBuZXcgT2JqZWN0SWRSZWYuVW5wZWVsZWQoCkBAIC0zNTQsNyArMzU0LDcgQEAKIAkJCQkmJiBwYWNrTmFtZXMuaXNFbXB0eSgpOwogCX0KIAotCXByaXZhdGUgdm9pZCBjcmVhdGVOZXdSZXBvc2l0b3J5KGZpbmFsIExpc3Q8UmVtb3RlUmVmVXBkYXRlPiB1cGRhdGVzKQorCXByaXZhdGUgdm9pZCBjcmVhdGVOZXdSZXBvc2l0b3J5KExpc3Q8UmVtb3RlUmVmVXBkYXRlPiB1cGRhdGVzKQogCQkJdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCXRyeSB7CiAJCQlmaW5hbCBTdHJpbmcgcmVmID0gInJlZjogIiArIHBpY2tIRUFEKHVwZGF0ZXMpICsgIlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCkBAIC0zNzQsMTIgKzM3NCwxMiBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHBpY2tIRUFEKGZpbmFsIExpc3Q8UmVtb3RlUmVmVXBkYXRlPiB1cGRhdGVzKSB7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHBpY2tIRUFEKExpc3Q8UmVtb3RlUmVmVXBkYXRlPiB1cGRhdGVzKSB7CiAJCS8vIFRyeSB0byB1c2UgbWFzdGVyIGlmIHRoZSB1c2VyIGlzIHB1c2hpbmcgdGhhdCwgaXQgaXMgdGhlCiAJCS8vIGRlZmF1bHQgYnJhbmNoIGFuZCBpcyBsaWtlbHkgd2hhdCB0aGV5IHdhbnQgdG8gcmVtYWluIGFzCiAJCS8vIHRoZSBkZWZhdWx0IG9uIHRoZSBuZXcgcmVtb3RlLgogCQkvLwotCQlmb3IgKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSB1IDogdXBkYXRlcykgeworCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSB1IDogdXBkYXRlcykgewogCQkJZmluYWwgU3RyaW5nIG4gPSB1LmdldFJlbW90ZU5hbWUoKTsKIAkJCWlmIChuLmVxdWFscyhDb25zdGFudHMuUl9IRUFEUyArIENvbnN0YW50cy5NQVNURVIpKQogCQkJCXJldHVybiBuOwpAQCAtMzg4LDcgKzM4OCw3IEBACiAJCS8vIFBpY2sgYW55IGJyYW5jaCwgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhlIHVzZXIgcHVzaGVkIG9ubHkKIAkJLy8gb25lIHRvIHRoZSByZW1vdGUgc2lkZS4KIAkJLy8KLQkJZm9yIChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgdSA6IHVwZGF0ZXMpIHsKKwkJZm9yIChSZW1vdGVSZWZVcGRhdGUgdSA6IHVwZGF0ZXMpIHsKIAkJCWZpbmFsIFN0cmluZyBuID0gdS5nZXRSZW1vdGVOYW1lKCk7CiAJCQlpZiAobi5zdGFydHNXaXRoKENvbnN0YW50cy5SX0hFQURTKSkKIAkJCQlyZXR1cm4gbjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1dhbGtSZW1vdGVPYmplY3REYXRhYmFzZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvV2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlLmphdmEKaW5kZXggOTY1YmU1MC4uYWE3MWM5NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvV2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvV2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlLmphdmEKQEAgLTIwMiw3ICsyMDIsNyBAQAogCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBkZWxldGlvbiBpcyBub3Qgc3VwcG9ydGVkLCBvciBkZWxldGlvbiBmYWlsZWQuCiAJICovCi0Jdm9pZCBkZWxldGVGaWxlKGZpbmFsIFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXZvaWQgZGVsZXRlRmlsZShTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmRlbGV0aW5nTm90U3VwcG9ydGVkLCBwYXRoKSk7CiAJfQogCkBAIC0yNjMsNyArMjYzLDcgQEAKIAkgKiAgICAgICAgICAgICB3cml0aW5nIGlzIG5vdCBzdXBwb3J0ZWQsIG9yIGF0dGVtcHRpbmcgdG8gd3JpdGUgdGhlIGZpbGUKIAkgKiAgICAgICAgICAgICBmYWlsZWQsIHBvc3NpYmx5IGR1ZSB0byBwZXJtaXNzaW9ucyBvciByZW1vdGUgZGlzayBmdWxsLCBldGMuCiAJICovCi0Jdm9pZCB3cml0ZUZpbGUoZmluYWwgU3RyaW5nIHBhdGgsIGZpbmFsIGJ5dGVbXSBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXZvaWQgd3JpdGVGaWxlKFN0cmluZyBwYXRoLCBieXRlW10gZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdHJ5IChPdXRwdXRTdHJlYW0gb3MgPSB3cml0ZUZpbGUocGF0aCwgbnVsbCwgbnVsbCkpIHsKIAkJCW9zLndyaXRlKGRhdGEpOwogCQl9CkBAIC0yNzgsNyArMjc4LDcgQEAKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgZGVsZXRpb24gaXMgbm90IHN1cHBvcnRlZCwgb3IgZGVsZXRpb24gZmFpbGVkLgogCSAqLwotCXZvaWQgZGVsZXRlUmVmKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXZvaWQgZGVsZXRlUmVmKFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlkZWxldGVGaWxlKFJPT1RfRElSICsgbmFtZSk7CiAJfQogCkBAIC0yOTEsNyArMjkxLDcgQEAKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgZGVsZXRpb24gaXMgbm90IHN1cHBvcnRlZCwgb3IgZGVsZXRpb24gZmFpbGVkLgogCSAqLwotCXZvaWQgZGVsZXRlUmVmTG9nKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXZvaWQgZGVsZXRlUmVmTG9nKFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlkZWxldGVGaWxlKFJPT1RfRElSICsgQ29uc3RhbnRzLkxPR1MgKyAiLyIgKyBuYW1lKTsgLy8kTk9OLU5MUy0xJAogCX0KIApAQCAtMzA5LDcgKzMwOSw3IEBACiAJICogICAgICAgICAgICAgd3JpdGluZyBpcyBub3Qgc3VwcG9ydGVkLCBvciBhdHRlbXB0aW5nIHRvIHdyaXRlIHRoZSBmaWxlCiAJICogICAgICAgICAgICAgZmFpbGVkLCBwb3NzaWJseSBkdWUgdG8gcGVybWlzc2lvbnMgb3IgcmVtb3RlIGRpc2sgZnVsbCwgZXRjLgogCSAqLwotCXZvaWQgd3JpdGVSZWYoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIE9iamVjdElkIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXZvaWQgd3JpdGVSZWYoU3RyaW5nIG5hbWUsIE9iamVjdElkIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYjsKIAogCQliID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbShDb25zdGFudHMuT0JKRUNUX0lEX1NUUklOR19MRU5HVEggKyAxKTsKQEAgLTMzMyw5ICszMzMsOSBAQAogCSAqICAgICAgICAgICAgIHdyaXRpbmcgaXMgbm90IHN1cHBvcnRlZCwgb3IgYXR0ZW1wdGluZyB0byB3cml0ZSB0aGUgZmlsZQogCSAqICAgICAgICAgICAgIGZhaWxlZCwgcG9zc2libHkgZHVlIHRvIHBlcm1pc3Npb25zIG9yIHJlbW90ZSBkaXNrIGZ1bGwsIGV0Yy4KIAkgKi8KLQl2b2lkIHdyaXRlSW5mb1BhY2tzKGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiBwYWNrTmFtZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJdm9pZCB3cml0ZUluZm9QYWNrcyhDb2xsZWN0aW9uPFN0cmluZz4gcGFja05hbWVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHcgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlmb3IgKGZpbmFsIFN0cmluZyBuIDogcGFja05hbWVzKSB7CisJCWZvciAoU3RyaW5nIG4gOiBwYWNrTmFtZXMpIHsKIAkJCXcuYXBwZW5kKCJQICIpOyAvLyROT04tTkxTLTEkCiAJCQl3LmFwcGVuZChuKTsKIAkJCXcuYXBwZW5kKCdcbicpOwpAQCAtMzYxLDcgKzM2MSw3IEBACiAJICogICAgICAgICAgICAgZXhpc3RzLCBvciBhZnRlciBpdCB3YXMgZGV0ZXJtaW5lZCB0byBleGlzdCBidXQgYmVmb3JlIHRoZQogCSAqICAgICAgICAgICAgIHN0cmVhbSBjb3VsZCBiZSBjcmVhdGVkLgogCSAqLwotCUJ1ZmZlcmVkUmVhZGVyIG9wZW5SZWFkZXIoZmluYWwgU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJQnVmZmVyZWRSZWFkZXIgb3BlblJlYWRlcihTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgSW5wdXRTdHJlYW0gaXMgPSBvcGVuKHBhdGgpLmluOwogCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcywgQ29uc3RhbnRzLkNIQVJTRVQpKTsKIAl9CkBAIC00MTQsNyArNDE0LDcgQEAKIAkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlRyYW5zcG9ydEV4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGFuIGVycm9yIG9jY3VycmVkIHJlYWRpbmcgZnJvbSB0aGUgcGFja2VkIHJlZnMgZmlsZS4KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWFkUGFja2VkUmVmcyhmaW5hbCBNYXA8U3RyaW5nLCBSZWY+IGF2YWlsKQorCXByb3RlY3RlZCB2b2lkIHJlYWRQYWNrZWRSZWZzKE1hcDxTdHJpbmcsIFJlZj4gYXZhaWwpCiAJCQl0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJdHJ5IChCdWZmZXJlZFJlYWRlciBiciA9IG9wZW5SZWFkZXIoUk9PVF9ESVIgKyBDb25zdGFudHMuUEFDS0VEX1JFRlMpKSB7CiAJCQlyZWFkUGFja2VkUmVmc0ltcGwoYXZhaWwsIGJyKTsKQEAgLTQ3NSw3ICs0NzUsNyBAQAogCQkgKiAgICAgICAgICAgIHN0cmVhbSBjb250YWluaW5nIHRoZSBmaWxlIGRhdGEuIFRoaXMgc3RyZWFtIHdpbGwgYmUKIAkJICogICAgICAgICAgICBjbG9zZWQgYnkgdGhlIGNhbGxlciB3aGVuIHJlYWRpbmcgaXMgY29tcGxldGUuCiAJCSAqLwotCQlGaWxlU3RyZWFtKGZpbmFsIElucHV0U3RyZWFtIGkpIHsKKwkJRmlsZVN0cmVhbShJbnB1dFN0cmVhbSBpKSB7CiAJCQlpbiA9IGk7CiAJCQlsZW5ndGggPSAtMTsKIAkJfQpAQCAtNDkwLDcgKzQ5MCw3IEBACiAJCSAqICAgICAgICAgICAgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBmb3IgcmVhZGluZyB0aHJvdWdoCiAJCSAqICAgICAgICAgICAgPGNvZGU+aTwvY29kZT4uCiAJCSAqLwotCQlGaWxlU3RyZWFtKGZpbmFsIElucHV0U3RyZWFtIGksIGZpbmFsIGxvbmcgbikgeworCQlGaWxlU3RyZWFtKElucHV0U3RyZWFtIGksIGxvbmcgbikgewogCQkJaW4gPSBpOwogCQkJbGVuZ3RoID0gbjsKIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvcmVzb2x2ZXIvRmlsZVJlc29sdmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9yZXNvbHZlci9GaWxlUmVzb2x2ZXIuamF2YQppbmRleCAxNmE2ZjRhLi42MGFjZDJmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9yZXNvbHZlci9GaWxlUmVzb2x2ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9yZXNvbHZlci9GaWxlUmVzb2x2ZXIuamF2YQpAQCAtODcsNyArODcsNyBAQAogCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgZXhwb3J0cyBhbGwgcmVwb3NpdG9yaWVzLCBpZ25vcmluZyB0aGUgY2hlY2sgZm9yIHRoZQogCSAqICAgICAgICAgICAge0Bjb2RlIGdpdC1kYWVtb24tZXhwb3J0LW9rfSBmaWxlcy4KIAkgKi8KLQlwdWJsaWMgRmlsZVJlc29sdmVyKGZpbmFsIEZpbGUgYmFzZVBhdGgsIGZpbmFsIGJvb2xlYW4gZXhwb3J0QWxsKSB7CisJcHVibGljIEZpbGVSZXNvbHZlcihGaWxlIGJhc2VQYXRoLCBib29sZWFuIGV4cG9ydEFsbCkgewogCQl0aGlzKCk7CiAJCWV4cG9ydERpcmVjdG9yeShiYXNlUGF0aCk7CiAJCXNldEV4cG9ydEFsbChleHBvcnRBbGwpOwpAQCAtOTUsNyArOTUsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVwb3NpdG9yeSBvcGVuKGZpbmFsIEMgcmVxLCBmaW5hbCBTdHJpbmcgbmFtZSkKKwlwdWJsaWMgUmVwb3NpdG9yeSBvcGVuKEMgcmVxLCBTdHJpbmcgbmFtZSkKIAkJCXRocm93cyBSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24sIFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uIHsKIAkJaWYgKGlzVW5yZWFzb25hYmxlTmFtZShuYW1lKSkKIAkJCXRocm93IG5ldyBSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24obmFtZSk7CkBAIC0xNzUsNyArMTc1LDcgQEAKIAkgKgogCSAqIEBwYXJhbSBleHBvcnQgYSBib29sZWFuLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cG9ydEFsbChmaW5hbCBib29sZWFuIGV4cG9ydCkgeworCXB1YmxpYyB2b2lkIHNldEV4cG9ydEFsbChib29sZWFuIGV4cG9ydCkgewogCQlleHBvcnRBbGwgPSBleHBvcnQ7CiAJfQogCkBAIC0yMDIsNyArMjAyLDcgQEAKIAkgKiAgICAgICAgICAgIGdpdCByZXBvc2l0b3J5LCBidXQgYW55IGRpcmVjdG9yeSBiZWxvdyBpdCB3aGljaCBoYXMgYSBmaWxlCiAJICogICAgICAgICAgICBuYW1lZCA8Y29kZT5naXQtZGFlbW9uLWV4cG9ydC1vazwvY29kZT4gd2lsbCBiZSBwdWJsaXNoZWQuCiAJICovCi0JcHVibGljIHZvaWQgZXhwb3J0RGlyZWN0b3J5KGZpbmFsIEZpbGUgZGlyKSB7CisJcHVibGljIHZvaWQgZXhwb3J0RGlyZWN0b3J5KEZpbGUgZGlyKSB7CiAJCWV4cG9ydEJhc2UuYWRkKGRpcik7CiAJfQogCkBAIC0yNDAsNyArMjQwLDcgQEAKIAkJcmV0dXJuIG5hbWUgKyBDb25zdGFudHMuRE9UX0dJVF9FWFQ7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1VucmVhc29uYWJsZU5hbWUoZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVW5yZWFzb25hYmxlTmFtZShTdHJpbmcgbmFtZSkgewogCQlpZiAobmFtZS5sZW5ndGgoKSA9PSAwKQogCQkJcmV0dXJuIHRydWU7IC8vIG5vIGVtcHR5IHBhdGhzCiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvQWJzdHJhY3RUcmVlSXRlcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvQWJzdHJhY3RUcmVlSXRlcmF0b3IuamF2YQppbmRleCBhNzkwMGYwLi40NzBlZDAyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0Fic3RyYWN0VHJlZUl0ZXJhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9BYnN0cmFjdFRyZWVJdGVyYXRvci5qYXZhCkBAIC0xNzYsNyArMTc2LDcgQEAKIAkgKiAgICAgICAgICAgIHJvb3Qgb2YgdGhlIHJlcG9zaXRvcnkuIEEgdHJhaWxpbmcgc2xhc2ggKCcvJykgaXMKIAkgKiAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgYXBwZW5kZWQgaWYgdGhlIHByZWZpeCBkb2VzIG5vdCBlbmQgaW4gJy8nLgogCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdFRyZWVJdGVyYXRvcihmaW5hbCBTdHJpbmcgcHJlZml4KSB7CisJcHJvdGVjdGVkIEFic3RyYWN0VHJlZUl0ZXJhdG9yKFN0cmluZyBwcmVmaXgpIHsKIAkJcGFyZW50ID0gbnVsbDsKIAogCQlpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkgewpAQCAtMjEwLDcgKzIxMCw3IEBACiAJICogICAgICAgICAgICByb290IG9mIHRoZSByZXBvc2l0b3J5LiBBIHRyYWlsaW5nIHNsYXNoICgnLycpIGlzCiAJICogICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkIGlmIHRoZSBwcmVmaXggZG9lcyBub3QgZW5kIGluICcvJy4KIAkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RUcmVlSXRlcmF0b3IoZmluYWwgYnl0ZVtdIHByZWZpeCkgeworCXByb3RlY3RlZCBBYnN0cmFjdFRyZWVJdGVyYXRvcihieXRlW10gcHJlZml4KSB7CiAJCXBhcmVudCA9IG51bGw7CiAKIAkJaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGggPiAwKSB7CkBAIC0yMzIsNyArMjMyLDcgQEAKIAkgKiBAcGFyYW0gcAogCSAqICAgICAgICAgICAgcGFyZW50IHRyZWUgaXRlcmF0b3IuCiAJICovCi0JcHJvdGVjdGVkIEFic3RyYWN0VHJlZUl0ZXJhdG9yKGZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHApIHsKKwlwcm90ZWN0ZWQgQWJzdHJhY3RUcmVlSXRlcmF0b3IoQWJzdHJhY3RUcmVlSXRlcmF0b3IgcCkgewogCQlwYXJlbnQgPSBwOwogCQlwYXRoID0gcC5wYXRoOwogCQlwYXRoT2Zmc2V0ID0gcC5wYXRoTGVuICsgMTsKQEAgLTI3NSw3ICsyNzUsNyBAQAogCSAqICAgICAgICAgICAgbnVtYmVyIG9mIGxpdmUgYnl0ZXMgaW4gdGhlIHBhdGggYnVmZmVyLiBUaGlzIG1hbnkgYnl0ZXMgd2lsbAogCSAqICAgICAgICAgICAgYmUgbW92ZWQgaW50byB0aGUgbGFyZ2VyIGJ1ZmZlci4KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBncm93UGF0aChmaW5hbCBpbnQgbGVuKSB7CisJcHJvdGVjdGVkIHZvaWQgZ3Jvd1BhdGgoaW50IGxlbikgewogCQlzZXRQYXRoQ2FwYWNpdHkocGF0aC5sZW5ndGggPDwgMSwgbGVuKTsKIAl9CiAKQEAgLTI4Nyw3ICsyODcsNyBAQAogCSAqIEBwYXJhbSBsZW4KIAkgKiAgICAgICAgICAgIHRoZSBhbW91bnQgb2YgbGl2ZSBieXRlcyBpbiBwYXRoIGJ1ZmZlcgogCSAqLwotCXByb3RlY3RlZCB2b2lkIGVuc3VyZVBhdGhDYXBhY2l0eShmaW5hbCBpbnQgY2FwYWNpdHksIGZpbmFsIGludCBsZW4pIHsKKwlwcm90ZWN0ZWQgdm9pZCBlbnN1cmVQYXRoQ2FwYWNpdHkoaW50IGNhcGFjaXR5LCBpbnQgbGVuKSB7CiAJCWlmIChwYXRoLmxlbmd0aCA+PSBjYXBhY2l0eSkKIAkJCXJldHVybjsKIAkJZmluYWwgYnl0ZVtdIG8gPSBwYXRoOwpAQCAtMzIyLDExICszMjIsMTEgQEAKIAkgKiBAcmV0dXJuIC0xIGlmIHRoaXMgZW50cnkgc29ydHMgZmlyc3Q7IDAgaWYgdGhlIGVudHJpZXMgYXJlIGVxdWFsOyAxIGlmCiAJICogICAgICAgICBwJ3MgZW50cnkgc29ydHMgZmlyc3QuCiAJICovCi0JcHVibGljIGludCBwYXRoQ29tcGFyZShmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciBwKSB7CisJcHVibGljIGludCBwYXRoQ29tcGFyZShBYnN0cmFjdFRyZWVJdGVyYXRvciBwKSB7CiAJCXJldHVybiBwYXRoQ29tcGFyZShwLCBwLm1vZGUpOwogCX0KIAotCWludCBwYXRoQ29tcGFyZShmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciBwLCBmaW5hbCBpbnQgcE1vZGUpIHsKKwlpbnQgcGF0aENvbXBhcmUoQWJzdHJhY3RUcmVlSXRlcmF0b3IgcCwgaW50IHBNb2RlKSB7CiAJCS8vIEl0cyBjb21tb24gd2hlbiB3ZSBhcmUgYSBzdWJ0cmVlIGZvciBib3RoIHBhcmVudHMgdG8gbWF0Y2g7CiAJCS8vIHdoZW4gdGhpcyBoYXBwZW5zIGV2ZXJ5dGhpbmcgaW4gcGF0aFswLi5jUG9zXSBpcyBrbm93biB0bwogCQkvLyBiZSBlcXVhbCBhbmQgZG9lcyBub3QgcmVxdWlyZSBldmFsdWF0aW9uIGFnYWluLgpAQCAtNDIwLDcgKzQyMCw3IEBACiAJICogICAgICAgICAgICB0aGUgb3RoZXIgaXRlcmF0b3IgdG8gdGVzdCBhZ2FpbnN0LgogCSAqIEByZXR1cm4gdHJ1ZSBpZiBib3RoIGl0ZXJhdG9ycyBoYXZlIHRoZSBzYW1lIG9iamVjdCBpZDsgZmFsc2Ugb3RoZXJ3aXNlLgogCSAqLwotCXB1YmxpYyBib29sZWFuIGlkRXF1YWwoZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3Igb3RoZXJJdGVyYXRvcikgeworCXB1YmxpYyBib29sZWFuIGlkRXF1YWwoQWJzdHJhY3RUcmVlSXRlcmF0b3Igb3RoZXJJdGVyYXRvcikgewogCQlyZXR1cm4gT2JqZWN0SWQuZXF1YWxzKGlkQnVmZmVyKCksIGlkT2Zmc2V0KCksCiAJCQkJb3RoZXJJdGVyYXRvci5pZEJ1ZmZlcigpLCBvdGhlckl0ZXJhdG9yLmlkT2Zmc2V0KCkpOwogCX0KQEAgLTQ0Nyw3ICs0NDcsNyBAQAogCSAqIEBwYXJhbSBvdXQKIAkgKiAgICAgICAgICAgIGJ1ZmZlciB0byBjb3B5IHRoZSBvYmplY3QgaWQgaW50by4KIAkgKi8KLQlwdWJsaWMgdm9pZCBnZXRFbnRyeU9iamVjdElkKGZpbmFsIE11dGFibGVPYmplY3RJZCBvdXQpIHsKKwlwdWJsaWMgdm9pZCBnZXRFbnRyeU9iamVjdElkKE11dGFibGVPYmplY3RJZCBvdXQpIHsKIAkJb3V0LmZyb21SYXcoaWRCdWZmZXIoKSwgaWRPZmZzZXQoKSk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0Nhbm9uaWNhbFRyZWVQYXJzZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvQ2Fub25pY2FsVHJlZVBhcnNlci5qYXZhCmluZGV4IDcxMTEzYTYuLjAxOTk2ODggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvQ2Fub25pY2FsVHJlZVBhcnNlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvQ2Fub25pY2FsVHJlZVBhcnNlci5qYXZhCkBAIC0xMTksNyArMTE5LDcgQEAKIAkJcmVzZXQocmVhZGVyLCB0cmVlSWQpOwogCX0KIAotCXByaXZhdGUgQ2Fub25pY2FsVHJlZVBhcnNlcihmaW5hbCBDYW5vbmljYWxUcmVlUGFyc2VyIHApIHsKKwlwcml2YXRlIENhbm9uaWNhbFRyZWVQYXJzZXIoQ2Fub25pY2FsVHJlZVBhcnNlciBwKSB7CiAJCXN1cGVyKHApOwogCX0KIApAQCAtMTQwLDcgKzE0MCw3IEBACiAJICogQHBhcmFtIHRyZWVEYXRhCiAJICogICAgICAgICAgICB0aGUgcmF3IHRyZWUgY29udGVudC4KIAkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChmaW5hbCBieXRlW10gdHJlZURhdGEpIHsKKwlwdWJsaWMgdm9pZCByZXNldChieXRlW10gdHJlZURhdGEpIHsKIAkJYXR0cmlidXRlc05vZGUgPSBudWxsOwogCQlyYXcgPSB0cmVlRGF0YTsKIAkJcHJldlB0ciA9IC0xOwpAQCAtMjE5LDcgKzIxOSw3IEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgYSBsb29zZSBvYmplY3Qgb3IgcGFjayBmaWxlIGNvdWxkIG5vdCBiZSByZWFkLgogCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGZpbmFsIE9iamVjdFJlYWRlciByZWFkZXIsIGZpbmFsIEFueU9iamVjdElkIGlkKQorCXB1YmxpYyB2b2lkIHJlc2V0KE9iamVjdFJlYWRlciByZWFkZXIsIEFueU9iamVjdElkIGlkKQogCQkJdGhyb3dzIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJcmVzZXQocmVhZGVyLm9wZW4oaWQsIE9CSl9UUkVFKS5nZXRDYWNoZWRCeXRlcygpKTsKIAl9CkBAIC0yNjIsNyArMjYyLDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIENhbm9uaWNhbFRyZWVQYXJzZXIgY3JlYXRlU3VidHJlZUl0ZXJhdG9yKGZpbmFsIE9iamVjdFJlYWRlciByZWFkZXIpCisJcHVibGljIENhbm9uaWNhbFRyZWVQYXJzZXIgY3JlYXRlU3VidHJlZUl0ZXJhdG9yKE9iamVjdFJlYWRlciByZWFkZXIpCiAJCQl0aHJvd3MgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gY3JlYXRlU3VidHJlZUl0ZXJhdG9yKHJlYWRlciwgbmV3IE11dGFibGVPYmplY3RJZCgpKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0VtcHR5VHJlZUl0ZXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0VtcHR5VHJlZUl0ZXJhdG9yLmphdmEKaW5kZXggNTk2ZDNkMC4uZjVkNDVjNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9FbXB0eVRyZWVJdGVyYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvRW1wdHlUcmVlSXRlcmF0b3IuamF2YQpAQCAtNjMsNyArNjMsNyBAQAogCQkvLyBDcmVhdGUgYSByb290IGVtcHR5IHRyZWUuCiAJfQogCi0JRW1wdHlUcmVlSXRlcmF0b3IoZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgcCkgeworCUVtcHR5VHJlZUl0ZXJhdG9yKEFic3RyYWN0VHJlZUl0ZXJhdG9yIHApIHsKIAkJc3VwZXIocCk7CiAJCXBhdGhMZW4gPSBwYXRoT2Zmc2V0OwogCX0KQEAgLTkyLDcgKzkyLDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGNyZWF0ZVN1YnRyZWVJdGVyYXRvcihmaW5hbCBPYmplY3RSZWFkZXIgcmVhZGVyKQorCXB1YmxpYyBBYnN0cmFjdFRyZWVJdGVyYXRvciBjcmVhdGVTdWJ0cmVlSXRlcmF0b3IoT2JqZWN0UmVhZGVyIHJlYWRlcikKIAkJCXRocm93cyBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBuZXcgRW1wdHlUcmVlSXRlcmF0b3IodGhpcyk7CiAJfQpAQCAtMTQxLDEzICsxNDEsMTMgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbmV4dChmaW5hbCBpbnQgZGVsdGEpIHRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBuZXh0KGludCBkZWx0YSkgdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24gewogCQkvLyBEbyBub3RoaW5nLgogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYmFjayhmaW5hbCBpbnQgZGVsdGEpIHRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBiYWNrKGludCBkZWx0YSkgdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24gewogCQkvLyBEbyBub3RoaW5nLgogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9GaWxlVHJlZUl0ZXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0ZpbGVUcmVlSXRlcmF0b3IuamF2YQppbmRleCA4ZGY3NjRkLi4yNGI5YWMwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0ZpbGVUcmVlSXRlcmF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0ZpbGVUcmVlSXRlcmF0b3IuamF2YQpAQCAtNTIsNiArNTIsNyBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGUuRGlyQ2FjaGVJdGVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5JbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5GaWxlTW9kZTsKQEAgLTY3LDYgKzY4LDcgQEAKICAqIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLlRyZWVXYWxrfS4KICAqLwogcHVibGljIGNsYXNzIEZpbGVUcmVlSXRlcmF0b3IgZXh0ZW5kcyBXb3JraW5nVHJlZUl0ZXJhdG9yIHsKKwogCS8qKgogCSAqIHRoZSBzdGFydGluZyBkaXJlY3Rvcnkgb2YgdGhpcyBJdGVyYXRvci4gQWxsIGVudHJpZXMgYXJlIGxvY2F0ZWQgZGlyZWN0bHkKIAkgKiBpbiB0aGlzIGRpcmVjdG9yeS4KQEAgLTEzMCw3ICsxMzIsNyBAQAogCSAqIEBwYXJhbSBvcHRpb25zCiAJICogICAgICAgICAgICB3b3JraW5nIHRyZWUgb3B0aW9ucyB0byBiZSB1c2VkCiAJICovCi0JcHVibGljIEZpbGVUcmVlSXRlcmF0b3IoZmluYWwgRmlsZSByb290LCBGUyBmcywgV29ya2luZ1RyZWVPcHRpb25zIG9wdGlvbnMpIHsKKwlwdWJsaWMgRmlsZVRyZWVJdGVyYXRvcihGaWxlIHJvb3QsIEZTIGZzLCBXb3JraW5nVHJlZU9wdGlvbnMgb3B0aW9ucykgewogCQl0aGlzKHJvb3QsIGZzLCBvcHRpb25zLCBEZWZhdWx0RmlsZU1vZGVTdHJhdGVneS5JTlNUQU5DRSk7CiAJfQogCkBAIC0xNzEsMjcgKzE3Myw2IEBACiAJICogICAgICAgICAgICB0aGUgZmlsZSBzeXN0ZW0gYWJzdHJhY3Rpb24gd2hpY2ggd2lsbCBiZSBuZWNlc3NhcnkgdG8gcGVyZm9ybQogCSAqICAgICAgICAgICAgY2VydGFpbiBmaWxlIHN5c3RlbSBvcGVyYXRpb25zLgogCSAqIEBzaW5jZSA0LjMKLQkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNGaWxlVHJlZUl0ZXJhdG9yKEZpbGVUcmVlSXRlcmF0b3IsIEZpbGUsIEZTKX0KLQkgKiAgICAgICAgICAgICBpbnN0ZWFkLgotCSAqLwotCUBEZXByZWNhdGVkCi0JcHJvdGVjdGVkIEZpbGVUcmVlSXRlcmF0b3IoZmluYWwgV29ya2luZ1RyZWVJdGVyYXRvciBwLCBmaW5hbCBGaWxlIHJvb3QsCi0JCQlGUyBmcykgewotCQl0aGlzKHAsIHJvb3QsIGZzLCBEZWZhdWx0RmlsZU1vZGVTdHJhdGVneS5JTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGl0ZXJhdG9yIHRvIHRyYXZlcnNlIGEgc3ViZGlyZWN0b3J5LgotCSAqCi0JICogQHBhcmFtIHAKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgaXRlcmF0b3Igd2Ugd2VyZSBjcmVhdGVkIGZyb20uCi0JICogQHBhcmFtIHJvb3QKLQkgKiAgICAgICAgICAgIHRoZSBzdWJkaXJlY3RvcnkuIFRoaXMgc2hvdWxkIGJlIGEgZGlyZWN0b3J5IGNvbnRhaW5lZCB3aXRoaW4KLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgZGlyZWN0b3J5LgotCSAqIEBwYXJhbSBmcwotCSAqICAgICAgICAgICAgdGhlIGZpbGUgc3lzdGVtIGFic3RyYWN0aW9uIHdoaWNoIHdpbGwgYmUgbmVjZXNzYXJ5IHRvIHBlcmZvcm0KLQkgKiAgICAgICAgICAgIGNlcnRhaW4gZmlsZSBzeXN0ZW0gb3BlcmF0aW9ucy4KLQkgKiBAc2luY2UgNC4zCiAJICovCiAJcHJvdGVjdGVkIEZpbGVUcmVlSXRlcmF0b3IoZmluYWwgRmlsZVRyZWVJdGVyYXRvciBwLCBmaW5hbCBGaWxlIHJvb3QsCiAJCQlGUyBmcykgewpAQCAtMjI2LDE5ICsyMDcsMzkgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGNyZWF0ZVN1YnRyZWVJdGVyYXRvcihmaW5hbCBPYmplY3RSZWFkZXIgcmVhZGVyKQorCXB1YmxpYyBBYnN0cmFjdFRyZWVJdGVyYXRvciBjcmVhdGVTdWJ0cmVlSXRlcmF0b3IoT2JqZWN0UmVhZGVyIHJlYWRlcikKIAkJCXRocm93cyBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgRmlsZVRyZWVJdGVyYXRvcih0aGlzLCAoKEZpbGVFbnRyeSkgY3VycmVudCgpKS5nZXRGaWxlKCksIGZzLCBmaWxlTW9kZVN0cmF0ZWd5KTsKKwkJaWYgKCF3YWxrc0lnbm9yZWREaXJlY3RvcmllcygpICYmIGlzRW50cnlJZ25vcmVkKCkpIHsKKwkJCURpckNhY2hlSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXREaXJDYWNoZUl0ZXJhdG9yKCk7CisJCQlpZiAoaXRlcmF0b3IgPT0gbnVsbCkgeworCQkJCXJldHVybiBuZXcgRW1wdHlUcmVlSXRlcmF0b3IodGhpcyk7CisJCQl9CisJCQkvLyBPbmx5IGVudGVyIGlmIHdlIGhhdmUgYW4gYXNzb2NpYXRlZCBEaXJDYWNoZUl0ZXJhdG9yIHRoYXQgaXMKKwkJCS8vIGF0IHRoZSBzYW1lIGVudHJ5ICh3aGljaCBpbmRpY2F0ZXMgdGhlcmUgaXMgc29tZSBhbHJlYWR5CisJCQkvLyB0cmFja2VkIGZpbGUgdW5kZXJuZWF0aCB0aGlzIGRpcmVjdG9yeSkuIE90aGVyd2lzZSB0aGUKKwkJCS8vIGRpcmVjdG9yeSBpcyBpbmRlZWQgaWdub3JlZCBhbmQgY2FuIGJlIHNraXBwZWQgZW50aXJlbHkuCisJCX0KKwkJcmV0dXJuIGVudGVyU3VidHJlZSgpOworCX0KKworCisJLyoqCisJICogQ3JlYXRlIGEgbmV3IGl0ZXJhdG9yIGZvciB0aGUgY3VycmVudCBlbnRyeSdzIHN1YnRyZWUuCisJICogPHA+CisJICogVGhlIHBhcmVudCByZWZlcmVuY2Ugb2YgdGhlIGl0ZXJhdG9yIG11c3QgYmUgPGNvZGU+dGhpczwvY29kZT4sIG90aGVyd2lzZQorCSAqIHRoZSBjYWxsZXIgd291bGQgbm90IGJlIGFibGUgdG8gZXhpdCBvdXQgb2YgdGhlIHN1YnRyZWUgaXRlcmF0b3IKKwkgKiBjb3JyZWN0bHkgYW5kIHJldHVybiB0byBjb250aW51ZSB3YWxraW5nIDxjb2RlPnRoaXM8L2NvZGU+LgorCSAqCisJICogQHJldHVybiBhIG5ldyBpdGVyYXRvciB0aGF0IHdhbGtzIG92ZXIgdGhlIGN1cnJlbnQgc3VidHJlZS4KKwkgKiBAc2luY2UgNS4wCisJICovCisJcHJvdGVjdGVkIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGVudGVyU3VidHJlZSgpIHsKKwkJcmV0dXJuIG5ldyBGaWxlVHJlZUl0ZXJhdG9yKHRoaXMsICgoRmlsZUVudHJ5KSBjdXJyZW50KCkpLmdldEZpbGUoKSwgZnMsCisJCQkJZmlsZU1vZGVTdHJhdGVneSk7CiAJfQogCiAJcHJpdmF0ZSBFbnRyeVtdIGVudHJpZXMoKSB7Ci0JCWZpbmFsIEZpbGVbXSBhbGwgPSBkaXJlY3RvcnkubGlzdEZpbGVzKCk7Ci0JCWlmIChhbGwgPT0gbnVsbCkKLQkJCXJldHVybiBFT0Y7Ci0JCWZpbmFsIEVudHJ5W10gciA9IG5ldyBFbnRyeVthbGwubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByLmxlbmd0aDsgaSsrKQotCQkJcltpXSA9IG5ldyBGaWxlRW50cnkoYWxsW2ldLCBmcywgZmlsZU1vZGVTdHJhdGVneSk7Ci0JCXJldHVybiByOworCQlyZXR1cm4gZnMubGlzdChkaXJlY3RvcnksIGZpbGVNb2RlU3RyYXRlZ3kpOwogCX0KIAogCS8qKgpAQCAtMjY3LDcgKzI2OCw3IEBACiAJICoKIAkgKiBAc2luY2UgNC4zCiAJICovCi0Jc3RhdGljIHB1YmxpYyBjbGFzcyBEZWZhdWx0RmlsZU1vZGVTdHJhdGVneSBpbXBsZW1lbnRzIEZpbGVNb2RlU3RyYXRlZ3kgeworCXB1YmxpYyBzdGF0aWMgY2xhc3MgRGVmYXVsdEZpbGVNb2RlU3RyYXRlZ3kgaW1wbGVtZW50cyBGaWxlTW9kZVN0cmF0ZWd5IHsKIAkJLyoqCiAJCSAqIGEgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBkZWZhdWx0IEZpbGVNb2RlU3RyYXRlZ3kKIAkJICovCkBAIC0zMDAsNyArMzAxLDcgQEAKIAkgKgogCSAqIEBzaW5jZSA0LjMKIAkgKi8KLQlzdGF0aWMgcHVibGljIGNsYXNzIE5vR2l0bGlua3NTdHJhdGVneSBpbXBsZW1lbnRzIEZpbGVNb2RlU3RyYXRlZ3kgeworCXB1YmxpYyBzdGF0aWMgY2xhc3MgTm9HaXRsaW5rc1N0cmF0ZWd5IGltcGxlbWVudHMgRmlsZU1vZGVTdHJhdGVneSB7CiAKIAkJLyoqCiAJCSAqIGEgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBkZWZhdWx0IEZpbGVNb2RlU3RyYXRlZ3kKQEAgLTMyNSw3ICszMjYsNyBAQAogCS8qKgogCSAqIFdyYXBwZXIgZm9yIGEgc3RhbmRhcmQgSmF2YSBJTyBmaWxlCiAJICovCi0Jc3RhdGljIHB1YmxpYyBjbGFzcyBGaWxlRW50cnkgZXh0ZW5kcyBFbnRyeSB7CisJcHVibGljIHN0YXRpYyBjbGFzcyBGaWxlRW50cnkgZXh0ZW5kcyBFbnRyeSB7CiAJCXByaXZhdGUgZmluYWwgRmlsZU1vZGUgbW9kZTsKIAogCQlwcml2YXRlIEZTLkF0dHJpYnV0ZXMgYXR0cmlidXRlczsKQEAgLTM2NCw2ICszNjUsMjkgQEAKIAkJCW1vZGUgPSBmaWxlTW9kZVN0cmF0ZWd5LmdldE1vZGUoZiwgYXR0cmlidXRlcyk7CiAJCX0KIAorCQkvKioKKwkJICogQ3JlYXRlIGEgbmV3IGZpbGUgZW50cnkgZ2l2ZW4gdGhlIHNwZWNpZmllZCBGaWxlTW9kZVN0cmF0ZWd5CisJCSAqCisJCSAqIEBwYXJhbSBmCisJCSAqICAgICAgICAgICAgZmlsZQorCQkgKiBAcGFyYW0gZnMKKwkJICogICAgICAgICAgICBmaWxlIHN5c3RlbQorCQkgKiBAcGFyYW0gYXR0cmlidXRlcworCQkgKiAgICAgICAgICAgIG9mIHRoZSBmaWxlCisJCSAqIEBwYXJhbSBmaWxlTW9kZVN0cmF0ZWd5CisJCSAqICAgICAgICAgICAgdGhlIHN0cmF0ZWd5IHRvIHVzZSB3aGVuIGRldGVybWluaW5nIHRoZSBGaWxlTW9kZSBvZiBhCisJCSAqICAgICAgICAgICAgZmlsZTsgY29udHJvbHMgZ2l0bGlua3MgZXRjLgorCQkgKgorCQkgKiBAc2luY2UgNS4wCisJCSAqLworCQlwdWJsaWMgRmlsZUVudHJ5KEZpbGUgZiwgRlMgZnMsIEZTLkF0dHJpYnV0ZXMgYXR0cmlidXRlcywKKwkJCQlGaWxlTW9kZVN0cmF0ZWd5IGZpbGVNb2RlU3RyYXRlZ3kpIHsKKwkJCXRoaXMuZnMgPSBmczsKKwkJCXRoaXMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7CisJCQlmID0gZnMubm9ybWFsaXplKGYpOworCQkJbW9kZSA9IGZpbGVNb2RlU3RyYXRlZ3kuZ2V0TW9kZShmLCBhdHRyaWJ1dGVzKTsKKwkJfQorCiAJCUBPdmVycmlkZQogCQlwdWJsaWMgRmlsZU1vZGUgZ2V0TW9kZSgpIHsKIAkJCXJldHVybiBtb2RlOwpAQCAtMzg2LDEyICs0MTAsMTIgQEAKIAogCQlAT3ZlcnJpZGUKIAkJcHVibGljIElucHV0U3RyZWFtIG9wZW5JbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlpZiAoZnMuaXNTeW1MaW5rKGdldEZpbGUoKSkpCisJCQlpZiAoYXR0cmlidXRlcy5pc1N5bWJvbGljTGluaygpKSB7CiAJCQkJcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShmcy5yZWFkU3ltTGluayhnZXRGaWxlKCkpCi0JCQkJCQkuZ2V0Qnl0ZXMoCi0JCQkJCQlDb25zdGFudHMuQ0hBUkFDVEVSX0VOQ09ESU5HKSk7Ci0JCQllbHNlCisJCQkJCQkuZ2V0Qnl0ZXMoQ29uc3RhbnRzLkNIQVJBQ1RFUl9FTkNPRElORykpOworCQkJfSBlbHNlIHsKIAkJCQlyZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShnZXRGaWxlKCkpOworCQkJfQogCQl9CiAKIAkJLyoqCkBAIC00MjYsNyArNDUwLDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJ5dGVbXSBpZFN1Ym1vZHVsZShmaW5hbCBFbnRyeSBlKSB7CisJcHJvdGVjdGVkIGJ5dGVbXSBpZFN1Ym1vZHVsZShFbnRyeSBlKSB7CiAJCXJldHVybiBpZFN1Ym1vZHVsZShnZXREaXJlY3RvcnkoKSwgZSk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL05hbWVDb25mbGljdFRyZWVXYWxrLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL05hbWVDb25mbGljdFRyZWVXYWxrLmphdmEKaW5kZXggNTU2MGY3Ny4uNjFiMTMwZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9OYW1lQ29uZmxpY3RUcmVlV2Fsay5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvTmFtZUNvbmZsaWN0VHJlZVdhbGsuamF2YQpAQCAtOTksNyArOTksNyBAQAogCSAqIEBwYXJhbSByZXBvCiAJICogICAgICAgICAgICB0aGUgcmVwb3NpdG9yeSB0aGUgd2Fsa2VyIHdpbGwgb2J0YWluIGRhdGEgZnJvbS4KIAkgKi8KLQlwdWJsaWMgTmFtZUNvbmZsaWN0VHJlZVdhbGsoZmluYWwgUmVwb3NpdG9yeSByZXBvKSB7CisJcHVibGljIE5hbWVDb25mbGljdFRyZWVXYWxrKFJlcG9zaXRvcnkgcmVwbykgewogCQlzdXBlcihyZXBvKTsKIAl9CiAKQEAgLTExMiw3ICsxMTIsNyBAQAogCSAqICAgICAgICAgICAgdGhlIHJlYWRlciB0aGUgd2Fsa2VyIHdpbGwgb2J0YWluIHRyZWUgZGF0YSBmcm9tLgogCSAqIEBzaW5jZSA0LjMKIAkgKi8KLQlwdWJsaWMgTmFtZUNvbmZsaWN0VHJlZVdhbGsoQE51bGxhYmxlIFJlcG9zaXRvcnkgcmVwbywgZmluYWwgT2JqZWN0UmVhZGVyIG9yKSB7CisJcHVibGljIE5hbWVDb25mbGljdFRyZWVXYWxrKEBOdWxsYWJsZSBSZXBvc2l0b3J5IHJlcG8sIE9iamVjdFJlYWRlciBvcikgewogCQlzdXBlcihyZXBvLCBvcik7CiAJfQogCkBAIC0xMjIsNyArMTIyLDcgQEAKIAkgKiBAcGFyYW0gb3IKIAkgKiAgICAgICAgICAgIHRoZSByZWFkZXIgdGhlIHdhbGtlciB3aWxsIG9idGFpbiB0cmVlIGRhdGEgZnJvbS4KIAkgKi8KLQlwdWJsaWMgTmFtZUNvbmZsaWN0VHJlZVdhbGsoZmluYWwgT2JqZWN0UmVhZGVyIG9yKSB7CisJcHVibGljIE5hbWVDb25mbGljdFRyZWVXYWxrKE9iamVjdFJlYWRlciBvcikgewogCQlzdXBlcihvcik7CiAJfQogCkBAIC0xMzUsNyArMTM1LDcgQEAKIAogCQkJaWYgKGlzVHJlZShtaW5SZWYpKSB7CiAJCQkJaWYgKHNraXBFbnRyeShtaW5SZWYpKSB7Ci0JCQkJCWZvciAoZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgdCA6IHRyZWVzKSB7CisJCQkJCWZvciAoQWJzdHJhY3RUcmVlSXRlcmF0b3IgdCA6IHRyZWVzKSB7CiAJCQkJCQlpZiAodC5tYXRjaGVzID09IG1pblJlZikgewogCQkJCQkJCXQubmV4dCgxKTsKIAkJCQkJCQl0Lm1hdGNoZXMgPSBudWxsOwpAQCAtMjIyLDE2ICsyMjIsMTYgQEAKIAkJcmV0dXJuIEZpbGVNb2RlLkdJVExJTksuZXF1YWxzKHAubW9kZSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1RyZWUoZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgcCkgeworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUcmVlKEFic3RyYWN0VHJlZUl0ZXJhdG9yIHApIHsKIAkJcmV0dXJuIEZpbGVNb2RlLlRSRUUuZXF1YWxzKHAubW9kZSk7CiAJfQogCi0JcHJpdmF0ZSBib29sZWFuIHNraXBFbnRyeShmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciBtaW5SZWYpCisJcHJpdmF0ZSBib29sZWFuIHNraXBFbnRyeShBYnN0cmFjdFRyZWVJdGVyYXRvciBtaW5SZWYpCiAJCQl0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiB7CiAJCS8vIEEgdHJlZSBEL0YgbWF5IGhhdmUgYmVlbiBoYW5kbGVkIGVhcmxpZXIuIFdlIG5lZWQgdG8KIAkJLy8gbm90IHJlcG9ydCB0aGlzIHBhdGggaWYgaXQgaGFzIGFscmVhZHkgYmVlbiByZXBvcnRlZC4KIAkJLy8KLQkJZm9yIChmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciB0IDogdHJlZXMpIHsKKwkJZm9yIChBYnN0cmFjdFRyZWVJdGVyYXRvciB0IDogdHJlZXMpIHsKIAkJCWlmICh0Lm1hdGNoZXMgPT0gbWluUmVmIHx8IHQuZmlyc3QoKSkKIAkJCQljb250aW51ZTsKIApAQCAtMjYwLDE0ICsyNjAsMTQgQEAKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAotCXByaXZhdGUgQWJzdHJhY3RUcmVlSXRlcmF0b3IgY29tYmluZURGKGZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIG1pblJlZikKKwlwcml2YXRlIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGNvbWJpbmVERihBYnN0cmFjdFRyZWVJdGVyYXRvciBtaW5SZWYpCiAJCQl0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiB7CiAJCS8vIExvb2sgZm9yIGEgcG9zc2libGUgRC9GIGNvbmZsaWN0IGZvcndhcmQgaW4gdGhlIHRyZWUocykKIAkJLy8gYXMgdGhlcmUgbWF5IGJlIGEgIiRwYXRoLyIgd2hpY2ggbWF0Y2hlcyAiJHBhdGgiLiBNYWtlCiAJCS8vIHN1Y2ggZW50cmllcyBtYXRjaCB0aGlzIGVudHJ5LgogCQkvLwogCQlBYnN0cmFjdFRyZWVJdGVyYXRvciB0cmVlTWF0Y2ggPSBudWxsOwotCQlmb3IgKGZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHQgOiB0cmVlcykgeworCQlmb3IgKEFic3RyYWN0VHJlZUl0ZXJhdG9yIHQgOiB0cmVlcykgewogCQkJaWYgKHQubWF0Y2hlcyA9PSBtaW5SZWYgfHwgdC5lb2YoKSkKIAkJCQljb250aW51ZTsKIApAQCAtMzA2LDcgKzMwNiw3IEBACiAJCQkvLyBtYXRjaGluZyBpdGVyYXRvcnMgaW5zdGVhZCBvZiB0aGUgZmlsZSBpdGVyYXRvci4KIAkJCS8vIFRoaXMgd2F5IGlzU3VidHJlZSBpcyB0cnVlIGFuZCBpc1JlY3Vyc2l2ZSB3b3Jrcy4KIAkJCS8vCi0JCQlmb3IgKGZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHQgOiB0cmVlcykKKwkJCWZvciAoQWJzdHJhY3RUcmVlSXRlcmF0b3IgdCA6IHRyZWVzKQogCQkJCWlmICh0Lm1hdGNoZXMgPT0gbWluUmVmKQogCQkJCQl0Lm1hdGNoZXMgPSB0cmVlTWF0Y2g7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvVHJlZVdhbGsuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvVHJlZVdhbGsuamF2YQppbmRleCA4ODcyNjg5Li5kNTAwYWFlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1RyZWVXYWxrLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9UcmVlV2Fsay5qYXZhCkBAIC0zMzIsNyArMzMyLDcgQEAKIAkgKiAgICAgICAgICAgIE9iamVjdFJlYWRlciB3aWxsIGJlIGNyZWF0ZWQgYnkgdGhlIHdhbGtlciwgYW5kIHdpbGwgYmUgY2xvc2VkCiAJICogICAgICAgICAgICB3aGVuIHRoZSB3YWxrZXIgaXMgY2xvc2VkLgogCSAqLwotCXB1YmxpYyBUcmVlV2FsayhmaW5hbCBSZXBvc2l0b3J5IHJlcG8pIHsKKwlwdWJsaWMgVHJlZVdhbGsoUmVwb3NpdG9yeSByZXBvKSB7CiAJCXRoaXMocmVwbywgcmVwby5uZXdPYmplY3RSZWFkZXIoKSwgdHJ1ZSk7CiAJfQogCkBAIC0zNDgsNyArMzQ4LDcgQEAKIAkgKiAgICAgICAgICAgIGlzIG5vdCBjbG9zZWQgd2hlbiB0aGUgd2Fsa2VyIGlzIGNsb3NlZC4KIAkgKiBAc2luY2UgNC4zCiAJICovCi0JcHVibGljIFRyZWVXYWxrKGZpbmFsIEBOdWxsYWJsZSBSZXBvc2l0b3J5IHJlcG8sIGZpbmFsIE9iamVjdFJlYWRlciBvcikgeworCXB1YmxpYyBUcmVlV2FsayhATnVsbGFibGUgUmVwb3NpdG9yeSByZXBvLCBPYmplY3RSZWFkZXIgb3IpIHsKIAkJdGhpcyhyZXBvLCBvciwgZmFsc2UpOwogCX0KIApAQCAtMzU5LDcgKzM1OSw3IEBACiAJICogICAgICAgICAgICB0aGUgcmVhZGVyIHRoZSB3YWxrZXIgd2lsbCBvYnRhaW4gdHJlZSBkYXRhIGZyb20uIFRoZSByZWFkZXIKIAkgKiAgICAgICAgICAgIGlzIG5vdCBjbG9zZWQgd2hlbiB0aGUgd2Fsa2VyIGlzIGNsb3NlZC4KIAkgKi8KLQlwdWJsaWMgVHJlZVdhbGsoZmluYWwgT2JqZWN0UmVhZGVyIG9yKSB7CisJcHVibGljIFRyZWVXYWxrKE9iamVjdFJlYWRlciBvcikgewogCQl0aGlzKG51bGwsIG9yLCBmYWxzZSk7CiAJfQogCkBAIC00NDcsNyArNDQ3LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLkFuZFRyZWVGaWx0ZXIKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLk9yVHJlZUZpbHRlcgogCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihmaW5hbCBUcmVlRmlsdGVyIG5ld0ZpbHRlcikgeworCXB1YmxpYyB2b2lkIHNldEZpbHRlcihUcmVlRmlsdGVyIG5ld0ZpbHRlcikgewogCQlmaWx0ZXIgPSBuZXdGaWx0ZXIgIT0gbnVsbCA/IG5ld0ZpbHRlciA6IFRyZWVGaWx0ZXIuQUxMOwogCX0KIApAQCAtNDc1LDcgKzQ3NSw3IEBACiAJICogQHBhcmFtIGIKIAkgKiAgICAgICAgICAgIHRydWUgdG8gc2tpcCBzdWJ0cmVlIG5vZGVzIGFuZCBvbmx5IG9idGFpbiBmaWxlcyBub2Rlcy4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWN1cnNpdmUoZmluYWwgYm9vbGVhbiBiKSB7CisJcHVibGljIHZvaWQgc2V0UmVjdXJzaXZlKGJvb2xlYW4gYikgewogCQlyZWN1cnNpdmUgPSBiOwogCX0KIApAQCAtNTA1LDcgKzUwNSw3IEBACiAJICogICAgICAgICAgICB0cnVlIHRvIGdldCB0cmVlcyBhZnRlciB0aGVpciBjaGlsZHJlbi4KIAkgKiBAc2VlICNpc1Bvc3RPcmRlclRyYXZlcnNhbCgpCiAJICovCi0JcHVibGljIHZvaWQgc2V0UG9zdE9yZGVyVHJhdmVyc2FsKGZpbmFsIGJvb2xlYW4gYikgeworCXB1YmxpYyB2b2lkIHNldFBvc3RPcmRlclRyYXZlcnNhbChib29sZWFuIGIpIHsKIAkJcG9zdE9yZGVyVHJhdmVyc2FsID0gYjsKIAl9CiAKQEAgLTYzMywyMiArNjMzLDYgQEAKIAl9CiAKIAkvKioKLQkgKiBHZXQgdGhlIEVPTCBzdHJlYW0gdHlwZSBvZiB0aGUgY3VycmVudCBlbnRyeSB1c2luZyB0aGUgY29uZmlnIGFuZAotCSAqIHtAbGluayAjZ2V0QXR0cmlidXRlcygpfS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIEVPTCBzdHJlYW0gdHlwZSBvZiB0aGUgY3VycmVudCBlbnRyeSB1c2luZyB0aGUgY29uZmlnIGFuZAotCSAqICAgICAgICAge0BsaW5rICNnZXRBdHRyaWJ1dGVzKCl9LiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsCi0JICogICAgICAgICBpZiB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuVHJlZVdhbGt9IGlzIG5vdCBiYXNlZCBvbgotCSAqICAgICAgICAgYSB3b3JraW5nIHRyZWUKLQkgKiBAc2luY2UgNC4zCi0JICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjZ2V0RW9sU3RyZWFtVHlwZShPcGVyYXRpb25UeXBlKX0gaW5zdGVhZC4KLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBATnVsbGFibGUgRW9sU3RyZWFtVHlwZSBnZXRFb2xTdHJlYW1UeXBlKCkgewotCQlyZXR1cm4gKGdldEVvbFN0cmVhbVR5cGUob3BlcmF0aW9uVHlwZSkpOwotCX0KLQotCS8qKgogCSAqIFJlc2V0IHRoaXMgd2Fsa2VyIHNvIG5ldyB0cmVlIGl0ZXJhdG9ycyBjYW4gYmUgYWRkZWQgdG8gaXQuCiAJICovCiAJcHVibGljIHZvaWQgcmVzZXQoKSB7CkBAIC02NzcsNyArNjYxLDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBhIGxvb3NlIG9iamVjdCBvciBwYWNrIGZpbGUgY291bGQgbm90IGJlIHJlYWQuCiAJICovCi0JcHVibGljIHZvaWQgcmVzZXQoZmluYWwgQW55T2JqZWN0SWQgaWQpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAorCXB1YmxpYyB2b2lkIHJlc2V0KEFueU9iamVjdElkIGlkKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIENvcnJ1cHRPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJaWYgKHRyZWVzLmxlbmd0aCA9PSAxKSB7CiAJCQlBYnN0cmFjdFRyZWVJdGVyYXRvciBvID0gdHJlZXNbMF07CkBAIC03MTgsNyArNzAyLDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBhIGxvb3NlIG9iamVjdCBvciBwYWNrIGZpbGUgY291bGQgbm90IGJlIHJlYWQuCiAJICovCi0JcHVibGljIHZvaWQgcmVzZXQoZmluYWwgQW55T2JqZWN0SWQuLi4gaWRzKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKKwlwdWJsaWMgdm9pZCByZXNldChBbnlPYmplY3RJZC4uLiBpZHMpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlmaW5hbCBpbnQgb2xkTGVuID0gdHJlZXMubGVuZ3RoOwogCQlmaW5hbCBpbnQgbmV3TGVuID0gaWRzLmxlbmd0aDsKQEAgLTc3Myw3ICs3NTcsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGEgbG9vc2Ugb2JqZWN0IG9yIHBhY2sgZmlsZSBjb3VsZCBub3QgYmUgcmVhZC4KIAkgKi8KLQlwdWJsaWMgaW50IGFkZFRyZWUoZmluYWwgQW55T2JqZWN0SWQgaWQpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAorCXB1YmxpYyBpbnQgYWRkVHJlZShBbnlPYmplY3RJZCBpZCkgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCQlJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBDb3JydXB0T2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBhZGRUcmVlKHBhcnNlckZvcihpZCkpOwogCX0KQEAgLTkzNiw3ICs5MjAsNyBAQAogCSAqIEByZXR1cm4gbW9kZSBiaXRzIGZvciB0aGUgY3VycmVudCBlbnRyeSBvZiB0aGUgbnRoIHRyZWUuCiAJICogQHNlZSBGaWxlTW9kZSNmcm9tQml0cyhpbnQpCiAJICovCi0JcHVibGljIGludCBnZXRSYXdNb2RlKGZpbmFsIGludCBudGgpIHsKKwlwdWJsaWMgaW50IGdldFJhd01vZGUoaW50IG50aCkgewogCQlmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciB0ID0gdHJlZXNbbnRoXTsKIAkJcmV0dXJuIHQubWF0Y2hlcyA9PSBjdXJyZW50SGVhZCA/IHQubW9kZSA6IDA7CiAJfQpAQCAtOTUyLDcgKzkzNiw3IEBACiAJICogICAgICAgICAgICB0cmVlIHRvIG9idGFpbiB0aGUgbW9kZSBmcm9tLgogCSAqIEByZXR1cm4gbW9kZSBmb3IgdGhlIGN1cnJlbnQgZW50cnkgb2YgdGhlIG50aCB0cmVlLgogCSAqLwotCXB1YmxpYyBGaWxlTW9kZSBnZXRGaWxlTW9kZShmaW5hbCBpbnQgbnRoKSB7CisJcHVibGljIEZpbGVNb2RlIGdldEZpbGVNb2RlKGludCBudGgpIHsKIAkJcmV0dXJuIEZpbGVNb2RlLmZyb21CaXRzKGdldFJhd01vZGUobnRoKSk7CiAJfQogCkBAIC05ODcsNyArOTcxLDcgQEAKIAkgKiBAc2VlICNnZXRPYmplY3RJZChNdXRhYmxlT2JqZWN0SWQsIGludCkKIAkgKiBAc2VlICNpZEVxdWFsKGludCwgaW50KQogCSAqLwotCXB1YmxpYyBPYmplY3RJZCBnZXRPYmplY3RJZChmaW5hbCBpbnQgbnRoKSB7CisJcHVibGljIE9iamVjdElkIGdldE9iamVjdElkKGludCBudGgpIHsKIAkJZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgdCA9IHRyZWVzW250aF07CiAJCXJldHVybiB0Lm1hdGNoZXMgPT0gY3VycmVudEhlYWQgPyB0LmdldEVudHJ5T2JqZWN0SWQoKSA6IE9iamVjdElkCiAJCQkJLnplcm9JZCgpOwpAQCAtMTAwOSw3ICs5OTMsNyBAQAogCSAqICAgICAgICAgICAgdHJlZSB0byBvYnRhaW4gdGhlIG9iamVjdCBpZGVudGlmaWVyIGZyb20uCiAJICogQHNlZSAjaWRFcXVhbChpbnQsIGludCkKIAkgKi8KLQlwdWJsaWMgdm9pZCBnZXRPYmplY3RJZChmaW5hbCBNdXRhYmxlT2JqZWN0SWQgb3V0LCBmaW5hbCBpbnQgbnRoKSB7CisJcHVibGljIHZvaWQgZ2V0T2JqZWN0SWQoTXV0YWJsZU9iamVjdElkIG91dCwgaW50IG50aCkgewogCQlmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciB0ID0gdHJlZXNbbnRoXTsKIAkJaWYgKHQubWF0Y2hlcyA9PSBjdXJyZW50SGVhZCkKIAkJCXQuZ2V0RW50cnlPYmplY3RJZChvdXQpOwpAQCAtMTAyOCw3ICsxMDEyLDcgQEAKIAkgKiAgICAgICAgIDxjb2RlPmdldE9iamVjdElkKG50aEEpLmVxdWFscyhnZXRPYmplY3RJZChudGhCKSk8L2NvZGU+LgogCSAqIEBzZWUgI2dldE9iamVjdElkKGludCkKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpZEVxdWFsKGZpbmFsIGludCBudGhBLCBmaW5hbCBpbnQgbnRoQikgeworCXB1YmxpYyBib29sZWFuIGlkRXF1YWwoaW50IG50aEEsIGludCBudGhCKSB7CiAJCWZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGNoID0gY3VycmVudEhlYWQ7CiAJCWZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGEgPSB0cmVlc1tudGhBXTsKIAkJZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgYiA9IHRyZWVzW250aEJdOwpAQCAtMTEyNiw3ICsxMTEwLDcgQEAKIAkgKiAgICAgICAgIGFnYWluIG9uIHRoaXMgdHJlZSB3YWxrLgogCSAqIEBzaW5jZSA0LjcKIAkgKi8KLQlwdWJsaWMgaW50IGlzUGF0aE1hdGNoKGZpbmFsIGJ5dGVbXSBwLCBmaW5hbCBpbnQgcExlbikgeworCXB1YmxpYyBpbnQgaXNQYXRoTWF0Y2goYnl0ZVtdIHAsIGludCBwTGVuKSB7CiAJCWZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHQgPSBjdXJyZW50SGVhZDsKIAkJZmluYWwgYnl0ZVtdIGMgPSB0LnBhdGg7CiAJCWZpbmFsIGludCBjTGVuID0gdC5wYXRoTGVuOwpAQCAtMTE3OSw3ICsxMTYzLDcgQEAKIAkgKiAgICAgICAgIHBhdGg7IDEgaWYgdGhlIGN1cnJlbnQgcGF0aCBpcyBwYXN0IHAgYW5kIHAgd2lsbCBuZXZlciBtYXRjaAogCSAqICAgICAgICAgYWdhaW4gb24gdGhpcyB0cmVlIHdhbGsuCiAJICovCi0JcHVibGljIGludCBpc1BhdGhQcmVmaXgoZmluYWwgYnl0ZVtdIHAsIGZpbmFsIGludCBwTGVuKSB7CisJcHVibGljIGludCBpc1BhdGhQcmVmaXgoYnl0ZVtdIHAsIGludCBwTGVuKSB7CiAJCWZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHQgPSBjdXJyZW50SGVhZDsKIAkJZmluYWwgYnl0ZVtdIGMgPSB0LnBhdGg7CiAJCWZpbmFsIGludCBjTGVuID0gdC5wYXRoTGVuOwpAQCAtMTIyOSw3ICsxMjEzLDcgQEAKIAkgKiBAcmV0dXJuIHRydWUgaWYgcCBpcyBzdWZmaXggb2YgdGhlIGN1cnJlbnQgcGF0aDsKIAkgKiAgICAgICAgIGZhbHNlIGlmIG90aGVyd2lzZQogCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGF0aFN1ZmZpeChmaW5hbCBieXRlW10gcCwgZmluYWwgaW50IHBMZW4pIHsKKwlwdWJsaWMgYm9vbGVhbiBpc1BhdGhTdWZmaXgoYnl0ZVtdIHAsIGludCBwTGVuKSB7CiAJCWZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHQgPSBjdXJyZW50SGVhZDsKIAkJZmluYWwgYnl0ZVtdIGMgPSB0LnBhdGg7CiAJCWZpbmFsIGludCBjTGVuID0gdC5wYXRoTGVuOwpAQCAtMTM3Nyw3ICsxMzYxLDcgQEAKIAkJCXRyZWVzW2ldID0gdHJlZXNbaV0ucGFyZW50OwogCiAJCUFic3RyYWN0VHJlZUl0ZXJhdG9yIG1pblJlZiA9IG51bGw7Ci0JCWZvciAoZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgdCA6IHRyZWVzKSB7CisJCWZvciAoQWJzdHJhY3RUcmVlSXRlcmF0b3IgdCA6IHRyZWVzKSB7CiAJCQlpZiAodC5tYXRjaGVzICE9IHQpCiAJCQkJY29udGludWU7CiAJCQlpZiAobWluUmVmID09IG51bGwgfHwgdC5wYXRoQ29tcGFyZShtaW5SZWYpIDwgMCkKQEAgLTEzODYsMTggKzEzNzAsMTggQEAKIAkJY3VycmVudEhlYWQgPSBtaW5SZWY7CiAJfQogCi0JcHJpdmF0ZSBDYW5vbmljYWxUcmVlUGFyc2VyIHBhcnNlckZvcihmaW5hbCBBbnlPYmplY3RJZCBpZCkKKwlwcml2YXRlIENhbm9uaWNhbFRyZWVQYXJzZXIgcGFyc2VyRm9yKEFueU9iamVjdElkIGlkKQogCQkJdGhyb3dzIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgQ2Fub25pY2FsVHJlZVBhcnNlciBwID0gbmV3IENhbm9uaWNhbFRyZWVQYXJzZXIoKTsKIAkJcC5yZXNldChyZWFkZXIsIGlkKTsKIAkJcmV0dXJuIHA7CiAJfQogCi0Jc3RhdGljIFN0cmluZyBwYXRoT2YoZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgdCkgeworCXN0YXRpYyBTdHJpbmcgcGF0aE9mKEFic3RyYWN0VHJlZUl0ZXJhdG9yIHQpIHsKIAkJcmV0dXJuIFJhd1BhcnNlVXRpbHMuZGVjb2RlKENvbnN0YW50cy5DSEFSU0VULCB0LnBhdGgsIDAsIHQucGF0aExlbik7CiAJfQogCi0Jc3RhdGljIFN0cmluZyBwYXRoT2YoZmluYWwgYnl0ZVtdIGJ1ZiwgaW50IHBvcywgaW50IGVuZCkgeworCXN0YXRpYyBTdHJpbmcgcGF0aE9mKGJ5dGVbXSBidWYsIGludCBwb3MsIGludCBlbmQpIHsKIAkJcmV0dXJuIFJhd1BhcnNlVXRpbHMuZGVjb2RlKENvbnN0YW50cy5DSEFSU0VULCBidWYsIHBvcywgZW5kKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvV29ya2luZ1RyZWVJdGVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9Xb3JraW5nVHJlZUl0ZXJhdG9yLmphdmEKaW5kZXggNjhjYzdjYi4uMTc5ZmQ0NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9Xb3JraW5nVHJlZUl0ZXJhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9Xb3JraW5nVHJlZUl0ZXJhdG9yLmphdmEKQEAgLTIxMSw3ICsyMTEsNyBAQAogCSAqIEBwYXJhbSBwCiAJICogICAgICAgICAgICBwYXJlbnQgdHJlZSBpdGVyYXRvci4KIAkgKi8KLQlwcm90ZWN0ZWQgV29ya2luZ1RyZWVJdGVyYXRvcihmaW5hbCBXb3JraW5nVHJlZUl0ZXJhdG9yIHApIHsKKwlwcm90ZWN0ZWQgV29ya2luZ1RyZWVJdGVyYXRvcihXb3JraW5nVHJlZUl0ZXJhdG9yIHApIHsKIAkJc3VwZXIocCk7CiAJCXN0YXRlID0gcC5zdGF0ZTsKIAkJcmVwb3NpdG9yeSA9IHAucmVwb3NpdG9yeTsKQEAgLTI1Niw2ICsyNTYsNDUgQEAKIAkJc3RhdGUuZGlyQ2FjaGVUcmVlID0gdHJlZUlkOwogCX0KIAorCS8qKgorCSAqIFJldHJpZXZlcyB0aGUge0BsaW5rIERpckNhY2hlSXRlcmF0b3J9IGF0IHRoZSBjdXJyZW50IGVudHJ5IGlmCisJICoge0BsaW5rICNzZXREaXJDYWNoZUl0ZXJhdG9yKFRyZWVXYWxrLCBpbnQpfSB3YXMgY2FsbGVkLgorCSAqCisJICogQHJldHVybiB0aGUgRGlyQ2FjaGVJdGVyYXRvciwgb3Ige0Bjb2RlIG51bGx9IGlmIG5vdCBzZXQgb3Igbm90IGF0IHRoZQorCSAqICAgICAgICAgY3VycmVudCBlbnRyeQorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwcm90ZWN0ZWQgRGlyQ2FjaGVJdGVyYXRvciBnZXREaXJDYWNoZUl0ZXJhdG9yKCkgeworCQlpZiAoc3RhdGUuZGlyQ2FjaGVUcmVlID49IDAgJiYgc3RhdGUud2FsayAhPSBudWxsKSB7CisJCQlyZXR1cm4gc3RhdGUud2Fsay5nZXRUcmVlKHN0YXRlLmRpckNhY2hlVHJlZSwKKwkJCQkJRGlyQ2FjaGVJdGVyYXRvci5jbGFzcyk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogRGVmaW5lcyB3aGV0aGVyIHRoaXMge0BsaW5rIFdvcmtpbmdUcmVlSXRlcmF0b3J9IHdhbGtzIGlnbm9yZWQKKwkgKiBkaXJlY3Rvcmllcy4KKwkgKgorCSAqIEBwYXJhbSBpbmNsdWRlSWdub3JlZAorCSAqICAgICAgICAgICAge0Bjb2RlIGZhbHNlfSB0byBza2lwIGlnbm9yZWQgZGlyZWN0b3JpZXMsIGlmIHBvc3NpYmxlOworCSAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IHRvIGFsd2F5cyBpbmNsdWRlIHRoZW0gaW4gdGhlIHdhbGsKKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIHZvaWQgc2V0V2Fsa0lnbm9yZWREaXJlY3Rvcmllcyhib29sZWFuIGluY2x1ZGVJZ25vcmVkKSB7CisJCXN0YXRlLndhbGtJZ25vcmVkID0gaW5jbHVkZUlnbm9yZWQ7CisJfQorCisJLyoqCisJICogVGVsbHMgd2hldGhlciB0aGlzIHtAbGluayBXb3JraW5nVHJlZUl0ZXJhdG9yfSB3YWxrcyBpZ25vcmVkIGRpcmVjdG9yaWVzLgorCSAqCisJICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgaXQgZG9lcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIGJvb2xlYW4gd2Fsa3NJZ25vcmVkRGlyZWN0b3JpZXMoKSB7CisJCXJldHVybiBzdGF0ZS53YWxrSWdub3JlZDsKKwl9CisKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGhhc0lkKCkgewpAQCAtMzQwLDMwICszNzksMjIgQEAKIAkgKiBAcmV0dXJuIG5vbi1udWxsIHN1Ym1vZHVsZSBpZAogCSAqLwogCXByb3RlY3RlZCBieXRlW10gaWRTdWJtb2R1bGUoRmlsZSBkaXJlY3RvcnksIEVudHJ5IGUpIHsKLQkJZmluYWwgUmVwb3NpdG9yeSBzdWJtb2R1bGVSZXBvOwotCQl0cnkgewotCQkJc3VibW9kdWxlUmVwbyA9IFN1Ym1vZHVsZVdhbGsuZ2V0U3VibW9kdWxlUmVwb3NpdG9yeShkaXJlY3RvcnksCi0JCQkJCWUuZ2V0TmFtZSgpLAotCQkJCQlyZXBvc2l0b3J5ICE9IG51bGwgPyByZXBvc2l0b3J5LmdldEZTKCkgOiBGUy5ERVRFQ1RFRCk7CisJCXRyeSAoUmVwb3NpdG9yeSBzdWJtb2R1bGVSZXBvID0gU3VibW9kdWxlV2Fsay5nZXRTdWJtb2R1bGVSZXBvc2l0b3J5KAorCQkJCWRpcmVjdG9yeSwgZS5nZXROYW1lKCksCisJCQkJcmVwb3NpdG9yeSAhPSBudWxsID8gcmVwb3NpdG9yeS5nZXRGUygpIDogRlMuREVURUNURUQpKSB7CisJCQlpZiAoc3VibW9kdWxlUmVwbyA9PSBudWxsKSB7CisJCQkJcmV0dXJuIHplcm9pZDsKKwkJCX0KKwkJCU9iamVjdElkIGhlYWQgPSBzdWJtb2R1bGVSZXBvLnJlc29sdmUoQ29uc3RhbnRzLkhFQUQpOworCQkJaWYgKGhlYWQgPT0gbnVsbCkgeworCQkJCXJldHVybiB6ZXJvaWQ7CisJCQl9CisJCQlieXRlW10gaWQgPSBuZXcgYnl0ZVtDb25zdGFudHMuT0JKRUNUX0lEX0xFTkdUSF07CisJCQloZWFkLmNvcHlSYXdUbyhpZCwgMCk7CisJCQlyZXR1cm4gaWQ7CiAJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4Y2VwdGlvbikgewogCQkJcmV0dXJuIHplcm9pZDsKIAkJfQotCQlpZiAoc3VibW9kdWxlUmVwbyA9PSBudWxsKQotCQkJcmV0dXJuIHplcm9pZDsKLQotCQlmaW5hbCBPYmplY3RJZCBoZWFkOwotCQl0cnkgewotCQkJaGVhZCA9IHN1Ym1vZHVsZVJlcG8ucmVzb2x2ZShDb25zdGFudHMuSEVBRCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJcmV0dXJuIHplcm9pZDsKLQkJfSBmaW5hbGx5IHsKLQkJCXN1Ym1vZHVsZVJlcG8uY2xvc2UoKTsKLQkJfQotCQlpZiAoaGVhZCA9PSBudWxsKQotCQkJcmV0dXJuIHplcm9pZDsKLQkJZmluYWwgYnl0ZVtdIGlkID0gbmV3IGJ5dGVbQ29uc3RhbnRzLk9CSkVDVF9JRF9MRU5HVEhdOwotCQloZWFkLmNvcHlSYXdUbyhpZCwgMCk7Ci0JCXJldHVybiBpZDsKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gZGlnaXRzID0geyAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsCkBAIC0zNzIsNyArNDAzLDcgQEAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gaGJsb2IgPSBDb25zdGFudHMKIAkJCS5lbmNvZGVkVHlwZVN0cmluZyhDb25zdGFudHMuT0JKX0JMT0IpOwogCi0JcHJpdmF0ZSBieXRlW10gaWRCdWZmZXJCbG9iKGZpbmFsIEVudHJ5IGUpIHsKKwlwcml2YXRlIGJ5dGVbXSBpZEJ1ZmZlckJsb2IoRW50cnkgZSkgewogCQl0cnkgewogCQkJZmluYWwgSW5wdXRTdHJlYW0gaXMgPSBlLm9wZW5JbnB1dFN0cmVhbSgpOwogCQkJaWYgKGlzID09IG51bGwpCkBAIC00MzAsNyArNDYxLDcgQEAKIAkJcmV0dXJuIGZpbHRlckNsZWFuKGlzLCBvcFR5cGUpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgc2FmZUNsb3NlKGZpbmFsIElucHV0U3RyZWFtIGluKSB7CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBzYWZlQ2xvc2UoSW5wdXRTdHJlYW0gaW4pIHsKIAkJdHJ5IHsKIAkJCWluLmNsb3NlKCk7CiAJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGVycjIpIHsKQEAgLTU0OCw3ICs1NzksNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBuZXh0KGZpbmFsIGludCBkZWx0YSkgdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24geworCXB1YmxpYyB2b2lkIG5leHQoaW50IGRlbHRhKSB0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiB7CiAJCXB0ciArPSBkZWx0YTsKIAkJaWYgKCFlb2YoKSkgewogCQkJcGFyc2VFbnRyeSgpOwpAQCAtNTU3LDcgKzU4OCw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGJhY2soZmluYWwgaW50IGRlbHRhKSB0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgYmFjayhpbnQgZGVsdGEpIHRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uIHsKIAkJcHRyIC09IGRlbHRhOwogCQlwYXJzZUVudHJ5KCk7CiAJfQpAQCAtNjYyLDcgKzY5Myw3IEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgYSByZWxldmFudCBpZ25vcmUgcnVsZSBmaWxlIGV4aXN0cyBidXQgY2Fubm90IGJlIHJlYWQuCiAJICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbnRyeUlnbm9yZWQoZmluYWwgaW50IHBMZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFbnRyeUlnbm9yZWQoaW50IHBMZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBpc0VudHJ5SWdub3JlZChwTGVuLCBtb2RlKTsKIAl9CiAKQEAgLTY3Nyw3ICs3MDgsNyBAQAogCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBhIHJlbGV2YW50IGlnbm9yZSBydWxlIGZpbGUgZXhpc3RzIGJ1dCBjYW5ub3QgYmUgcmVhZC4KIAkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNFbnRyeUlnbm9yZWQoZmluYWwgaW50IHBMZW4sIGludCBmaWxlTW9kZSkKKwlwcml2YXRlIGJvb2xlYW4gaXNFbnRyeUlnbm9yZWQoaW50IHBMZW4sIGludCBmaWxlTW9kZSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCS8vIFRoZSBpZ25vcmUgY29kZSB3YW50cyBwYXRoIHRvIHN0YXJ0IHdpdGggYSAnLycgaWYgcG9zc2libGUuCiAJCS8vIElmIHdlIGhhdmUgdGhlICcvJyBpbiBvdXIgcGF0aCBidWZmZXIgYmVjYXVzZSB3ZSBhcmUgaW5zaWRlCkBAIC03NTYsNyArNzg3LDcgQEAKIAkgKiAgICAgICAgICAgIGZpbGVzIGluIHRoZSBzdWJ0cmVlIG9mIHRoZSB3b3JrIHRyZWUgdGhpcyBpdGVyYXRvciBvcGVyYXRlcwogCSAqICAgICAgICAgICAgb24KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KGZpbmFsIEVudHJ5W10gbGlzdCkgeworCXByb3RlY3RlZCB2b2lkIGluaXQoRW50cnlbXSBsaXN0KSB7CiAJCS8vIEZpbHRlciBvdXQgbnVsbHMsIC4gYW5kIC4uIGFzIHRoZXNlIGFyZSBub3QgdmFsaWQgdHJlZSBlbnRyaWVzLAogCQkvLyBhbHNvIGNhY2hlIHRoZSBlbmNvZGVkIGZvcm1zIG9mIHRoZSBwYXRoIG5hbWVzIGZvciBlZmZpY2llbnQgdXNlCiAJCS8vIGxhdGVyIG9uIGR1cmluZyBzb3J0aW5nIGFuZCBpdGVyYXRpb24uCkBAIC04MzgsNyArODY5LDcgQEAKIAkgKiAgICAgICAgICAgIGFuIGludC4KIAkgKiBAcmV0dXJuIHRydWUgaWYgZGlmZmVyZW50LCBmYWxzZSBvdGhlcndpc2UKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01vZGVEaWZmZXJlbnQoZmluYWwgaW50IHJhd01vZGUpIHsKKwlwdWJsaWMgYm9vbGVhbiBpc01vZGVEaWZmZXJlbnQoaW50IHJhd01vZGUpIHsKIAkJLy8gRGV0ZXJtaW5lIGRpZmZlcmVuY2UgaW4gbW9kZS1iaXRzIG9mIGZpbGUgYW5kIGluZGV4LWVudHJ5LiBJbiB0aGUKIAkJLy8gYml0d2lzZSBwcmVzZW50YXRpb24gb2YgbW9kZURpZmYgd2UnbGwgaGF2ZSBhICcxJyB3aGVuIHRoZSB0d28gbW9kZXMKIAkJLy8gZGlmZmVyIGF0IHRoaXMgcG9zaXRpb24uCkBAIC05OTIsNyArMTAyMyw3IEBACiAJICogICAgICAgICAgICBhdmFpbGFibGUgYXQgdGhpcyBpdGVyYXRvcidzIGN1cnJlbnQgZW50cnkKIAkgKiBAcmV0dXJuIGluZGV4IGZpbGUgbW9kZQogCSAqLwotCXB1YmxpYyBGaWxlTW9kZSBnZXRJbmRleEZpbGVNb2RlKGZpbmFsIERpckNhY2hlSXRlcmF0b3IgaW5kZXhJdGVyKSB7CisJcHVibGljIEZpbGVNb2RlIGdldEluZGV4RmlsZU1vZGUoRGlyQ2FjaGVJdGVyYXRvciBpbmRleEl0ZXIpIHsKIAkJZmluYWwgRmlsZU1vZGUgd3RNb2RlID0gZ2V0RW50cnlGaWxlTW9kZSgpOwogCQlpZiAoaW5kZXhJdGVyID09IG51bGwpIHsKIAkJCXJldHVybiB3dE1vZGU7CkBAIC0xMTczLDEzICsxMjA0LDE3IEBACiAJCXJldHVybiBjb250ZW50RGlnZXN0LmRpZ2VzdCgpOwogCX0KIAotCS8qKiBBIHNpbmdsZSBlbnRyeSB3aXRoaW4gYSB3b3JraW5nIGRpcmVjdG9yeSB0cmVlLiAqLwotCXByb3RlY3RlZCBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgRW50cnkgeworCS8qKgorCSAqIEEgc2luZ2xlIGVudHJ5IHdpdGhpbiBhIHdvcmtpbmcgZGlyZWN0b3J5IHRyZWUuCisJICoKKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBFbnRyeSB7CiAJCWJ5dGVbXSBlbmNvZGVkTmFtZTsKIAogCQlpbnQgZW5jb2RlZE5hbWVMZW47CiAKLQkJdm9pZCBlbmNvZGVOYW1lKGZpbmFsIENoYXJzZXRFbmNvZGVyIGVuYykgeworCQl2b2lkIGVuY29kZU5hbWUoQ2hhcnNldEVuY29kZXIgZW5jKSB7CiAJCQlmaW5hbCBCeXRlQnVmZmVyIGI7CiAJCQl0cnkgewogCQkJCWIgPSBlbmMuZW5jb2RlKENoYXJCdWZmZXIud3JhcChnZXROYW1lKCkpKTsKQEAgLTEyODAsMTEgKzEzMTUsOCBAQAogCiAJCUlnbm9yZU5vZGUgbG9hZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlJZ25vcmVOb2RlIHIgPSBuZXcgSWdub3JlTm9kZSgpOwotCQkJSW5wdXRTdHJlYW0gaW4gPSBlbnRyeS5vcGVuSW5wdXRTdHJlYW0oKTsKLQkJCXRyeSB7CisJCQl0cnkgKElucHV0U3RyZWFtIGluID0gZW50cnkub3BlbklucHV0U3RyZWFtKCkpIHsKIAkJCQlyLnBhcnNlKGluKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaW4uY2xvc2UoKTsKIAkJCX0KIAkJCXJldHVybiByLmdldFJ1bGVzKCkuaXNFbXB0eSgpID8gbnVsbCA6IHI7CiAJCX0KQEAgLTEzMzIsMTEgKzEzNjQsOCBAQAogCQlwcml2YXRlIHN0YXRpYyB2b2lkIGxvYWRSdWxlc0Zyb21GaWxlKElnbm9yZU5vZGUgciwgRmlsZSBleGNsdWRlKQogCQkJCXRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJCWlmIChGUy5ERVRFQ1RFRC5leGlzdHMoZXhjbHVkZSkpIHsKLQkJCQlGaWxlSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGV4Y2x1ZGUpOwotCQkJCXRyeSB7CisJCQkJdHJ5IChGaWxlSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGV4Y2x1ZGUpKSB7CiAJCQkJCXIucGFyc2UoaW4pOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWluLmNsb3NlKCk7CiAJCQkJfQogCQkJfQogCQl9CkBAIC0xMzUzLDExICsxMzgyLDggQEAKIAogCQlBdHRyaWJ1dGVzTm9kZSBsb2FkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCUF0dHJpYnV0ZXNOb2RlIHIgPSBuZXcgQXR0cmlidXRlc05vZGUoKTsKLQkJCUlucHV0U3RyZWFtIGluID0gZW50cnkub3BlbklucHV0U3RyZWFtKCk7Ci0JCQl0cnkgeworCQkJdHJ5IChJbnB1dFN0cmVhbSBpbiA9IGVudHJ5Lm9wZW5JbnB1dFN0cmVhbSgpKSB7CiAJCQkJci5wYXJzZShpbik7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWluLmNsb3NlKCk7CiAJCQl9CiAJCQlyZXR1cm4gci5nZXRSdWxlcygpLmlzRW1wdHkoKSA/IG51bGwgOiByOwogCQl9CkBAIC0xMzc4LDcgKzE0MDQsMTAgQEAKIAkJVHJlZVdhbGsgd2FsazsKIAogCQkvKiogUG9zaXRpb24gb2YgdGhlIG1hdGNoaW5nIHtAbGluayBEaXJDYWNoZUl0ZXJhdG9yfS4gKi8KLQkJaW50IGRpckNhY2hlVHJlZTsKKwkJaW50IGRpckNhY2hlVHJlZSA9IC0xOworCisJCS8qKiBXaGV0aGVyIHRoZSBpdGVyYXRvciBzaGFsbCB3YWxrIGlnbm9yZWQgZGlyZWN0b3JpZXMuICovCisJCWJvb2xlYW4gd2Fsa0lnbm9yZWQgPSBmYWxzZTsKIAogCQlmaW5hbCBNYXA8U3RyaW5nLCBCb29sZWFuPiBkaXJlY3RvcnlUb0lnbm9yZWQgPSBuZXcgSGFzaE1hcDw+KCk7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvV29ya2luZ1RyZWVPcHRpb25zLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1dvcmtpbmdUcmVlT3B0aW9ucy5qYXZhCmluZGV4IDJkZmIyMDMuLjg0NmZiNmUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvV29ya2luZ1RyZWVPcHRpb25zLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9Xb3JraW5nVHJlZU9wdGlvbnMuamF2YQpAQCAtNzQsNyArNzQsNyBAQAogCiAJcHJpdmF0ZSBmaW5hbCBib29sZWFuIGRpck5vR2l0TGlua3M7CiAKLQlwcml2YXRlIFdvcmtpbmdUcmVlT3B0aW9ucyhmaW5hbCBDb25maWcgcmMpIHsKKwlwcml2YXRlIFdvcmtpbmdUcmVlT3B0aW9ucyhDb25maWcgcmMpIHsKIAkJZmlsZU1vZGUgPSByYy5nZXRCb29sZWFuKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfQ09SRV9TRUNUSU9OLAogCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX0ZJTEVNT0RFLCB0cnVlKTsKIAkJYXV0b0NSTEYgPSByYy5nZXRFbnVtKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfQ09SRV9TRUNUSU9OLCBudWxsLApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvQW5kVHJlZUZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvQW5kVHJlZUZpbHRlci5qYXZhCmluZGV4IDZkNDBhNGUuLmE5NjBiZDcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL0FuZFRyZWVGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9BbmRUcmVlRmlsdGVyLmphdmEKQEAgLTcxLDcgKzcxLDcgQEAKIAkgKiAgICAgICAgICAgIHNlY29uZCBmaWx0ZXIgdG8gdGVzdC4KIAkgKiBAcmV0dXJuIGEgZmlsdGVyIHRoYXQgbXVzdCBtYXRjaCBib3RoIGlucHV0IGZpbHRlcnMuCiAJICovCi0JcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZShmaW5hbCBUcmVlRmlsdGVyIGEsIGZpbmFsIFRyZWVGaWx0ZXIgYikgeworCXB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGUoVHJlZUZpbHRlciBhLCBUcmVlRmlsdGVyIGIpIHsKIAkJaWYgKGEgPT0gQUxMKQogCQkJcmV0dXJuIGI7CiAJCWlmIChiID09IEFMTCkKQEAgLTg3LDcgKzg3LDcgQEAKIAkgKiAgICAgICAgICAgIGZpbHRlcnMuCiAJICogQHJldHVybiBhIGZpbHRlciB0aGF0IG11c3QgbWF0Y2ggYWxsIGlucHV0IGZpbHRlcnMuCiAJICovCi0JcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZShmaW5hbCBUcmVlRmlsdGVyW10gbGlzdCkgeworCXB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGUoVHJlZUZpbHRlcltdIGxpc3QpIHsKIAkJaWYgKGxpc3QubGVuZ3RoID09IDIpCiAJCQlyZXR1cm4gY3JlYXRlKGxpc3RbMF0sIGxpc3RbMV0pOwogCQlpZiAobGlzdC5sZW5ndGggPCAyKQpAQCAtMTA1LDcgKzEwNSw3IEBACiAJICogICAgICAgICAgICBmaWx0ZXJzLgogCSAqIEByZXR1cm4gYSBmaWx0ZXIgdGhhdCBtdXN0IG1hdGNoIGFsbCBpbnB1dCBmaWx0ZXJzLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGUoZmluYWwgQ29sbGVjdGlvbjxUcmVlRmlsdGVyPiBsaXN0KSB7CisJcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZShDb2xsZWN0aW9uPFRyZWVGaWx0ZXI+IGxpc3QpIHsKIAkJaWYgKGxpc3Quc2l6ZSgpIDwgMikKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkuYXRMZWFzdFR3b0ZpbHRlcnNOZWVkZWQpOwogCQlmaW5hbCBUcmVlRmlsdGVyW10gc3ViZmlsdGVycyA9IG5ldyBUcmVlRmlsdGVyW2xpc3Quc2l6ZSgpXTsKQEAgLTEyMCwxMyArMTIwLDEzIEBACiAKIAkJcHJpdmF0ZSBmaW5hbCBUcmVlRmlsdGVyIGI7CiAKLQkJQmluYXJ5KGZpbmFsIFRyZWVGaWx0ZXIgb25lLCBmaW5hbCBUcmVlRmlsdGVyIHR3bykgeworCQlCaW5hcnkoVHJlZUZpbHRlciBvbmUsIFRyZWVGaWx0ZXIgdHdvKSB7CiAJCQlhID0gb25lOwogCQkJYiA9IHR3bzsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFRyZWVXYWxrIHdhbGtlcikKKwkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShUcmVlV2FsayB3YWxrZXIpCiAJCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQkJSU9FeGNlcHRpb24gewogCQkJcmV0dXJuIG1hdGNoRmlsdGVyKHdhbGtlcikgPD0gMDsKQEAgLTE3MCwxMiArMTcwLDEyIEBACiAJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGlzdCBleHRlbmRzIEFuZFRyZWVGaWx0ZXIgewogCQlwcml2YXRlIGZpbmFsIFRyZWVGaWx0ZXJbXSBzdWJmaWx0ZXJzOwogCi0JCUxpc3QoZmluYWwgVHJlZUZpbHRlcltdIGxpc3QpIHsKKwkJTGlzdChUcmVlRmlsdGVyW10gbGlzdCkgewogCQkJc3ViZmlsdGVycyA9IGxpc3Q7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBUcmVlV2FsayB3YWxrZXIpCisJCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoVHJlZVdhbGsgd2Fsa2VyKQogCQkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJCUlPRXhjZXB0aW9uIHsKIAkJCXJldHVybiBtYXRjaEZpbHRlcih3YWxrZXIpIDw9IDA7CkBAIC0xODYsNyArMTg2LDcgQEAKIAkJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCQlJT0V4Y2VwdGlvbiB7CiAJCQlpbnQgbSA9IDA7Ci0JCQlmb3IgKGZpbmFsIFRyZWVGaWx0ZXIgZiA6IHN1YmZpbHRlcnMpIHsKKwkJCWZvciAoVHJlZUZpbHRlciBmIDogc3ViZmlsdGVycykgewogCQkJCWludCByID0gZi5tYXRjaEZpbHRlcih3YWxrZXIpOwogCQkJCWlmIChyID09IDEpIHsKIAkJCQkJcmV0dXJuIDE7CkBAIC0yMDAsNyArMjAwLDcgQEAKIAogCQlAT3ZlcnJpZGUKIAkJcHVibGljIGJvb2xlYW4gc2hvdWxkQmVSZWN1cnNpdmUoKSB7Ci0JCQlmb3IgKGZpbmFsIFRyZWVGaWx0ZXIgZiA6IHN1YmZpbHRlcnMpCisJCQlmb3IgKFRyZWVGaWx0ZXIgZiA6IHN1YmZpbHRlcnMpCiAJCQkJaWYgKGYuc2hvdWxkQmVSZWN1cnNpdmUoKSkKIAkJCQkJcmV0dXJuIHRydWU7CiAJCQlyZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9CeXRlQXJyYXlTZXQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL0J5dGVBcnJheVNldC5qYXZhCmluZGV4IDY1Mzc4NmIuLjk5NTU2MWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL0J5dGVBcnJheVNldC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL0J5dGVBcnJheVNldC5qYXZhCkBAIC03Nyw3ICs3Nyw3IEBACiAJCWluaXRUYWJsZSgxIDw8IEludGVnZXIuaGlnaGVzdE9uZUJpdCgoY2FwYWNpdHkgKiAyKSAtIDEpKTsKIAl9CiAKLQlwcml2YXRlIGJ5dGVbXSBnZXQoZmluYWwgYnl0ZVtdIHRvRmluZCwgaW50IGxlbmd0aCwgaW50IGhhc2gpIHsKKwlwcml2YXRlIGJ5dGVbXSBnZXQoYnl0ZVtdIHRvRmluZCwgaW50IGxlbmd0aCwgaW50IGhhc2gpIHsKIAkJZmluYWwgaW50IG1zayA9IG1hc2s7CiAJCWludCBpID0gaGFzaCAmIG1zazsKIAkJZmluYWwgYnl0ZVtdW10gdGJsID0gdGFibGU7CkBAIC0xMTIsNyArMTEyLDcgQEAKIAkgKiAgICAgICAgICAgIHByZS1jb21wdXRlZCBoYXNoIG9mIHRvRmluZAogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWFwcGluZyBleGlzdHMgZm9yIHRoaXMgYnl0ZSBhcnJheTsgZmFsc2Ugb3RoZXJ3aXNlLgogCSAqLwotCWJvb2xlYW4gY29udGFpbnMoZmluYWwgYnl0ZVtdIHRvRmluZCwgaW50IGxlbmd0aCwgaW50IGhhc2gpIHsKKwlib29sZWFuIGNvbnRhaW5zKGJ5dGVbXSB0b0ZpbmQsIGludCBsZW5ndGgsIGludCBoYXNoKSB7CiAJCXJldHVybiBnZXQodG9GaW5kLCBsZW5ndGgsIGhhc2gpICE9IG51bGw7CiAJfQogCkBAIC0xODAsNyArMTgwLDcgQEAKIAkJcmV0dXJuIHNpemUgPT0gMDsKIAl9CiAKLQlwcml2YXRlIHZvaWQgaW5zZXJ0KGZpbmFsIGJ5dGVbXSBuZXdWYWx1ZSwgaW50IGhhc2gpIHsKKwlwcml2YXRlIHZvaWQgaW5zZXJ0KGJ5dGVbXSBuZXdWYWx1ZSwgaW50IGhhc2gpIHsKIAkJZmluYWwgaW50IG1zayA9IG1hc2s7CiAJCWludCBqID0gaGFzaCAmIG1zazsKIAkJZmluYWwgYnl0ZVtdW10gdGJsID0gdGFibGU7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9JbnRlckluZGV4RGlmZkZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvSW50ZXJJbmRleERpZmZGaWx0ZXIuamF2YQppbmRleCA4MWI4ZTZkLi4zMzhlZTJiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9JbnRlckluZGV4RGlmZkZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL0ludGVySW5kZXhEaWZmRmlsdGVyLmphdmEKQEAgLTYzLDcgKzYzLDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBUcmVlV2FsayB3YWxrZXIpIHsKKwlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFRyZWVXYWxrIHdhbGtlcikgewogCQlmaW5hbCBpbnQgbiA9IHdhbGtlci5nZXRUcmVlQ291bnQoKTsKIAkJaWYgKG4gPT0gMSkgLy8gQXNzdW1lIHRoZXkgbWVhbnQgZGlmZmVyZW5jZSB0byBlbXB0eSB0cmVlLgogCQkJcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9Ob3RJZ25vcmVkRmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9Ob3RJZ25vcmVkRmlsdGVyLmphdmEKaW5kZXggMzQwM2M3OC4uNjA5MDUwOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvTm90SWdub3JlZEZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL05vdElnbm9yZWRGaWx0ZXIuamF2YQpAQCAtNjIsNyArNjIsNyBAQAogCSAqIEBwYXJhbSB3b3JrZGlyVHJlZUluZGV4CiAJICogICAgICAgICAgICBpbmRleCBvZiB0aGUgd29ya2RpciB0cmVlIGluIHRoZSB0cmVlIHdhbGsKIAkgKi8KLQlwdWJsaWMgTm90SWdub3JlZEZpbHRlcihmaW5hbCBpbnQgd29ya2RpclRyZWVJbmRleCkgeworCXB1YmxpYyBOb3RJZ25vcmVkRmlsdGVyKGludCB3b3JrZGlyVHJlZUluZGV4KSB7CiAJCXRoaXMuaW5kZXggPSB3b3JrZGlyVHJlZUluZGV4OwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvTm90VHJlZUZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvTm90VHJlZUZpbHRlci5qYXZhCmluZGV4IDJlMDIzZDAuLmQzMTU1MjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL05vdFRyZWVGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9Ob3RUcmVlRmlsdGVyLmphdmEKQEAgLTYxLDEzICs2MSwxMyBAQAogCSAqICAgICAgICAgICAgZmlsdGVyIHRvIG5lZ2F0ZS4KIAkgKiBAcmV0dXJuIGEgZmlsdGVyIHRoYXQgZG9lcyB0aGUgcmV2ZXJzZSBvZiA8Y29kZT5hPC9jb2RlPi4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlKGZpbmFsIFRyZWVGaWx0ZXIgYSkgeworCXB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGUoVHJlZUZpbHRlciBhKSB7CiAJCXJldHVybiBuZXcgTm90VHJlZUZpbHRlcihhKTsKIAl9CiAKIAlwcml2YXRlIGZpbmFsIFRyZWVGaWx0ZXIgYTsKIAotCXByaXZhdGUgTm90VHJlZUZpbHRlcihmaW5hbCBUcmVlRmlsdGVyIG9uZSkgeworCXByaXZhdGUgTm90VHJlZUZpbHRlcihUcmVlRmlsdGVyIG9uZSkgewogCQlhID0gb25lOwogCX0KIApAQCAtNzksNyArNzksNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFRyZWVXYWxrIHdhbGtlcikKKwlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFRyZWVXYWxrIHdhbGtlcikKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJSU9FeGNlcHRpb24gewogCQlyZXR1cm4gbWF0Y2hGaWx0ZXIod2Fsa2VyKSA9PSAwOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvT3JUcmVlRmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9PclRyZWVGaWx0ZXIuamF2YQppbmRleCBkYmIwNjJiLi4zMDhmZjBjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9PclRyZWVGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9PclRyZWVGaWx0ZXIuamF2YQpAQCAtNzEsNyArNzEsNyBAQAogCSAqICAgICAgICAgICAgc2Vjb25kIGZpbHRlciB0byB0ZXN0LgogCSAqIEByZXR1cm4gYSBmaWx0ZXIgdGhhdCBtdXN0IG1hdGNoIGF0IGxlYXN0IG9uZSBpbnB1dCBmaWx0ZXIuCiAJICovCi0JcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZShmaW5hbCBUcmVlRmlsdGVyIGEsIGZpbmFsIFRyZWVGaWx0ZXIgYikgeworCXB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGUoVHJlZUZpbHRlciBhLCBUcmVlRmlsdGVyIGIpIHsKIAkJaWYgKGEgPT0gQUxMIHx8IGIgPT0gQUxMKQogCQkJcmV0dXJuIEFMTDsKIAkJcmV0dXJuIG5ldyBCaW5hcnkoYSwgYik7CkBAIC04NSw3ICs4NSw3IEBACiAJICogICAgICAgICAgICBmaWx0ZXJzLgogCSAqIEByZXR1cm4gYSBmaWx0ZXIgdGhhdCBtdXN0IG1hdGNoIGF0IGxlYXN0IG9uZSBpbnB1dCBmaWx0ZXIuCiAJICovCi0JcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZShmaW5hbCBUcmVlRmlsdGVyW10gbGlzdCkgeworCXB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGUoVHJlZUZpbHRlcltdIGxpc3QpIHsKIAkJaWYgKGxpc3QubGVuZ3RoID09IDIpCiAJCQlyZXR1cm4gY3JlYXRlKGxpc3RbMF0sIGxpc3RbMV0pOwogCQlpZiAobGlzdC5sZW5ndGggPCAyKQpAQCAtMTAzLDcgKzEwMyw3IEBACiAJICogICAgICAgICAgICBmaWx0ZXJzLgogCSAqIEByZXR1cm4gYSBmaWx0ZXIgdGhhdCBtdXN0IG1hdGNoIGF0IGxlYXN0IG9uZSBpbnB1dCBmaWx0ZXIuCiAJICovCi0JcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZShmaW5hbCBDb2xsZWN0aW9uPFRyZWVGaWx0ZXI+IGxpc3QpIHsKKwlwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlKENvbGxlY3Rpb248VHJlZUZpbHRlcj4gbGlzdCkgewogCQlpZiAobGlzdC5zaXplKCkgPCAyKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS5hdExlYXN0VHdvRmlsdGVyc05lZWRlZCk7CiAJCWZpbmFsIFRyZWVGaWx0ZXJbXSBzdWJmaWx0ZXJzID0gbmV3IFRyZWVGaWx0ZXJbbGlzdC5zaXplKCldOwpAQCAtMTE4LDEzICsxMTgsMTMgQEAKIAogCQlwcml2YXRlIGZpbmFsIFRyZWVGaWx0ZXIgYjsKIAotCQlCaW5hcnkoZmluYWwgVHJlZUZpbHRlciBvbmUsIGZpbmFsIFRyZWVGaWx0ZXIgdHdvKSB7CisJCUJpbmFyeShUcmVlRmlsdGVyIG9uZSwgVHJlZUZpbHRlciB0d28pIHsKIAkJCWEgPSBvbmU7CiAJCQliID0gdHdvOwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgVHJlZVdhbGsgd2Fsa2VyKQorCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFRyZWVXYWxrIHdhbGtlcikKIAkJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCQlJT0V4Y2VwdGlvbiB7CiAJCQlyZXR1cm4gbWF0Y2hGaWx0ZXIod2Fsa2VyKSA8PSAwOwpAQCAtMTY4LDEyICsxNjgsMTIgQEAKIAlwcml2YXRlIHN0YXRpYyBjbGFzcyBMaXN0IGV4dGVuZHMgT3JUcmVlRmlsdGVyIHsKIAkJcHJpdmF0ZSBmaW5hbCBUcmVlRmlsdGVyW10gc3ViZmlsdGVyczsKIAotCQlMaXN0KGZpbmFsIFRyZWVGaWx0ZXJbXSBsaXN0KSB7CisJCUxpc3QoVHJlZUZpbHRlcltdIGxpc3QpIHsKIAkJCXN1YmZpbHRlcnMgPSBsaXN0OwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgVHJlZVdhbGsgd2Fsa2VyKQorCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFRyZWVXYWxrIHdhbGtlcikKIAkJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCQlJT0V4Y2VwdGlvbiB7CiAJCQlyZXR1cm4gbWF0Y2hGaWx0ZXIod2Fsa2VyKSA8PSAwOwpAQCAtMTg0LDcgKzE4NCw3IEBACiAJCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQkJSU9FeGNlcHRpb24gewogCQkJaW50IG0gPSAxOwotCQkJZm9yIChmaW5hbCBUcmVlRmlsdGVyIGYgOiBzdWJmaWx0ZXJzKSB7CisJCQlmb3IgKFRyZWVGaWx0ZXIgZiA6IHN1YmZpbHRlcnMpIHsKIAkJCQlpbnQgciA9IGYubWF0Y2hGaWx0ZXIod2Fsa2VyKTsKIAkJCQlpZiAociA9PSAwKSB7CiAJCQkJCXJldHVybiAwOwpAQCAtMTk4LDcgKzE5OCw3IEBACiAKIAkJQE92ZXJyaWRlCiAJCXB1YmxpYyBib29sZWFuIHNob3VsZEJlUmVjdXJzaXZlKCkgewotCQkJZm9yIChmaW5hbCBUcmVlRmlsdGVyIGYgOiBzdWJmaWx0ZXJzKQorCQkJZm9yIChUcmVlRmlsdGVyIGYgOiBzdWJmaWx0ZXJzKQogCQkJCWlmIChmLnNob3VsZEJlUmVjdXJzaXZlKCkpCiAJCQkJCXJldHVybiB0cnVlOwogCQkJcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aEZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aEZpbHRlci5qYXZhCmluZGV4IDJmN2Y1Y2QuLjkyNjdmYjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1BhdGhGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9QYXRoRmlsdGVyLmphdmEKQEAgLTg2LDcgKzg2LDcgQEAKIAogCWZpbmFsIGJ5dGVbXSBwYXRoUmF3OwogCi0JcHJpdmF0ZSBQYXRoRmlsdGVyKGZpbmFsIFN0cmluZyBzKSB7CisJcHJpdmF0ZSBQYXRoRmlsdGVyKFN0cmluZyBzKSB7CiAJCXBhdGhTdHIgPSBzOwogCQlwYXRoUmF3ID0gQ29uc3RhbnRzLmVuY29kZShwYXRoU3RyKTsKIAl9CkBAIC0xMDIsMjAgKzEwMiwyMCBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFRyZWVXYWxrIHdhbGtlcikgeworCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoVHJlZVdhbGsgd2Fsa2VyKSB7CiAJCXJldHVybiBtYXRjaEZpbHRlcih3YWxrZXIpIDw9IDA7CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IG1hdGNoRmlsdGVyKGZpbmFsIFRyZWVXYWxrIHdhbGtlcikgeworCXB1YmxpYyBpbnQgbWF0Y2hGaWx0ZXIoVHJlZVdhbGsgd2Fsa2VyKSB7CiAJCXJldHVybiB3YWxrZXIuaXNQYXRoTWF0Y2gocGF0aFJhdywgcGF0aFJhdy5sZW5ndGgpOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gc2hvdWxkQmVSZWN1cnNpdmUoKSB7Ci0JCWZvciAoZmluYWwgYnl0ZSBiIDogcGF0aFJhdykKKwkJZm9yIChieXRlIGIgOiBwYXRoUmF3KQogCQkJaWYgKGIgPT0gJy8nKQogCQkJCXJldHVybiB0cnVlOwogCQlyZXR1cm4gZmFsc2U7CkBAIC0xNDMsNyArMTQzLDcgQEAKIAkgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgcGF0aCBsZW5ndGggb2YgdGhpcyBmaWx0ZXIgbWF0Y2hlcyB0aGUgbGVuZ3RoCiAJICogICAgICAgICBvZiB0aGUgY3VycmVudCBwYXRoIG9mIHRoZSBzdXBwbGllZCBUcmVlV2Fsay4KIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RvbmUoZmluYWwgVHJlZVdhbGsgd2Fsa2VyKSB7CisJcHVibGljIGJvb2xlYW4gaXNEb25lKFRyZWVXYWxrIHdhbGtlcikgewogCQlyZXR1cm4gcGF0aFJhdy5sZW5ndGggPT0gd2Fsa2VyLmdldFBhdGhMZW5ndGgoKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9QYXRoRmlsdGVyR3JvdXAuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1BhdGhGaWx0ZXJHcm91cC5qYXZhCmluZGV4IDA2NTIyODguLjVjZjU3NTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1BhdGhGaWx0ZXJHcm91cC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1BhdGhGaWx0ZXJHcm91cC5qYXZhCkBAIC04MiwxMyArODIsMTMgQEAKIAkgKiAgICAgICAgICAgIHRoZSBwYXRocyB0byB0ZXN0IGFnYWluc3QuIE11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgZW50cnkuCiAJICogQHJldHVybiBhIG5ldyBmaWx0ZXIgZm9yIHRoZSBsaXN0IG9mIHBhdGhzIHN1cHBsaWVkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGVGcm9tU3RyaW5ncyhmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gcGF0aHMpIHsKKwlwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlRnJvbVN0cmluZ3MoQ29sbGVjdGlvbjxTdHJpbmc+IHBhdGhzKSB7CiAJCWlmIChwYXRocy5pc0VtcHR5KCkpCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAogCQkJCQlKR2l0VGV4dC5nZXQoKS5hdExlYXN0T25lUGF0aElzUmVxdWlyZWQpOwogCQlmaW5hbCBQYXRoRmlsdGVyW10gcCA9IG5ldyBQYXRoRmlsdGVyW3BhdGhzLnNpemUoKV07CiAJCWludCBpID0gMDsKLQkJZm9yIChmaW5hbCBTdHJpbmcgcyA6IHBhdGhzKQorCQlmb3IgKFN0cmluZyBzIDogcGF0aHMpCiAJCQlwW2krK10gPSBQYXRoRmlsdGVyLmNyZWF0ZShzKTsKIAkJcmV0dXJuIGNyZWF0ZShwKTsKIAl9CkBAIC0xMDksNyArMTA5LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBwYXRocyB0byB0ZXN0IGFnYWluc3QuIE11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgZW50cnkuCiAJICogQHJldHVybiBhIG5ldyBmaWx0ZXIgZm9yIHRoZSBwYXRocyBzdXBwbGllZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlRnJvbVN0cmluZ3MoZmluYWwgU3RyaW5nLi4uIHBhdGhzKSB7CisJcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZUZyb21TdHJpbmdzKFN0cmluZy4uLiBwYXRocykgewogCQlpZiAocGF0aHMubGVuZ3RoID09IDApCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAogCQkJCQlKR2l0VGV4dC5nZXQoKS5hdExlYXN0T25lUGF0aElzUmVxdWlyZWQpOwpAQCAtMTMxLDcgKzEzMSw3IEBACiAJICogICAgICAgICAgICB0aGUgcGF0aHMgdG8gdGVzdCBhZ2FpbnN0LiBNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGVudHJ5LgogCSAqIEByZXR1cm4gYSBuZXcgZmlsdGVyIGZvciB0aGUgbGlzdCBvZiBwYXRocyBzdXBwbGllZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlKGZpbmFsIENvbGxlY3Rpb248UGF0aEZpbHRlcj4gcGF0aHMpIHsKKwlwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlKENvbGxlY3Rpb248UGF0aEZpbHRlcj4gcGF0aHMpIHsKIAkJaWYgKHBhdGhzLmlzRW1wdHkoKSkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCiAJCQkJCUpHaXRUZXh0LmdldCgpLmF0TGVhc3RPbmVQYXRoSXNSZXF1aXJlZCk7CkBAIC0xNDAsNyArMTQwLDcgQEAKIAkJcmV0dXJuIGNyZWF0ZShwKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZShmaW5hbCBQYXRoRmlsdGVyW10gcCkgeworCXByaXZhdGUgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlKFBhdGhGaWx0ZXJbXSBwKSB7CiAJCWlmIChwLmxlbmd0aCA9PSAxKQogCQkJcmV0dXJuIG5ldyBTaW5nbGUocFswXSk7CiAJCXJldHVybiBuZXcgR3JvdXAocCk7CkBAIC0xNTEsMTMgKzE1MSwxMyBAQAogCiAJCXByaXZhdGUgZmluYWwgYnl0ZVtdIHJhdzsKIAotCQlwcml2YXRlIFNpbmdsZShmaW5hbCBQYXRoRmlsdGVyIHApIHsKKwkJcHJpdmF0ZSBTaW5nbGUoUGF0aEZpbHRlciBwKSB7CiAJCQlwYXRoID0gcDsKIAkJCXJhdyA9IHBhdGgucGF0aFJhdzsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFRyZWVXYWxrIHdhbGtlcikgeworCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFRyZWVXYWxrIHdhbGtlcikgewogCQkJZmluYWwgaW50IGNtcCA9IHdhbGtlci5pc1BhdGhQcmVmaXgocmF3LCByYXcubGVuZ3RoKTsKIAkJCWlmIChjbXAgPiAwKQogCQkJCXRocm93IFN0b3BXYWxrRXhjZXB0aW9uLklOU1RBTkNFOwpAQCAtMTg4LDcgKzE4OCw3IEBACiAKIAkJcHJpdmF0ZSBieXRlW10gbWF4OwogCi0JCXByaXZhdGUgR3JvdXAoZmluYWwgUGF0aEZpbHRlcltdIHBhdGhGaWx0ZXJzKSB7CisJCXByaXZhdGUgR3JvdXAoUGF0aEZpbHRlcltdIHBhdGhGaWx0ZXJzKSB7CiAJCQlmdWxscGF0aHMgPSBuZXcgQnl0ZUFycmF5U2V0KHBhdGhGaWx0ZXJzLmxlbmd0aCk7CiAJCQlwcmVmaXhlcyA9IG5ldyBCeXRlQXJyYXlTZXQocGF0aEZpbHRlcnMubGVuZ3RoIC8gNSk7CiAJCQkvLyA1IGlzIGFuIGVtcGlyaWNhbGx5IGRlcml2ZWQgcmF0aW8gb2YgI3BhdGhzLyNwcmVmaXhlcyBmcm9tOgpAQCAtMjM5LDcgKzIzOSw3IEBACiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBUcmVlV2FsayB3YWxrZXIpIHsKKwkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShUcmVlV2FsayB3YWxrZXIpIHsKIAogCQkJYnl0ZVtdIHJwID0gd2Fsa2VyLmdldFJhd1BhdGgoKTsKIAkJCUhhc2hlciBoYXNoZXIgPSBuZXcgSGFzaGVyKHJwLCB3YWxrZXIuZ2V0UGF0aExlbmd0aCgpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1BhdGhTdWZmaXhGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1BhdGhTdWZmaXhGaWx0ZXIuamF2YQppbmRleCA1NTNlNmJkLi4zZDlmODc1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9QYXRoU3VmZml4RmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aFN1ZmZpeEZpbHRlci5qYXZhCkBAIC04NCw3ICs4NCw3IEBACiAJZmluYWwgU3RyaW5nIHBhdGhTdHI7CiAJZmluYWwgYnl0ZVtdIHBhdGhSYXc7CiAKLQlwcml2YXRlIFBhdGhTdWZmaXhGaWx0ZXIoZmluYWwgU3RyaW5nIHMpIHsKKwlwcml2YXRlIFBhdGhTdWZmaXhGaWx0ZXIoU3RyaW5nIHMpIHsKIAkJcGF0aFN0ciA9IHM7CiAJCXBhdGhSYXcgPSBDb25zdGFudHMuZW5jb2RlKHBhdGhTdHIpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1RyZWVGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1RyZWVGaWx0ZXIuamF2YQppbmRleCBmMGE3NjMyLi4xMWFkNDY1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9UcmVlRmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvVHJlZUZpbHRlci5qYXZhCkBAIC05MSw3ICs5MSw3IEBACiAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBBbGxGaWx0ZXIgZXh0ZW5kcyBUcmVlRmlsdGVyIHsKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgVHJlZVdhbGsgd2Fsa2VyKSB7CisJCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoVHJlZVdhbGsgd2Fsa2VyKSB7CiAJCQlyZXR1cm4gdHJ1ZTsKIAkJfQogCkBAIC0xMzMsNyArMTMzLDcgQEAKIAkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGJhc2VUcmVlID0gMDsKIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBUcmVlV2FsayB3YWxrZXIpIHsKKwkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShUcmVlV2FsayB3YWxrZXIpIHsKIAkJCWZpbmFsIGludCBuID0gd2Fsa2VyLmdldFRyZWVDb3VudCgpOwogCQkJaWYgKG4gPT0gMSkgLy8gQXNzdW1lIHRoZXkgbWVhbnQgZGlmZmVyZW5jZSB0byBlbXB0eSB0cmVlLgogCQkJCXJldHVybiB0cnVlOwpAQCAtMjIxLDcgKzIyMSw3IEBACiAJICogICAgICAgICAgICAgYXMgdGhyb3duIGJ5IHtAbGluayAjaW5jbHVkZShUcmVlV2Fsayl9CiAJICogQHNpbmNlIDQuNwogCSAqLwotCXB1YmxpYyBpbnQgbWF0Y2hGaWx0ZXIoZmluYWwgVHJlZVdhbGsgd2Fsa2VyKQorCXB1YmxpYyBpbnQgbWF0Y2hGaWx0ZXIoVHJlZVdhbGsgd2Fsa2VyKQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQlJT0V4Y2VwdGlvbgogCXsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9CYXNlNjQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9CYXNlNjQuamF2YQppbmRleCAwYzI3Y2VkLi40NDJmMDc5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvQmFzZTY0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0Jhc2U2NC5qYXZhCkBAIC02LDkgKzYsOCBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudXRpbDsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogCi1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiAKQEAgLTU1LDcgKzU0LDcgQEAKIAkJCQkrICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIgLy8gLy8kTk9OLU5MUy0xJAogCQkJCSsgIjAxMjM0NTY3ODkiIC8vIC8vJE5PTi1OTFMtMSQKIAkJCQkrICIrLyIgLy8gLy8kTk9OLU5MUy0xJAotCQkpLmdldEJ5dGVzKFVURl84KTsKKwkJKS5nZXRCeXRlcyhDSEFSU0VUKTsKIAogCQlERUMgPSBuZXcgYnl0ZVsxMjhdOwogCQlBcnJheXMuZmlsbChERUMsIElOVkFMSURfREVDKTsKQEAgLTE3OCw3ICsxNzcsNyBAQAogCQkJZSArPSA0OwogCQl9CiAKLQkJcmV0dXJuIG5ldyBTdHJpbmcob3V0QnVmZiwgMCwgZSwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisJCXJldHVybiBuZXcgU3RyaW5nKG91dEJ1ZmYsIDAsIGUsIENIQVJTRVQpOwogCX0KIAogCS8qKgpAQCAtMjk0LDcgKzI5Myw3IEBACiAJICogQHJldHVybiB0aGUgZGVjb2RlZCBkYXRhCiAJICovCiAJcHVibGljIHN0YXRpYyBieXRlW10gZGVjb2RlKFN0cmluZyBzKSB7Ci0JCWJ5dGVbXSBieXRlcyA9IHMuZ2V0Qnl0ZXMoVVRGXzgpOworCQlieXRlW10gYnl0ZXMgPSBzLmdldEJ5dGVzKENIQVJTRVQpOwogCQlyZXR1cm4gZGVjb2RlKGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9DYWNoZWRBdXRoZW50aWNhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvQ2FjaGVkQXV0aGVudGljYXRvci5qYXZhCmluZGV4IDk5MTViZGYuLjZiNTg3OTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9DYWNoZWRBdXRoZW50aWNhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0NhY2hlZEF1dGhlbnRpY2F0b3IuamF2YQpAQCAtNjEsNyArNjEsNyBAQAogCSAqIEBwYXJhbSBjYQogCSAqICAgICAgICAgICAgdGhlIGluZm9ybWF0aW9uIHdlIHNob3VsZCByZW1lbWJlci4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkKGZpbmFsIENhY2hlZEF1dGhlbnRpY2F0aW9uIGNhKSB7CisJcHVibGljIHN0YXRpYyB2b2lkIGFkZChDYWNoZWRBdXRoZW50aWNhdGlvbiBjYSkgewogCQljYWNoZWQuYWRkKGNhKTsKIAl9CiAKQEAgLTcwLDcgKzcwLDcgQEAKIAlwcm90ZWN0ZWQgZmluYWwgUGFzc3dvcmRBdXRoZW50aWNhdGlvbiBnZXRQYXNzd29yZEF1dGhlbnRpY2F0aW9uKCkgewogCQlmaW5hbCBTdHJpbmcgaG9zdCA9IGdldFJlcXVlc3RpbmdIb3N0KCk7CiAJCWZpbmFsIGludCBwb3J0ID0gZ2V0UmVxdWVzdGluZ1BvcnQoKTsKLQkJZm9yIChmaW5hbCBDYWNoZWRBdXRoZW50aWNhdGlvbiBjYSA6IGNhY2hlZCkgeworCQlmb3IgKENhY2hlZEF1dGhlbnRpY2F0aW9uIGNhIDogY2FjaGVkKSB7CiAJCQlpZiAoY2EuaG9zdC5lcXVhbHMoaG9zdCkgJiYgY2EucG9ydCA9PSBwb3J0KQogCQkJCXJldHVybiBjYS50b1Bhc3N3b3JkQXV0aGVudGljYXRpb24oKTsKIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZTLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRlMuamF2YQppbmRleCA1NmY3YWNiLi44OTQ4ZTYwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRlMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRlMuamF2YQpAQCAtNzUsNiArNzUsOSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuSkdpdFRleHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5GaWxlVHJlZUl0ZXJhdG9yLkZpbGVFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLkZpbGVUcmVlSXRlcmF0b3IuRmlsZU1vZGVTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLldvcmtpbmdUcmVlSXRlcmF0b3IuRW50cnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlByb2Nlc3NSZXN1bHQuU3RhdHVzOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CkBAIC04Niw2ICs4OSwxNCBAQAogCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihGUy5jbGFzcyk7CiAKIAkvKioKKwkgKiBBbiBlbXB0eSBhcnJheSBvZiBlbnRyaWVzLCBzdWl0YWJsZSBhcyBhIHJldHVybiB2YWx1ZSBmb3IKKwkgKiB7QGxpbmsgI2xpc3QoRmlsZSwgRmlsZU1vZGVTdHJhdGVneSl9LgorCSAqCisJICogQHNpbmNlIDUuMAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRW50cnlbXSBOT19FTlRSSUVTID0ge307CisKKwkvKioKIAkgKiBUaGlzIGNsYXNzIGNyZWF0ZXMgRlMgaW5zdGFuY2VzLiBJdCB3aWxsIGJlIG92ZXJyaWRkZW4gYnkgYSBKYXZhNyB2YXJpYW50CiAJICogaWYgc3VjaCBjYW4gYmUgZGV0ZWN0ZWQgaW4ge0BsaW5rICNkZXRlY3QoQm9vbGVhbil9LgogCSAqCkBAIC0zODMsNyArMzk0LDcgQEAKIAkgKiBAcmV0dXJuIHRoZSB0cmFuc2xhdGVkIHBhdGguIDxjb2RlPm5ldyBGaWxlKGRpcixuYW1lKTwvY29kZT4gaWYgdGhpcwogCSAqICAgICAgICAgcGxhdGZvcm0gZG9lcyBub3QgcmVxdWlyZSBwYXRoIG5hbWUgdHJhbnNsYXRpb24uCiAJICovCi0JcHVibGljIEZpbGUgcmVzb2x2ZShmaW5hbCBGaWxlIGRpciwgZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlwdWJsaWMgRmlsZSByZXNvbHZlKEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgewogCQlmaW5hbCBGaWxlIGFic3BuID0gbmV3IEZpbGUobmFtZSk7CiAJCWlmIChhYnNwbi5pc0Fic29sdXRlKCkpCiAJCQlyZXR1cm4gYWJzcG47CkBAIC00NTksMTEgKzQ3MCwxMSBAQAogCSAqIEByZXR1cm4gdGhlIGZpcnN0IG1hdGNoIGZvdW5kLCBvciBudWxsCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgRmlsZSBzZWFyY2hQYXRoKGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBTdHJpbmcuLi4gbG9va0ZvcikgeworCXByb3RlY3RlZCBzdGF0aWMgRmlsZSBzZWFyY2hQYXRoKFN0cmluZyBwYXRoLCBTdHJpbmcuLi4gbG9va0ZvcikgewogCQlpZiAocGF0aCA9PSBudWxsKQogCQkJcmV0dXJuIG51bGw7CiAKLQkJZm9yIChmaW5hbCBTdHJpbmcgcCA6IHBhdGguc3BsaXQoRmlsZS5wYXRoU2VwYXJhdG9yKSkgeworCQlmb3IgKFN0cmluZyBwIDogcGF0aC5zcGxpdChGaWxlLnBhdGhTZXBhcmF0b3IpKSB7CiAJCQlmb3IgKFN0cmluZyBjb21tYW5kIDogbG9va0ZvcikgewogCQkJCWZpbmFsIEZpbGUgZSA9IG5ldyBGaWxlKHAsIGNvbW1hbmQpOwogCQkJCWlmIChlLmlzRmlsZSgpKQpAQCAtOTYxLDYgKzk3MiwyOSBAQAogCX0KIAogCS8qKgorCSAqIEVudW1lcmF0ZXMgY2hpbGRyZW4gb2YgYSBkaXJlY3RvcnkuCisJICoKKwkgKiBAcGFyYW0gZGlyZWN0b3J5CisJICogICAgICAgICAgICB0byBnZXQgdGhlIGNoaWxkcmVuIG9mCisJICogQHBhcmFtIGZpbGVNb2RlU3RyYXRlZ3kKKwkgKiAgICAgICAgICAgIHRvIHVzZSB0byBjYWxjdWxhdGUgdGhlIGdpdCBtb2RlIG9mIGEgY2hpbGQKKwkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGVudHJpZXMgZm9yIHRoZSBjaGlsZHJlbgorCSAqCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyBFbnRyeVtdIGxpc3QoRmlsZSBkaXJlY3RvcnksIEZpbGVNb2RlU3RyYXRlZ3kgZmlsZU1vZGVTdHJhdGVneSkgeworCQlmaW5hbCBGaWxlW10gYWxsID0gZGlyZWN0b3J5Lmxpc3RGaWxlcygpOworCQlpZiAoYWxsID09IG51bGwpIHsKKwkJCXJldHVybiBOT19FTlRSSUVTOworCQl9CisJCWZpbmFsIEVudHJ5W10gcmVzdWx0ID0gbmV3IEVudHJ5W2FsbC5sZW5ndGhdOworCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgeworCQkJcmVzdWx0W2ldID0gbmV3IEZpbGVFbnRyeShhbGxbaV0sIHRoaXMsIGZpbGVNb2RlU3RyYXRlZ3kpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCiAJICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGhvb2sgaXMgZGVmaW5lZCBmb3IgdGhlIGdpdmVuIHJlcG9zaXRvcnksIHRoZW4KIAkgKiBydW5zIGl0IHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4KIAkgKiA8cD4KQEAgLTEwOTcsNyArMTEzMSw3IEBACiAJICogICAgICAgICBleGlzdHMgaW4gdGhlIGdpdmVuIHJlcG9zaXRvcnksIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KIAkgKiBAc2luY2UgNC4wCiAJICovCi0JcHVibGljIEZpbGUgZmluZEhvb2soUmVwb3NpdG9yeSByZXBvc2l0b3J5LCBmaW5hbCBTdHJpbmcgaG9va05hbWUpIHsKKwlwdWJsaWMgRmlsZSBmaW5kSG9vayhSZXBvc2l0b3J5IHJlcG9zaXRvcnksIFN0cmluZyBob29rTmFtZSkgewogCQlGaWxlIGdpdERpciA9IHJlcG9zaXRvcnkuZ2V0RGlyZWN0b3J5KCk7CiAJCWlmIChnaXREaXIgPT0gbnVsbCkKIAkJCXJldHVybiBudWxsOwpAQCAtMTE4MiwxOSArMTIxNiwyMyBAQAogCQkJCQluZXcgU3RyZWFtR29iYmxlcihwcm9jZXNzLmdldEVycm9yU3RyZWFtKCksIGVyclJlZGlyZWN0KSk7CiAJCQlleGVjdXRvci5leGVjdXRlKAogCQkJCQluZXcgU3RyZWFtR29iYmxlcihwcm9jZXNzLmdldElucHV0U3RyZWFtKCksIG91dFJlZGlyZWN0KSk7CisJCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBDbG9zZWQgaW4gdGhlIGZpbmFsbHkgYmxvY2sKIAkJCU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBwcm9jZXNzLmdldE91dHB1dFN0cmVhbSgpOwotCQkJaWYgKGluUmVkaXJlY3QgIT0gbnVsbCkgewotCQkJCW5ldyBTdHJlYW1Hb2JibGVyKGluUmVkaXJlY3QsIG91dHB1dFN0cmVhbSkuY29weSgpOwotCQkJfQogCQkJdHJ5IHsKLQkJCQlvdXRwdXRTdHJlYW0uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBXaGVuIHRoZSBwcm9jZXNzIGV4aXRzIGJlZm9yZSBjb25zdW1pbmcgdGhlIGlucHV0LCB0aGUgT3V0cHV0U3RyZWFtCi0JCQkJLy8gaXMgcmVwbGFjZWQgd2l0aCB0aGUgbnVsbCBvdXRwdXQgc3RyZWFtLiBUaGlzIG51bGwgb3V0cHV0IHN0cmVhbQotCQkJCS8vIHRocm93cyBJT0V4Y2VwdGlvbiBmb3IgYWxsIHdyaXRlIGNhbGxzLiBXaGVuIFN0cmVhbUdvYmJsZXIgZmFpbHMgdG8KLQkJCQkvLyBmbHVzaCB0aGUgYnVmZmVyIGJlY2F1c2Ugb2YgdGhpcywgdGhpcyBjbG9zZSBjYWxsIHRyaWVzIHRvIGZsdXNoIGl0Ci0JCQkJLy8gYWdhaW4uIFRoaXMgY2F1c2VzIGFub3RoZXIgSU9FeGNlcHRpb24uIFNpbmNlIHdlIGlnbm9yZSB0aGUKLQkJCQkvLyBJT0V4Y2VwdGlvbiBpbiBTdHJlYW1Hb2JibGVyLCB3ZSBhbHNvIGlnbm9yZSB0aGUgZXhjZXB0aW9uIGhlcmUuCisJCQkJaWYgKGluUmVkaXJlY3QgIT0gbnVsbCkgeworCQkJCQluZXcgU3RyZWFtR29iYmxlcihpblJlZGlyZWN0LCBvdXRwdXRTdHJlYW0pLmNvcHkoKTsKKwkJCQl9CisJCQl9IGZpbmFsbHkgeworCQkJCXRyeSB7CisJCQkJCW91dHB1dFN0cmVhbS5jbG9zZSgpOworCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gV2hlbiB0aGUgcHJvY2VzcyBleGl0cyBiZWZvcmUgY29uc3VtaW5nIHRoZSBpbnB1dCwgdGhlIE91dHB1dFN0cmVhbQorCQkJCQkvLyBpcyByZXBsYWNlZCB3aXRoIHRoZSBudWxsIG91dHB1dCBzdHJlYW0uIFRoaXMgbnVsbCBvdXRwdXQgc3RyZWFtCisJCQkJCS8vIHRocm93cyBJT0V4Y2VwdGlvbiBmb3IgYWxsIHdyaXRlIGNhbGxzLiBXaGVuIFN0cmVhbUdvYmJsZXIgZmFpbHMgdG8KKwkJCQkJLy8gZmx1c2ggdGhlIGJ1ZmZlciBiZWNhdXNlIG9mIHRoaXMsIHRoaXMgY2xvc2UgY2FsbCB0cmllcyB0byBmbHVzaCBpdAorCQkJCQkvLyBhZ2Fpbi4gVGhpcyBjYXVzZXMgYW5vdGhlciBJT0V4Y2VwdGlvbi4gU2luY2Ugd2UgaWdub3JlIHRoZQorCQkJCQkvLyBJT0V4Y2VwdGlvbiBpbiBTdHJlYW1Hb2JibGVyLCB3ZSBhbHNvIGlnbm9yZSB0aGUgZXhjZXB0aW9uIGhlcmUuCisJCQkJfQogCQkJfQogCQkJcmV0dXJuIHByb2Nlc3Mud2FpdEZvcigpOwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRlNfUE9TSVguamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GU19QT1NJWC5qYXZhCmluZGV4IDQ1MjM3YzQuLjg3OTUzMjkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GU19QT1NJWC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GU19QT1NJWC5qYXZhCkBAIC0zOTksNyArMzk5LDcgQEAKIAkJCUludGVnZXIgbmxpbmsgPSAoSW50ZWdlcikgKEZpbGVzLmdldEF0dHJpYnV0ZShsb2NrUGF0aCwKIAkJCQkJInVuaXg6bmxpbmsiKSk7IC8vJE5PTi1OTFMtMSQKIAkJCWlmIChubGluayA+IDIpIHsKLQkJCQlMT0cud2Fybigibmxpbmsgb2YgbGluayB0byBsb2NrIGZpbGUgezB9IHdhcyBub3QgMiBidXQgezF9IiwgLy8kTk9OLU5MUy0xJAorCQkJCUxPRy53YXJuKCJubGluayBvZiBsaW5rIHRvIGxvY2sgZmlsZSB7fSB3YXMgbm90IDIgYnV0IHt9IiwgLy8kTk9OLU5MUy0xJAogCQkJCQkJbG9jay5nZXRQYXRoKCksIG5saW5rKTsKIAkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9IGVsc2UgaWYgKG5saW5rIDwgMikgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZTX1dpbjMyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRlNfV2luMzIuamF2YQppbmRleCAyOWZlNWRjLi45Zjk5ZTI4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRlNfV2luMzIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRlNfV2luMzIuamF2YQpAQCAtNDcsMTEgKzQ3LDIxIEBACiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZVZpc2l0T3B0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZVZpc2l0UmVzdWx0OworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEubmlvLmZpbGUuU2ltcGxlRmlsZVZpc2l0b3I7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5hdHRyaWJ1dGUuQmFzaWNGaWxlQXR0cmlidXRlczsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Db21tYW5kRmFpbGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuRmlsZVRyZWVJdGVyYXRvci5GaWxlRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5GaWxlVHJlZUl0ZXJhdG9yLkZpbGVNb2RlU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5Xb3JraW5nVHJlZUl0ZXJhdG9yLkVudHJ5OwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKQEAgLTk3LDEzICsxMDcsMTMgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZShmaW5hbCBGaWxlIGYpIHsKKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKEZpbGUgZikgewogCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBzZXRFeGVjdXRlKGZpbmFsIEZpbGUgZiwgZmluYWwgYm9vbGVhbiBjYW5FeGVjKSB7CisJcHVibGljIGJvb2xlYW4gc2V0RXhlY3V0ZShGaWxlIGYsIGJvb2xlYW4gY2FuRXhlYykgewogCQlyZXR1cm4gZmFsc2U7CiAJfQogCkBAIC0xMjEsNiArMTMxLDQ5IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQorCXB1YmxpYyBFbnRyeVtdIGxpc3QoRmlsZSBkaXJlY3RvcnksIEZpbGVNb2RlU3RyYXRlZ3kgZmlsZU1vZGVTdHJhdGVneSkgeworCQlMaXN0PEVudHJ5PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJRlMgZnMgPSB0aGlzOworCQlib29sZWFuIGNoZWNrRXhlY3V0YWJsZSA9IGZzLnN1cHBvcnRzRXhlY3V0ZSgpOworCQl0cnkgeworCQkJRmlsZXMud2Fsa0ZpbGVUcmVlKGRpcmVjdG9yeS50b1BhdGgoKSwKKwkJCQkJRW51bVNldC5ub25lT2YoRmlsZVZpc2l0T3B0aW9uLmNsYXNzKSwgMSwKKwkJCQkJbmV3IFNpbXBsZUZpbGVWaXNpdG9yPFBhdGg+KCkgeworCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwdWJsaWMgRmlsZVZpc2l0UmVzdWx0IHZpc2l0RmlsZShQYXRoIGZpbGUsCisJCQkJCQkJCUJhc2ljRmlsZUF0dHJpYnV0ZXMgYXR0cnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQkJCQkJRmlsZSBmID0gZmlsZS50b0ZpbGUoKTsKKwkJCQkJCQlGUy5BdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSBuZXcgRlMuQXR0cmlidXRlcyhmcywgZiwKKwkJCQkJCQkJCXRydWUsIGF0dHJzLmlzRGlyZWN0b3J5KCksCisJCQkJCQkJCQljaGVja0V4ZWN1dGFibGUgJiYgZi5jYW5FeGVjdXRlKCksCisJCQkJCQkJCQlhdHRycy5pc1N5bWJvbGljTGluaygpLAorCQkJCQkJCQkJYXR0cnMuaXNSZWd1bGFyRmlsZSgpLAorCQkJCQkJCQkJYXR0cnMuY3JlYXRpb25UaW1lKCkudG9NaWxsaXMoKSwKKwkJCQkJCQkJCWF0dHJzLmxhc3RNb2RpZmllZFRpbWUoKS50b01pbGxpcygpLAorCQkJCQkJCQkJYXR0cnMuc2l6ZSgpKTsKKwkJCQkJCQlyZXN1bHQuYWRkKG5ldyBGaWxlRW50cnkoZiwgZnMsIGF0dHJpYnV0ZXMsCisJCQkJCQkJCQlmaWxlTW9kZVN0cmF0ZWd5KSk7CisJCQkJCQkJcmV0dXJuIEZpbGVWaXNpdFJlc3VsdC5DT05USU5VRTsKKwkJCQkJCX0KKworCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwdWJsaWMgRmlsZVZpc2l0UmVzdWx0IHZpc2l0RmlsZUZhaWxlZChQYXRoIGZpbGUsCisJCQkJCQkJCUlPRXhjZXB0aW9uIGV4YykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCQkJCQkvLyBKdXN0IGlnbm9yZSBpdAorCQkJCQkJCXJldHVybiBGaWxlVmlzaXRSZXN1bHQuQ09OVElOVUU7CisJCQkJCQl9CisJCQkJCX0pOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkvLyBJZ25vcmUKKwkJfQorCQlpZiAocmVzdWx0LmlzRW1wdHkoKSkgeworCQkJcmV0dXJuIE5PX0VOVFJJRVM7CisJCX0KKwkJcmV0dXJuIHJlc3VsdC50b0FycmF5KG5ldyBFbnRyeVtyZXN1bHQuc2l6ZSgpXSk7CisJfQorCisJLyoqIHtAaW5oZXJpdERvY30gKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRmlsZSBkaXNjb3ZlckdpdEV4ZSgpIHsKIAkJU3RyaW5nIHBhdGggPSBTeXN0ZW1SZWFkZXIuZ2V0SW5zdGFuY2UoKS5nZXRlbnYoIlBBVEgiKTsgLy8kTk9OLU5MUy0xJAogCQlGaWxlIGdpdEV4ZSA9IHNlYXJjaFBhdGgocGF0aCwgImdpdC5leGUiLCAiZ2l0LmNtZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GU19XaW4zMl9DeWd3aW4uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GU19XaW4zMl9DeWd3aW4uamF2YQppbmRleCA2NGNkY2MzLi4zMzkzZmJmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRlNfV2luMzJfQ3lnd2luLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZTX1dpbjMyX0N5Z3dpbi5qYXZhCkBAIC00Myw2ICs0Myw4IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC51dGlsOwogCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOworCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKQEAgLTExNywxNCArMTE5LDE0IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBGaWxlIHJlc29sdmUoZmluYWwgRmlsZSBkaXIsIGZpbmFsIFN0cmluZyBwbikgeworCXB1YmxpYyBGaWxlIHJlc29sdmUoRmlsZSBkaXIsIFN0cmluZyBwbikgewogCQlTdHJpbmcgdXNlQ3lnUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamdpdC51c2VjeWdwYXRoIik7IC8vJE5PTi1OTFMtMSQKIAkJaWYgKHVzZUN5Z1BhdGggIT0gbnVsbCAmJiB1c2VDeWdQYXRoLmVxdWFscygidHJ1ZSIpKSB7IC8vJE5PTi1OTFMtMSQKIAkJCVN0cmluZyB3OwogCQkJdHJ5IHsKIAkJCQl3ID0gcmVhZFBpcGUoZGlyLCAvLwogCQkJCQluZXcgU3RyaW5nW10geyBjeWdwYXRoLCAiLS13aW5kb3dzIiwgIi0tYWJzb2x1dGUiLCBwbiB9LCAvLyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJQ0hBUlNFVC5uYW1lKCkpOwogCQkJfSBjYXRjaCAoQ29tbWFuZEZhaWxlZEV4Y2VwdGlvbiBlKSB7CiAJCQkJTE9HLndhcm4oZS5nZXRNZXNzYWdlKCkpOwogCQkJCXJldHVybiBudWxsOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZpbGVVdGlsLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRmlsZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZmMjE3NS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRmlsZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyLCBSb2JpbiBSb3NlbmJlcmcgPHJvYmluLnJvc2VuYmVyZ0BkZXdpcmUuY29tPgotICogYW5kIG90aGVyIGNvcHlyaWdodCBvd25lcnMgYXMgZG9jdW1lbnRlZCBpbiB0aGUgcHJvamVjdCdzIElQIGxvZy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZQotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYxLjAgd2hpY2gKLSAqIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBpcyByZXByb2R1Y2VkIGJlbG93LCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAKLSAqCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKLSAqIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZwotICogY29uZGl0aW9ucyBhcmUgbWV0OgotICoKLSAqIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIC0gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCBJbmMuIG5vciB0aGUKLSAqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAqICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogICB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5ECi0gKiBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAotICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCi0gKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKLSAqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRlMuQXR0cmlidXRlczsKLQotLyoqCi0gKiBGaWxlIHV0aWxpdGllcyB1c2luZyBKYXZhIDcgTklPMgotICovCi1ARGVwcmVjYXRlZAotcHVibGljIGNsYXNzIEZpbGVVdGlsIHsKLQotCS8qKgotCSAqIFJlYWQgdGFyZ2V0IHBhdGggb2YgYSBzeW1saW5rLgotCSAqCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEge0BsaW5rIGphdmEuaW8uRmlsZX0uCi0JICogQHJldHVybiB0YXJnZXQgcGF0aCBvZiB0aGUgc3ltbGluay4KLQkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GaWxlVXRpbHMjcmVhZFN5bUxpbmsoRmlsZSl9Ci0JICogICAgICAgICAgICAgaW5zdGVhZAotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZFN5bWxpbmsoRmlsZSBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gRmlsZVV0aWxzLnJlYWRTeW1MaW5rKHBhdGgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHN5bWxpbmsKLQkgKgotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBwYXRoIG9mIHRoZSBzeW1saW5rIHRvIGJlIGNyZWF0ZWQKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogICAgICAgICAgICB0YXJnZXQgb2YgdGhlIHN5bWxpbmsgdG8gYmUgY3JlYXRlZAotCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotCSAqIEBkZXByZWNhdGVkIHVzZQotCSAqICAgICAgICAgICAgIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRmlsZVV0aWxzI2NyZWF0ZVN5bUxpbmsoRmlsZSwgU3RyaW5nKX0KLQkgKiAgICAgICAgICAgICBpbnN0ZWFkCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlU3ltTGluayhGaWxlIHBhdGgsIFN0cmluZyB0YXJnZXQpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlVXRpbHMuY3JlYXRlU3ltTGluayhwYXRoLCB0YXJnZXQpOwotCX0KLQotCS8qKgotCSAqIFdoZXRoZXIgdGhlIHBhc3NlZCBmaWxlIGlzIGEgc3ltbGluawotCSAqCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEge0BsaW5rIGphdmEuaW8uRmlsZX0gb2JqZWN0LgotCSAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBwYXNzZWQgcGF0aCBpcyBhIHN5bWxpbmsKLQkgKiBAZGVwcmVjYXRlZCBVc2UKLQkgKiAgICAgICAgICAgICB7QGxpbmsgamF2YS5uaW8uZmlsZS5GaWxlcyNpc1N5bWJvbGljTGluayhqYXZhLm5pby5maWxlLlBhdGgpfQotCSAqICAgICAgICAgICAgIGluc3RlYWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N5bWxpbmsoRmlsZSBwYXRoKSB7Ci0JCXJldHVybiBGaWxlVXRpbHMuaXNTeW1saW5rKHBhdGgpOwotCX0KLQotCS8qKgotCSAqIEdldCBsYXN0TW9kaWZpZWQgYXR0cmlidXRlIGZvciBnaXZlbiBwYXRoCi0JICoKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSB7QGxpbmsgamF2YS5pby5GaWxlfS4KLQkgKiBAcmV0dXJuIGxhc3RNb2RpZmllZCBhdHRyaWJ1dGUgZm9yIGdpdmVuIHBhdGgKLQkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKiBAZGVwcmVjYXRlZCBVc2UKLQkgKiAgICAgICAgICAgICB7QGxpbmsgamF2YS5uaW8uZmlsZS5GaWxlcyNnZXRMYXN0TW9kaWZpZWRUaW1lKGphdmEubmlvLmZpbGUuUGF0aCwgamF2YS5uaW8uZmlsZS5MaW5rT3B0aW9uLi4uKX0KLQkgKiAgICAgICAgICAgICBpbnN0ZWFkCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIGxvbmcgbGFzdE1vZGlmaWVkKEZpbGUgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIEZpbGVVdGlscy5sYXN0TW9kaWZpZWQocGF0aCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IGxhc3RNb2RpZmllZCBhdHRyaWJ1dGUgZm9yIGdpdmVuIHBhdGgKLQkgKgotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHtAbGluayBqYXZhLmlvLkZpbGV9LgotCSAqIEBwYXJhbSB0aW1lCi0JICogICAgICAgICAgICBhIGxvbmcuCi0JICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICogQGRlcHJlY2F0ZWQgVXNlCi0JICogICAgICAgICAgICAge0BsaW5rIGphdmEubmlvLmZpbGUuRmlsZXMjc2V0TGFzdE1vZGlmaWVkVGltZShqYXZhLm5pby5maWxlLlBhdGgsIGphdmEubmlvLmZpbGUuYXR0cmlidXRlLkZpbGVUaW1lKX0KLQkgKiAgICAgICAgICAgICBpbnN0ZWFkCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0TGFzdE1vZGlmaWVkKEZpbGUgcGF0aCwgbG9uZyB0aW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlVXRpbHMuc2V0TGFzdE1vZGlmaWVkKHBhdGgsIHRpbWUpOwotCX0KLQotCS8qKgotCSAqIFdoZXRoZXIgdGhpcyBmaWxlIGV4aXN0cwotCSAqCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEge0BsaW5rIGphdmEuaW8uRmlsZX0uCi0JICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGdpdmVuIHBhdGggZXhpc3RzCi0JICogQGRlcHJlY2F0ZWQgVXNlCi0JICogICAgICAgICAgICAge0BsaW5rIGphdmEubmlvLmZpbGUuRmlsZXMjZXhpc3RzKGphdmEubmlvLmZpbGUuUGF0aCwgamF2YS5uaW8uZmlsZS5MaW5rT3B0aW9uLi4uKX0KLQkgKiAgICAgICAgICAgICBpbnN0ZWFkCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXhpc3RzKEZpbGUgcGF0aCkgewotCQlyZXR1cm4gRmlsZVV0aWxzLmV4aXN0cyhwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBXaGV0aGVyIHRoaXMgZmlsZSBpcyBoaWRkZW4KLQkgKgotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHtAbGluayBqYXZhLmlvLkZpbGV9LgotCSAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBnaXZlbiBwYXRoIGlzIGhpZGRlbgotCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgamF2YS5uaW8uZmlsZS5GaWxlcyNpc0hpZGRlbihqYXZhLm5pby5maWxlLlBhdGgpfQotCSAqICAgICAgICAgICAgIGluc3RlYWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0hpZGRlbihGaWxlIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBGaWxlVXRpbHMuaXNIaWRkZW4ocGF0aCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoaXMgZmlsZSBoaWRkZW4KLQkgKgotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHtAbGluayBqYXZhLmlvLkZpbGV9LgotCSAqIEBwYXJhbSBoaWRkZW4KLQkgKiAgICAgICAgICAgIGEgYm9vbGVhbi4KLQkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKiBAZGVwcmVjYXRlZCBVc2UKLQkgKiAgICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZpbGVVdGlscyNzZXRIaWRkZW4oRmlsZSxib29sZWFuKX0KLQkgKiAgICAgICAgICAgICBpbnN0ZWFkCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SGlkZGVuKEZpbGUgcGF0aCwgYm9vbGVhbiBoaWRkZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGVVdGlscy5zZXRIaWRkZW4ocGF0aCwgaGlkZGVuKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgZmlsZSBsZW5ndGgKLQkgKgotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHtAbGluayBqYXZhLmlvLkZpbGV9LgotCSAqIEByZXR1cm4gbGVuZ3RoIG9mIHRoZSBnaXZlbiBmaWxlCi0JICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRmlsZVV0aWxzI2dldExlbmd0aChGaWxlKX0KLQkgKiAgICAgICAgICAgICBpbnN0ZWFkCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIGxvbmcgZ2V0TGVuZ3RoKEZpbGUgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIEZpbGVVdGlscy5nZXRMZW5ndGgocGF0aCk7Ci0JfQotCi0JLyoqCi0JICogV2hldGhlciB0aGUgZ2l2ZW4gRmlsZSBpcyBhIGRpcmVjdG9yeQotCSAqCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEge0BsaW5rIGphdmEuaW8uRmlsZX0gb2JqZWN0LgotCSAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBnaXZlbiBmaWxlIGlzIGEgZGlyZWN0b3J5Ci0JICogQGRlcHJlY2F0ZWQgVXNlCi0JICogICAgICAgICAgICAge0BsaW5rIGphdmEubmlvLmZpbGUuRmlsZXMjaXNEaXJlY3RvcnkoamF2YS5uaW8uZmlsZS5QYXRoLCBqYXZhLm5pby5maWxlLkxpbmtPcHRpb24uLi4pfQotCSAqICAgICAgICAgICAgIGluc3RlYWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RpcmVjdG9yeShGaWxlIHBhdGgpIHsKLQkJcmV0dXJuIEZpbGVVdGlscy5pc0RpcmVjdG9yeShwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBXaGV0aGVyIHRoZSBnaXZlbiBGaWxlIGlzIGEgZmlsZQotCSAqCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEge0BsaW5rIGphdmEuaW8uRmlsZX0gb2JqZWN0LgotCSAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBnaXZlbiBmaWxlIGlzIGEgZmlsZQotCSAqIEBkZXByZWNhdGVkIFVzZQotCSAqICAgICAgICAgICAgIHtAbGluayBqYXZhLm5pby5maWxlLkZpbGVzI2lzUmVndWxhckZpbGUoamF2YS5uaW8uZmlsZS5QYXRoLCBqYXZhLm5pby5maWxlLkxpbmtPcHRpb24uLi4pfQotCSAqICAgICAgICAgICAgIGluc3RlYWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ZpbGUoRmlsZSBwYXRoKSB7Ci0JCXJldHVybiBGaWxlVXRpbHMuaXNGaWxlKHBhdGgpOwotCX0KLQotCS8qKgotCSAqIFdoZXRoZXIgdGhlIGdpdmVuIGZpbGUgY2FuIGJlIGV4ZWN1dGVkCi0JICoKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSB7QGxpbmsgamF2YS5pby5GaWxlfSBvYmplY3QuCi0JICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGdpdmVuIGZpbGUgY2FuIGJlIGV4ZWN1dGVkCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRmlsZVV0aWxzI2NhbkV4ZWN1dGUoRmlsZSl9Ci0JICogICAgICAgICAgICAgaW5zdGVhZAotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNhbkV4ZWN1dGUoRmlsZSBwYXRoKSB7Ci0JCXJldHVybiBGaWxlVXRpbHMuY2FuRXhlY3V0ZShwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxldGUgdGhlIGdpdmVuIGZpbGUKLQkgKgotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHtAbGluayBqYXZhLmlvLkZpbGV9IG9iamVjdC4KLQkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GaWxlVXRpbHMjZGVsZXRlKEZpbGUpfQotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZShGaWxlIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGVVdGlscy5kZWxldGUocGF0aCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGZpbGUgc3lzdGVtIGF0dHJpYnV0ZXMgZm9yIHRoZSBnaXZlbiBmaWxlCi0JICoKLQkgKiBAcGFyYW0gZnMKLQkgKiAgICAgICAgICAgIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GU30gb2JqZWN0LgotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHtAbGluayBqYXZhLmlvLkZpbGV9IG9iamVjdC4KLQkgKiBAcmV0dXJuIGZpbGUgc3lzdGVtIGF0dHJpYnV0ZXMgZm9yIHRoZSBnaXZlbiBmaWxlCi0JICogQGRlcHJlY2F0ZWQgVXNlCi0JICogICAgICAgICAgICAge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GaWxlVXRpbHMjZ2V0RmlsZUF0dHJpYnV0ZXNQb3NpeChGUyxGaWxlKX0KLQkgKiAgICAgICAgICAgICBpbnN0ZWFkCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIEF0dHJpYnV0ZXMgZ2V0RmlsZUF0dHJpYnV0ZXNQb3NpeChGUyBmcywgRmlsZSBwYXRoKSB7Ci0JCXJldHVybiBGaWxlVXRpbHMuZ2V0RmlsZUF0dHJpYnV0ZXNQb3NpeChmcywgcGF0aCk7Ci0JfQotCi0JLyoqCi0JICogTkZDIG5vcm1hbGl6ZSBGaWxlIChvbiBNYWMpLCBvdGhlcndpc2UgZG8gbm90aGluZwotCSAqCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIGEge0BsaW5rIGphdmEuaW8uRmlsZX0uCi0JICogQHJldHVybiBvbiBNYWM6IE5GQyBub3JtYWxpemVkIHtAbGluayBqYXZhLmlvLkZpbGV9LCBvdGhlcndpc2UgdGhlIHBhc3NlZAotCSAqICAgICAgICAgZmlsZQotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZpbGVVdGlscyNub3JtYWxpemUoRmlsZSl9Ci0JICogICAgICAgICAgICAgaW5zdGVhZAotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyBGaWxlIG5vcm1hbGl6ZShGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIEZpbGVVdGlscy5ub3JtYWxpemUoZmlsZSk7Ci0JfQotCi0JLyoqCi0JICogTkZDIG5vcm1hbGl6ZSBmaWxlIG5hbWUgKG9uIE1hYyksIG90aGVyd2lzZSBkbyBub3RoaW5nCi0JICoKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgYSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30gb2JqZWN0LgotCSAqIEByZXR1cm4gb24gTWFjOiBORkMgbm9ybWFsaXplZCBmb3JtIG9mIGdpdmVuIG5hbWUKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GaWxlVXRpbHMjbm9ybWFsaXplKFN0cmluZyl9Ci0JICogICAgICAgICAgICAgaW5zdGVhZAotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbm9ybWFsaXplKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBGaWxlVXRpbHMubm9ybWFsaXplKG5hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZpbGVVdGlscy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZpbGVVdGlscy5qYXZhCmluZGV4IDA4YzI3OGUuLjJmNTQ3YzEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GaWxlVXRpbHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRmlsZVV0aWxzLmphdmEKQEAgLTEyMiw3ICsxMjIsNyBAQAogCSAqICAgICAgICAgICAgIHtAbGluayBqYXZhLm5pby5maWxlLkludmFsaWRQYXRoRXhjZXB0aW9ufSkKIAkgKiBAc2luY2UgNC4xMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgUGF0aCB0b1BhdGgoZmluYWwgRmlsZSBmKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBzdGF0aWMgUGF0aCB0b1BhdGgoRmlsZSBmKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0cnkgewogCQkJcmV0dXJuIGYudG9QYXRoKCk7CiAJCX0gY2F0Y2ggKEludmFsaWRQYXRoRXhjZXB0aW9uIGV4KSB7CkBAIC0xNDEsNyArMTQxLDcgQEAKIAkgKiAgICAgICAgICAgICBjYXVzZSBqYXZhLmlvLklPRXhjZXB0aW9ucyBkdXJpbmcgcmFjZSBjb25kaXRpb25zIHdoZW4KIAkgKiAgICAgICAgICAgICBtdWx0aXBsZSBjb25jdXJyZW50IHRocmVhZHMgYWxsIHRyeSB0byBkZWxldGUgdGhlIHNhbWUgZmlsZS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlKGZpbmFsIEZpbGUgZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlKEZpbGUgZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZGVsZXRlKGYsIE5PTkUpOwogCX0KIApAQCAtMTYyLDcgKzE2Miw3IEBACiAJICogICAgICAgICAgICAgbXVsdGlwbGUgY29uY3VycmVudCB0aHJlYWRzIGFsbCB0cnkgdG8gZGVsZXRlIHRoZSBzYW1lIGZpbGUuCiAJICogICAgICAgICAgICAgVGhpcyBleGNlcHRpb24gaXMgbm90IHRocm93biB3aGVuIElHTk9SRV9FUlJPUlMgaXMgc2V0LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGUoZmluYWwgRmlsZSBmLCBpbnQgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlKEZpbGUgZiwgaW50IG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCUZTIGZzID0gRlMuREVURUNURUQ7CiAJCWlmICgob3B0aW9ucyAmIFNLSVBfTUlTU0lORykgIT0gMCAmJiAhZnMuZXhpc3RzKGYpKQogCQkJcmV0dXJuOwpAQCAtMjQxLDcgKzI0MSw3IEBACiAJICogICAgICAgICAgICAgaWYgdGhlIHJlbmFtZSBoYXMgZmFpbGVkCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW5hbWUoZmluYWwgRmlsZSBzcmMsIGZpbmFsIEZpbGUgZHN0KQorCXB1YmxpYyBzdGF0aWMgdm9pZCByZW5hbWUoRmlsZSBzcmMsIEZpbGUgZHN0KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmVuYW1lKHNyYywgZHN0LCBTdGFuZGFyZENvcHlPcHRpb24uUkVQTEFDRV9FWElTVElORyk7CiAJfQpAQCAtMzIxLDcgKzMyMSw3IEBACiAJICogICAgICAgICAgICAgbXVsdGlwbGUgY29uY3VycmVudCB0aHJlYWRzIGFsbCB0cnkgdG8gY3JlYXRlIHRoZSBzYW1lCiAJICogICAgICAgICAgICAgZGlyZWN0b3J5LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBta2RpcihmaW5hbCBGaWxlIGQpCisJcHVibGljIHN0YXRpYyB2b2lkIG1rZGlyKEZpbGUgZCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCW1rZGlyKGQsIGZhbHNlKTsKIAl9CkBAIC0zNDEsNyArMzQxLDcgQEAKIAkgKiAgICAgICAgICAgICBtdWx0aXBsZSBjb25jdXJyZW50IHRocmVhZHMgYWxsIHRyeSB0byBjcmVhdGUgdGhlIHNhbWUKIAkgKiAgICAgICAgICAgICBkaXJlY3RvcnkuCiAJICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1rZGlyKGZpbmFsIEZpbGUgZCwgYm9vbGVhbiBza2lwRXhpc3RpbmcpCisJcHVibGljIHN0YXRpYyB2b2lkIG1rZGlyKEZpbGUgZCwgYm9vbGVhbiBza2lwRXhpc3RpbmcpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAoIWQubWtkaXIoKSkgewogCQkJaWYgKHNraXBFeGlzdGluZyAmJiBkLmlzRGlyZWN0b3J5KCkpCkBAIC0zNjYsNyArMzY2LDcgQEAKIAkgKiAgICAgICAgICAgICBtdWx0aXBsZSBjb25jdXJyZW50IHRocmVhZHMgYWxsIHRyeSB0byBjcmVhdGUgdGhlIHNhbWUKIAkgKiAgICAgICAgICAgICBkaXJlY3RvcnkuCiAJICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1rZGlycyhmaW5hbCBGaWxlIGQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHN0YXRpYyB2b2lkIG1rZGlycyhGaWxlIGQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCW1rZGlycyhkLCBmYWxzZSk7CiAJfQogCkBAIC0zODgsNyArMzg4LDcgQEAKIAkgKiAgICAgICAgICAgICBtdWx0aXBsZSBjb25jdXJyZW50IHRocmVhZHMgYWxsIHRyeSB0byBjcmVhdGUgdGhlIHNhbWUKIAkgKiAgICAgICAgICAgICBkaXJlY3RvcnkuCiAJICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1rZGlycyhmaW5hbCBGaWxlIGQsIGJvb2xlYW4gc2tpcEV4aXN0aW5nKQorCXB1YmxpYyBzdGF0aWMgdm9pZCBta2RpcnMoRmlsZSBkLCBib29sZWFuIHNraXBFeGlzdGluZykKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmICghZC5ta2RpcnMoKSkgewogCQkJaWYgKHNraXBFeGlzdGluZyAmJiBkLmlzRGlyZWN0b3J5KCkpCkBAIC00OTgsMzMgKzQ5OCw2IEBACiAJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS5jYW5ub3RDcmVhdGVUZW1wRGlyKTsKIAl9CiAKLQotCS8qKgotCSAqIFJlbGF0aXZpemUgYSBwYXRoCi0JICoKLQkgKiBAZGVwcmVjYXRlZCBVc2UgdGhlIG1vcmUtY2xlYXJseS1uYW1lZAotCSAqICAgICAgICAgICAgIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRmlsZVV0aWxzI3JlbGF0aXZpemVOYXRpdmVQYXRoKFN0cmluZywgU3RyaW5nKX0KLQkgKiAgICAgICAgICAgICBpbnN0ZWFkLCBvciBkaXJlY3RseSBjYWxsCi0JICogICAgICAgICAgICAge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GaWxlVXRpbHMjcmVsYXRpdml6ZVBhdGgoU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgYm9vbGVhbil9Ci0JICoKLQkgKiAgICAgICAgICAgICBFeHByZXNzZXMgPGNvZGU+b3RoZXI8L2NvZGU+IGFzIGEgcmVsYXRpdmUgZmlsZSBwYXRoIGZyb20KLQkgKiAgICAgICAgICAgICA8Y29kZT5iYXNlPC9jb2RlPi4gRmlsZS1zZXBhcmF0b3IgYW5kIGNhc2Ugc2Vuc2l0aXZpdHkgYXJlCi0JICogICAgICAgICAgICAgYmFzZWQgb24gdGhlIGN1cnJlbnQgZmlsZSBzeXN0ZW0uCi0JICoKLQkgKiAgICAgICAgICAgICBTZWUgYWxzbwotCSAqICAgICAgICAgICAgIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRmlsZVV0aWxzI3JlbGF0aXZpemVQYXRoKFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIGJvb2xlYW4pfS4KLQkgKiBAcGFyYW0gYmFzZQotCSAqICAgICAgICAgICAgQmFzZSBwYXRoCi0JICogQHBhcmFtIG90aGVyCi0JICogICAgICAgICAgICBEZXN0aW5hdGlvbiBwYXRoCi0JICogQHJldHVybiBSZWxhdGl2ZSBwYXRoIGZyb20gPGNvZGU+YmFzZTwvY29kZT4gdG8gPGNvZGU+b3RoZXI8L2NvZGU+Ci0JICogQHNpbmNlIDMuNwotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVsYXRpdml6ZShTdHJpbmcgYmFzZSwgU3RyaW5nIG90aGVyKSB7Ci0JCXJldHVybiByZWxhdGl2aXplTmF0aXZlUGF0aChiYXNlLCBvdGhlcik7Ci0JfQotCiAJLyoqCiAJICogRXhwcmVzc2VzIDxjb2RlPm90aGVyPC9jb2RlPiBhcyBhIHJlbGF0aXZlIGZpbGUgcGF0aCBmcm9tCiAJICogPGNvZGU+YmFzZTwvY29kZT4uIEZpbGUtc2VwYXJhdG9yIGFuZCBjYXNlIHNlbnNpdGl2aXR5IGFyZSBiYXNlZCBvbiB0aGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9IdHRwU3VwcG9ydC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0h0dHBTdXBwb3J0LmphdmEKaW5kZXggYTVhODU4Zi4uNmY5MmIzNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0h0dHBTdXBwb3J0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0h0dHBTdXBwb3J0LmphdmEKQEAgLTQ0LDYgKzQ0LDggQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJBQ1RFUl9FTkNPRElORzsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LkNvbm5lY3RFeGNlcHRpb247CkBAIC0xNzUsMTEgKzE3NywxMSBAQAogCSAqIEBwYXJhbSBrZXkKIAkgKiAgICAgICAgICAgIHZhbHVlIHdoaWNoIG11c3QgYmUgZW5jb2RlZCB0byBwcm90ZWN0ZWQgc3BlY2lhbCBjaGFyYWN0ZXJzLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBlbmNvZGUoZmluYWwgU3RyaW5nQnVpbGRlciB1cmxzdHIsIGZpbmFsIFN0cmluZyBrZXkpIHsKKwlwdWJsaWMgc3RhdGljIHZvaWQgZW5jb2RlKFN0cmluZ0J1aWxkZXIgdXJsc3RyLCBTdHJpbmcga2V5KSB7CiAJCWlmIChrZXkgPT0gbnVsbCB8fCBrZXkubGVuZ3RoKCkgPT0gMCkKIAkJCXJldHVybjsKIAkJdHJ5IHsKLQkJCXVybHN0ci5hcHBlbmQoVVJMRW5jb2Rlci5lbmNvZGUoa2V5LCAiVVRGLTgiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCXVybHN0ci5hcHBlbmQoVVJMRW5jb2Rlci5lbmNvZGUoa2V5LCBDSEFSQUNURVJfRU5DT0RJTkcpKTsKIAkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CiAJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS5jb3VsZE5vdFVSTEVuY29kZVRvVVRGOCwgZSk7CiAJCX0KQEAgLTIwMCw3ICsyMDIsNyBAQAogCSAqICAgICAgICAgICAgIGNvbW11bmljYXRpb25zIGVycm9yIHByZXZlbnRlZCBvYnRhaW5pbmcgdGhlIHJlc3BvbnNlIGNvZGUuCiAJICogQHNpbmNlIDMuMwogCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IHJlc3BvbnNlKGZpbmFsIEh0dHBDb25uZWN0aW9uIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHN0YXRpYyBpbnQgcmVzcG9uc2UoSHR0cENvbm5lY3Rpb24gYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCXJldHVybiBjLmdldFJlc3BvbnNlQ29kZSgpOwogCQl9IGNhdGNoIChDb25uZWN0RXhjZXB0aW9uIGNlKSB7CkBAIC0yMjgsNyArMjMwLDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBjb21tdW5pY2F0aW9ucyBlcnJvciBwcmV2ZW50ZWQgb2J0YWluaW5nIHRoZSByZXNwb25zZSBjb2RlLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IHJlc3BvbnNlKGZpbmFsIGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uIGMpCisJcHVibGljIHN0YXRpYyBpbnQgcmVzcG9uc2UoamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb24gYykKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRyeSB7CiAJCQlyZXR1cm4gYy5nZXRSZXNwb25zZUNvZGUoKTsKQEAgLTI3Myw3ICsyNzUsNyBAQAogCSAqICAgICAgICAgICAgIHRoZSBwcm94eSBjb3VsZCBub3QgYmUgY29tcHV0ZWQgYXMgdGhlIHN1cHBsaWVkIFVSTCBjb3VsZCBub3QKIAkgKiAgICAgICAgICAgICBiZSByZWFkLiBUaGlzIGZhaWx1cmUgc2hvdWxkIG5ldmVyIG9jY3VyLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJveHkgcHJveHlGb3IoZmluYWwgUHJveHlTZWxlY3RvciBwcm94eVNlbGVjdG9yLCBmaW5hbCBVUkwgdSkKKwlwdWJsaWMgc3RhdGljIFByb3h5IHByb3h5Rm9yKFByb3h5U2VsZWN0b3IgcHJveHlTZWxlY3RvciwgVVJMIHUpCiAJCQl0aHJvd3MgQ29ubmVjdEV4Y2VwdGlvbiB7CiAJCXRyeSB7CiAJCQlyZXR1cm4gcHJveHlTZWxlY3Rvci5zZWxlY3QodS50b1VSSSgpKS5nZXQoMCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvSU8uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9JTy5qYXZhCmluZGV4IGYzOWQyMTcuLmU4OGU3YTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9JTy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9JTy5qYXZhCkBAIC00Nyw3ICs0Nyw2IEBACiAKIGltcG9ydCBqYXZhLmlvLkVPRkV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwpAQCAtNTksNiArNTgsNyBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW8uU2lsZW50RmlsZUlucHV0U3RyZWFtOwogCiAvKioKICAqIElucHV0L091dHB1dCB1dGlsaXRpZXMKQEAgLTc2LDcgKzc2LDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgZmlsZSBleGlzdHMsIGJ1dCBpdHMgY29udGVudHMgY2Fubm90IGJlIHJlYWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gcmVhZEZ1bGx5KGZpbmFsIEZpbGUgcGF0aCkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSByZWFkRnVsbHkoRmlsZSBwYXRoKQogCQkJdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gSU8ucmVhZEZ1bGx5KHBhdGgsIEludGVnZXIuTUFYX1ZBTFVFKTsKIAl9CkBAIC05NiwxMCArOTYsOSBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBmaWxlIGV4aXN0cywgYnV0IGl0cyBjb250ZW50cyBjYW5ub3QgYmUgcmVhZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSByZWFkU29tZShmaW5hbCBGaWxlIHBhdGgsIGZpbmFsIGludCBsaW1pdCkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSByZWFkU29tZShGaWxlIHBhdGgsIGludCBsaW1pdCkKIAkJCXRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoKTsKLQkJdHJ5IHsKKwkJdHJ5IChTaWxlbnRGaWxlSW5wdXRTdHJlYW0gaW4gPSBuZXcgU2lsZW50RmlsZUlucHV0U3RyZWFtKHBhdGgpKSB7CiAJCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbbGltaXRdOwogCQkJaW50IGNudCA9IDA7CiAJCQlmb3IgKDs7KSB7CkBAIC0xMTMsMTIgKzExMiw2IEBACiAJCQlieXRlW10gcmVzID0gbmV3IGJ5dGVbY250XTsKIAkJCVN5c3RlbS5hcnJheWNvcHkoYnVmLCAwLCByZXMsIDAsIGNudCk7CiAJCQlyZXR1cm4gcmVzOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpbi5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlZCkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KIAkJfQogCX0KIApAQCAtMTM2LDEwICsxMjksOSBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBmaWxlIGV4aXN0cywgYnV0IGl0cyBjb250ZW50cyBjYW5ub3QgYmUgcmVhZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSByZWFkRnVsbHkoZmluYWwgRmlsZSBwYXRoLCBmaW5hbCBpbnQgbWF4KQorCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIHJlYWRGdWxseShGaWxlIHBhdGgsIGludCBtYXgpCiAJCQl0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCWZpbmFsIEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aCk7Ci0JCXRyeSB7CisJCXRyeSAoU2lsZW50RmlsZUlucHV0U3RyZWFtIGluID0gbmV3IFNpbGVudEZpbGVJbnB1dFN0cmVhbShwYXRoKSkgewogCQkJbG9uZyBzeiA9IE1hdGgubWF4KHBhdGgubGVuZ3RoKCksIDEpOwogCQkJaWYgKHN6ID4gbWF4KQogCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKQEAgLTE3MywxMiArMTY1LDYgQEAKIAkJCQlidWYgPSBuYjsKIAkJCX0KIAkJCXJldHVybiBidWY7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWluLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmVkKSB7Ci0JCQkJLy8gaWdub3JlIGFueSBjbG9zZSBlcnJvcnMsIHRoaXMgd2FzIGEgcmVhZCBvbmx5IHN0cmVhbQotCQkJfQogCQl9CiAJfQogCkBAIC0zMjUsNyArMzExLDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyBmcm9tIHRoZSBzdHJlYW0uCiAJICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNraXBGdWxseShmaW5hbCBJbnB1dFN0cmVhbSBmZCwgbG9uZyB0b1NraXApCisJcHVibGljIHN0YXRpYyB2b2lkIHNraXBGdWxseShJbnB1dFN0cmVhbSBmZCwgbG9uZyB0b1NraXApCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl3aGlsZSAodG9Ta2lwID4gMCkgewogCQkJZmluYWwgbG9uZyByID0gZmQuc2tpcCh0b1NraXApOwpAQCAtMzQzLDcgKzMyOSw3IEBACiAJICogQHJldHVybiB0aGUgc3RyaW5nIGRpdmlkZWQgaW50byBsaW5lcwogCSAqIEBzaW5jZSAyLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiByZWFkTGluZXMoZmluYWwgU3RyaW5nIHMpIHsKKwlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiByZWFkTGluZXMoU3RyaW5nIHMpIHsKIAkJTGlzdDxTdHJpbmc+IGwgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvSW50TGlzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ludExpc3QuamF2YQppbmRleCAyNDAzOGYwLi43NDQxZDUwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvSW50TGlzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9JbnRMaXN0LmphdmEKQEAgLTY1LDcgKzY1LDcgQEAKIAkgKiBAcGFyYW0gY2FwYWNpdHkKIAkgKiAgICAgICAgICAgIG51bWJlciBvZiBlbnRyaWVzIHRoZSBsaXN0IGNhbiBpbml0aWFsbHkgaG9sZC4KIAkgKi8KLQlwdWJsaWMgSW50TGlzdChmaW5hbCBpbnQgY2FwYWNpdHkpIHsKKwlwdWJsaWMgSW50TGlzdChpbnQgY2FwYWNpdHkpIHsKIAkJZW50cmllcyA9IG5ldyBpbnRbY2FwYWNpdHldOwogCX0KIApAQCAtMTAyLDcgKzEwMiw3IEBACiAJICogQHRocm93cyBqYXZhLmxhbmcuQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIGluZGV4IG91dHNpZGUgdGhlIHZhbGlkIHJhbmdlCiAJICovCi0JcHVibGljIGludCBnZXQoZmluYWwgaW50IGkpIHsKKwlwdWJsaWMgaW50IGdldChpbnQgaSkgewogCQlpZiAoY291bnQgPD0gaSkKIAkJCXRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oaSk7CiAJCXJldHVybiBlbnRyaWVzW2ldOwpAQCAtMTIxLDcgKzEyMSw3IEBACiAJICogQHBhcmFtIG4KIAkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgdG8gYWRkLgogCSAqLwotCXB1YmxpYyB2b2lkIGFkZChmaW5hbCBpbnQgbikgeworCXB1YmxpYyB2b2lkIGFkZChpbnQgbikgewogCQlpZiAoY291bnQgPT0gZW50cmllcy5sZW5ndGgpCiAJCQlncm93KCk7CiAJCWVudHJpZXNbY291bnQrK10gPSBuOwpAQCAtMTM1LDcgKzEzNSw3IEBACiAJICogQHBhcmFtIG4KIAkgKiAgICAgICAgICAgIHZhbHVlIHRvIHN0b3JlIGF0IHRoZSBwb3NpdGlvbi4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoZmluYWwgaW50IGluZGV4LCBmaW5hbCBpbnQgbikgeworCXB1YmxpYyB2b2lkIHNldChpbnQgaW5kZXgsIGludCBuKSB7CiAJCWlmIChjb3VudCA8IGluZGV4KQogCQkJdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihpbmRleCk7CiAJCWVsc2UgaWYgKGNvdW50ID09IGluZGV4KQpAQCAtMTU0LDcgKzE1NCw3IEBACiAJICogQHBhcmFtIHZhbAogCSAqICAgICAgICAgICAgdmFsdWUgdG8gaW5zZXJ0IGludG8gcGFkZGVkIHBvc2l0aW9ucy4KIAkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsVG8oaW50IHRvSW5kZXgsIGZpbmFsIGludCB2YWwpIHsKKwlwdWJsaWMgdm9pZCBmaWxsVG8oaW50IHRvSW5kZXgsIGludCB2YWwpIHsKIAkJd2hpbGUgKGNvdW50IDwgdG9JbmRleCkKIAkJCWFkZCh2YWwpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9Mb25nTGlzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0xvbmdMaXN0LmphdmEKaW5kZXggNDA0NTk0Yy4uM2JkNmUxOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0xvbmdMaXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0xvbmdMaXN0LmphdmEKQEAgLTY3LDcgKzY3LDcgQEAKIAkgKiBAcGFyYW0gY2FwYWNpdHkKIAkgKiAgICAgICAgICAgIG51bWJlciBvZiBlbnRyaWVzIHRoZSBsaXN0IGNhbiBpbml0aWFsbHkgaG9sZC4KIAkgKi8KLQlwdWJsaWMgTG9uZ0xpc3QoZmluYWwgaW50IGNhcGFjaXR5KSB7CisJcHVibGljIExvbmdMaXN0KGludCBjYXBhY2l0eSkgewogCQllbnRyaWVzID0gbmV3IGxvbmdbY2FwYWNpdHldOwogCX0KIApAQCAtODksNyArODksNyBAQAogCSAqIEB0aHJvd3MgamF2YS5sYW5nLkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBpbmRleCBvdXRzaWRlIHRoZSB2YWxpZCByYW5nZQogCSAqLwotCXB1YmxpYyBsb25nIGdldChmaW5hbCBpbnQgaSkgeworCXB1YmxpYyBsb25nIGdldChpbnQgaSkgewogCQlpZiAoY291bnQgPD0gaSkKIAkJCXRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oaSk7CiAJCXJldHVybiBlbnRyaWVzW2ldOwpAQCAtMTAyLDcgKzEwMiw3IEBACiAJICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gc2VhcmNoIGZvci4KIAkgKiBAcmV0dXJuIHRydWUgb2Yge0Bjb2RlIHZhbHVlfSBhcHBlYXJzIGluIHRoaXMgbGlzdC4KIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhmaW5hbCBsb25nIHZhbHVlKSB7CisJcHVibGljIGJvb2xlYW4gY29udGFpbnMobG9uZyB2YWx1ZSkgewogCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCiAJCQlpZiAoZW50cmllc1tpXSA9PSB2YWx1ZSkKIAkJCQlyZXR1cm4gdHJ1ZTsKQEAgLTEyMiw3ICsxMjIsNyBAQAogCSAqIEBwYXJhbSBuCiAJICogICAgICAgICAgICB0aGUgbnVtYmVyIHRvIGFkZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoZmluYWwgbG9uZyBuKSB7CisJcHVibGljIHZvaWQgYWRkKGxvbmcgbikgewogCQlpZiAoY291bnQgPT0gZW50cmllcy5sZW5ndGgpCiAJCQlncm93KCk7CiAJCWVudHJpZXNbY291bnQrK10gPSBuOwpAQCAtMTM2LDcgKzEzNiw3IEBACiAJICogQHBhcmFtIG4KIAkgKiAgICAgICAgICAgIHZhbHVlIHRvIHN0b3JlIGF0IHRoZSBwb3NpdGlvbi4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoZmluYWwgaW50IGluZGV4LCBmaW5hbCBsb25nIG4pIHsKKwlwdWJsaWMgdm9pZCBzZXQoaW50IGluZGV4LCBsb25nIG4pIHsKIAkJaWYgKGNvdW50IDwgaW5kZXgpCiAJCQl0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKGluZGV4KTsKIAkJZWxzZSBpZiAoY291bnQgPT0gaW5kZXgpCkBAIC0xNTUsNyArMTU1LDcgQEAKIAkgKiBAcGFyYW0gdmFsCiAJICogICAgICAgICAgICB2YWx1ZSB0byBpbnNlcnQgaW50byBwYWRkZWQgcG9zaXRpb25zLgogCSAqLwotCXB1YmxpYyB2b2lkIGZpbGxUbyhpbnQgdG9JbmRleCwgZmluYWwgbG9uZyB2YWwpIHsKKwlwdWJsaWMgdm9pZCBmaWxsVG8oaW50IHRvSW5kZXgsIGxvbmcgdmFsKSB7CiAJCXdoaWxlIChjb3VudCA8IHRvSW5kZXgpCiAJCQlhZGQodmFsKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvTG9uZ01hcC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0xvbmdNYXAuamF2YQppbmRleCAwOWVlZTQyLi44YzdmNjcyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvTG9uZ01hcC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9Mb25nTWFwLmphdmEKQEAgLTE0NCw3ICsxNDQsNyBAQAogCQlyZXR1cm4gbnVsbDsKIAl9CiAKLQlwcml2YXRlIHZvaWQgaW5zZXJ0KGZpbmFsIE5vZGU8Vj4gbikgeworCXByaXZhdGUgdm9pZCBpbnNlcnQoTm9kZTxWPiBuKSB7CiAJCWZpbmFsIGludCBpZHggPSBpbmRleChuLmtleSk7CiAJCW4ubmV4dCA9IHRhYmxlW2lkeF07CiAJCXRhYmxlW2lkeF0gPSBuOwpAQCAtMTY2LDE0ICsxNjYsMTQgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgZmluYWwgaW50IGluZGV4KGZpbmFsIGxvbmcga2V5KSB7CisJcHJpdmF0ZSBmaW5hbCBpbnQgaW5kZXgobG9uZyBrZXkpIHsKIAkJaW50IGggPSAoKGludCkga2V5KSA+Pj4gMTsKIAkJaCBePSAoaCA+Pj4gMjApIF4gKGggPj4+IDEyKTsKIAkJcmV0dXJuIGggJiAodGFibGUubGVuZ3RoIC0gMSk7CiAJfQogCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgPFY+IE5vZGU8Vj5bXSBjcmVhdGVBcnJheShmaW5hbCBpbnQgc3opIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCA8Vj4gTm9kZTxWPltdIGNyZWF0ZUFycmF5KGludCBzeikgewogCQlyZXR1cm4gbmV3IE5vZGVbc3pdOwogCX0KIApAQCAtMTgyLDcgKzE4Miw3IEBACiAJCVYgdmFsdWU7CiAJCU5vZGU8Vj4gbmV4dDsKIAotCQlOb2RlKGZpbmFsIGxvbmcgaywgZmluYWwgViB2KSB7CisJCU5vZGUobG9uZyBrLCBWIHYpIHsKIAkJCWtleSA9IGs7CiAJCQl2YWx1ZSA9IHY7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9RdW90ZWRTdHJpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9RdW90ZWRTdHJpbmcuamF2YQppbmRleCA3N2JjMjQ5Li40ZDU4ZDA2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUXVvdGVkU3RyaW5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1F1b3RlZFN0cmluZy5qYXZhCkBAIC05OSw3ICs5OSw3IEBACiAJICogQHJldHVybiB0aGUgY2xlYW5lZCBzdHJpbmcuCiAJICogQHNlZSAjZGVxdW90ZShieXRlW10sIGludCwgaW50KQogCSAqLwotCXB1YmxpYyBTdHJpbmcgZGVxdW90ZShmaW5hbCBTdHJpbmcgaW4pIHsKKwlwdWJsaWMgU3RyaW5nIGRlcXVvdGUoU3RyaW5nIGluKSB7CiAJCWZpbmFsIGJ5dGVbXSBiID0gQ29uc3RhbnRzLmVuY29kZShpbik7CiAJCXJldHVybiBkZXF1b3RlKGIsIDAsIGIubGVuZ3RoKTsKIAl9CkBAIC0xMzcsNyArMTM3LDcgQEAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGNsYXNzIEJvdXJuZVN0eWxlIGV4dGVuZHMgUXVvdGVkU3RyaW5nIHsKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgcXVvdGUoZmluYWwgU3RyaW5nIGluKSB7CisJCXB1YmxpYyBTdHJpbmcgcXVvdGUoU3RyaW5nIGluKSB7CiAJCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQkJci5hcHBlbmQoJ1wnJyk7CiAJCQlpbnQgc3RhcnQgPSAwLCBpID0gMDsKQEAgLTE2MCw3ICsxNjAsNyBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZGVxdW90ZShmaW5hbCBieXRlW10gaW4sIGludCBpcCwgZmluYWwgaW50IGllKSB7CisJCXB1YmxpYyBTdHJpbmcgZGVxdW90ZShieXRlW10gaW4sIGludCBpcCwgaW50IGllKSB7CiAJCQlib29sZWFuIGlucXVvdGUgPSBmYWxzZTsKIAkJCWZpbmFsIGJ5dGVbXSByID0gbmV3IGJ5dGVbaWUgLSBpcF07CiAJCQlpbnQgclB0ciA9IDA7CkBAIC0xODgsNyArMTg4LDcgQEAKIAkvKiogQm91cm5lIHN0eWxlLCBidXQgcGVybWl0cyA8Y29kZT5+dXNlcjwvY29kZT4gYXQgdGhlIHN0YXJ0IG9mIHRoZSBzdHJpbmcuICovCiAJcHVibGljIHN0YXRpYyBjbGFzcyBCb3VybmVVc2VyUGF0aFN0eWxlIGV4dGVuZHMgQm91cm5lU3R5bGUgewogCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBxdW90ZShmaW5hbCBTdHJpbmcgaW4pIHsKKwkJcHVibGljIFN0cmluZyBxdW90ZShTdHJpbmcgaW4pIHsKIAkJCWlmIChpbi5tYXRjaGVzKCJefltBLVphLXowLTlfLV0rJCIpKSB7IC8vJE5PTi1OTFMtMSQKIAkJCQkvLyBJZiB0aGUgc3RyaW5nIGlzIGp1c3QgIn51c2VyIiB3ZSBjYW4gYXNzdW1lIHRoZXkKIAkJCQkvLyBtZWFuICJ+dXNlci8iLgpAQCAtMjU1LDcgKzI1NSw3IEBACiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBxdW90ZShmaW5hbCBTdHJpbmcgaW5zdHIpIHsKKwkJcHVibGljIFN0cmluZyBxdW90ZShTdHJpbmcgaW5zdHIpIHsKIAkJCWlmIChpbnN0ci5sZW5ndGgoKSA9PSAwKQogCQkJCXJldHVybiAiXCJcIiI7IC8vJE5PTi1OTFMtMSQKIAkJCWJvb2xlYW4gcmV1c2UgPSB0cnVlOwpAQCAtMjkxLDEzICsyOTEsMTMgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGRlcXVvdGUoZmluYWwgYnl0ZVtdIGluLCBmaW5hbCBpbnQgaW5QdHIsIGZpbmFsIGludCBpbkVuZCkgeworCQlwdWJsaWMgU3RyaW5nIGRlcXVvdGUoYnl0ZVtdIGluLCBpbnQgaW5QdHIsIGludCBpbkVuZCkgewogCQkJaWYgKDIgPD0gaW5FbmQgLSBpblB0ciAmJiBpbltpblB0cl0gPT0gJyInICYmIGluW2luRW5kIC0gMV0gPT0gJyInKQogCQkJCXJldHVybiBkcShpbiwgaW5QdHIgKyAxLCBpbkVuZCAtIDEpOwogCQkJcmV0dXJuIFJhd1BhcnNlVXRpbHMuZGVjb2RlKENvbnN0YW50cy5DSEFSU0VULCBpbiwgaW5QdHIsIGluRW5kKTsKIAkJfQogCi0JCXByaXZhdGUgc3RhdGljIFN0cmluZyBkcShmaW5hbCBieXRlW10gaW4sIGludCBpblB0ciwgZmluYWwgaW50IGluRW5kKSB7CisJCXByaXZhdGUgc3RhdGljIFN0cmluZyBkcShieXRlW10gaW4sIGludCBpblB0ciwgaW50IGluRW5kKSB7CiAJCQlmaW5hbCBieXRlW10gciA9IG5ldyBieXRlW2luRW5kIC0gaW5QdHJdOwogCQkJaW50IHJQdHIgPSAwOwogCQkJd2hpbGUgKGluUHRyIDwgaW5FbmQpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdDaGFyU2VxdWVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdDaGFyU2VxdWVuY2UuamF2YQppbmRleCAyM2VlOWQwLi40MjA2MGM2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3Q2hhclNlcXVlbmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd0NoYXJTZXF1ZW5jZS5qYXZhCkBAIC02OCw3ICs2OCw3IEBACiAJICogQHBhcmFtIGVuZAogCSAqICAgICAgICAgICAgZW5kaW5nIHBvc2l0aW9uIGZvciB0aGUgc2VxdWVuY2UuCiAJICovCi0JcHVibGljIFJhd0NoYXJTZXF1ZW5jZShmaW5hbCBieXRlW10gYnVmLCBmaW5hbCBpbnQgc3RhcnQsIGZpbmFsIGludCBlbmQpIHsKKwlwdWJsaWMgUmF3Q2hhclNlcXVlbmNlKGJ5dGVbXSBidWYsIGludCBzdGFydCwgaW50IGVuZCkgewogCQlidWZmZXIgPSBidWY7CiAJCXN0YXJ0UHRyID0gc3RhcnQ7CiAJCWVuZFB0ciA9IGVuZDsKQEAgLTc2LDcgKzc2LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGNoYXIgY2hhckF0KGZpbmFsIGludCBpbmRleCkgeworCXB1YmxpYyBjaGFyIGNoYXJBdChpbnQgaW5kZXgpIHsKIAkJcmV0dXJuIChjaGFyKSAoYnVmZmVyW3N0YXJ0UHRyICsgaW5kZXhdICYgMHhmZik7CiAJfQogCkBAIC04OCw3ICs4OCw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBDaGFyU2VxdWVuY2Ugc3ViU2VxdWVuY2UoZmluYWwgaW50IHN0YXJ0LCBmaW5hbCBpbnQgZW5kKSB7CisJcHVibGljIENoYXJTZXF1ZW5jZSBzdWJTZXF1ZW5jZShpbnQgc3RhcnQsIGludCBlbmQpIHsKIAkJcmV0dXJuIG5ldyBSYXdDaGFyU2VxdWVuY2UoYnVmZmVyLCBzdGFydFB0ciArIHN0YXJ0LCBzdGFydFB0ciArIGVuZCk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3UGFyc2VVdGlscy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd1BhcnNlVXRpbHMuamF2YQppbmRleCAwMTRjNzcyLi5jMjJjOGRlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3UGFyc2VVdGlscy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdQYXJzZVV0aWxzLmphdmEKQEAgLTYzLDYgKzYzLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9ucy5OdWxsYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5CaW5hcnlCbG9iRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5QZXJzb25JZGVudDsKIApAQCAtMTI1LDcgKzEyNiw3IEBACiAJICogICAgICAgICAgICB0aGUgYnVmZmVyIHRvIHRlc3QgZm9yIGVxdWFsaXR5IHdpdGggYi4KIAkgKiBAcmV0dXJuIHB0ciArIHNyYy5sZW5ndGggaWYgYltwdHIuLnNyYy5sZW5ndGhdID09IHNyYzsgZWxzZSAtMS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBtYXRjaChmaW5hbCBieXRlW10gYiwgaW50IHB0ciwgZmluYWwgYnl0ZVtdIHNyYykgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1hdGNoKGJ5dGVbXSBiLCBpbnQgcHRyLCBieXRlW10gc3JjKSB7CiAJCWlmIChwdHIgKyBzcmMubGVuZ3RoID4gYi5sZW5ndGgpCiAJCQlyZXR1cm4gLTE7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgc3JjLmxlbmd0aDsgaSsrLCBwdHIrKykKQEAgLTQ2MSw3ICs0NjIsNyBAQAogCSAqICAgICAgICAgICAgcG9zaXRpb24gd2l0aGluIGJ1ZmZlciB0byBzdGFydCBwYXJzaW5nIGRpZ2l0cyBhdC4KIAkgKiBAcmV0dXJuIHRoZSB0aW1lem9uZSBhdCB0aGlzIGxvY2F0aW9uLCBleHByZXNzZWQgaW4gbWludXRlcy4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwYXJzZVRpbWVab25lT2Zmc2V0KGZpbmFsIGJ5dGVbXSBiLCBpbnQgcHRyKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGFyc2VUaW1lWm9uZU9mZnNldChieXRlW10gYiwgaW50IHB0cikgewogCQlyZXR1cm4gcGFyc2VUaW1lWm9uZU9mZnNldChiLCBwdHIsIG51bGwpOwogCX0KIApAQCAtNTAwLDcgKzUwMSw3IEBACiAJICogICAgICAgICAgICBjaGFyYWN0ZXIgdG8gZmluZC4KIAkgKiBAcmV0dXJuIG5ldyBwb3NpdGlvbiBqdXN0IGFmdGVyIGNockEuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbmV4dChmaW5hbCBieXRlW10gYiwgaW50IHB0ciwgZmluYWwgY2hhciBjaHJBKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbmV4dChieXRlW10gYiwgaW50IHB0ciwgY2hhciBjaHJBKSB7CiAJCWZpbmFsIGludCBzeiA9IGIubGVuZ3RoOwogCQl3aGlsZSAocHRyIDwgc3opIHsKIAkJCWlmIChiW3B0cisrXSA9PSBjaHJBKQpAQCAtNTIwLDcgKzUyMSw3IEBACiAJICogICAgICAgICAgICBwb3NpdGlvbiB3aXRoaW4gYnVmZmVyIHRvIHN0YXJ0IGxvb2tpbmcgZm9yIExGIGF0LgogCSAqIEByZXR1cm4gbmV3IHBvc2l0aW9uIGp1c3QgYWZ0ZXIgdGhlIGZpcnN0IExGIGZvdW5kLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG5leHRMRihmaW5hbCBieXRlW10gYiwgaW50IHB0cikgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG5leHRMRihieXRlW10gYiwgaW50IHB0cikgewogCQlyZXR1cm4gbmV4dChiLCBwdHIsICdcbicpOwogCX0KIApAQCAtNTM3LDcgKzUzOCw3IEBACiAJICogICAgICAgICAgICBjaGFyYWN0ZXIgdG8gZmluZC4KIAkgKiBAcmV0dXJuIG5ldyBwb3NpdGlvbiBqdXN0IGFmdGVyIHRoZSBmaXJzdCBjaHJBIG9yIExGIHRvIGJlIGZvdW5kLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG5leHRMRihmaW5hbCBieXRlW10gYiwgaW50IHB0ciwgZmluYWwgY2hhciBjaHJBKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbmV4dExGKGJ5dGVbXSBiLCBpbnQgcHRyLCBjaGFyIGNockEpIHsKIAkJZmluYWwgaW50IHN6ID0gYi5sZW5ndGg7CiAJCXdoaWxlIChwdHIgPCBzeikgewogCQkJZmluYWwgYnl0ZSBjID0gYltwdHIrK107CkBAIC01NTgsNyArNTU5LDcgQEAKIAkgKiAgICAgICAgICAgIGNoYXJhY3RlciB0byBmaW5kLgogCSAqIEByZXR1cm4gbmV3IHBvc2l0aW9uIGp1c3QgYmVmb3JlIGNockEsIC0xIGZvciBub3QgZm91bmQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcmV2KGZpbmFsIGJ5dGVbXSBiLCBpbnQgcHRyLCBmaW5hbCBjaGFyIGNockEpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcmV2KGJ5dGVbXSBiLCBpbnQgcHRyLCBjaGFyIGNockEpIHsKIAkJaWYgKHB0ciA9PSBiLmxlbmd0aCkKIAkJCS0tcHRyOwogCQl3aGlsZSAocHRyID49IDApIHsKQEAgLTU3OSw3ICs1ODAsNyBAQAogCSAqICAgICAgICAgICAgcG9zaXRpb24gd2l0aGluIGJ1ZmZlciB0byBzdGFydCBsb29raW5nIGZvciBMRiBhdC4KIAkgKiBAcmV0dXJuIG5ldyBwb3NpdGlvbiBqdXN0IGJlZm9yZSB0aGUgZmlyc3QgTEYgZm91bmQsIC0xIGZvciBub3QgZm91bmQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcmV2TEYoZmluYWwgYnl0ZVtdIGIsIGludCBwdHIpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcmV2TEYoYnl0ZVtdIGIsIGludCBwdHIpIHsKIAkJcmV0dXJuIHByZXYoYiwgcHRyLCAnXG4nKTsKIAl9CiAKQEAgLTU5Nyw3ICs1OTgsNyBAQAogCSAqIEByZXR1cm4gbmV3IHBvc2l0aW9uIGp1c3QgYmVmb3JlIHRoZSBmaXJzdCBjaHJBIG9yIExGIHRvIGJlIGZvdW5kLCAtMSBmb3IKIAkgKiAgICAgICAgIG5vdCBmb3VuZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByZXZMRihmaW5hbCBieXRlW10gYiwgaW50IHB0ciwgZmluYWwgY2hhciBjaHJBKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJldkxGKGJ5dGVbXSBiLCBpbnQgcHRyLCBjaGFyIGNockEpIHsKIAkJaWYgKHB0ciA9PSBiLmxlbmd0aCkKIAkJCS0tcHRyOwogCQl3aGlsZSAocHRyID49IDApIHsKQEAgLTYzMiwxMSArNjMzLDQ3IEBACiAJICogICAgICAgICAgICBsaW5lIDEuCiAJICogQHBhcmFtIGVuZAogCSAqICAgICAgICAgICAgMSBwYXN0IHRoZSBlbmQgb2YgdGhlIGNvbnRlbnQgd2l0aGluIDxjb2RlPmJ1ZjwvY29kZT4uCi0JICogQHJldHVybiBhIGxpbmUgbWFwIGluZGV4aW5nIHRoZSBzdGFydCBwb3NpdGlvbiBvZiBlYWNoIGxpbmUuCisJICogQHJldHVybiBhIGxpbmUgbWFwIGluZGljYXRpbmcgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIGVhY2ggbGluZSwgb3IgYQorCSAqICAgICAgICAgbWFwIHJlcHJlc2VudGluZyB0aGUgZW50aXJlIGJ1ZmZlciBhcyBhIHNpbmdsZSBsaW5lIGlmCisJICogICAgICAgICA8Y29kZT5idWY8L2NvZGU+IGNvbnRhaW5zIGEgTlVMIGJ5dGUuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbnRMaXN0IGxpbmVNYXAoZmluYWwgYnl0ZVtdIGJ1ZiwgaW50IHB0ciwgaW50IGVuZCkgewotCQlpbnQgc3RhcnQgPSBwdHI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBJbnRMaXN0IGxpbmVNYXAoYnl0ZVtdIGJ1ZiwgaW50IHB0ciwgaW50IGVuZCkgeworCQlJbnRMaXN0IG1hcCA9IGxpbmVNYXBPck51bGwoYnVmLCBwdHIsIGVuZCk7CisJCWlmIChtYXAgPT0gbnVsbCkgeworCQkJbWFwID0gbmV3IEludExpc3QoMyk7CisJCQltYXAuYWRkKEludGVnZXIuTUlOX1ZBTFVFKTsKKwkJCW1hcC5hZGQocHRyKTsKKwkJCW1hcC5hZGQoZW5kKTsKKwkJfQorCQlyZXR1cm4gbWFwOworCX0KIAorCS8qKgorCSAqIExpa2Uge0BsaW5rICNsaW5lTWFwKGJ5dGVbXSwgaW50LCBpbnQpfSBidXQgdGhyb3cKKwkgKiB7QGxpbmsgQmluYXJ5QmxvYkV4Y2VwdGlvbn0gaWYgYSBOVUwgYnl0ZSBpcyBlbmNvdW50ZXJlZC4KKwkgKgorCSAqIEBwYXJhbSBidWYKKwkgKiAgICAgICAgICAgIGJ1ZmZlciB0byBzY2FuLgorCSAqIEBwYXJhbSBwdHIKKwkgKiAgICAgICAgICAgIHBvc2l0aW9uIHdpdGhpbiB0aGUgYnVmZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpcnN0IGJ5dGUgb2YKKwkgKiAgICAgICAgICAgIGxpbmUgMS4KKwkgKiBAcGFyYW0gZW5kCisJICogICAgICAgICAgICAxIHBhc3QgdGhlIGVuZCBvZiB0aGUgY29udGVudCB3aXRoaW4gPGNvZGU+YnVmPC9jb2RlPi4KKwkgKiBAcmV0dXJuIGEgbGluZSBtYXAgaW5kaWNhdGluZyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgZWFjaCBsaW5lLgorCSAqIEB0aHJvd3MgQmluYXJ5QmxvYkV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgaWYgYSBOVUwgYnl0ZSBpcyBmb3VuZC4KKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBJbnRMaXN0IGxpbmVNYXBPckJpbmFyeShieXRlW10gYnVmLCBpbnQgcHRyLCBpbnQgZW5kKQorCQkJdGhyb3dzIEJpbmFyeUJsb2JFeGNlcHRpb24geworCQlJbnRMaXN0IG1hcCA9IGxpbmVNYXBPck51bGwoYnVmLCBwdHIsIGVuZCk7CisJCWlmIChtYXAgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IEJpbmFyeUJsb2JFeGNlcHRpb24oKTsKKwkJfQorCQlyZXR1cm4gbWFwOworCX0KKworCXByaXZhdGUgc3RhdGljIEBOdWxsYWJsZSBJbnRMaXN0IGxpbmVNYXBPck51bGwoYnl0ZVtdIGJ1ZiwgaW50IHB0ciwgaW50IGVuZCkgewogCQkvLyBFeHBlcmltZW50YWxseSBkZXJpdmVkIGZyb20gbXVsdGlwbGUgc291cmNlIHJlcG9zaXRvcmllcwogCQkvLyB0aGUgYXZlcmFnZSBudW1iZXIgb2YgYnl0ZXMvbGluZSBpcyAzNi4gSXRzIGEgcm91Z2ggZ3Vlc3MKIAkJLy8gdG8gaW5pdGlhbGx5IHNpemUgb3VyIG1hcCBjbG9zZSB0byB0aGUgdGFyZ2V0LgpAQCAtNjQ5LDExICs2ODYsNyBAQAogCQkJfQogCiAJCQlpZiAoYnVmW3B0cl0gPT0gJ1wwJykgewotCQkJCS8vIGJpbmFyeSBkYXRhLgotCQkJCW1hcCA9IG5ldyBJbnRMaXN0KDMpOwotCQkJCW1hcC5hZGQoSW50ZWdlci5NSU5fVkFMVUUpOwotCQkJCW1hcC5hZGQoc3RhcnQpOwotCQkJCWJyZWFrOworCQkJCXJldHVybiBudWxsOwogCQkJfQogCiAJCQlmb3VuZExGID0gKGJ1ZltwdHJdID09ICdcbicpOwpAQCAtNjc1LDcgKzcwOCw3IEBACiAJICogICAgICAgICBjaGFyYWN0ZXIgb2YgdGhlIGF1dGhvcidzIG5hbWUuIElmIG5vIGF1dGhvciBoZWFkZXIgY2FuIGJlCiAJICogICAgICAgICBsb2NhdGVkIC0xIGlzIHJldHVybmVkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGF1dGhvcihmaW5hbCBieXRlW10gYiwgaW50IHB0cikgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGF1dGhvcihieXRlW10gYiwgaW50IHB0cikgewogCQlmaW5hbCBpbnQgc3ogPSBiLmxlbmd0aDsKIAkJaWYgKHB0ciA9PSAwKQogCQkJcHRyICs9IDQ2OyAvLyBza2lwIHRoZSAidHJlZSAuLi4iIGxpbmUuCkBAIC02OTcsNyArNzMwLDcgQEAKIAkgKiAgICAgICAgIGNoYXJhY3RlciBvZiB0aGUgY29tbWl0dGVyJ3MgbmFtZS4gSWYgbm8gY29tbWl0dGVyIGhlYWRlciBjYW4gYmUKIAkgKiAgICAgICAgIGxvY2F0ZWQgLTEgaXMgcmV0dXJuZWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29tbWl0dGVyKGZpbmFsIGJ5dGVbXSBiLCBpbnQgcHRyKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29tbWl0dGVyKGJ5dGVbXSBiLCBpbnQgcHRyKSB7CiAJCWZpbmFsIGludCBzeiA9IGIubGVuZ3RoOwogCQlpZiAocHRyID09IDApCiAJCQlwdHIgKz0gNDY7IC8vIHNraXAgdGhlICJ0cmVlIC4uLiIgbGluZS4KQEAgLTcyMSw3ICs3NTQsNyBAQAogCSAqICAgICAgICAgY2hhcmFjdGVyIG9mIHRoZSB0YWdnZXIncyBuYW1lLiBJZiBubyB0YWdnZXIgaGVhZGVyIGNhbiBiZQogCSAqICAgICAgICAgbG9jYXRlZCAtMSBpcyByZXR1cm5lZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCB0YWdnZXIoZmluYWwgYnl0ZVtdIGIsIGludCBwdHIpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCB0YWdnZXIoYnl0ZVtdIGIsIGludCBwdHIpIHsKIAkJZmluYWwgaW50IHN6ID0gYi5sZW5ndGg7CiAJCWlmIChwdHIgPT0gMCkKIAkJCXB0ciArPSA0ODsgLy8gc2tpcCB0aGUgIm9iamVjdCAuLi4iIGxpbmUuCkBAIC03NDksNyArNzgyLDcgQEAKIAkgKiAgICAgICAgIGNoYXJhY3RlciBvZiB0aGUgZW5jb2RpbmcncyBuYW1lLiBJZiBubyBlbmNvZGluZyBoZWFkZXIgY2FuIGJlCiAJICogICAgICAgICBsb2NhdGVkIC0xIGlzIHJldHVybmVkIChhbmQgVVRGLTggc2hvdWxkIGJlIGFzc3VtZWQpLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGVuY29kaW5nKGZpbmFsIGJ5dGVbXSBiLCBpbnQgcHRyKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZW5jb2RpbmcoYnl0ZVtdIGIsIGludCBwdHIpIHsKIAkJZmluYWwgaW50IHN6ID0gYi5sZW5ndGg7CiAJCXdoaWxlIChwdHIgPCBzeikgewogCQkJaWYgKGJbcHRyXSA9PSAnXG4nKQpAQCAtNzczLDcgKzgwNiw3IEBACiAJICogQHNpbmNlIDQuMgogCSAqLwogCUBOdWxsYWJsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhcnNlRW5jb2RpbmdOYW1lKGZpbmFsIGJ5dGVbXSBiKSB7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgcGFyc2VFbmNvZGluZ05hbWUoYnl0ZVtdIGIpIHsKIAkJaW50IGVuYyA9IGVuY29kaW5nKGIsIDApOwogCQlpZiAoZW5jIDwgMCkgewogCQkJcmV0dXJuIG51bGw7CkBAIC04MDEsNyArODM0LDcgQEAKIAkgKiAgICAgICAgICAgICBpZiB0aGUgSlJFIGRvZXMgbm90IHN1cHBvcnQgdGhlIGNoYXJhY3RlciBzZXQgcmVxdWVzdGVkIGJ5CiAJICogICAgICAgICAgICAgdGhlIGVuY29kaW5nIGhlYWRlci4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIENoYXJzZXQgcGFyc2VFbmNvZGluZyhmaW5hbCBieXRlW10gYikgeworCXB1YmxpYyBzdGF0aWMgQ2hhcnNldCBwYXJzZUVuY29kaW5nKGJ5dGVbXSBiKSB7CiAJCVN0cmluZyBlbmMgPSBwYXJzZUVuY29kaW5nTmFtZShiKTsKIAkJaWYgKGVuYyA9PSBudWxsKSB7CiAJCQlyZXR1cm4gVVRGXzg7CkBAIC04MzEsNyArODY0LDcgQEAKIAkgKiBAcmV0dXJuIHRoZSBwYXJzZWQgaWRlbnRpdHkgb3IgbnVsbCBpbiBjYXNlIHRoZSBpZGVudGl0eSBjb3VsZCBub3QgYmUKIAkgKiAgICAgICAgIHBhcnNlZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFBlcnNvbklkZW50IHBhcnNlUGVyc29uSWRlbnQoZmluYWwgU3RyaW5nIGluKSB7CisJcHVibGljIHN0YXRpYyBQZXJzb25JZGVudCBwYXJzZVBlcnNvbklkZW50KFN0cmluZyBpbikgewogCQlyZXR1cm4gcGFyc2VQZXJzb25JZGVudChDb25zdGFudHMuZW5jb2RlKGluKSwgMCk7CiAJfQogCkBAIC04NTMsNyArODg2LDcgQEAKIAkgKiBAcmV0dXJuIHRoZSBwYXJzZWQgaWRlbnRpdHkgb3IgbnVsbCBpbiBjYXNlIHRoZSBpZGVudGl0eSBjb3VsZCBub3QgYmUKIAkgKiAgICAgICAgIHBhcnNlZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFBlcnNvbklkZW50IHBhcnNlUGVyc29uSWRlbnQoZmluYWwgYnl0ZVtdIHJhdywgZmluYWwgaW50IG5hbWVCKSB7CisJcHVibGljIHN0YXRpYyBQZXJzb25JZGVudCBwYXJzZVBlcnNvbklkZW50KGJ5dGVbXSByYXcsIGludCBuYW1lQikgewogCQlDaGFyc2V0IGNzOwogCQl0cnkgewogCQkJY3MgPSBwYXJzZUVuY29kaW5nKHJhdyk7CkBAIC05NjEsNyArOTk0LDcgQEAKIAkgKiBAcmV0dXJuIHBvc2l0aW9uIG9mIHRoZSAnOicgd2hpY2ggdGVybWluYXRlcyB0aGUgZm9vdGVyIGxpbmUga2V5IGlmIHRoaXMKIAkgKiAgICAgICAgIGlzIG90aGVyd2lzZSBhIHZhbGlkIGZvb3RlciBsaW5lIGtleTsgb3RoZXJ3aXNlIC0xLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGVuZE9mRm9vdGVyTGluZUtleShmaW5hbCBieXRlW10gcmF3LCBpbnQgcHRyKSB7CisJcHVibGljIHN0YXRpYyBpbnQgZW5kT2ZGb290ZXJMaW5lS2V5KGJ5dGVbXSByYXcsIGludCBwdHIpIHsKIAkJdHJ5IHsKIAkJCWZvciAoOzspIHsKIAkJCQlmaW5hbCBieXRlIGMgPSByYXdbcHRyXTsKQEAgLTk4OCw3ICsxMDIxLDcgQEAKIAkgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByYW5nZSA8Y29kZT5bc3RhcnQsZW5kKTwvY29kZT4sCiAJICogICAgICAgICBhZnRlciBkZWNvZGluZyB0aGUgcmVnaW9uIHRocm91Z2ggdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgc2V0LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlY29kZShmaW5hbCBieXRlW10gYnVmZmVyKSB7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZGVjb2RlKGJ5dGVbXSBidWZmZXIpIHsKIAkJcmV0dXJuIGRlY29kZShidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgpOwogCX0KIApAQCAtMTAyNiw3ICsxMDU5LDcgQEAKIAkgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByYW5nZSA8Y29kZT5bc3RhcnQsZW5kKTwvY29kZT4sCiAJICogICAgICAgICBhZnRlciBkZWNvZGluZyB0aGUgcmVnaW9uIHRocm91Z2ggdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgc2V0LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlY29kZShmaW5hbCBDaGFyc2V0IGNzLCBmaW5hbCBieXRlW10gYnVmZmVyKSB7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZGVjb2RlKENoYXJzZXQgY3MsIGJ5dGVbXSBidWZmZXIpIHsKIAkJcmV0dXJuIGRlY29kZShjcywgYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKTsKIAl9CiAKQEAgLTExNDMsNyArMTE3Niw3IEBACiAJCXJldHVybiByLnRvU3RyaW5nKCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlY29kZShmaW5hbCBCeXRlQnVmZmVyIGIsIGZpbmFsIENoYXJzZXQgY2hhcnNldCkKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVjb2RlKEJ5dGVCdWZmZXIgYiwgQ2hhcnNldCBjaGFyc2V0KQogCQkJdGhyb3dzIENoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbiB7CiAJCWZpbmFsIENoYXJzZXREZWNvZGVyIGQgPSBjaGFyc2V0Lm5ld0RlY29kZXIoKTsKIAkJZC5vbk1hbGZvcm1lZElucHV0KENvZGluZ0Vycm9yQWN0aW9uLlJFUE9SVCk7CkBAIC0xMTYyLDcgKzExOTUsNyBAQAogCSAqICAgICAgICAgICAgY29tbWl0IGJ1ZmZlci4KIAkgKiBAcmV0dXJuIHBvc2l0aW9uIG9mIHRoZSB1c2VyJ3MgbWVzc2FnZSBidWZmZXIuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29tbWl0TWVzc2FnZShmaW5hbCBieXRlW10gYiwgaW50IHB0cikgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbW1pdE1lc3NhZ2UoYnl0ZVtdIGIsIGludCBwdHIpIHsKIAkJZmluYWwgaW50IHN6ID0gYi5sZW5ndGg7CiAJCWlmIChwdHIgPT0gMCkKIAkJCXB0ciArPSA0NjsgLy8gc2tpcCB0aGUgInRyZWUgLi4uIiBsaW5lLgpAQCAtMTE4Niw3ICsxMjE5LDcgQEAKIAkgKiAgICAgICAgICAgIGJ1ZmZlci4KIAkgKiBAcmV0dXJuIHBvc2l0aW9uIG9mIHRoZSB1c2VyJ3MgbWVzc2FnZSBidWZmZXIuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGFnTWVzc2FnZShmaW5hbCBieXRlW10gYiwgaW50IHB0cikgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRhZ01lc3NhZ2UoYnl0ZVtdIGIsIGludCBwdHIpIHsKIAkJZmluYWwgaW50IHN6ID0gYi5sZW5ndGg7CiAJCWlmIChwdHIgPT0gMCkKIAkJCXB0ciArPSA0ODsgLy8gc2tpcCB0aGUgIm9iamVjdCAuLi4iIGxpbmUuCkBAIC0xMjExLDcgKzEyNDQsNyBAQAogCSAqIEByZXR1cm4gcG9zaXRpb24gb2YgdGhlIExGIGF0IHRoZSBlbmQgb2YgdGhlIHBhcmFncmFwaDsKIAkgKiAgICAgICAgIDxjb2RlPmIubGVuZ3RoPC9jb2RlPiBpZiBubyBwYXJhZ3JhcGggZW5kIGNvdWxkIGJlIGxvY2F0ZWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZW5kT2ZQYXJhZ3JhcGgoZmluYWwgYnl0ZVtdIGIsIGZpbmFsIGludCBzdGFydCkgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGVuZE9mUGFyYWdyYXBoKGJ5dGVbXSBiLCBpbnQgc3RhcnQpIHsKIAkJaW50IHB0ciA9IHN0YXJ0OwogCQlmaW5hbCBpbnQgc3ogPSBiLmxlbmd0aDsKIAkJd2hpbGUgKHB0ciA8IHN6ICYmIChiW3B0cl0gIT0gJ1xuJyAmJiBiW3B0cl0gIT0gJ1xyJykpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3U3ViU3RyaW5nUGF0dGVybi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd1N1YlN0cmluZ1BhdHRlcm4uamF2YQppbmRleCBhOGY5YmM3Li4wNDBiNWNiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3U3ViU3RyaW5nUGF0dGVybi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdTdWJTdHJpbmdQYXR0ZXJuLmphdmEKQEAgLTY2LDcgKzY2LDcgQEAKIAkgKiAgICAgICAgICAgIG1ldGEtY2hhcmFjdGVycyBhcmUgc3VwcG9ydGVkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb24uIFRoZQogCSAqICAgICAgICAgICAgc3RyaW5nIG1heSBub3QgYmUgdGhlIGVtcHR5IHN0cmluZy4KIAkgKi8KLQlwdWJsaWMgUmF3U3ViU3RyaW5nUGF0dGVybihmaW5hbCBTdHJpbmcgcGF0dGVyblRleHQpIHsKKwlwdWJsaWMgUmF3U3ViU3RyaW5nUGF0dGVybihTdHJpbmcgcGF0dGVyblRleHQpIHsKIAkJaWYgKHBhdHRlcm5UZXh0Lmxlbmd0aCgpID09IDApCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLmNhbm5vdE1hdGNoT25FbXB0eVN0cmluZyk7CiAJCW5lZWRsZVN0cmluZyA9IHBhdHRlcm5UZXh0OwpAQCAtODcsNyArODcsNyBAQAogCSAqICAgICAgICAgcGF0dGVybjsgLTEgaWYgdGhpcyBwYXR0ZXJuIGRvZXMgbm90IGFwcGVhciBhdCBhbnkgcG9zaXRpb24gb2YKIAkgKiAgICAgICAgIDxjb2RlPnJjczwvY29kZT4uCiAJICovCi0JcHVibGljIGludCBtYXRjaChmaW5hbCBSYXdDaGFyU2VxdWVuY2UgcmNzKSB7CisJcHVibGljIGludCBtYXRjaChSYXdDaGFyU2VxdWVuY2UgcmNzKSB7CiAJCWZpbmFsIGludCBuZWVkbGVMZW4gPSBuZWVkbGUubGVuZ3RoOwogCQlmaW5hbCBieXRlIGZpcnN0ID0gbmVlZGxlWzBdOwogCkBAIC0xMTQsMTEgKzExNCwxMSBAQAogCQlyZXR1cm4gLTE7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBuZXEoZmluYWwgYnl0ZSBhLCBmaW5hbCBieXRlIGIpIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIG5lcShieXRlIGEsIGJ5dGUgYikgewogCQlyZXR1cm4gYSAhPSBiICYmIGEgIT0gbGMoYik7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBsYyhmaW5hbCBieXRlIHEpIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIGxjKGJ5dGUgcSkgewogCQlyZXR1cm4gKGJ5dGUpIFN0cmluZ1V0aWxzLnRvTG93ZXJDYXNlKChjaGFyKSAocSAmIDB4ZmYpKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SZWZNYXAuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SZWZNYXAuamF2YQppbmRleCBjMWFhZWNmLi5hM2Y5NzMwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmVmTWFwLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1JlZk1hcC5qYXZhCkBAIC0xNjksNyArMTY5LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIFJlZiBwdXQoZmluYWwgU3RyaW5nIGtleU5hbWUsIFJlZiB2YWx1ZSkgeworCXB1YmxpYyBSZWYgcHV0KFN0cmluZyBrZXlOYW1lLCBSZWYgdmFsdWUpIHsKIAkJU3RyaW5nIG5hbWUgPSB0b1JlZk5hbWUoa2V5TmFtZSk7CiAKIAkJaWYgKCFuYW1lLmVxdWFscyh2YWx1ZS5nZXROYW1lKCkpKQpAQCAtMzU1LDcgKzM1NSw3IEBACiAJCQlyZXR1cm4gbnVsbDsKIAkJfQogCi0JCXByaXZhdGUgUmVmIHJlc29sdmVMb29zZShmaW5hbCBSZWYgbCkgeworCQlwcml2YXRlIFJlZiByZXNvbHZlTG9vc2UoUmVmIGwpIHsKIAkJCWlmIChyZXNvbHZlZElkeCA8IHJlc29sdmVkLnNpemUoKSkgewogCQkJCVJlZiByID0gcmVzb2x2ZWQuZ2V0KHJlc29sdmVkSWR4KTsKIAkJCQlpbnQgY21wID0gUmVmQ29tcGFyYXRvci5jb21wYXJlVG8obCwgcik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvU3NoU3VwcG9ydC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1NzaFN1cHBvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTNhYTcyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1NzaFN1cHBvcnQuamF2YQpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCwgTWFya3VzIER1ZnQgPG1hcmt1cy5kdWZ0QHNzaS1zY2hhZWZlci5jb20+CisgKiBhbmQgb3RoZXIgY29weXJpZ2h0IG93bmVycyBhcyBkb2N1bWVudGVkIGluIHRoZSBwcm9qZWN0J3MgSVAgbG9nLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlCisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgdjEuMCB3aGljaAorICogYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGlzIHJlcHJvZHVjZWQgYmVsb3csIGFuZCBpcworICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocAorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIEluYy4gbm9yIHRoZQorICogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQKKyAqIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgorICogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC51dGlsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnMuTnVsbGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQ29tbWFuZEZhaWxlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkNyZWRlbnRpYWxzUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUmVtb3RlU2Vzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5Tc2hTZXNzaW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5VUklpc2g7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvLk1lc3NhZ2VXcml0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvLlN0cmVhbUNvcHlUaHJlYWQ7CisKKy8qKgorICogRXh0cmEgdXRpbGl0aWVzIHRvIHN1cHBvcnQgdXNhZ2Ugb2YgU1NILgorICoKKyAqIEBzaW5jZSA1LjAKKyAqLworcHVibGljIGNsYXNzIFNzaFN1cHBvcnQgeworCisJLyoqCisJICogVXRpbGl0eSB0byBleGVjdXRlIGEgcmVtb3RlIFNTSCBjb21tYW5kIGFuZCByZWFkIHRoZSBmaXJzdCBsaW5lIG9mCisJICogb3V0cHV0LgorCSAqCisJICogQHBhcmFtIHNzaFVyaQorCSAqICAgICAgICAgICAgdGhlIFNTSCByZW1vdGUgVVJJCisJICogQHBhcmFtIHByb3ZpZGVyCisJICogICAgICAgICAgICB0aGUge0BsaW5rIENyZWRlbnRpYWxzUHJvdmlkZXJ9IG9yIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBmcworCSAqICAgICAgICAgICAgdGhlIHtAbGluayBGU30gaW1wbGVtZW50YXRpb24gcGFzc2VkIHRvCisJICogICAgICAgICAgICB7QGxpbmsgU3NoU2Vzc2lvbkZhY3Rvcnl9CisJICogQHBhcmFtIGNvbW1hbmQKKwkgKiAgICAgICAgICAgIHRoZSByZW1vdGUgY29tbWFuZCB0byBleGVjdXRlLgorCSAqIEBwYXJhbSB0aW1lb3V0CisJICogICAgICAgICAgICBhIHRpbWVvdXQgaW4gc2Vjb25kcy4gVGhlIHRpbWVvdXQgbWF5IGJlIGV4Y2VlZGVkIGluIGNvcm5lcgorCSAqICAgICAgICAgICAgY2FzZXMuCisJICogQHJldHVybiBUaGUgZW50aXJlIG91dHB1dCByZWFkIGZyb20gc3Rkb3V0LgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKiBAdGhyb3dzIENvbW1hbmRGYWlsZWRFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB0aGUgc3NoIGNvbW1hbmQgZXhlY3V0aW9uIGZhaWxlZCwgZXJyb3IgbWVzc2FnZSBjb250YWlucworCSAqICAgICAgICAgICAgIHRoZSBjb250ZW50IG9mIHN0ZGVyci4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBydW5Tc2hDb21tYW5kKFVSSWlzaCBzc2hVcmksCisJCQlATnVsbGFibGUgQ3JlZGVudGlhbHNQcm92aWRlciBwcm92aWRlciwgRlMgZnMsIFN0cmluZyBjb21tYW5kLAorCQkJaW50IHRpbWVvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29tbWFuZEZhaWxlZEV4Y2VwdGlvbiB7CisJCVJlbW90ZVNlc3Npb24gc2Vzc2lvbiA9IG51bGw7CisJCVByb2Nlc3MgcHJvY2VzcyA9IG51bGw7CisJCVN0cmVhbUNvcHlUaHJlYWQgZXJyb3JUaHJlYWQgPSBudWxsOworCQlTdHJlYW1Db3B5VGhyZWFkIG91dFRocmVhZCA9IG51bGw7CisJCUNvbW1hbmRGYWlsZWRFeGNlcHRpb24gZmFpbHVyZSA9IG51bGw7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCisJCU1lc3NhZ2VXcml0ZXIgc3RkZXJyID0gbmV3IE1lc3NhZ2VXcml0ZXIoKTsKKwkJdHJ5IChNZXNzYWdlV3JpdGVyIHN0ZG91dCA9IG5ldyBNZXNzYWdlV3JpdGVyKCkpIHsKKwkJCXNlc3Npb24gPSBTc2hTZXNzaW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNlc3Npb24oc3NoVXJpLAorCQkJCQlwcm92aWRlciwgZnMsIDEwMDAgKiB0aW1lb3V0KTsKKwkJCXByb2Nlc3MgPSBzZXNzaW9uLmV4ZWMoY29tbWFuZCwgMCk7CisJCQllcnJvclRocmVhZCA9IG5ldyBTdHJlYW1Db3B5VGhyZWFkKHByb2Nlc3MuZ2V0RXJyb3JTdHJlYW0oKSwKKwkJCQkJc3RkZXJyLmdldFJhd1N0cmVhbSgpKTsKKwkJCWVycm9yVGhyZWFkLnN0YXJ0KCk7CisJCQlvdXRUaHJlYWQgPSBuZXcgU3RyZWFtQ29weVRocmVhZChwcm9jZXNzLmdldElucHV0U3RyZWFtKCksCisJCQkJCXN0ZG91dC5nZXRSYXdTdHJlYW0oKSk7CisJCQlvdXRUaHJlYWQuc3RhcnQoKTsKKwkJCXRyeSB7CisJCQkJLy8gd2FpdEZvciB3aXRoIHRpbWVvdXQgaGFzIGEgYnVnIC0gSlNjaCcgZXhpdFZhbHVlKCkgdGhyb3dzIHRoZQorCQkJCS8vIHdyb25nIGV4Y2VwdGlvbiB0eXBlIDooCisJCQkJaWYgKHByb2Nlc3Mud2FpdEZvcigpID09IDApIHsKKwkJCQkJcmV0dXJuIHN0ZG91dC50b1N0cmluZygpOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBudWxsOyAvLyBzdGlsbCBydW5uaW5nIGFmdGVyIHRpbWVvdXQKKwkJCQl9CisJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCisJCQl9CisJCX0gZmluYWxseSB7CisJCQlpZiAoZXJyb3JUaHJlYWQgIT0gbnVsbCkgeworCQkJCXRyeSB7CisJCQkJCWVycm9yVGhyZWFkLmhhbHQoKTsKKwkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIFN0b3Agd2FpdGluZyBhbmQgcmV0dXJuIGFueXdheS4KKwkJCQl9IGZpbmFsbHkgeworCQkJCQllcnJvclRocmVhZCA9IG51bGw7CisJCQkJfQorCQkJfQorCQkJaWYgKG91dFRocmVhZCAhPSBudWxsKSB7CisJCQkJdHJ5IHsKKwkJCQkJb3V0VGhyZWFkLmhhbHQoKTsKKwkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIFN0b3Agd2FpdGluZyBhbmQgcmV0dXJuIGFueXdheS4KKwkJCQl9IGZpbmFsbHkgeworCQkJCQlvdXRUaHJlYWQgPSBudWxsOworCQkJCX0KKwkJCX0KKwkJCWlmIChwcm9jZXNzICE9IG51bGwpIHsKKwkJCQlpZiAocHJvY2Vzcy5leGl0VmFsdWUoKSAhPSAwKSB7CisJCQkJCWZhaWx1cmUgPSBuZXcgQ29tbWFuZEZhaWxlZEV4Y2VwdGlvbihwcm9jZXNzLmV4aXRWYWx1ZSgpLAorCQkJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQkJCUpHaXRUZXh0LmdldCgpLnNzaENvbW1hbmRGYWlsZWQsIGNvbW1hbmQsCisJCQkJCQkJc3RkZXJyLnRvU3RyaW5nKCkpKTsKKwkJCQl9CisJCQkJcHJvY2Vzcy5kZXN0cm95KCk7CisJCQl9CisJCQlzdGRlcnIuY2xvc2UoKTsKKwkJCWlmIChzZXNzaW9uICE9IG51bGwpIHsKKwkJCQlTc2hTZXNzaW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpLnJlbGVhc2VTZXNzaW9uKHNlc3Npb24pOworCQkJfQorCQkJaWYgKGZhaWx1cmUgIT0gbnVsbCkgeworCQkJCXRocm93IGZhaWx1cmU7CisJCQl9CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9TdHJpbmdVdGlscy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1N0cmluZ1V0aWxzLmphdmEKaW5kZXggYjQ3MzZkMy4uMzg2OGU1NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1N0cmluZ1V0aWxzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1N0cmluZ1V0aWxzLmphdmEKQEAgLTc0LDcgKzc0LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBpbnB1dCBjaGFyYWN0ZXIuCiAJICogQHJldHVybiBsb3dlcmNhc2UgdmVyc2lvbiBvZiB0aGUgaW5wdXQuCiAJICovCi0JcHVibGljIHN0YXRpYyBjaGFyIHRvTG93ZXJDYXNlKGZpbmFsIGNoYXIgYykgeworCXB1YmxpYyBzdGF0aWMgY2hhciB0b0xvd2VyQ2FzZShjaGFyIGMpIHsKIAkJcmV0dXJuIGMgPD0gJ1onID8gTENbY10gOiBjOwogCX0KIApAQCAtOTEsNyArOTEsNyBAQAogCSAqIEByZXR1cm4gYSBjb3B5IG9mIHRoZSBpbnB1dCBzdHJpbmcsIGFmdGVyIGNvbnZlcnRpbmcgY2hhcmFjdGVycyBpbiB0aGUKIAkgKiAgICAgICAgIHJhbmdlICdBJy4uJ1onIHRvICdhJy4uJ3onLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvTG93ZXJDYXNlKGZpbmFsIFN0cmluZyBpbikgeworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvTG93ZXJDYXNlKFN0cmluZyBpbikgewogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHIgPSBuZXcgU3RyaW5nQnVpbGRlcihpbi5sZW5ndGgoKSk7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgaW4ubGVuZ3RoKCk7IGkrKykKIAkJCXIuYXBwZW5kKHRvTG93ZXJDYXNlKGluLmNoYXJBdChpKSkpOwpAQCAtMTM4LDcgKzEzOCw3IEBACiAJICogICAgICAgICAgICBzZWNvbmQgc3RyaW5nIHRvIGNvbXBhcmUuCiAJICogQHJldHVybiB0cnVlIGlmIGEgZXF1YWxzIGIKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxzSWdub3JlQ2FzZShmaW5hbCBTdHJpbmcgYSwgZmluYWwgU3RyaW5nIGIpIHsKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxzSWdub3JlQ2FzZShTdHJpbmcgYSwgU3RyaW5nIGIpIHsKIAkJaWYgKGEgPT0gYikKIAkJCXJldHVybiB0cnVlOwogCQlpZiAoYS5sZW5ndGgoKSAhPSBiLmxlbmd0aCgpKQpAQCAtMjA1LDcgKzIwNSw3IEBACiAJICogICAgICAgICAgICAgaWYge0Bjb2RlIHZhbHVlfSBpcyBub3QgcmVjb2duaXplZCBhcyBvbmUgb2YgdGhlIHN0YW5kYXJkCiAJICogICAgICAgICAgICAgYm9vbGVhbiBuYW1lcy4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdG9Cb29sZWFuKGZpbmFsIFN0cmluZyBzdHJpbmdWYWx1ZSkgeworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0b0Jvb2xlYW4oU3RyaW5nIHN0cmluZ1ZhbHVlKSB7CiAJCWlmIChzdHJpbmdWYWx1ZSA9PSBudWxsKQogCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLmV4cGVjdGVkQm9vbGVhblN0cmluZ1ZhbHVlKTsKIApAQCAtMjMyLDcgKzIzMiw3IEBACiAJICogQHJldHVybiB0aGUgYm9vbGVhbiBpbnRlcnByZXRhdGlvbiBvZiB7QGNvZGUgdmFsdWV9IG9yIG51bGwgaW4gY2FzZSB0aGUKIAkgKiAgICAgICAgIHN0cmluZyBkb2VzIG5vdCByZXByZXNlbnQgYSBib29sZWFuIHZhbHVlCiAJICovCi0JcHVibGljIHN0YXRpYyBCb29sZWFuIHRvQm9vbGVhbk9yTnVsbChmaW5hbCBTdHJpbmcgc3RyaW5nVmFsdWUpIHsKKwlwdWJsaWMgc3RhdGljIEJvb2xlYW4gdG9Cb29sZWFuT3JOdWxsKFN0cmluZyBzdHJpbmdWYWx1ZSkgewogCQlpZiAoc3RyaW5nVmFsdWUgPT0gbnVsbCkKIAkJCXJldHVybiBudWxsOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvU3lzdGVtUmVhZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvU3lzdGVtUmVhZGVyLmphdmEKaW5kZXggOTZhNzk2Yy4uOTUzYzk3NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1N5c3RlbVJlYWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9TeXN0ZW1SZWFkZXIuamF2YQpAQCAtMjM3LDcgKzIzNyw3IEBACiAJcHVibGljIGFic3RyYWN0IEZpbGVCYXNlZENvbmZpZyBvcGVuVXNlckNvbmZpZyhDb25maWcgcGFyZW50LCBGUyBmcyk7CiAKIAkvKioKLQkgKiBPcGVuIHRoZSBnaXRvbmZpZyBjb25maWd1cmF0aW9uIGZvdW5kIGluIHRoZSBzeXN0ZW0td2lkZSAiZXRjIiBkaXJlY3RvcnkKKwkgKiBPcGVuIHRoZSBnaXRjb25maWcgY29uZmlndXJhdGlvbiBmb3VuZCBpbiB0aGUgc3lzdGVtLXdpZGUgImV0YyIgZGlyZWN0b3J5CiAJICoKIAkgKiBAcGFyYW0gcGFyZW50CiAJICogICAgICAgICAgICBhIGNvbmZpZyB3aXRoIHZhbHVlcyBub3QgZm91bmQgZGlyZWN0bHkgaW4gdGhlIHJldHVybmVkCkBAIC0yNDUsNyArMjQ1LDcgQEAKIAkgKiBAcGFyYW0gZnMKIAkgKiAgICAgICAgICAgIHRoZSBmaWxlIHN5c3RlbSBhYnN0cmFjdGlvbiB3aGljaCB3aWxsIGJlIG5lY2Vzc2FyeSB0byBwZXJmb3JtCiAJICogICAgICAgICAgICBjZXJ0YWluIGZpbGUgc3lzdGVtIG9wZXJhdGlvbnMuCi0JICogQHJldHVybiB0aGUgZ2l0b25maWcgY29uZmlndXJhdGlvbiBmb3VuZCBpbiB0aGUgc3lzdGVtLXdpZGUgImV0YyIKKwkgKiBAcmV0dXJuIHRoZSBnaXRjb25maWcgY29uZmlndXJhdGlvbiBmb3VuZCBpbiB0aGUgc3lzdGVtLXdpZGUgImV0YyIKIAkgKiAgICAgICAgIGRpcmVjdG9yeQogCSAqLwogCXB1YmxpYyBhYnN0cmFjdCBGaWxlQmFzZWRDb25maWcgb3BlblN5c3RlbUNvbmZpZyhDb25maWcgcGFyZW50LCBGUyBmcyk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvVGVtcG9yYXJ5QnVmZmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvVGVtcG9yYXJ5QnVmZmVyLmphdmEKaW5kZXggZGQ5MzNhMC4uM2VkN2FlYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1RlbXBvcmFyeUJ1ZmZlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9UZW1wb3JhcnlCdWZmZXIuamF2YQpAQCAtOTEsNyArOTEsNyBAQAogCSAqICAgICAgICAgICAgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gc3RvcmUgaW4gbWVtb3J5IGJlZm9yZSBlbnRlcmluZyB0aGUKIAkgKiAgICAgICAgICAgIG92ZXJmbG93IG91dHB1dCBwYXRoOyBhbHNvIHVzZWQgYXMgdGhlIGVzdGltYXRlZCBzaXplLgogCSAqLwotCXByb3RlY3RlZCBUZW1wb3JhcnlCdWZmZXIoZmluYWwgaW50IGxpbWl0KSB7CisJcHJvdGVjdGVkIFRlbXBvcmFyeUJ1ZmZlcihpbnQgbGltaXQpIHsKIAkJdGhpcyhsaW1pdCwgbGltaXQpOwogCX0KIApAQCAtMTA2LDcgKzEwNiw3IEBACiAJICogICAgICAgICAgICBvdmVyZmxvdyBvdXRwdXQgcGF0aC4KIAkgKiBAc2luY2UgNC4wCiAJICovCi0JcHJvdGVjdGVkIFRlbXBvcmFyeUJ1ZmZlcihmaW5hbCBpbnQgZXN0aW1hdGVkU2l6ZSwgZmluYWwgaW50IGxpbWl0KSB7CisJcHJvdGVjdGVkIFRlbXBvcmFyeUJ1ZmZlcihpbnQgZXN0aW1hdGVkU2l6ZSwgaW50IGxpbWl0KSB7CiAJCWlmIChlc3RpbWF0ZWRTaXplID4gbGltaXQpCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAJCXRoaXMuaW5Db3JlTGltaXQgPSBsaW1pdDsKQEAgLTExNiw3ICsxMTYsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKG92ZXJmbG93ICE9IG51bGwpIHsKIAkJCW92ZXJmbG93LndyaXRlKGIpOwogCQkJcmV0dXJuOwpAQCAtMTM3LDcgKzEzNyw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHdyaXRlKGZpbmFsIGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAob3ZlcmZsb3cgPT0gbnVsbCkgewogCQkJd2hpbGUgKGxlbiA+IDApIHsKIAkJCQlCbG9jayBzID0gbGFzdCgpOwpAQCAtMTgzLDcgKzE4Myw3IEBACiAJICogICAgICAgICAgICAgYW4gZXJyb3Igb2NjdXJyZWQgcmVhZGluZyBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sIG9yIHdoaWxlCiAJICogICAgICAgICAgICAgd3JpdGluZyB0byBhIGxvY2FsIHRlbXBvcmFyeSBmaWxlLgogCSAqLwotCXB1YmxpYyB2b2lkIGNvcHkoZmluYWwgSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgY29weShJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKGJsb2NrcyAhPSBudWxsKSB7CiAJCQlmb3IgKDs7KSB7CiAJCQkJQmxvY2sgcyA9IGxhc3QoKTsKQEAgLTIzOCw3ICsyMzgsNyBAQAogCQkJdGhyb3cgbmV3IE91dE9mTWVtb3J5RXJyb3IoSkdpdFRleHQuZ2V0KCkubGVuZ3RoRXhjZWVkc01heGltdW1BcnJheVNpemUpOwogCQlmaW5hbCBieXRlW10gb3V0ID0gbmV3IGJ5dGVbKGludCkgbGVuXTsKIAkJaW50IG91dFB0ciA9IDA7Ci0JCWZvciAoZmluYWwgQmxvY2sgYiA6IGJsb2NrcykgeworCQlmb3IgKEJsb2NrIGIgOiBibG9ja3MpIHsKIAkJCVN5c3RlbS5hcnJheWNvcHkoYi5idWZmZXIsIDAsIG91dCwgb3V0UHRyLCBiLmNvdW50KTsKIAkJCW91dFB0ciArPSBiLmNvdW50OwogCQl9CkBAIC0yNjUsNyArMjY1LDcgQEAKIAkJCQkJSkdpdFRleHQuZ2V0KCkubGVuZ3RoRXhjZWVkc01heGltdW1BcnJheVNpemUpOwogCQlmaW5hbCBieXRlW10gb3V0ID0gbmV3IGJ5dGVbKGludCkgbGVuXTsKIAkJaW50IG91dFB0ciA9IDA7Ci0JCWZvciAoZmluYWwgQmxvY2sgYiA6IGJsb2NrcykgeworCQlmb3IgKEJsb2NrIGIgOiBibG9ja3MpIHsKIAkJCVN5c3RlbS5hcnJheWNvcHkoYi5idWZmZXIsIDAsIG91dCwgb3V0UHRyLCBiLmNvdW50KTsKIAkJCW91dFB0ciArPSBiLmNvdW50OwogCQl9CkBAIC0yODgsMTEgKzI4OCwxMSBAQAogCSAqICAgICAgICAgICAgIGFuIGVycm9yIG9jY3VycmVkIHJlYWRpbmcgZnJvbSBhIHRlbXBvcmFyeSBmaWxlIG9uIHRoZSBsb2NhbAogCSAqICAgICAgICAgICAgIHN5c3RlbSwgb3Igd3JpdGluZyB0byB0aGUgb3V0cHV0IHN0cmVhbS4KIAkgKi8KLQlwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIE91dHB1dFN0cmVhbSBvcywgUHJvZ3Jlc3NNb25pdG9yIHBtKQorCXB1YmxpYyB2b2lkIHdyaXRlVG8oT3V0cHV0U3RyZWFtIG9zLCBQcm9ncmVzc01vbml0b3IgcG0pCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAocG0gPT0gbnVsbCkKIAkJCXBtID0gTnVsbFByb2dyZXNzTW9uaXRvci5JTlNUQU5DRTsKLQkJZm9yIChmaW5hbCBCbG9jayBiIDogYmxvY2tzKSB7CisJCWZvciAoQmxvY2sgYiA6IGJsb2NrcykgewogCQkJb3Mud3JpdGUoYi5idWZmZXIsIDAsIGIuY291bnQpOwogCQkJcG0udXBkYXRlKGIuY291bnQgLyAxMDI0KTsKIAkJfQpAQCAtMzczLDcgKzM3Myw3IEBACiAJCW92ZXJmbG93ID0gb3ZlcmZsb3coKTsKIAogCQlmaW5hbCBCbG9jayBsYXN0ID0gYmxvY2tzLnJlbW92ZShibG9ja3Muc2l6ZSgpIC0gMSk7Ci0JCWZvciAoZmluYWwgQmxvY2sgYiA6IGJsb2NrcykKKwkJZm9yIChCbG9jayBiIDogYmxvY2tzKQogCQkJb3ZlcmZsb3cud3JpdGUoYi5idWZmZXIsIDAsIGIuY291bnQpOwogCQlibG9ja3MgPSBudWxsOwogCkBAIC00NDIsNyArNDQyLDcgQEAKIAkJICogICAgICAgICAgICBzeXN0ZW0gZGVmYXVsdCB0ZW1wb3JhcnkgZGlyZWN0b3J5IChmb3IgZXhhbXBsZSAvdG1wKSB3aWxsCiAJCSAqICAgICAgICAgICAgYmUgdXNlZCBpbnN0ZWFkLgogCQkgKi8KLQkJcHVibGljIExvY2FsRmlsZShmaW5hbCBGaWxlIGRpcmVjdG9yeSkgeworCQlwdWJsaWMgTG9jYWxGaWxlKEZpbGUgZGlyZWN0b3J5KSB7CiAJCQl0aGlzKGRpcmVjdG9yeSwgREVGQVVMVF9JTl9DT1JFX0xJTUlUKTsKIAkJfQogCkBAIC00NTgsNyArNDU4LDcgQEAKIAkJICogICAgICAgICAgICBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBzdG9yZSBpbiBtZW1vcnkuIFN0b3JhZ2UgYmV5b25kCiAJCSAqICAgICAgICAgICAgdGhpcyBsaW1pdCB3aWxsIHVzZSB0aGUgbG9jYWwgZmlsZS4KIAkJICovCi0JCXB1YmxpYyBMb2NhbEZpbGUoZmluYWwgRmlsZSBkaXJlY3RvcnksIGZpbmFsIGludCBpbkNvcmVMaW1pdCkgeworCQlwdWJsaWMgTG9jYWxGaWxlKEZpbGUgZGlyZWN0b3J5LCBpbnQgaW5Db3JlTGltaXQpIHsKIAkJCXN1cGVyKGluQ29yZUxpbWl0KTsKIAkJCXRoaXMuZGlyZWN0b3J5ID0gZGlyZWN0b3J5OwogCQl9CkBAIC00ODcsMTcgKzQ4NywxNCBAQAogCQkJaWYgKEludGVnZXIuTUFYX1ZBTFVFIDwgbGVuKQogCQkJCXRocm93IG5ldyBPdXRPZk1lbW9yeUVycm9yKEpHaXRUZXh0LmdldCgpLmxlbmd0aEV4Y2VlZHNNYXhpbXVtQXJyYXlTaXplKTsKIAkJCWZpbmFsIGJ5dGVbXSBvdXQgPSBuZXcgYnl0ZVsoaW50KSBsZW5dOwotCQkJZmluYWwgRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShvbkRpc2tGaWxlKTsKLQkJCXRyeSB7CisJCQl0cnkgKEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ob25EaXNrRmlsZSkpIHsKIAkJCQlJTy5yZWFkRnVsbHkoaW4sIG91dCwgMCwgKGludCkgbGVuKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaW4uY2xvc2UoKTsKIAkJCX0KIAkJCXJldHVybiBvdXQ7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgd3JpdGVUbyhmaW5hbCBPdXRwdXRTdHJlYW0gb3MsIFByb2dyZXNzTW9uaXRvciBwbSkKKwkJcHVibGljIHZvaWQgd3JpdGVUbyhPdXRwdXRTdHJlYW0gb3MsIFByb2dyZXNzTW9uaXRvciBwbSkKIAkJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJaWYgKG9uRGlza0ZpbGUgPT0gbnVsbCkgewogCQkJCXN1cGVyLndyaXRlVG8ob3MsIHBtKTsKQEAgLTUwNSwxNiArNTAyLDEzIEBACiAJCQl9CiAJCQlpZiAocG0gPT0gbnVsbCkKIAkJCQlwbSA9IE51bGxQcm9ncmVzc01vbml0b3IuSU5TVEFOQ0U7Ci0JCQlmaW5hbCBGaWxlSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKG9uRGlza0ZpbGUpOwotCQkJdHJ5IHsKKwkJCXRyeSAoRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShvbkRpc2tGaWxlKSkgewogCQkJCWludCBjbnQ7CiAJCQkJZmluYWwgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW0Jsb2NrLlNaXTsKIAkJCQl3aGlsZSAoKGNudCA9IGluLnJlYWQoYnVmKSkgPj0gMCkgewogCQkJCQlvcy53cml0ZShidWYsIDAsIGNudCk7CiAJCQkJCXBtLnVwZGF0ZShjbnQgLyAxMDI0KTsKIAkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCWluLmNsb3NlKCk7CiAJCQl9CiAJCX0KIApAQCAtNTY5LDcgKzU2Myw3IEBACiAJCSAqICAgICAgICAgICAgYWxzbyB1c2VkIGFzIHRoZSBlc3RpbWF0ZWQgc2l6ZS4gU3RvcmluZyBiZXlvbmQgdGhpcyBtYW55CiAJCSAqICAgICAgICAgICAgd2lsbCBjYXVzZSBhbiBJT0V4Y2VwdGlvbiB0byBiZSB0aHJvd24gZHVyaW5nIHdyaXRlLgogCQkgKi8KLQkJcHVibGljIEhlYXAoZmluYWwgaW50IGxpbWl0KSB7CisJCXB1YmxpYyBIZWFwKGludCBsaW1pdCkgewogCQkJc3VwZXIobGltaXQpOwogCQl9CiAKQEAgLTU4NSw3ICs1NzksNyBAQAogCQkgKiAgICAgICAgICAgIHRocm93biBkdXJpbmcgd3JpdGUuCiAJCSAqIEBzaW5jZSA0LjAKIAkJICovCi0JCXB1YmxpYyBIZWFwKGZpbmFsIGludCBlc3RpbWF0ZWRTaXplLCBmaW5hbCBpbnQgbGltaXQpIHsKKwkJcHVibGljIEhlYXAoaW50IGVzdGltYXRlZFNpemUsIGludCBsaW1pdCkgewogCQkJc3VwZXIoZXN0aW1hdGVkU2l6ZSwgbGltaXQpOwogCQl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvQ1JMRklucHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0NSTEZJbnB1dFN0cmVhbS5qYXZhCmluZGV4IDQ1NjY4MjUuLjA4Mzc3ZTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvQ1JMRklucHV0U3RyZWFtLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0F1dG9DUkxGSW5wdXRTdHJlYW0uamF2YQpAQCAtMTAwLDcgKzEwMCw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgcmVhZChieXRlW10gYnMsIGZpbmFsIGludCBvZmYsIGZpbmFsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIGludCByZWFkKGJ5dGVbXSBicywgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKGxlbiA9PSAwKQogCQkJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvQ1JMRk91dHB1dFN0cmVhbS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0F1dG9DUkxGT3V0cHV0U3RyZWFtLmphdmEKaW5kZXggZTc2NDM4OS4uZDhjZmVlNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0F1dG9DUkxGT3V0cHV0U3RyZWFtLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0F1dG9DUkxGT3V0cHV0U3RyZWFtLmphdmEKQEAgLTExMyw3ICsxMTMsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYiwgZmluYWwgaW50IHN0YXJ0T2ZmLCBmaW5hbCBpbnQgc3RhcnRMZW4pCisJcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBzdGFydE9mZiwgaW50IHN0YXJ0TGVuKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgaW50IG92ZXJmbG93ID0gYnVmZmVyKGIsIHN0YXJ0T2ZmLCBzdGFydExlbik7CiAJCWlmIChvdmVyZmxvdyA8IDApCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0xGSW5wdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvTEZJbnB1dFN0cmVhbS5qYXZhCmluZGV4IDA2ZjgzZjMuLmZmMjgxNjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvTEZJbnB1dFN0cmVhbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvTEZJbnB1dFN0cmVhbS5qYXZhCkBAIC0xMzQsNyArMTM0LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGludCByZWFkKGJ5dGVbXSBicywgZmluYWwgaW50IG9mZiwgZmluYWwgaW50IGxlbikKKwlwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJzLCBpbnQgb2ZmLCBpbnQgbGVuKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKGxlbiA9PSAwKQogCQkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0xGT3V0cHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0xGT3V0cHV0U3RyZWFtLmphdmEKaW5kZXggMzIyMjZjNC4uOTA4ZDBhMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0F1dG9MRk91dHB1dFN0cmVhbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvTEZPdXRwdXRTdHJlYW0uamF2YQpAQCAtMTIwLDcgKzEyMCw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBiLCBmaW5hbCBpbnQgc3RhcnRPZmYsIGZpbmFsIGludCBzdGFydExlbikKKwlwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IHN0YXJ0T2ZmLCBpbnQgc3RhcnRMZW4pCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBpbnQgb3ZlcmZsb3cgPSBidWZmZXIoYiwgc3RhcnRPZmYsIHN0YXJ0TGVuKTsKIAkJaWYgKG92ZXJmbG93IDwgMCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0VvbENhbm9uaWNhbGl6aW5nSW5wdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9Fb2xDYW5vbmljYWxpemluZ0lucHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkOWE5NTMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0VvbENhbm9uaWNhbGl6aW5nSW5wdXRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwLCAyMDEzIE1hcmMgU3RyYXBldHogPG1hcmMuc3RyYXBldHpAc3ludGV2by5jb20+Ci0gKiBhbmQgb3RoZXIgY29weXJpZ2h0IG93bmVycyBhcyBkb2N1bWVudGVkIGluIHRoZSBwcm9qZWN0J3MgSVAgbG9nLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlCi0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgdjEuMCB3aGljaAotICogYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGlzIHJlcHJvZHVjZWQgYmVsb3csIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocAotICoKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgotICogd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCi0gKiBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKgotICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIEluYy4gbm9yIHRoZQotICogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICogICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQKLSAqIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCi0gKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKLSAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgotICogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW87Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLS8qKgotICogQW4gaW5wdXQgc3RyZWFtIHdoaWNoIGNhbm9uaWNhbGl6ZXMgRU9McyBieXRlcyBvbiB0aGUgZmx5IHRvICdcbicuCi0gKgotICogT3B0aW9uYWxseSwgYSBiaW5hcnkgY2hlY2sgb24gdGhlIGZpcnN0IDgwMDAgYnl0ZXMgaXMgcGVyZm9ybWVkIGFuZCBpbiBjYXNlCi0gKiBvZiBiaW5hcnkgZmlsZXMsIGNhbm9uaWNhbGl6YXRpb24gaXMgdHVybmVkIG9mZiAoZm9yIHRoZSBjb21wbGV0ZSBmaWxlKS4KLSAqCi0gKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pby5BdXRvTEZJbnB1dFN0cmVhbX0gaW5zdGVhZAotICovCi1ARGVwcmVjYXRlZAotcHVibGljIGNsYXNzIEVvbENhbm9uaWNhbGl6aW5nSW5wdXRTdHJlYW0gZXh0ZW5kcyBBdXRvTEZJbnB1dFN0cmVhbSB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IElucHV0U3RyZWFtLCB3cmFwcGluZyB0aGUgc3BlY2lmaWVkIHN0cmVhbQotCSAqCi0JICogQHBhcmFtIGluCi0JICogICAgICAgICAgICByYXcgaW5wdXQgc3RyZWFtCi0JICogQHBhcmFtIGRldGVjdEJpbmFyeQotCSAqICAgICAgICAgICAgd2hldGhlciBiaW5hcmllcyBzaG91bGQgYmUgZGV0ZWN0ZWQKLQkgKi8KLQlwdWJsaWMgRW9sQ2Fub25pY2FsaXppbmdJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbiwgYm9vbGVhbiBkZXRlY3RCaW5hcnkpIHsKLQkJc3VwZXIoaW4sIGRldGVjdEJpbmFyeSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBJbnB1dFN0cmVhbSwgd3JhcHBpbmcgdGhlIHNwZWNpZmllZCBzdHJlYW0KLQkgKgotCSAqIEBwYXJhbSBpbgotCSAqICAgICAgICAgICAgcmF3IGlucHV0IHN0cmVhbQotCSAqIEBwYXJhbSBkZXRlY3RCaW5hcnkKLQkgKiAgICAgICAgICAgIHdoZXRoZXIgYmluYXJpZXMgc2hvdWxkIGJlIGRldGVjdGVkCi0JICogQHBhcmFtIGFib3J0SWZCaW5hcnkKLQkgKiAgICAgICAgICAgIHRocm93IGFuIElPRXhjZXB0aW9uIGlmIHRoZSBmaWxlIGlzIGJpbmFyeQotCSAqLwotCXB1YmxpYyBFb2xDYW5vbmljYWxpemluZ0lucHV0U3RyZWFtKElucHV0U3RyZWFtIGluLCBib29sZWFuIGRldGVjdEJpbmFyeSwKLQkJCWJvb2xlYW4gYWJvcnRJZkJpbmFyeSkgewotCQlzdXBlcihpbiwgZGV0ZWN0QmluYXJ5LCBhYm9ydElmQmluYXJ5KTsKLQl9Ci0KLQkvKioKLQkgKiBBIHNwZWNpYWwgZXhjZXB0aW9uIHRocm93biB3aGVuIHtAbGluayBBdXRvTEZJbnB1dFN0cmVhbX0gaXMgdG9sZCB0bwotCSAqIHRocm93IGFuIGV4Y2VwdGlvbiB3aGVuIGF0dGVtcHRpbmcgdG8gcmVhZCBhIGJpbmFyeSBmaWxlLiBUaGUgZXhjZXB0aW9uCi0JICogbWF5IGJlIHRocm93biBhdCBhbnkgc3RhZ2UgZHVyaW5nIHJlYWRpbmcuCi0JICoKLQkgKiBAc2luY2UgMy4zCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBJc0JpbmFyeUV4Y2VwdGlvbiBleHRlbmRzIElPRXhjZXB0aW9uIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJSXNCaW5hcnlFeGNlcHRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vSW50ZXJydXB0VGltZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9JbnRlcnJ1cHRUaW1lci5qYXZhCmluZGV4IGY0MDBlNTAuLmI3ZmVkZGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9JbnRlcnJ1cHRUaW1lci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9JbnRlcnJ1cHRUaW1lci5qYXZhCkBAIC0xMDMsNyArMTAzLDcgQEAKIAkgKiBAcGFyYW0gdGhyZWFkTmFtZQogCSAqICAgICAgICAgICAgbmFtZSBvZiB0aGUgdGltZXIgdGhyZWFkLgogCSAqLwotCXB1YmxpYyBJbnRlcnJ1cHRUaW1lcihmaW5hbCBTdHJpbmcgdGhyZWFkTmFtZSkgeworCXB1YmxpYyBJbnRlcnJ1cHRUaW1lcihTdHJpbmcgdGhyZWFkTmFtZSkgewogCQlzdGF0ZSA9IG5ldyBBbGFybVN0YXRlKCk7CiAJCWF1dG9LaWxsZXIgPSBuZXcgQXV0b0tpbGxlcihzdGF0ZSk7CiAJCXRocmVhZCA9IG5ldyBBbGFybVRocmVhZCh0aHJlYWROYW1lLCBzdGF0ZSk7CkBAIC0xMTcsNyArMTE3LDcgQEAKIAkgKiAgICAgICAgICAgIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSBpbnRlcnJ1cHQgc2hvdWxkIHRyaWdnZXIuCiAJICogICAgICAgICAgICBNdXN0IGJlICZndDsgMC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBiZWdpbihmaW5hbCBpbnQgdGltZW91dCkgeworCXB1YmxpYyB2b2lkIGJlZ2luKGludCB0aW1lb3V0KSB7CiAJCWlmICh0aW1lb3V0IDw9IDApCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAogCQkJCQlKR2l0VGV4dC5nZXQoKS5pbnZhbGlkVGltZW91dCwgSW50ZWdlci52YWx1ZU9mKHRpbWVvdXQpKSk7CkBAIC0xNDUsNyArMTQ1LDcgQEAKIAl9CiAKIAlzdGF0aWMgZmluYWwgY2xhc3MgQWxhcm1UaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewotCQlBbGFybVRocmVhZChmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgQWxhcm1TdGF0ZSBxKSB7CisJCUFsYXJtVGhyZWFkKFN0cmluZyBuYW1lLCBBbGFybVN0YXRlIHEpIHsKIAkJCXN1cGVyKHEpOwogCQkJc2V0TmFtZShuYW1lKTsKIAkJCXNldERhZW1vbih0cnVlKTsKQEAgLTE2MSw3ICsxNjEsNyBAQAogCXByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEF1dG9LaWxsZXIgewogCQlwcml2YXRlIGZpbmFsIEFsYXJtU3RhdGUgc3RhdGU7CiAKLQkJQXV0b0tpbGxlcihmaW5hbCBBbGFybVN0YXRlIHMpIHsKKwkJQXV0b0tpbGxlcihBbGFybVN0YXRlIHMpIHsKIAkJCXN0YXRlID0gczsKIAkJfQogCkBAIC0yMDMsNyArMjAzLDcgQEAKIAkJCX0KIAkJfQogCi0JCXN5bmNocm9uaXplZCB2b2lkIGJlZ2luKGZpbmFsIGludCB0aW1lb3V0KSB7CisJCXN5bmNocm9uaXplZCB2b2lkIGJlZ2luKGludCB0aW1lb3V0KSB7CiAJCQlpZiAodGVybWluYXRlZCkKIAkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLnRpbWVyQWxyZWFkeVRlcm1pbmF0ZWQpOwogCQkJY2FsbGluZ1RocmVhZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vSXNvbGF0ZWRPdXRwdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9Jc29sYXRlZE91dHB1dFN0cmVhbS5qYXZhCmluZGV4IDVlNTA5OTUuLjY1NDcwZDQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9Jc29sYXRlZE91dHB1dFN0cmVhbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9Jc29sYXRlZE91dHB1dFN0cmVhbS5qYXZhCkBAIC05OSw3ICs5OSw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHdyaXRlKGZpbmFsIGJ5dGVbXSBidWYsIGZpbmFsIGludCBwb3MsIGZpbmFsIGludCBjbnQpCisJcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IHBvcywgaW50IGNudCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWNoZWNrQ2xvc2VkKCk7CiAJCWV4ZWN1dGUobmV3IENhbGxhYmxlPFZvaWQ+KCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1NhZmVCdWZmZXJlZE91dHB1dFN0cmVhbS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1NpbGVudEZpbGVJbnB1dFN0cmVhbS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNjklCnJlbmFtZSBmcm9tIG9yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9TYWZlQnVmZmVyZWRPdXRwdXRTdHJlYW0uamF2YQpyZW5hbWUgdG8gb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1NpbGVudEZpbGVJbnB1dFN0cmVhbS5qYXZhCmluZGV4IDY4YjQxN2UuLmU1ODgwM2IgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9TYWZlQnVmZmVyZWRPdXRwdXRTdHJlYW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vU2lsZW50RmlsZUlucHV0U3RyZWFtLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDExLCBSb2JpbiBSb3NlbmJlcmcKKyAqIENvcHlyaWdodCAoQykgMjAxOCwgRGF2aWQgUHVyc2Vob3VzZSA8ZGF2aWQucHVyc2Vob3VzZUBnbWFpbC5jb20+CiAgKiBhbmQgb3RoZXIgY29weXJpZ2h0IG93bmVycyBhcyBkb2N1bWVudGVkIGluIHRoZSBwcm9qZWN0J3MgSVAgbG9nLgogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlCkBAIC00MCwzOSArNDAsMzYgQEAKICAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCiAgKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzsKIAotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKIC8qKgotICogPHA+U2FmZUJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGNsYXNzLjwvcD4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIEZpbGVJbnB1dFN0cmVhbSB0aGF0IGlnbm9yZXMgYW55IGV4Y2VwdGlvbnMgb24gY2xvc2UoKS4KICAqCi0gKiBAZGVwcmVjYXRlZCB1c2UgQnVmZmVyZWRPdXRwdXRTdHJlYW0gaW4gSmF2YSA4IGFuZCBsYXRlci4KKyAqIEBzaW5jZSA1LjAKICAqLwotQERlcHJlY2F0ZWQKLXB1YmxpYyBjbGFzcyBTYWZlQnVmZmVyZWRPdXRwdXRTdHJlYW0gZXh0ZW5kcyBCdWZmZXJlZE91dHB1dFN0cmVhbSB7CitwdWJsaWMgY2xhc3MgU2lsZW50RmlsZUlucHV0U3RyZWFtIGV4dGVuZHMgRmlsZUlucHV0U3RyZWFtIHsKIAkvKioKLQkgKiA8cD5Db25zdHJ1Y3RvciBmb3IgU2FmZUJ1ZmZlcmVkT3V0cHV0U3RyZWFtLjwvcD4KLQkgKgotCSAqIEBzZWUgQnVmZmVyZWRPdXRwdXRTdHJlYW0jQnVmZmVyZWRPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtKQotCSAqIEBwYXJhbSBvdXQKLQkgKiAgICAgICAgICAgIHVuZGVybHlpbmcgb3V0cHV0IHN0cmVhbQorCSAqIEBwYXJhbSBmaWxlCisJICogICAgICAgICAgICB0aGUgZmlsZQorCSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCisJICogICAgICAgICAgICAgdGhlIGZpbGUgd2FzIG5vdCBmb3VuZAogCSAqLwotCXB1YmxpYyBTYWZlQnVmZmVyZWRPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG91dCkgewotCQlzdXBlcihvdXQpOworCXB1YmxpYyBTaWxlbnRGaWxlSW5wdXRTdHJlYW0oRmlsZSBmaWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKwkJc3VwZXIoZmlsZSk7CiAJfQogCi0JLyoqCi0JICogPHA+Q29uc3RydWN0b3IgZm9yIFNhZmVCdWZmZXJlZE91dHB1dFN0cmVhbS48L3A+Ci0JICoKLQkgKiBAc2VlIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtI0J1ZmZlcmVkT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSwgaW50KQotCSAqIEBwYXJhbSBvdXQKLQkgKiAgICAgICAgICAgIHVuZGVybHlpbmcgb3V0cHV0IHN0cmVhbQotCSAqIEBwYXJhbSBzaXplCi0JICogICAgICAgICAgICBidWZmZXIgc2l6ZQotCSAqLwotCXB1YmxpYyBTYWZlQnVmZmVyZWRPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG91dCwgaW50IHNpemUpIHsKLQkJc3VwZXIob3V0LCBzaXplKTsKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKwkJdHJ5IHsKKwkJCXN1cGVyLmNsb3NlKCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCS8vIElnbm9yZQorCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1N0cmVhbUNvcHlUaHJlYWQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9TdHJlYW1Db3B5VGhyZWFkLmphdmEKaW5kZXggNWMxYWY5ZWYuLmE5OTg5YTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9TdHJlYW1Db3B5VGhyZWFkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1N0cmVhbUNvcHlUaHJlYWQuamF2YQpAQCAtNzMsNyArNzMsNyBAQAogCSAqICAgICAgICAgICAgc3RyZWFtIHRvIGNvcHkgaW50by4gVGhlIGRlc3RpbmF0aW9uIHN0cmVhbSBpcyBhdXRvbWF0aWNhbGx5CiAJICogICAgICAgICAgICBjbG9zZWQgd2hlbiB0aGUgdGhyZWFkIHRlcm1pbmF0ZXMuCiAJICovCi0JcHVibGljIFN0cmVhbUNvcHlUaHJlYWQoZmluYWwgSW5wdXRTdHJlYW0gaSwgZmluYWwgT3V0cHV0U3RyZWFtIG8pIHsKKwlwdWJsaWMgU3RyZWFtQ29weVRocmVhZChJbnB1dFN0cmVhbSBpLCBPdXRwdXRTdHJlYW0gbykgewogCQlzZXROYW1lKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpICsgIi1TdHJlYW1Db3B5Iik7IC8vJE5PTi1OTFMtMSQKIAkJc3JjID0gaTsKIAkJZHN0ID0gbzsKQEAgLTgxLDIwICs4MSw2IEBACiAJfQogCiAJLyoqCi0JICogUmVxdWVzdCB0aGUgdGhyZWFkIHRvIGZsdXNoIHRoZSBvdXRwdXQgc3RyZWFtIGFzIHNvb24gYXMgcG9zc2libGUuCi0JICogPHA+Ci0JICogVGhpcyBpcyBhbiBhc3luY2hyb25vdXMgcmVxdWVzdCB0byB0aGUgdGhyZWFkLiBUaGUgYWN0dWFsIGZsdXNoIHdpbGwKLQkgKiBoYXBwZW4gYXQgc29tZSBmdXR1cmUgcG9pbnQgaW4gdGltZSwgd2hlbiB0aGUgdGhyZWFkIHdha2VzIHVwIHRvIHByb2Nlc3MKLQkgKiB0aGUgcmVxdWVzdC4KLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyB2b2lkIGZsdXNoKCkgewotCQlzeW5jaHJvbml6ZWQgKHdyaXRlTG9jaykgewotCQkJaW50ZXJydXB0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKIAkgKiBSZXF1ZXN0IHRoYXQgdGhlIHRocmVhZCB0ZXJtaW5hdGUsIGFuZCB3YWl0IGZvciBpdC4KIAkgKiA8cD4KIAkgKiBUaGlzIG1ldGhvZCBzaWduYWxzIHRvIHRoZSBjb3B5IHRocmVhZCB0aGF0IGl0IHNob3VsZCBzdG9wIGFzIHNvb24gYXMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9UZWVJbnB1dFN0cmVhbS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1RlZUlucHV0U3RyZWFtLmphdmEKaW5kZXggZGVlNGZlOS4uZTQwYTVhNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1RlZUlucHV0U3RyZWFtLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1RlZUlucHV0U3RyZWFtLmphdmEKQEAgLTg5LDcgKzg5LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGxvbmcgc2tpcChmaW5hbCBsb25nIGNvdW50KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBsb25nIHNraXAobG9uZyBjb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJbG9uZyBza2lwcGVkID0gMDsKIAkJbG9uZyBjbnQgPSBjb3VudDsKIAkJZmluYWwgYnl0ZVtdIGIgPSBza2lwQnVmZmVyKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vVGltZW91dElucHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vVGltZW91dElucHV0U3RyZWFtLmphdmEKaW5kZXggMDFiMjUxOS4uMjM5MmI4YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1RpbWVvdXRJbnB1dFN0cmVhbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9UaW1lb3V0SW5wdXRTdHJlYW0uamF2YQpAQCAtODksNyArODksNyBAQAogCSAqIEBwYXJhbSBtaWxsaXMKIAkgKiAgICAgICAgICAgIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYmVmb3JlIGFib3J0aW5nIGEgcmVhZC4gTXVzdCBiZSAmZ3Q7IDAuCiAJICovCi0JcHVibGljIHZvaWQgc2V0VGltZW91dChmaW5hbCBpbnQgbWlsbGlzKSB7CisJcHVibGljIHZvaWQgc2V0VGltZW91dChpbnQgbWlsbGlzKSB7CiAJCWlmIChtaWxsaXMgPCAwKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQkJSkdpdFRleHQuZ2V0KCkuaW52YWxpZFRpbWVvdXQsIEludGVnZXIudmFsdWVPZihtaWxsaXMpKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vVGltZW91dE91dHB1dFN0cmVhbS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1RpbWVvdXRPdXRwdXRTdHJlYW0uamF2YQppbmRleCBlYTQwMTMzLi4yN2YxODc0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vVGltZW91dE91dHB1dFN0cmVhbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9UaW1lb3V0T3V0cHV0U3RyZWFtLmphdmEKQEAgLTkxLDcgKzkxLDcgQEAKIAkgKiAgICAgICAgICAgIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYmVmb3JlIGFib3J0aW5nIGEgd3JpdGUuIE11c3QgYmUgJmd0OwogCSAqICAgICAgICAgICAgMC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGZpbmFsIGludCBtaWxsaXMpIHsKKwlwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGludCBtaWxsaXMpIHsKIAkJaWYgKG1pbGxpcyA8IDApCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAogCQkJCQlKR2l0VGV4dC5nZXQoKS5pbnZhbGlkVGltZW91dCwgSW50ZWdlci52YWx1ZU9mKG1pbGxpcykpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9VbmlvbklucHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vVW5pb25JbnB1dFN0cmVhbS5qYXZhCmluZGV4IDUxZDMxMDYuLmUxNGViMmIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9VbmlvbklucHV0U3RyZWFtLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1VuaW9uSW5wdXRTdHJlYW0uamF2YQpAQCAtMTA3LDcgKzEwNyw3IEBACiAJICogQHBhcmFtIGluCiAJICogICAgICAgICAgICB0aGUgc3RyZWFtIHRvIGFkZDsgbXVzdCBub3QgYmUgbnVsbC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoZmluYWwgSW5wdXRTdHJlYW0gaW4pIHsKKwlwdWJsaWMgdm9pZCBhZGQoSW5wdXRTdHJlYW0gaW4pIHsKIAkJc3RyZWFtcy5hZGQoaW4pOwogCX0KIApAQCAtMTY0LDcgKzE2NCw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBsb25nIHNraXAoZmluYWwgbG9uZyBjb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgbG9uZyBza2lwKGxvbmcgY291bnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWxvbmcgc2tpcHBlZCA9IDA7CiAJCWxvbmcgY250ID0gY291bnQ7CiAJCXdoaWxlICgwIDwgY250KSB7CmRpZmYgLS1naXQgYS9wb20ueG1sIGIvcG9tLnhtbAppbmRleCAwODlhNzRmLi4yNWM5MjNkIDEwMDY0NAotLS0gYS9wb20ueG1sCisrKyBiL3BvbS54bWwKQEAgLTUxLDcgKzUxLDcgQEAKICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+CiAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjQuMTEuNC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAKICAgPG5hbWU+SkdpdCAtIFBhcmVudDwvbmFtZT4KICAgPHVybD4ke2pnaXQtdXJsfTwvdXJsPgpAQCAtMjEzLDcgKzIxMyw3IEBACiAgICAgPGh0dHBjb3JlLXZlcnNpb24+NC40LjY8L2h0dHBjb3JlLXZlcnNpb24+CiAgICAgPHNsZjRqLXZlcnNpb24+MS43LjI8L3NsZjRqLXZlcnNpb24+CiAgICAgPGxvZzRqLXZlcnNpb24+MS4yLjE1PC9sb2c0ai12ZXJzaW9uPgotICAgIDxtYXZlbi1qYXZhZG9jLXBsdWdpbi12ZXJzaW9uPjMuMC4wPC9tYXZlbi1qYXZhZG9jLXBsdWdpbi12ZXJzaW9uPgorICAgIDxtYXZlbi1qYXZhZG9jLXBsdWdpbi12ZXJzaW9uPjMuMC4xPC9tYXZlbi1qYXZhZG9jLXBsdWdpbi12ZXJzaW9uPgogICAgIDx0eWNoby1leHRyYXMtdmVyc2lvbj4xLjEuMDwvdHljaG8tZXh0cmFzLXZlcnNpb24+CiAgICAgPGdzb24tdmVyc2lvbj4yLjguMjwvZ3Nvbi12ZXJzaW9uPgogICAgIDxzcG90YnVncy1tYXZlbi1wbHVnaW4tdmVyc2lvbj4zLjEuMjwvc3BvdGJ1Z3MtbWF2ZW4tcGx1Z2luLXZlcnNpb24+CkBAIC0yNjcsNjMgKzI2Nyw2IEBACiAgICAgICAgIDwvcGx1Z2luPgogCiAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgIDx2ZXJzaW9uPjMuNy4wPC92ZXJzaW9uPgotICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPGVuY29kaW5nPlVURi04PC9lbmNvZGluZz4KLSAgICAgICAgICAgIDxzb3VyY2U+MS44PC9zb3VyY2U+Ci0gICAgICAgICAgICA8dGFyZ2V0PjEuODwvdGFyZ2V0PgotICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgIDxpZD5kZWZhdWx0LWNvbXBpbGU8L2lkPgotICAgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+Ci0gICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICA8Z29hbD5jb21waWxlPC9nb2FsPgotICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICA8aW5jbHVkZT5vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9JbnNlY3VyZUNpcGhlckZhY3RvcnkuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgIDxpZD5jb21waWxlLXdpdGgtZXJyb3Jwcm9uZTwvaWQ+Ci0gICAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KLSAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgIDxnb2FsPmNvbXBpbGU8L2dvYWw+Ci0gICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgIDxjb21waWxlcklkPmphdmFjLXdpdGgtZXJyb3Jwcm9uZTwvY29tcGlsZXJJZD4KLSAgICAgICAgICAgICAgICA8Zm9yY2VKYXZhY0NvbXBpbGVyVXNlPnRydWU8L2ZvcmNlSmF2YWNDb21waWxlclVzZT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9JbnNlY3VyZUNpcGhlckZhY3RvcnkuamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgotICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtY29tcGlsZXItamF2YWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgIDx2ZXJzaW9uPjIuOC4yPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy1jb21waWxlci1qYXZhYy1lcnJvcnByb25lPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICA8dmVyc2lvbj4yLjguMjwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDwhLS0gb3ZlcnJpZGUgcGxleHVzLWNvbXBpbGVyLWphdmFjLWVycm9ycHJvbmUncyBkZXBlbmRlbmN5IG9uCi0gICAgICAgICAgICAgICAgIEVycm9yIFByb25lIHdpdGggdGhlIGxhdGVzdCB2ZXJzaW9uIC0tPgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZXJyb3Jwcm9uZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXJyb3JfcHJvbmVfY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yLjA8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgICAgIDwvcGx1Z2luPgotCi0gICAgICAgIDxwbHVnaW4+CiAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY2xlYW4tcGx1Z2luPC9hcnRpZmFjdElkPgogICAgICAgICAgIDx2ZXJzaW9uPjMuMC4wPC92ZXJzaW9uPgogICAgICAgICA8L3BsdWdpbj4KQEAgLTM0Myw3ICsyODYsNyBAQAogICAgICAgICA8cGx1Z2luPgogICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICA8dmVyc2lvbj4zLjAuMjwvdmVyc2lvbj4KKyAgICAgICAgICA8dmVyc2lvbj4zLjEuMTwvdmVyc2lvbj4KICAgICAgICAgPC9wbHVnaW4+CiAKICAgICAgICAgPHBsdWdpbj4KQEAgLTU0MSw3ICs0ODQsNiBAQAogICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CiAgICAgICAgIDxleGVjdXRpb25zPgogICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+YXR0YWNoLWphdmFkb2NzPC9pZD4KICAgICAgICAgICAgIDxnb2Fscz4KICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgogICAgICAgICAgICAgPC9nb2Fscz4KQEAgLTU5Niw2ICs1MzgsMjMgQEAKICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgogICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KICAgICAgICAgPHZlcnNpb24+JHttYXZlbi1qYXZhZG9jLXBsdWdpbi12ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPHJlcG9ydFNldHM+CisgICAgICAgICAgPHJlcG9ydFNldD4KKyAgICAgICAgICAgIDxyZXBvcnRzPgorICAgICAgICAgICAgICA8cmVwb3J0PmphdmFkb2M8L3JlcG9ydD4KKyAgICAgICAgICAgIDwvcmVwb3J0cz4KKyAgICAgICAgICA8L3JlcG9ydFNldD4KKyAgICAgICAgICA8cmVwb3J0U2V0PgorICAgICAgICAgICAgPGlkPmFnZ3JlZ2F0ZTwvaWQ+CisgICAgICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICA8cmVwb3J0cz4KKyAgICAgICAgICAgICAgPHJlcG9ydD5hZ2dyZWdhdGU8L3JlcG9ydD4KKyAgICAgICAgICAgIDwvcmVwb3J0cz4KKyAgICAgICAgICA8L3JlcG9ydFNldD4KKyAgICAgICAgPC9yZXBvcnRTZXRzPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8YWRkaXRpb25hbHBhcmFtPi1YZG9jbGludDpub25lPC9hZGRpdGlvbmFscGFyYW0+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KICAgICAgIDwvcGx1Z2luPgogICAgICAgPHBsdWdpbj4KICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgpAQCAtNjE5LDYgKzU3OCwyNCBAQAogICAgICAgICAgIDwvcmVwb3J0c0RpcmVjdG9yaWVzPgogICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CiAgICAgICA8L3BsdWdpbj4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdC1pbmZvLXJlcG9ydHMtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjk8L3ZlcnNpb24+CisgICAgICAgIDxyZXBvcnRTZXRzPgorICAgICAgICAgIDxyZXBvcnRTZXQ+CisgICAgICAgICAgICA8cmVwb3J0cz4KKyAgICAgICAgICAgICAgPHJlcG9ydD5kZXBlbmRlbmNpZXM8L3JlcG9ydD4KKyAgICAgICAgICAgICAgPHJlcG9ydD5wcm9qZWN0LXRlYW08L3JlcG9ydD4KKyAgICAgICAgICAgICAgPHJlcG9ydD5tYWlsaW5nLWxpc3Q8L3JlcG9ydD4KKyAgICAgICAgICAgICAgPHJlcG9ydD5jaW08L3JlcG9ydD4KKyAgICAgICAgICAgICAgPHJlcG9ydD5pc3N1ZS10cmFja2luZzwvcmVwb3J0PgorICAgICAgICAgICAgICA8cmVwb3J0PmxpY2Vuc2U8L3JlcG9ydD4KKyAgICAgICAgICAgICAgPHJlcG9ydD5zY208L3JlcG9ydD4KKyAgICAgICAgICAgIDwvcmVwb3J0cz4KKyAgICAgICAgICA8L3JlcG9ydFNldD4KKyAgICAgICAgPC9yZXBvcnRTZXRzPgorICAgICAgPC9wbHVnaW4+CiAgICAgPC9wbHVnaW5zPgogICA8L3JlcG9ydGluZz4KIApAQCAtNzYyLDYgKzczOSwxMDcgQEAKIAogICA8cHJvZmlsZXM+CiAgICAgPHByb2ZpbGU+CisgICAgICA8aWQ+amF2YWM8L2lkPgorICAgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+My43LjA8L3ZlcnNpb24+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGVuY29kaW5nPlVURi04PC9lbmNvZGluZz4KKyAgICAgICAgICAgICAgPHNvdXJjZT4xLjg8L3NvdXJjZT4KKyAgICAgICAgICAgICAgPHRhcmdldD4xLjg8L3RhcmdldD4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDxpZD5kZWZhdWx0LWNvbXBpbGU8L2lkPgorICAgICAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICA8Z29hbD5jb21waWxlPC9nb2FsPgorICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPm9yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0luc2VjdXJlQ2lwaGVyRmFjdG9yeS5qYXZhPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDxpZD5jb21waWxlLXdpdGgtZXJyb3Jwcm9uZTwvaWQ+CisgICAgICAgICAgICAgICAgPHBoYXNlPmNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgIDxnb2FsPmNvbXBpbGU8L2dvYWw+CisgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgIDxjb21waWxlcklkPmphdmFjLXdpdGgtZXJyb3Jwcm9uZTwvY29tcGlsZXJJZD4KKyAgICAgICAgICAgICAgICAgIDxmb3JjZUphdmFjQ29tcGlsZXJVc2U+dHJ1ZTwvZm9yY2VKYXZhY0NvbXBpbGVyVXNlPgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9JbnNlY3VyZUNpcGhlckZhY3RvcnkuamF2YTwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLWNvbXBpbGVyLWphdmFjPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuOC4yPC92ZXJzaW9uPgorICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLWNvbXBpbGVyLWphdmFjLWVycm9ycHJvbmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi44LjQ8L3ZlcnNpb24+CisgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgPCEtLSBvdmVycmlkZSBwbGV4dXMtY29tcGlsZXItamF2YWMtZXJyb3Jwcm9uZSdzIGRlcGVuZGVuY3kgb24KKyAgICAgICAgICAgICAgICAgIEVycm9yIFByb25lIHdpdGggdGhlIGxhdGVzdCB2ZXJzaW9uIC0tPgorICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmVycm9ycHJvbmU8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXJyb3JfcHJvbmVfY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjMuMTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+CisgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgIDwvYnVpbGQ+CisgICAgPC9wcm9maWxlPgorICAgIDxwcm9maWxlPgorICAgICAgPGlkPmVjajwvaWQ+CisgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgPGFjdGl2ZUJ5RGVmYXVsdD50cnVlPC9hY3RpdmVCeURlZmF1bHQ+CisgICAgICA8L2FjdGl2YXRpb24+CisgICAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4zLjcuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8Y29tcGlsZXJJZD5lY2xpcHNlPC9jb21waWxlcklkPgorICAgICAgICAgICAgICA8ZW5jb2Rpbmc+VVRGLTg8L2VuY29kaW5nPgorICAgICAgICAgICAgICA8c291cmNlPjEuODwvc291cmNlPgorICAgICAgICAgICAgICA8dGFyZ2V0PjEuODwvdGFyZ2V0PgorICAgICAgICAgICAgICA8IS0tIFBhc3NpbmcgYXJndW1lbnRzIGlzIGEgdHJhaW53cmVjaywgc2VlIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvTUNPTVBJTEVSLTEyMyAtLT4KKyAgICAgICAgICAgICAgPGNvbXBpbGVyQXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0aWVzPiR7cHJvamVjdC5iYXNlZGlyfS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnM8L3Byb3BlcnRpZXM+CisgICAgICAgICAgICAgIDwvY29tcGlsZXJBcmd1bWVudHM+CisgICAgICAgICAgICAgIDxzaG93V2FybmluZ3M+dHJ1ZTwvc2hvd1dhcm5pbmdzPgorICAgICAgICAgICAgICA8c2hvd0RlcHJlY2F0aW9uPnRydWU8L3Nob3dEZXByZWNhdGlvbj4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLWNvbXBpbGVyLWVjbGlwc2U8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi44LjQ8L3ZlcnNpb24+CisgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamR0PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmVjajwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4zLjEzLjEwMjwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+CisgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgIDwvYnVpbGQ+CisgICAgPC9wcm9maWxlPgorICAgIDxwcm9maWxlPgogICAgICAgPGlkPnN0YXRpYy1jaGVja3M8L2lkPgogICAgICAgPGJ1aWxkPgogICAgICAgICA8cGx1Z2lucz4K