ZGlmZiAtLWdpdCBhLy5wcm9qZWN0IGIvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVmNTVhYgotLS0gL2Rldi9udWxsCisrKyBiLy5wcm9qZWN0CkBAIC0wLDAgKzEsMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuYWdncmVnYXRvcjwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLm0yZS5jb3JlLm1hdmVuMkJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLm0yZS5jb3JlLm1hdmVuMk5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYWJvdXQuaHRtbCBiL2Fib3V0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRjMDU5OAotLS0gL2Rldi9udWxsCisrKyBiL2Fib3V0Lmh0bWwKQEAgLTAsMCArMSwyOCBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKKyAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KKzx0aXRsZT5BYm91dDwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keSBsYW5nPSJFTi1VUyI+Cis8aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KKyAKKzxwPkp1bmUgMSwgMjAxNjwvcD4JCis8aDM+TGljZW5zZTwvaDM+CisKKzxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAoraW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKK2F0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCitGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCis8cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAorYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQorYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAorcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCitpbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAorYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+CisKKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qZW5raW5zLmJ1aWxkLmNvbmZpZy54bWwgYi9qZW5raW5zLmJ1aWxkLmNvbmZpZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkxOTU2NwotLS0gL2Rldi9udWxsCisrKyBiL2plbmtpbnMuYnVpbGQuY29uZmlnLnhtbApAQCAtMCwwICsxLDQ1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKzwhLS0jIENvcHlyaWdodCAoYykgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKzwhLS0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCQkgLS0+Cis8IS0tIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgIC0tPgorPCEtLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAtLT4KKzwhLS0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorPCEtLSMgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKzwhLS0jIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorPCEtLSMgTW9kdWxlIHNwZWNpZmljIHBhcmFtZXRlcnMgZm9yIHRoZSBKZW5raW5zIEpvYiAJCQkJCQkgLS0+Cis8IS0tIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCis8amVua2lucz4KKwk8IS0tIERPIE5PVCBFRElUIEJFTE9XIFRISVMgTElORSAtLT4KKyAgICAgICAgPGplbmtpbnMuYnVpbGQuZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgICAgIDxqZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+b3JnLmVjbGlwc2Uub3NicC5icG0uYXBpPC9qZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGplbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT5vcmcuZWNsaXBzZS5vc2JwLmJwbW4yLmVjb3JlPC9qZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGplbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT5vcmcuZWNsaXBzZS5vc2JwLmRzbDwvamVua2lucy5idWlsZC5kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxqZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+b3JnLmVjbGlwc2Uub3NicC5lY3ZpZXcuYWRkb25zPC9qZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGplbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT5vcmcuZWNsaXBzZS5vc2JwLmV2ZW50YnJva2VyPC9qZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGplbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT5vcmcuZWNsaXBzZS5vc2JwLmZvcmsubWloYWxpcy5vcGFsLmltYWdlU2VsZWN0b3Iub3NnaTwvamVua2lucy5idWlsZC5kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxqZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+b3JnLmVjbGlwc2Uub3NicC5pbmZvZ3JpZDwvamVua2lucy5idWlsZC5kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxqZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+b3JnLmVjbGlwc2Uub3NicC5wcmVmZXJlbmNlczwvamVua2lucy5idWlsZC5kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxqZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+b3JnLmVjbGlwc2Uub3NicC5ydW50aW1lPC9qZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGplbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT5vcmcuZWNsaXBzZS5vc2JwLnJ1bnRpbWUud2ViPC9qZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGplbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT5vcmcuZWNsaXBzZS5vc2JwLnV0aWxzPC9qZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGplbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT5vcmcuZWNsaXBzZS5vc2JwLnV0aWxzLnVpPC9qZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGplbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmFjdGlvbjwvamVua2lucy5idWlsZC5kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxqZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5hZGRvbnM8L2plbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8amVua2lucy5idWlsZC5kZXBlbmRlbmN5Pm9yZy5lY2xpcHNlLm9zYnAueHRleHQuYmxpcDwvamVua2lucy5idWlsZC5kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxqZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydDwvamVua2lucy5idWlsZC5kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxqZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2U8L2plbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8amVua2lucy5idWlsZC5kZXBlbmRlbmN5Pm9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnQ8L2plbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8amVua2lucy5idWlsZC5kZXBlbmRlbmN5Pm9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGlhbG9nPC9qZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGplbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmZ1bmN0aW9ubGlicmFyeTwvamVua2lucy5idWlsZC5kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxqZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5pMThuPC9qZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGplbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0Lm1lc3NhZ2U8L2plbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8amVua2lucy5idWlsZC5kZXBlbmRlbmN5Pm9yZy5lY2xpcHNlLm9zYnAueHRleHQub3JnYW5pemF0aW9uPC9qZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGplbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydDwvamVua2lucy5idWlsZC5kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxqZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+b3JnLmVjbGlwc2Uub3NicC54dGV4dC50YWJsZTwvamVua2lucy5idWlsZC5kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxqZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+b3JnLmVjbGlwc2Uub3NicC54dGV4dC50b3BvbG9neTwvamVua2lucy5idWlsZC5kZXBlbmRlbmN5PgorICAgICAgICA8L2plbmtpbnMuYnVpbGQuZGVwZW5kZW5jaWVzPgorPC9qZW5raW5zPgpkaWZmIC0tZ2l0IGEvbm90aWNlLmh0bWwgYi9ub3RpY2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2QzNGMzCi0tLSAvZGV2L251bGwKKysrIGIvbm90aWNlLmh0bWwKQEAgLTAsMCArMSwxMDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+Cis8dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHkgbGFuZz0iRU4tVVMiPgorPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Cis8cD5BcHJpbCA5LCAyMDE0PC9wPgorCis8aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CisKKzxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUworICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKKyAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCisgICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKworPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgorCis8cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCisgICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKworPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZQorICAgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gc29mdHdhcmUgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+CisKKzx1bD4KKyAgICAgICA8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgorICAgICAgIDxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KKyAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKKyAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgorICAgICAgIDxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgorPC91bD4KKworPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKK0luY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCitpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisKKzx1bD4KKyAgICAgICA8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKyAgICAgICA8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorICAgICAgIDxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKyAgICAgICA8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorICAgICAgIDxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKzwvdWw+CisKKzxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKK2luc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgoraW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgorU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCit0aGF0IGRpcmVjdG9yeS48L3A+CisKKzxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKworPHVsPgorICAgICAgIDxsaT5FY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbDwvYT4pPC9saT4KKyAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgorICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+CisgICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgorICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Cis8L3VsPgorCis8cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQorY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+CisKKworPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CisKKzxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCisgICBVcGRhdGUgTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKKyAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCisgICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCisgICAgICAgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KKyAgICgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS48L3A+CisKKzxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKKyAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQorICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKKyAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KKworPG9sPgorICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKKyAgICAgICBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKKyAgICAgICBwcm9kdWN0LjwvbGk+CisgICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKKyAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgorICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKKyAgICAgICBTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0CisgICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgorICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCisgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KKzwvb2w+CisKKzxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCis8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCisgICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKKyAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorCis8cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuZmVhdHVyZS8ucHJvamVjdCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuZmVhdHVyZS8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDY1MWE4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5mZWF0dXJlLy5wcm9qZWN0CkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuZmVhdHVyZTwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnh0ZXh0LnVpLnNoYXJlZC54dGV4dEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLm0yZS5jb3JlLm1hdmVuMkJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnh0ZXh0LnVpLnNoYXJlZC54dGV4dE5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLm0yZS5jb3JlLm1hdmVuMk5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmZlYXR1cmUvTElDRU5TRS50eHQgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmZlYXR1cmUvTElDRU5TRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY0MmFkNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuZmVhdHVyZS9MSUNFTlNFLnR4dApAQCAtMCwwICsxLDE2MSBAQAorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtdiAxLjAKKworVEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OCitPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC4KKworMS4gREVGSU5JVElPTlMKKworIkNvbnRyaWJ1dGlvbiIgbWVhbnM6CisKK2EpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQKKworYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOgorCitpKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQKKworaWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTsKKword2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuCitBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUKK2FjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZQorbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdAorZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS4KKworIkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLgorCisiTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YKK2l0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLgorCisiUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50LgorCisiUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy4KKworMi4gR1JBTlQgT0YgUklHSFRTCisKK2EpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAorcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlCithbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCitmb3JtLgorCitiKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKK3JveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlCitDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUKK2NvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwgc3VjaAorYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90CithcHBseSB0byBhbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4KKworYykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vCithc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQorcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5CitiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKK2xpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5CityaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlIHRoZQorUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS4KKworZCkgRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8KK2dyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuCisKKzMuIFJFUVVJUkVNRU5UUworCitBIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6CisKK2EpIGl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQKKworYikgaXRzIGxpY2Vuc2UgYWdyZWVtZW50OgorCitpKSBlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZword2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7CisKK2lpKSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKK2luY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7CisKK2lpaSkgc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueQorb3RoZXIgcGFydHk7IGFuZAorCitpdikgc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0CitpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuCisKK1doZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybToKKworYSkgaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kCisKK2IpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLgorCitDb250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uCisKK0VhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCitzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4KKworNC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT04KKworQ29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kCit0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzCit0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yCitvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvcgorKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikKK2FnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMKK2Jyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaAorQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gVGhlCitvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwKK3Byb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCitDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkKKyBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuCisKK0ZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcwordGhlbiBhIENvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMKK3JlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLgorVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8KK3Rob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwKK3RoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuCisKKzUuIE5PIFdBUlJBTlRZCisKK0VYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IKK0NPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsCitOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseSByZXNwb25zaWJsZSBmb3IKK2RldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cworZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlCit3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuCisKKzYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZCisKK0VYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWQorRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwKK0hPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKK09USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVECitIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCis3LiBHRU5FUkFMCisKK0lmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgorZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaAorcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuCisKK0lmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKK2FsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoCitSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2gKK2xpdGlnYXRpb24gaXMgZmlsZWQuCisKK0FsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKK2NvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoCitub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbgorb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzCisgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuCisKK0V2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudAoraXMgY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2gKK25ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlCityaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5Cithc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUKK0FncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZQorZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKK3RoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUKK25ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCit0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvcgorb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuCisKK1RoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzCitvZiBBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2UKK29mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg5MjBmZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMiBAQAorYmluLmluY2x1ZGVzID0gbGljZW5zZS5odG1sLCAgZXBsLXYxMC5odG1sLCAgZmVhdHVyZS54bWwsXAorICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5mZWF0dXJlL2VwbC12MTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzk4YWNjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5mZWF0dXJlL2VwbC12MTAuaHRtbApAQCAtMCwwICsxLDI1OSBAQAorPCEtLT94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPy0tPgorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgIGJvZHkgeworICAgIHNpemU6IDguNWluIDExLjBpbjsKKyAgICBtYXJnaW46IDAuMjVpbiAwLjVpbiAwLjI1aW4gMC41aW47CisgICAgdGFiLWludGVydmFsOiAwLjVpbjsKKyAgICB9CisgIHAgeyAgCQorICAgIG1hcmdpbi1sZWZ0OiBhdXRvOworICAgIG1hcmdpbi10b3A6ICAwLjVlbTsKKyAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsKKyAgICB9CisgIHAubGlzdCB7CisgIAltYXJnaW4tbGVmdDogMC41aW47CisgICAgbWFyZ2luLXRvcDogIDAuMDVlbTsKKyAgICBtYXJnaW4tYm90dG9tOiAwLjA1ZW07CisgICAgfQorICA8L3N0eWxlPgorCis8L2hlYWQ+CisKKzxib2R5IGxhbmc9IkVOLVVTIj4KKworPGgyPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvaDI+CisKKzxwPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFCitQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IKK0RJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMKK0FHUkVFTUVOVC48L3A+CisKKzxwPjxiPjEuIERFRklOSVRJT05TPC9iPjwvcD4KKworPHA+IkNvbnRyaWJ1dGlvbiIgbWVhbnM6PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsCitjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8L3A+Cis8cCBjbGFzcz0ibGlzdCI+YikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvcD4KKzxwIGNsYXNzPSJsaXN0Ij5pKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3A+Cis8cCBjbGFzcz0ibGlzdCI+aWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3A+Cis8cCBjbGFzcz0ibGlzdCI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0KK29yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBCitDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlCitQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaAorQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQorUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluCitjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkKK2FyZSBub3QgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS48L3A+CisKKzxwPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcwordGhlIFByb2dyYW0uPC9wPgorCis8cD4iTGljZW5zZWQgUGF0ZW50cyIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYQorQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzCitDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLjwvcD4KKworPHA+IlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2UKK3dpdGggdGhpcyBBZ3JlZW1lbnQuPC9wPgorCis8cD4iUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyCit0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9wPgorCis8cD48Yj4yLiBHUkFOVCBPRiBSSUdIVFM8L2I+PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2gKK0NvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAorcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzCitvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUKK0NvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluCitzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS48L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5iKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaAorQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCityb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsCitvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKK0NvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudAorbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlCitQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwKK3N1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkCitieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIKK2NvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcworbGljZW5zZWQgaGVyZXVuZGVyLjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmMpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IKK2dyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcworYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZQorcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaAorQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieQorYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cworb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzCitncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0bworc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IKK2V4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50Cit0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlCit0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5kKSBFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0CitoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQKK3RoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuPC9wPgorCis8cD48Yj4zLiBSRVFVSVJFTUVOVFM8L2I+PC9wPgorCis8cD5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZQorZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmEpIGl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMKK0FncmVlbWVudDsgYW5kPC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YikgaXRzIGxpY2Vuc2UgYWdyZWVtZW50OjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycworYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzCitvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yCitjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+aWkpIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzCithbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKK2luY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+aWlpKSBzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzCitBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlcgorcGFydHk7IGFuZDwvcD4KKworPHAgY2xhc3M9Imxpc3QiPml2KSBzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlCitmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEKK3JlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUKK2V4Y2hhbmdlLjwvcD4KKworPHA+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmIpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaAorY29weSBvZiB0aGUgUHJvZ3JhbS48L3A+CisKKzxwPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkCit3aXRoaW4gdGhlIFByb2dyYW0uPC9wPgorCis8cD5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cworQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3Mgc3Vic2VxdWVudAorUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLjwvcD4KKworPHA+PGI+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L2I+PC9wPgorCis8cD5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4KK3Jlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZQorbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mCit0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKK3Byb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZQorcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IKK2luY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yCisoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQKK2luZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikKK2FnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikKK2FyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZAorcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlCithY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cworZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiBUaGUKK29ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKK3JlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbgorb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5Cit0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsCitDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUKK0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duCitleHBlbnNlLjwvcD4KKworPHA+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKK3Byb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCitjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZQorY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eQorYWxvbmUuIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0bworZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZQorcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIKK0NvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKK211c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9wPgorCis8cD48Yj41LiBOTyBXQVJSQU5UWTwvYj48L3A+CisKKzxwPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUworUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMKK09GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLAorQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZCitPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5CityZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKK2Rpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cworZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwordGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywKK2RhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yCitpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy48L3A+CisKKzxwPjxiPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9iPjwvcD4KKworPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UCitOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORworV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUgorRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKK0hFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9wPgorCis8cD48Yj43LiBHRU5FUkFMPC9iPjwvcD4KKworPHA+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKK2FwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZgordGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uCitieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtCitleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvcD4KKworPHA+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5CisoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUKK1Byb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIKK3NvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAorUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUKK2RhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLjwvcD4KKworPHA+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQKK2ZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzCitBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZQorYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzCit1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAorZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKK1JlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQorUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLjwvcD4KKworPHA+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMKK0FncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcworY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUKK0FncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nCityZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUKK0FncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZQorRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkKK2Fzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEKK3N1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUKK2dpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcKK0NvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUKK0FncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uCitvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlCitQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzCitleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubworcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyCit0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvcgorb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzCitBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvcD4KKworPHA+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZAordGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5Cit0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUKK3RoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzCityaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3A+CisKKworCis8L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YmU4M2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTY5IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIworIyBDb250cmlidXRvcnM6CisjICAgICBDcmlzdGlhbm8gR2F2aeNvIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGZlYXR1cmUucHJvcGVydGllcworIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKKyMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCisjIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCisjIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KKworIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQorZmVhdHVyZU5hbWUgPU9TQlAgRFNMOiBQZXJzcGVjdGl2ZSAKKworIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQorcHJvdmlkZXJOYW1lPUVjbGlwc2UgT1NCUAorCisjICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQorZGVzY3JpcHRpb249VGhpcyBmZWF0dXJlIHByb3ZpZGVzIHRoZSBidW5kbGVzIGZvciB0aGUgT1NCUCBQZXJzcGVjdGl2ZURTTC4KKworIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQordXBkYXRlU2l0ZU5hbWU9CisKKyMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgorY29weXJpZ2h0PVwKK0NvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIFxuXAorQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAorYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCit3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAoraHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKK1xuXAorIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKKyMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQorbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKKworIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKKyMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgorbGljZW5zZT1cCitFY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnRcblwKK0ZlYnJ1YXJ5IDEsIDIwMTFcblwKK1xuXAorVXNhZ2UgT2YgQ29udGVudFxuXAorXG5cCitUSEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCitPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKK1VTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAorQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCitOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAorQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAorQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKK09SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAorT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKK0JFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKK1xuXAorQXBwbGljYWJsZSBMaWNlbnNlc1xuXAorXG5cCitVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCitFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAordGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKK3Byb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKK0ZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAorXG5cCitDb250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKK2RvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAorcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAorYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCitcblwKKyAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCisgICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCisgICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAorICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAorICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAorICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCisgICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAorICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCisgICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCisgICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKKyAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAorXG5cCitUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCitjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKK2NvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCitpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCitMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCitpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKK1xuXAorICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCisgICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAorICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAorICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAorICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAorXG5cCitOb3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCitQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCitVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCitJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAord2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKK3lvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKK3RoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKK1N1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKK3Rlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKK2dvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAorXG5cCitUSEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCitUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKK1NPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKK1xuXAorICAgICAgIC0gRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbClcblwKKyAgICAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAorICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCisgICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCisgICAgICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKKyAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCitcblwKK0lUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKK1RPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAoraXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKK2dvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKK1xuXAorXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCitcblwKK1RoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSxcblwKK2J1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yXG5cCit0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3JcblwKK290aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aFxuXAordGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuXG5cCitJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCitodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLlxuXAorXG5cCitZb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCitZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGVcblwKK0luc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCitpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kXG5cCittYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAorYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOlxuXAorXG5cCisgICAgICAgMS4gQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZVxuXAorICAgICAgICAgIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLFxuXAorICAgICAgICAgIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCisgICAgICAgMi4gRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eVxuXAorICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLlxuXAorICAgICAgIDMuIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0XG5cCisgICAgICAgICAgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2hcblwKKyAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZVxuXAorICAgICAgICAgIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZVxuXAorICAgICAgICAgIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnlcblwKKyAgICAgICAgICB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2hcblwKKyAgICAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uXG5cCisgICAgICAgICAgb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAorXG5cCitDcnlwdG9ncmFwaHlcblwKK1xuXAorQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCitjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCithbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCit1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKK3JlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kXG5cCityZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAorXG5cCitKYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCisjIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuZmVhdHVyZS9mZWF0dXJlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTg4NGNlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC0wLDAgKzEsNTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorPCEtLSMgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgLS0+Cis8IS0tIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIC0tPgorPCEtLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIC0tPgorPCEtLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgLS0+Cis8IS0tIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAtLT4KKzwhLS0jIC0tPgorPCEtLSMgQ29udHJpYnV0b3JzOiAtLT4KKzwhLS0jICAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAtLT4KKzwhLS0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKzxmZWF0dXJlCisgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmZlYXR1cmUiCisgICAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCisgICAgICAgIHZlcnNpb249IjAuOS4wLnF1YWxpZmllciIKKyAgICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+CisgICAgICAgIAorICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgJWRlc2NyaXB0aW9uCisgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgCisgICAgPGNvcHlyaWdodD4KKyAgICAgICAgJWNvcHlyaWdodAorICAgIDwvY29weXJpZ2h0PgorICAgICAgICAKKyAgICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KKyAgICAgICAgJWxpY2Vuc2UKKyAgICA8L2xpY2Vuc2U+CisgICAgICAgIAorICAgIDxwbHVnaW4KKyAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUiCisgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKyAgICAgICAgCisgICAgPHBsdWdpbgorICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS50ZXN0cyIKKyAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorICAgICAgICAKKyAgICA8cGx1Z2luCisgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpIgorICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisgICAgICAgIAorPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuZmVhdHVyZS9saWNlbnNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU1NzlhNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuZmVhdHVyZS9saWNlbnNlLmh0bWwKQEAgLTAsMCArMSwxNjQgQEAKKzwhLS0/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8tLT4KKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9IkVOLVVTIj4KKzxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorPHA+RmVicnVhcnkgMSwgMjAxMTwvcD4KKworPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCis8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKyAgIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKKyAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCisgICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKworPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgorCis8cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UKKyBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIAorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAorICAgKCJFUEwiKS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvCisgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCisgICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKK2RvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiAKK3NvdXJjZSBjb2RlCisgICByZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgCithdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9wPgorCis8dWw+CisgICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byAKK2ZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCAKK21vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKKygiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuPC9saT4KKyAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJiM4NDgyOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuPC9saT4KKyAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciAKK0ZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSAKK3N1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIAorbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgCitvZiB0aGUgUGx1Zy1pbnMKKyAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgorICAgICAgIDxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgCitGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgCitsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Cis8L3VsPgorCis8cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIAorY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIAorY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCitJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAorKCJGZWF0dXJlIExpY2Vuc2VzIikuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55CisgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCitpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisKKzx1bD4KKyAgICAgICA8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKyAgICAgICA8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorICAgICAgIDxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKyAgICAgICA8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+CisgICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgorPC91bD4KKworPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgCitpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QKKyBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZQoraW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIAorRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCAKK2NvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgoraW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIAorZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiAKK2ZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCitTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIAordGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCAKK2dvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCit0aGF0IGRpcmVjdG9yeS48L3A+CisKKzxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgCitUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4KKyAgU09NRSBPRiBUSEVTRQorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CisKKzx1bD4KKyAgICAgICA8bGk+RWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWw8L2E+KTwvbGk+CisgICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KKyAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgorICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KKyAgICAgICA8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgorICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Cis8L3VsPgorCis8cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCAKK0NPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgCitvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKK2NvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyAKK2dvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+CisKKworPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CisKKzxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgCitleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKKyAgIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3IgdGhlIHB1cnBvc2Ugb2YgCithbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKKyAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIAorY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bworICAgaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQgCitwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+CisgICAoIlNwZWNpZmljYXRpb24iKS48L3A+CisKKzxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbAorIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQorICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvCisgYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIAorVGVjaG5vbG9neQorICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgCitUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIAordGhlCisgICBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZSAKK2FjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KKworPG9sPgorICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gCit3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5CisgICAgICAgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgCitleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAorICAgICAgIHByb2R1Y3QuPC9saT4KKyAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IAorbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCisgICAgICAgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KKyAgICAgICA8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgCit0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKKyAgICAgICBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoIEluc3RhbGxhYmxlIAorU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAorICAgICAgIE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIAorU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0CisgZ292ZXJuCisgICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIAordXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIAorVXBvbiBzdWNoCisgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSAKK3dpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgorPC9vbD4KKworPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisKKzxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZQorIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgCithbmQvb3IgcmUtZXhwb3J0IHRvCisgICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiAKK3NvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCitjb25jZXJuaW5nIHRoZSBpbXBvcnQsCisgICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIAordGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorCis8cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KKworCis8L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuZmVhdHVyZS9wb20ueG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5mZWF0dXJlL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI0Y2VkMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuZmVhdHVyZS9wb20ueG1sCkBAIC0wLDAgKzEsOTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorPCEtLSMgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkuIC0tPgorPCEtLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAtLT4KKzwhLS0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAtLT4KKzwhLS0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IC0tPgorPCEtLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgLS0+Cis8IS0tIyAtLT4KKzwhLS0jIENvbnRyaWJ1dG9yczogLS0+Cis8IS0tIyBDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gLS0+Cis8IS0tIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisJPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisJPHBhcmVudD4KKwkJPGdyb3VwSWQ+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZTwvZ3JvdXBJZD4KKwkJPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5hZ2dyZWdhdG9yPC9hcnRpZmFjdElkPgorCQk8dmVyc2lvbj4wLjkuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKwk8L3BhcmVudD4KKworCTxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuZmVhdHVyZTwvYXJ0aWZhY3RJZD4KKwk8cGFja2FnaW5nPmVjbGlwc2UtZmVhdHVyZTwvcGFja2FnaW5nPgorCQorCQk8YnVpbGQ+CisJCTxwbHVnaW5zPgorCQkJPHBsdWdpbj4KKwkJCQk8Z3JvdXBJZD5vcmcuZWNsaXBzZS50eWNoby5leHRyYXM8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+dHljaG8tc291cmNlLWZlYXR1cmUtcGx1Z2luPC9hcnRpZmFjdElkPgorCQkJCTx2ZXJzaW9uPiR7dHljaG9FeHRyYXNWZXJzaW9ufTwvdmVyc2lvbj4KKwkJCQk8ZXhlY3V0aW9ucz4KKwkJCQkJPGV4ZWN1dGlvbj4KKwkJCQkJCTxpZD5zb3VyY2UtZmVhdHVyZTwvaWQ+CisJCQkJCQk8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisJCQkJCQk8Z29hbHM+CisJCQkJCQkJPGdvYWw+c291cmNlLWZlYXR1cmU8L2dvYWw+CisJCQkJCQk8L2dvYWxzPgorCQkJCQk8L2V4ZWN1dGlvbj4KKwkJCQk8L2V4ZWN1dGlvbnM+CisJCQkJPGNvbmZpZ3VyYXRpb24+CisJCQkJCTxsYWJlbFN1ZmZpeD4gKHNvdXJjZSk8L2xhYmVsU3VmZml4PgorCQkJCTwvY29uZmlndXJhdGlvbj4KKwkJCTwvcGx1Z2luPgorCQkJPHBsdWdpbj4KKwkJCQk8IS0tIHdvcmthcm91bmQgd2hpbGUgYnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zOTgyNTAgCisJCQkJCWlzIG5vdCBmaXhlZCAtLT4KKwkJCQk8Z3JvdXBJZD5vcmcuZWNsaXBzZS50eWNobzwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD50eWNoby1wMi1wbHVnaW48L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+JHt0eWNoby12ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCQk8ZXhlY3V0aW9ucz4KKwkJCQkJPGV4ZWN1dGlvbj4KKwkJCQkJCTxpZD5hdHRhY2hlZC1wMi1tZXRhZGF0YTwvaWQ+CisJCQkJCQk8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisJCQkJCQk8Z29hbHM+CisJCQkJCQkJPGdvYWw+cDItbWV0YWRhdGE8L2dvYWw+CisJCQkJCQk8L2dvYWxzPgorCQkJCQk8L2V4ZWN1dGlvbj4KKwkJCQk8L2V4ZWN1dGlvbnM+CisJCQk8L3BsdWdpbj4KKwkJCTxwbHVnaW4+CisJCQkJPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+CisJCQkJPGV4ZWN1dGlvbnM+CisJCQkJCTxleGVjdXRpb24+CisJCQkJCQk8aWQ+amF2YWRvYy1qYXI8L2lkPgorCQkJCQkJPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgorCQkJCQkJPGdvYWxzPgorCQkJCQkJCTxnb2FsPmphcjwvZ29hbD4KKwkJCQkJCTwvZ29hbHM+CisJCQkJCTwvZXhlY3V0aW9uPgorCQkJCTwvZXhlY3V0aW9ucz4KKwkJCTwvcGx1Z2luPgorCQk8L3BsdWdpbnM+CisJPC9idWlsZD4KKworCTxkZXBlbmRlbmNpZXM+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZTwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmU8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4wLjkuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKwkJPC9kZXBlbmRlbmN5PgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmU8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+MC45LjAtU05BUFNIT1Q8L3ZlcnNpb24+CisJCTwvZGVwZW5kZW5jeT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jb20udmFhZGluPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+dmFhZGluLXNoYXJlZC1kZXBzPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+MS4wLjI8L3ZlcnNpb24+CisJCTwvZGVwZW5kZW5jeT4KKwk8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5mZWF0dXJlL3NyYy9tYWluL2phdmFkb2MvUkVBRE1FLnR4dCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuZmVhdHVyZS9zcmMvbWFpbi9qYXZhZG9jL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMxZGE3ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuZmVhdHVyZS9zcmMvbWFpbi9qYXZhZG9jL1JFQURNRS50eHQKQEAgLTAsMCArMSBAQAorUmVzb3VyY2UgZm9sZGVyIGZvciBqYXZhZG9jIHJlc291cmNlcy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmZlYXR1cmUvc3JjL292ZXJ2aWV3Lmh0bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmZlYXR1cmUvc3JjL292ZXJ2aWV3Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIzMzhlOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuZmVhdHVyZS9zcmMvb3ZlcnZpZXcuaHRtbApAQCAtMCwwICsxLDExIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKwk8dGl0bGU+T1NCUCBUb29scyBHcmFwaGljYWwgRW50aXR5PC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorPHA+VGhlIDxzdHJvbmc+T1NCUCZuYnNwO1h0ZXh0Jm5ic3A7UGVyc2VwY3RpdmUgRFNMPC9zdHJvbmc+IGltcGxlbWVudHMgdGhlIHBlcnNwZWN0aXZlIERTTC48L3A+CisKKzxwPiZuYnNwOzwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudGVzdHMvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnRlc3RzLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYjdlODYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnRlc3RzLy5wcm9qZWN0CkBAIC0wLDAgKzEsNDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudGVzdHM8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnh0ZXh0LnVpLnNoYXJlZC54dGV4dEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnJiZUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UubTJlLmNvcmUubWF2ZW4yQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UubTJlLmNvcmUubWF2ZW4yTmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS54dGV4dC51aS5zaGFyZWQueHRleHROYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IucmJlTmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnRlc3RzL0xJQ0VOU0UudHh0IGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS50ZXN0cy9MSUNFTlNFLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjQyYWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS50ZXN0cy9MSUNFTlNFLnR4dApAQCAtMCwwICsxLDE2MSBAQAorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtdiAxLjAKKworVEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OCitPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC4KKworMS4gREVGSU5JVElPTlMKKworIkNvbnRyaWJ1dGlvbiIgbWVhbnM6CisKK2EpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQKKworYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOgorCitpKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQKKworaWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTsKKword2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuCitBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUKK2FjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZQorbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdAorZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS4KKworIkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLgorCisiTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YKK2l0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLgorCisiUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50LgorCisiUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy4KKworMi4gR1JBTlQgT0YgUklHSFRTCisKK2EpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAorcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlCithbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCitmb3JtLgorCitiKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKK3JveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlCitDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUKK2NvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwgc3VjaAorYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90CithcHBseSB0byBhbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4KKworYykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vCithc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQorcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5CitiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKK2xpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5CityaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlIHRoZQorUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS4KKworZCkgRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8KK2dyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuCisKKzMuIFJFUVVJUkVNRU5UUworCitBIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6CisKK2EpIGl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQKKworYikgaXRzIGxpY2Vuc2UgYWdyZWVtZW50OgorCitpKSBlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZword2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7CisKK2lpKSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKK2luY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7CisKK2lpaSkgc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueQorb3RoZXIgcGFydHk7IGFuZAorCitpdikgc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0CitpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuCisKK1doZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybToKKworYSkgaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kCisKK2IpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLgorCitDb250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uCisKK0VhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCitzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4KKworNC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT04KKworQ29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kCit0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzCit0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yCitvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvcgorKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikKK2FnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMKK2Jyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaAorQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gVGhlCitvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwKK3Byb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCitDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkKKyBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuCisKK0ZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcwordGhlbiBhIENvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMKK3JlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLgorVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8KK3Rob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwKK3RoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuCisKKzUuIE5PIFdBUlJBTlRZCisKK0VYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IKK0NPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsCitOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseSByZXNwb25zaWJsZSBmb3IKK2RldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cworZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlCit3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuCisKKzYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZCisKK0VYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWQorRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwKK0hPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKK09USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVECitIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCis3LiBHRU5FUkFMCisKK0lmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgorZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaAorcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuCisKK0lmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKK2FsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoCitSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2gKK2xpdGlnYXRpb24gaXMgZmlsZWQuCisKK0FsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKK2NvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoCitub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbgorb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzCisgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuCisKK0V2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudAoraXMgY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2gKK25ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlCityaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5Cithc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUKK0FncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZQorZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKK3RoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUKK25ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCit0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvcgorb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuCisKK1RoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzCitvZiBBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2UKK29mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzN2JhMDUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsMjYgQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMAorQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgorQnVuZGxlLU5hbWU6IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudGVzdHMKK0J1bmRsZS1WZW5kb3I6IEVjbGlwc2UgT1NCUAorQnVuZGxlLVZlcnNpb246IDAuOS4wLnF1YWxpZmllcgorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS50ZXN0cztzaW5nbGV0b246PXRydWUKK0J1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CitSZXF1aXJlLUJ1bmRsZTogb3JnLnNsZjRqLmFwaTtidW5kbGUtdmVyc2lvbj0iMS43LjIiLAorIG9yZy5hcGFjaGUubG9nNGo7YnVuZGxlLXZlcnNpb249IjEuMi4xNSIsCisgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAorIG9yZy5lY2xpcHNlLnh0ZXh0Lmp1bml0NDtidW5kbGUtdmVyc2lvbj0iWzIuNy4zLDIuOC4wKSIsCisgY29tLmdvb2dsZS5pbmplY3Q7YnVuZGxlLXZlcnNpb249IjMuMC4wIiwKKyBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iMy4xMDYuMSIKK0ltcG9ydC1QYWNrYWdlOiBqYXZheC52YWxpZGF0aW9uLAorIGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZTt2ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5pbnRlcm5hbDt2ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmhhbWNyZXN0LmNvcmUsCisgb3JnLmp1bml0O3ZlcnNpb249IjQuNS4wIiwKKyBvcmcuanVuaXQucnVubmVyO3ZlcnNpb249IjQuNS4wIiwKKyBvcmcuanVuaXQucnVubmVyLm1hbmlwdWxhdGlvbjt2ZXJzaW9uPSI0LjUuMCIsCisgb3JnLmp1bml0LnJ1bm5lci5ub3RpZmljYXRpb247dmVyc2lvbj0iNC41LjAiLAorIG9yZy5qdW5pdC5ydW5uZXJzO3ZlcnNpb249IjQuNS4wIiwKKyBvcmcuanVuaXQucnVubmVycy5tb2RlbDt2ZXJzaW9uPSI0LjUuMCIKK0J1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS44CitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZTt2ZXJzaW9uPSIwLjkuMCIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudGVzdHMvYWJvdXQuaHRtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudGVzdHMvYWJvdXQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGMwNTk4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS50ZXN0cy9hYm91dC5odG1sCkBAIC0wLDAgKzEsMjggQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCisgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Cis8dGl0bGU+QWJvdXQ8L3RpdGxlPgorPC9oZWFkPgorPGJvZHkgbGFuZz0iRU4tVVMiPgorPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+CisgCis8cD5KdW5lIDEsIDIwMTY8L3A+CQorPGgzPkxpY2Vuc2U8L2gzPgorCis8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKK2luZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCithdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKworPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKK2JlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKK2FwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKK3Byb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQoraW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKK2FuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgorCis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS50ZXN0cy9hYm91dC5pbmkgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnRlc3RzL2Fib3V0LmluaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGY2NzFmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS50ZXN0cy9hYm91dC5pbmkKQEAgLTAsMCArMSwxNyBAQAorIyBhYm91dC5pbmkKKyMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCisjIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCisjICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCisjIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCisKKyMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQorYWJvdXRUZXh0PSVmZWF0dXJlVGV4dAorCisjIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCitmZWF0dXJlSW1hZ2U9CisKKyMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uICh0cmFuc2xhdGVkKQorYXBwTmFtZT0lZmVhdHVyZU5hbWUKKworIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCit3ZWxjb21lUGFnZT0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudGVzdHMvYWJvdXQubWFwcGluZ3MgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnRlc3RzL2Fib3V0Lm1hcHBpbmdzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MTFhMGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnRlc3RzL2Fib3V0Lm1hcHBpbmdzCkBAIC0wLDAgKzEsNiBAQAorIyBhYm91dC5tYXBwaW5ncworIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcworIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQorIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgorCiswPXF1YWxpZmllcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS50ZXN0cy9hYm91dC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS50ZXN0cy9hYm91dC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4OTcwZjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnRlc3RzL2Fib3V0LnByb3BlcnRpZXMKQEAgLTAsMCArMSwyNiBAQAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIworIyBDb250cmlidXRvcnM6CisjICAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjCisKKyMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCisKK2ZlYXR1cmVOYW1lPW9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudGVzdHMKKworIyMjIyMjIyMjIyMjIyMjIyBibHVyYiBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2ZlYXR1cmVUZXh0PVwKK0NvcHlyaWdodCAoYykgMjAxMi0yMDE2IC0gTG9ldHogR21iSCZDby5LRyBcblwKK0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKK2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAord2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKK2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCitcblwKK0NvbnRyaWJ1dG9yczpcblwKKyAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25cbgorIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgYmx1cmIgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk1YzlhNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudGVzdHMvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDEwIEBACitzb3VyY2UuLiA9IHNyYy1nZW4vCitiaW4uaW5jbHVkZXMgPSBhYm91dC5wcm9wZXJ0aWVzLCAgYWJvdXQubWFwcGluZ3MsICBhYm91dC5pbmksICBhYm91dC5odG1sLCAgTUVUQS1JTkYvLFwKKyAgICAgICAgICAgICAgIC5zZXR0aW5ncy8sXAorCQkJICAgLixcCisgICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAorICAgICAgICAgICAgICAgTElDRU5TRS50eHQsXAorICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sCitzcmMuaW5jbHVkZXMgPSBhYm91dC5wcm9wZXJ0aWVzLCAgYWJvdXQubWFwcGluZ3MsICBhYm91dC5pbmksICBhYm91dC5odG1sLCAgbGljZW5zZS5odG1sLFwKKyAgICAgICAgICAgICAgIExJQ0VOU0UudHh0LFwKKyAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbAkJCSAgIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS50ZXN0cy9lcGwtdjEwLmh0bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnRlc3RzL2VwbC12MTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzk4YWNjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS50ZXN0cy9lcGwtdjEwLmh0bWwKQEAgLTAsMCArMSwyNTkgQEAKKzwhLS0/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8tLT4KKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICBib2R5IHsKKyAgICBzaXplOiA4LjVpbiAxMS4waW47CisgICAgbWFyZ2luOiAwLjI1aW4gMC41aW4gMC4yNWluIDAuNWluOworICAgIHRhYi1pbnRlcnZhbDogMC41aW47CisgICAgfQorICBwIHsgIAkKKyAgICBtYXJnaW4tbGVmdDogYXV0bzsKKyAgICBtYXJnaW4tdG9wOiAgMC41ZW07CisgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07CisgICAgfQorICBwLmxpc3QgeworICAJbWFyZ2luLWxlZnQ6IDAuNWluOworICAgIG1hcmdpbi10b3A6ICAwLjA1ZW07CisgICAgbWFyZ2luLWJvdHRvbTogMC4wNWVtOworICAgIH0KKyAgPC9zdHlsZT4KKworPC9oZWFkPgorCis8Ym9keSBsYW5nPSJFTi1VUyI+CisKKzxoMj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2gyPgorCis8cD5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRQorUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SCitESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTCitBR1JFRU1FTlQuPC9wPgorCis8cD48Yj4xLiBERUZJTklUSU9OUzwvYj48L3A+CisKKzxwPiJDb250cmlidXRpb24iIG1lYW5zOjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbAorY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPC9wPgorPHAgY2xhc3M9Imxpc3QiPmIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3A+Cis8cCBjbGFzcz0ibGlzdCI+aSkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9wPgorPHAgY2xhc3M9Imxpc3QiPmlpKSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9wPgorPHAgY2xhc3M9Imxpc3QiPndoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtCitvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQQorQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZQorUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2gKK0NvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKK1Byb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbgorY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpCithcmUgbm90IGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uPC9wPgorCis8cD4iQ29udHJpYnV0b3IiIG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMKK3RoZSBQcm9ncmFtLjwvcD4KKworPHA+IkxpY2Vuc2VkIFBhdGVudHMiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEKK0NvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cworQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS48L3A+CisKKzxwPiJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlCit3aXRoIHRoaXMgQWdyZWVtZW50LjwvcD4KKworPHA+IlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlcgordGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvcD4KKworPHA+PGI+Mi4gR1JBTlQgT0YgUklHSFRTPC9iPjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmEpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoCitDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKK3JveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3Jrcworb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlCitDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbgorc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uPC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YikgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2gKK0NvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAorcm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLAorb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCitDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQKK2xpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZQorUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsCitzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZAorYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyCitjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKK2xpY2Vuc2VkIGhlcmV1bmRlci48L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5jKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yCitncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMKK2FyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUKK3BhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2gKK0NvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkKK2FueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKK29yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcworZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8KK3NlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yCitleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudAordG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZQordGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9wPgorCis8cCBjbGFzcz0ibGlzdCI+ZCkgRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdAoraGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50Cit0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LjwvcD4KKworPHA+PGI+My4gUkVRVUlSRU1FTlRTPC9iPjwvcD4KKworPHA+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUKK2Zvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5hKSBpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzCitBZ3JlZW1lbnQ7IGFuZDwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmIpIGl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5pKSBlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMKK2FsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcworb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvcgorY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOzwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmlpKSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycworYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCitpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOzwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmlpaSkgc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcworQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIKK3BhcnR5OyBhbmQ8L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5pdikgc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZQorZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhCityZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlCitleGNoYW5nZS48L3A+CisKKzxwPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybTo8L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5hKSBpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5iKSBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2gKK2NvcHkgb2YgdGhlIFByb2dyYW0uPC9wPgorCis8cD5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZAord2l0aGluIHRoZSBQcm9ncmFtLjwvcD4KKworPHA+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMKK0NvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQKK1JlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi48L3A+CisKKzxwPjxiPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9iPjwvcD4KKworPHA+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluCityZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUKK2xpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZgordGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCitwcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUKK3BvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yCitpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvcgorKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kCitpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpCithZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpCithcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQKK3BhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZQorYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gVGhlCitvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCityZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4KK29yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeQordGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlCitJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93bgorZXhwZW5zZS48L3A+CisKKzxwPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCitwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhIENvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQorY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UKK2NsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkKK2Fsb25lLiBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8KK2RlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UKK3BlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyCitDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCittdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvcD4KKworPHA+PGI+NS4gTk8gV0FSUkFOVFk8L2I+PC9wPgorCis8cD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMKK1BST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TCitPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwKK0FOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWQorT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQorcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kCitkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKK2V4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KK3RoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsCitkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvcgoraW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuPC9wPgorCis8cD48Yj42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvYj48L3A+CisKKzxwPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVAorTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKK0lOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcKK1dJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKK05FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IKK0RJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVECitIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvcD4KKworPHA+PGI+Ny4gR0VORVJBTDwvYj48L3A+CisKKzxwPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCithcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YKK3RoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbgorYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bQorZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3A+CisKKzxwPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eQorKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlCitQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyCitzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKK1JlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlCitkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC48L3A+CisKKzxwPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0CitmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcworQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUKK2FmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cwordW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCitSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKK1JlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS48L3A+CisKKzxwPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzCitBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKK2NvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlCitBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZworcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlCitBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UKK0ZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5Cithc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhCitzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlCitnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nCitDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlCitBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbgorb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZQorUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcworZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8KK3JpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlcgordGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3IKK290aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcworQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3A+CisKKzxwPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQKK3RoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLiBObyBwYXJ0eQordG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlCit0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzIGl0cworcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9wPgorCisKKworPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnRlc3RzL2xpY2Vuc2UuaHRtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudGVzdHMvbGljZW5zZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNTc5YTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnRlc3RzL2xpY2Vuc2UuaHRtbApAQCAtMCwwICsxLDE2NCBAQAorPCEtLT94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPy0tPgorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHkgbGFuZz0iRU4tVVMiPgorPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Cis8cD5GZWJydWFyeSAxLCAyMDExPC9wPgorCis8aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CisKKzxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUworICAgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAorICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQorICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKKyAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAorICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgorCis8aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+CisKKzxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZQorIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgCitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCisgICAoIkVQTCIpLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28KKyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KKyAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKworPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAorZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIAorc291cmNlIGNvZGUKKyAgIHJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSAKK2F2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L3A+CisKKzx1bD4KKyAgICAgICA8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIAorZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIAorbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAorKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS48L2xpPgorICAgICAgIDxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmIzg0ODI7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi48L2xpPgorICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIAorRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIAorc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgCituYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyAKK29mIHRoZSBQbHVnLWlucworICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+CisgICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCAKK0ZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSAKK2xpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KKzwvdWw+CisKKzxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgCitjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgCitjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKK0luY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCisoIkZlYXR1cmUgTGljZW5zZXMiKS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkKKyBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKK2luY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KKworPHVsPgorICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgorICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+CisgICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgorICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KKyAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Cis8L3VsPgorCis8cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyAKK2luc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdAorIGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlCitpbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgCitGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIAorY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCitpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgCitmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIAorZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KK1N1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgCit0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IAorZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KK3RoYXQgZGlyZWN0b3J5LjwvcD4KKworPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiAKK1RPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLgorICBTT01FIE9GIFRIRVNFCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKworPHVsPgorICAgICAgIDxsaT5FY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbDwvYT4pPC9saT4KKyAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgorICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+CisgICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgorICAgICAgIDxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+CisgICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KKzwvdWw+CisKKzxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIAorQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCAKK29yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQorY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIAorZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KKworCis8aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KKworPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCAKK2V4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZQorICAgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvciB0aGUgcHVycG9zZSBvZiAKK2FsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgorICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgCitjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCisgICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCAKK3BhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KKyAgICgiU3BlY2lmaWNhdGlvbiIpLjwvcD4KKworPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsCisgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlCisgICBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8KKyBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgCitUZWNobm9sb2d5CisgICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyAKK1RlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggCit0aGUKKyAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIAorYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgorCis8b2w+CisgICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiAKK3doaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKKyAgICAgICBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCAKK2V4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkCisgICAgICAgcHJvZHVjdC48L2xpPgorICAgICAgIDxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgCittYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKKyAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgorICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciAKK3RoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQorICAgICAgIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2ggSW5zdGFsbGFibGUgCitTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0CisgICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgCitTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQKKyBnb3Zlcm4KKyAgICAgICB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5IHRoZSBlbmQgCit1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gCitVcG9uIHN1Y2gKKyAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IAord2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLjwvbGk+Cis8L29sPgorCis8aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KKworPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlCisgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCAKK2FuZC9vciByZS1leHBvcnQgdG8KKyAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIAorc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKK2NvbmNlcm5pbmcgdGhlIGltcG9ydCwKKyAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgCit0aGlzIGlzIHBlcm1pdHRlZC48L3A+CisKKzxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgorCisKKzwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS50ZXN0cy9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnRlc3RzLmxhdW5jaCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudGVzdHMvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS50ZXN0cy5sYXVuY2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ5MjFjMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudGVzdHMvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS50ZXN0cy5sYXVuY2gKQEAgLTAsMCArMSwxNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPSJvcmcuZWNsaXBzZS5qZHQuanVuaXQubGF1bmNoY29uZmlnIj4KKzxsaXN0QXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5NQVBQRURfUkVTT1VSQ0VfUEFUSFMiPgorPGxpc3RFbnRyeSB2YWx1ZT0iL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudGVzdHMiLz4KKzwvbGlzdEF0dHJpYnV0ZT4KKzxsaXN0QXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5NQVBQRURfUkVTT1VSQ0VfVFlQRVMiPgorPGxpc3RFbnRyeSB2YWx1ZT0iNCIvPgorPC9saXN0QXR0cmlidXRlPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5DT05UQUlORVIiIHZhbHVlPSI9b3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS50ZXN0cyIvPgorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuS0VFUFJVTk5JTkdfQVRUUiIgdmFsdWU9ImZhbHNlIi8+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LlRFU1RfS0lORCIgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5sb2FkZXIuanVuaXQ0Ii8+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5DTEFTU1BBVEhfUFJPVklERVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5tMmUubGF1bmNoY29uZmlnLmNsYXNzcGF0aFByb3ZpZGVyIi8+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5QUk9KRUNUX0FUVFIiIHZhbHVlPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnRlc3RzIi8+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5TT1VSQ0VfUEFUSF9QUk9WSURFUiIgdmFsdWU9Im9yZy5lY2xpcHNlLm0yZS5sYXVuY2hjb25maWcuc291cmNlcGF0aFByb3ZpZGVyIi8+Cis8L2xhdW5jaENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnRlc3RzL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnRlc3RzL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAwYzc1ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudGVzdHMvcG9tLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKzwhLS0jIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIC0tPgorPCEtLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAtLT4KKzwhLS0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAtLT4KKzwhLS0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IC0tPgorPCEtLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgLS0+Cis8IS0tIyAtLT4KKzwhLS0jIENvbnRyaWJ1dG9yczogLS0+Cis8IS0tIyAgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gLS0+Cis8IS0tIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKwk8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisJPHBhcmVudD4KKwkJPGdyb3VwSWQ+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZTwvZ3JvdXBJZD4KKwkJPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5hZ2dyZWdhdG9yPC9hcnRpZmFjdElkPgorCQk8dmVyc2lvbj4wLjkuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKwkJPHJlbGF0aXZlUGF0aD4uLjwvcmVsYXRpdmVQYXRoPgorCTwvcGFyZW50PgorCTxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudGVzdHM8L2FydGlmYWN0SWQ+CisJPHBhY2thZ2luZz5lY2xpcHNlLXBsdWdpbjwvcGFja2FnaW5nPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnRlc3RzL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9QZXJzcGVjdGl2ZURzbEluamVjdG9yUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudGVzdHMvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL1BlcnNwZWN0aXZlRHNsSW5qZWN0b3JQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZTllYTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnRlc3RzL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9QZXJzcGVjdGl2ZURzbEluamVjdG9yUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5qdW5pdDQuR2xvYmFsUmVnaXN0cmllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5qdW5pdDQuR2xvYmFsUmVnaXN0cmllcy5HbG9iYWxTdGF0ZU1lbWVudG87CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuanVuaXQ0LklJbmplY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lmp1bml0NC5JUmVnaXN0cnlDb25maWd1cmF0b3I7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3RvcjsKKworcHVibGljIGNsYXNzIFBlcnNwZWN0aXZlRHNsSW5qZWN0b3JQcm92aWRlciBpbXBsZW1lbnRzIElJbmplY3RvclByb3ZpZGVyLCBJUmVnaXN0cnlDb25maWd1cmF0b3IgeworCQorICAgIHByb3RlY3RlZCBHbG9iYWxTdGF0ZU1lbWVudG8gc3RhdGVCZWZvcmVJbmplY3RvckNyZWF0aW9uOworCXByb3RlY3RlZCBHbG9iYWxTdGF0ZU1lbWVudG8gc3RhdGVBZnRlckluamVjdG9yQ3JlYXRpb247CisJcHJvdGVjdGVkIEluamVjdG9yIGluamVjdG9yOworCisJc3RhdGljIHsKKwkJR2xvYmFsUmVnaXN0cmllcy5pbml0aWFsaXplRGVmYXVsdHMoKTsKKwl9CisKKwlwdWJsaWMgSW5qZWN0b3IgZ2V0SW5qZWN0b3IoKQorCXsKKwkJaWYgKGluamVjdG9yID09IG51bGwpIHsKKwkJCXN0YXRlQmVmb3JlSW5qZWN0b3JDcmVhdGlvbiA9IEdsb2JhbFJlZ2lzdHJpZXMubWFrZUNvcHlPZkdsb2JhbFN0YXRlKCk7CisJCQl0aGlzLmluamVjdG9yID0gaW50ZXJuYWxDcmVhdGVJbmplY3RvcigpOworCQkJc3RhdGVBZnRlckluamVjdG9yQ3JlYXRpb24gPSBHbG9iYWxSZWdpc3RyaWVzLm1ha2VDb3B5T2ZHbG9iYWxTdGF0ZSgpOworCQl9CisJCXJldHVybiBpbmplY3RvcjsKKwl9CisJCisJcHJvdGVjdGVkIEluamVjdG9yIGludGVybmFsQ3JlYXRlSW5qZWN0b3IoKSB7CisJICAgIHJldHVybiBuZXcgUGVyc3BlY3RpdmVEc2xTdGFuZGFsb25lU2V0dXAoKS5jcmVhdGVJbmplY3RvckFuZERvRU1GUmVnaXN0cmF0aW9uKCk7CisJfQorCisJcHVibGljIHZvaWQgcmVzdG9yZVJlZ2lzdHJ5KCkgeworCQlzdGF0ZUJlZm9yZUluamVjdG9yQ3JlYXRpb24ucmVzdG9yZUdsb2JhbFN0YXRlKCk7CisJfQorCisJcHVibGljIHZvaWQgc2V0dXBSZWdpc3RyeSgpIHsKKwkJZ2V0SW5qZWN0b3IoKTsKKwkJc3RhdGVBZnRlckluamVjdG9yQ3JlYXRpb24ucmVzdG9yZUdsb2JhbFN0YXRlKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS50ZXN0cy9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvUGVyc3BlY3RpdmVEc2xVaUluamVjdG9yUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudGVzdHMvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL1BlcnNwZWN0aXZlRHNsVWlJbmplY3RvclByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM5MmE3NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudGVzdHMvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL1BlcnNwZWN0aXZlRHNsVWlJbmplY3RvclByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlOworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuanVuaXQ0LklJbmplY3RvclByb3ZpZGVyOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0b3I7CisKK3B1YmxpYyBjbGFzcyBQZXJzcGVjdGl2ZURzbFVpSW5qZWN0b3JQcm92aWRlciBpbXBsZW1lbnRzIElJbmplY3RvclByb3ZpZGVyIHsKKwkKKwlwdWJsaWMgSW5qZWN0b3IgZ2V0SW5qZWN0b3IoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLmludGVybmFsLlBlcnNwZWN0aXZlRHNsQWN0aXZhdG9yLmdldEluc3RhbmNlKCkuZ2V0SW5qZWN0b3IoIm9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wiKTsKKwl9CisJCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzA0YmU2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS8ucHJvamVjdApAQCAtMCwwICsxLDQ2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS54dGV4dC51aS5zaGFyZWQueHRleHRCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5yYmVCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLm0yZS5jb3JlLm1hdmVuMkJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLm0yZS5jb3JlLm1hdmVuMk5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UueHRleHQudWkuc2hhcmVkLnh0ZXh0TmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnJiZU5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9MSUNFTlNFLnR4dCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvTElDRU5TRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY0MmFkNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvTElDRU5TRS50eHQKQEAgLTAsMCArMSwxNjEgQEAKK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgLXYgMS4wCisKK1RIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuIEFOWSBVU0UsIFJFUFJPRFVDVElPTgorT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuCisKKzEuIERFRklOSVRJT05TCisKKyJDb250cmlidXRpb24iIG1lYW5zOgorCithKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kCisKK2IpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjoKKworaSkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kCisKK2lpKSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07CisKK3doZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLgorQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lCithY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUKK21vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QKK2Rlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uCisKKyJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS4KKworIkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mCitpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4KKworIlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC4KKworIlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuCisKKzIuIEdSQU5UIE9GIFJJR0hUUworCithKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKK3JveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZQorYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQorZm9ybS4KKworYikgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCityb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZQorQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlCitjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2gKK2FkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdAorYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuCisKK2MpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubworYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKK3JpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eQorYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCitsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQorcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZSB0aGUKK1Byb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uCisKK2QpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvCitncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LgorCiszLiBSRVFVSVJFTUVOVFMKKworQSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OgorCithKSBpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kCisKK2IpIGl0cyBsaWNlbnNlIGFncmVlbWVudDoKKworaSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcKK3dhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOworCitpaSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCitpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOworCitpaWkpIHN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkKK290aGVyIHBhcnR5OyBhbmQKKworaXYpIHN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdAoraW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLgorCitXaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06CisKK2EpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZAorCitiKSBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4KKworQ29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLgorCitFYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cworc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uCisKKzQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OCisKK0NvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZAordGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcwordGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvcgorb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IKKygiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpCithZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zCiticm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2gKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuIFRoZQorb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZQorQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5CisgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLgorCitGb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMKK3RoZW4gYSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzCityZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4KK1VuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvCit0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsCit0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLgorCis1LiBOTyBXQVJSQU5UWQorCitFWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCitDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLAorTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkgcmVzcG9uc2libGUgZm9yCitkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKK2V4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZQord2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgorCis2LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWQorCitFWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkKK0RJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksCitIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCitPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRAorSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworNy4gR0VORVJBTAorCitJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKK2VuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2gKK3Byb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLgorCitJZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCithbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaAorUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoCitsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCitBbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCitjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaAorbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24KK29mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcworIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLgorCitFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQKK2lzIGNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoCituZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZQorcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heQorYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YgdGhlCitBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUKK2Rpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCit0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlCituZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwordGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3IKK290aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLgorCitUaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcworb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlCitvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODdiZDY4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDQ3IEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1OYW1lOiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpCitCdW5kbGUtVmVuZG9yOiBFY2xpcHNlIE9TQlAKK0J1bmRsZS1WZXJzaW9uOiAwLjkuMC5xdWFsaWZpZXIKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWk7c2luZ2xldG9uOj10cnVlCitCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQorUmVxdWlyZS1CdW5kbGU6IG9yZy5hcGFjaGUubG9nNGosCisgb3JnLnNsZjRqLmFwaTtidW5kbGUtdmVyc2lvbj0iMS43LjIiLAorIGphdmF4LmFubm90YXRpb247YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAorIG9yZy5lY2xpcHNlLnh0ZXh0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMi43LjMsMi44LjApIiwKKyBvcmcuZWNsaXBzZS51aS5lZGl0b3JzO2J1bmRsZS12ZXJzaW9uPSIzLjUuMCIsCisgb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSIzLjUuMCIsCisgb3JnLmVjbGlwc2UueHRleHQudWkuc2hhcmVkO2J1bmRsZS12ZXJzaW9uPSJbMi43LjMsMi44LjApIiwKKyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aTtidW5kbGUtdmVyc2lvbj0iWzIuNy4zLDIuOC4wKSIsCisgb3JnLmVjbGlwc2UudWksCisgb3JnLmVjbGlwc2UueHRleHQuYnVpbGRlcjtidW5kbGUtdmVyc2lvbj0iWzIuNy4zLDIuOC4wKSIsCisgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliO2J1bmRsZS12ZXJzaW9uPSJbMi43LjMsMi44LjApIiwKKyBvcmcuYW50bHIucnVudGltZSwKKyBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMudWk7YnVuZGxlLXZlcnNpb249IlsyLjcuMywyLjguMCkiLAorIG9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aSwKKyBvcmcuZWNsaXBzZS54dGV4dC51aS5jb2RldGVtcGxhdGVzLnVpO2J1bmRsZS12ZXJzaW9uPSJbMi43LjMsMi44LjApIiwKKyBvcmcuZWNsaXBzZS5jb21wYXJlLAorIG9yZy5lY2xpcHNlLm9zYnAuZm9yay5taWhhbGlzLm9wYWwuaW1hZ2VTZWxlY3Rvci5vc2dpO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC51dGlscztidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmU7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnByZWZlcmVuY2VzO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5iYXNpYy51aTtidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiLAorIG9yZy5lY2xpcHNlLm9zYnAuYnBtbjIuZWNvcmU7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIiwKKyBvcmcuZWNsaXBzZS5vc2JwLmRzbC5jb21tb24ueHRleHQ7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIiwKKyBvcmcuZWNsaXBzZS5vc2JwLmRzbC54dGV4dC5sYXp5cmVzb2x2ZXI7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIiwKKyBvcmcuZWNsaXBzZS5vc2JwLmRzbC54dGV4dC5sYXp5cmVzb2x2ZXIuYXBpO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwud29ya2JlbmNoO2J1bmRsZS12ZXJzaW9uPSIxLjEuMCIKK0J1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS44CitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aTt2ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5jb250ZW50YXNzaXN0O3ZlcnNpb249IjAuOS4wIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLmNvbnRlbnRhc3Npc3QuYW50bHI7dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuY29udGVudGFzc2lzdC5hbnRsci5pbnRlcm5hbDt2ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5pbnRlcm5hbDt2ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5sYWJlbGluZzt2ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5vdXRsaW5lO3ZlcnNpb249IjAuOS4wIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLnF1aWNrZml4O3ZlcnNpb249IjAuOS4wIgorQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5pbnRlcm5hbC5QZXJzcGVjdGl2ZURzbEFjdGl2YXRvcgorSW1wb3J0LVBhY2thZ2U6IGphdmF4LnZhbGlkYXRpb24sCisgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cywKKyBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzM7dmVyc2lvbj0iMy40LjAiLAorIG9yZy5hcGFjaGUubG9nNGoKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvYWJvdXQuaHRtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvYWJvdXQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGMwNTk4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9hYm91dC5odG1sCkBAIC0wLDAgKzEsMjggQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCisgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Cis8dGl0bGU+QWJvdXQ8L3RpdGxlPgorPC9oZWFkPgorPGJvZHkgbGFuZz0iRU4tVVMiPgorPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+CisgCis8cD5KdW5lIDEsIDIwMTY8L3A+CQorPGgzPkxpY2Vuc2U8L2gzPgorCis8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKK2luZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCithdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKworPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKK2JlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKK2FwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKK3Byb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQoraW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKK2FuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgorCis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9hYm91dC5pbmkgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL2Fib3V0LmluaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGY2NzFmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9hYm91dC5pbmkKQEAgLTAsMCArMSwxNyBAQAorIyBhYm91dC5pbmkKKyMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCisjIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCisjICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCisjIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCisKKyMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQorYWJvdXRUZXh0PSVmZWF0dXJlVGV4dAorCisjIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCitmZWF0dXJlSW1hZ2U9CisKKyMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uICh0cmFuc2xhdGVkKQorYXBwTmFtZT0lZmVhdHVyZU5hbWUKKworIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCit3ZWxjb21lUGFnZT0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvYWJvdXQubWFwcGluZ3MgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL2Fib3V0Lm1hcHBpbmdzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MTFhMGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL2Fib3V0Lm1hcHBpbmdzCkBAIC0wLDAgKzEsNiBAQAorIyBhYm91dC5tYXBwaW5ncworIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcworIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQorIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgorCiswPXF1YWxpZmllcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9hYm91dC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9hYm91dC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ODQzMGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL2Fib3V0LnByb3BlcnRpZXMKQEAgLTAsMCArMSwyNiBAQAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIworIyBDb250cmlidXRvcnM6CisjICAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjCisKKyMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCisKK2ZlYXR1cmVOYW1lPW9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkKKworIyMjIyMjIyMjIyMjIyMjIyBibHVyYiBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2ZlYXR1cmVUZXh0PVwKK0NvcHlyaWdodCAoYykgMjAxMi0yMDE2IC0gTG9ldHogR21iSCZDby5LRyBcblwKK0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKK2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAord2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKK2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCitcblwKK0NvbnRyaWJ1dG9yczpcblwKKyAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25cbgorIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgYmx1cmIgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEyNjQ3NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDE5IEBACitzb3VyY2UuLiA9IHNyYy8sXAorICAgICAgICAgIHNyYy1nZW4vLFwKKyAgICAgICAgICB4dGVuZC1nZW4vCitiaW4uaW5jbHVkZXMgPSBhYm91dC5wcm9wZXJ0aWVzLCAgYWJvdXQubWFwcGluZ3MsICBhYm91dC5pbmksICBhYm91dC5odG1sLCAgTUVUQS1JTkYvLFwKKyAgICAgICAgICAgICAgIC4sXAorICAgICAgICAgICAgICAgLnNldHRpbmdzLyxcCisgICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKKyAgICAgICAgICAgICAgIGkxOG4vLFwKKyAgICAgICAgICAgICAgIHRlbXBsYXRlcy8sXAorICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKKyAgICAgICAgICAgICAgIExJQ0VOU0UudHh0LFwKKyAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCisgICAgICAgICAgICAgICBpY29ucy8KK3NyYy5pbmNsdWRlcyA9IGFib3V0LnByb3BlcnRpZXMsICBhYm91dC5tYXBwaW5ncywgIGFib3V0LmluaSwgIGFib3V0Lmh0bWwsICB0ZW1wbGF0ZXMvLFwKKyAgICAgICAgICAgICAgIGkxOG4vLFwKKyAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCisgICAgICAgICAgICAgICBMSUNFTlNFLnR4dCxcCisgICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAorICAgICAgICAgICAgICAgaWNvbnMvCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL2VwbC12MTAuaHRtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvZXBsLXYxMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzOThhY2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL2VwbC12MTAuaHRtbApAQCAtMCwwICsxLDI1OSBAQAorPCEtLT94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPy0tPgorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgIGJvZHkgeworICAgIHNpemU6IDguNWluIDExLjBpbjsKKyAgICBtYXJnaW46IDAuMjVpbiAwLjVpbiAwLjI1aW4gMC41aW47CisgICAgdGFiLWludGVydmFsOiAwLjVpbjsKKyAgICB9CisgIHAgeyAgCQorICAgIG1hcmdpbi1sZWZ0OiBhdXRvOworICAgIG1hcmdpbi10b3A6ICAwLjVlbTsKKyAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsKKyAgICB9CisgIHAubGlzdCB7CisgIAltYXJnaW4tbGVmdDogMC41aW47CisgICAgbWFyZ2luLXRvcDogIDAuMDVlbTsKKyAgICBtYXJnaW4tYm90dG9tOiAwLjA1ZW07CisgICAgfQorICA8L3N0eWxlPgorCis8L2hlYWQ+CisKKzxib2R5IGxhbmc9IkVOLVVTIj4KKworPGgyPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvaDI+CisKKzxwPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFCitQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IKK0RJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMKK0FHUkVFTUVOVC48L3A+CisKKzxwPjxiPjEuIERFRklOSVRJT05TPC9iPjwvcD4KKworPHA+IkNvbnRyaWJ1dGlvbiIgbWVhbnM6PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsCitjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8L3A+Cis8cCBjbGFzcz0ibGlzdCI+YikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvcD4KKzxwIGNsYXNzPSJsaXN0Ij5pKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3A+Cis8cCBjbGFzcz0ibGlzdCI+aWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3A+Cis8cCBjbGFzcz0ibGlzdCI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0KK29yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBCitDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlCitQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaAorQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQorUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluCitjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkKK2FyZSBub3QgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS48L3A+CisKKzxwPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcwordGhlIFByb2dyYW0uPC9wPgorCis8cD4iTGljZW5zZWQgUGF0ZW50cyIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYQorQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzCitDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLjwvcD4KKworPHA+IlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2UKK3dpdGggdGhpcyBBZ3JlZW1lbnQuPC9wPgorCis8cD4iUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyCit0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9wPgorCis8cD48Yj4yLiBHUkFOVCBPRiBSSUdIVFM8L2I+PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2gKK0NvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAorcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzCitvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUKK0NvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluCitzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS48L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5iKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaAorQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCityb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsCitvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKK0NvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudAorbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlCitQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwKK3N1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkCitieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIKK2NvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcworbGljZW5zZWQgaGVyZXVuZGVyLjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmMpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IKK2dyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcworYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZQorcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaAorQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieQorYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cworb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzCitncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0bworc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IKK2V4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50Cit0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlCit0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5kKSBFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0CitoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQKK3RoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuPC9wPgorCis8cD48Yj4zLiBSRVFVSVJFTUVOVFM8L2I+PC9wPgorCis8cD5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZQorZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmEpIGl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMKK0FncmVlbWVudDsgYW5kPC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YikgaXRzIGxpY2Vuc2UgYWdyZWVtZW50OjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycworYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzCitvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yCitjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+aWkpIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzCithbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKK2luY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+aWlpKSBzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzCitBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlcgorcGFydHk7IGFuZDwvcD4KKworPHAgY2xhc3M9Imxpc3QiPml2KSBzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlCitmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEKK3JlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUKK2V4Y2hhbmdlLjwvcD4KKworPHA+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmIpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaAorY29weSBvZiB0aGUgUHJvZ3JhbS48L3A+CisKKzxwPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkCit3aXRoaW4gdGhlIFByb2dyYW0uPC9wPgorCis8cD5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cworQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3Mgc3Vic2VxdWVudAorUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLjwvcD4KKworPHA+PGI+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L2I+PC9wPgorCis8cD5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4KK3Jlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZQorbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mCit0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKK3Byb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZQorcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IKK2luY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yCisoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQKK2luZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikKK2FnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikKK2FyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZAorcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlCithY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cworZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiBUaGUKK29ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKK3JlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbgorb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5Cit0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsCitDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUKK0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duCitleHBlbnNlLjwvcD4KKworPHA+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKK3Byb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCitjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZQorY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eQorYWxvbmUuIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0bworZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZQorcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIKK0NvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKK211c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9wPgorCis8cD48Yj41LiBOTyBXQVJSQU5UWTwvYj48L3A+CisKKzxwPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUworUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMKK09GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLAorQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZCitPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5CityZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKK2Rpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cworZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwordGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywKK2RhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yCitpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy48L3A+CisKKzxwPjxiPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9iPjwvcD4KKworPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UCitOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORworV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUgorRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKK0hFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9wPgorCis8cD48Yj43LiBHRU5FUkFMPC9iPjwvcD4KKworPHA+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKK2FwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZgordGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uCitieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtCitleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvcD4KKworPHA+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5CisoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUKK1Byb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIKK3NvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAorUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUKK2RhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLjwvcD4KKworPHA+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQKK2ZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzCitBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZQorYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzCit1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAorZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKK1JlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQorUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLjwvcD4KKworPHA+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMKK0FncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcworY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUKK0FncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nCityZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUKK0FncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZQorRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkKK2Fzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEKK3N1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUKK2dpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcKK0NvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUKK0FncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uCitvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlCitQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzCitleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubworcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyCit0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvcgorb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzCitBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvcD4KKworPHA+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZAordGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5Cit0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUKK3RoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzCityaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3A+CisKKworCis8L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvaTE4bi9JMThOLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL2kxOG4vSTE4Ti5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNjc0YjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL2kxOG4vSTE4Ti5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNjYgQEAKKyMKKyNNb24gRGVjIDEyIDE0OjA4OjA0IENFVCAyMDE2CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZS5hY2Nlc3NpYmlsaXR5PUEgcnVsZSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgY29uZGl0aW9ucyBvZiBhY2Nlc3NpYmlsaXR5IG9mIHRoaXMgY29udGFpbmVyLgorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZS5kZXNjcmliZWRcIGJ5PVRoZSBkb2N1bWVudGF0aW9uIHN0cmluZyB3aGljaCBpcyB1c2VkIGJ5IHRoZSBhdXRvbWF0ZWQgZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3IKK29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmUuaHVtYW50YXNrPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZS5pY29uVVJJPVRoZSBpZGVudGlmaWVyIGZvciBhIHJlc291cmNlLCBlLmcuIGljb24gZmlsZQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZS5wZXJzcGVjdGl2ZT1FYWNoIFdvcmtiZW5jaCB3aW5kb3cgY29udGFpbnMgb25lIG9yIG1vcmUgcGVyc3BlY3RpdmVzLiBBIHBlcnNwZWN0aXZlIGRlZmluZXMgdGhlIGluaXRpYWwgc2V0IGFuZCBsYXlvdXQgb2Ygdmlld3MgaW4gdGhlIFdvcmtiZW5jaCB3aW5kb3cuIEVhY2ggcGVyc3BlY3RpdmUgcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25hbGl0eSBhaW1lZCBhdCBhY2NvbXBsaXNoaW5nIGEgc3BlY2lmaWMgdHlwZSBvZiB0YXNrIG9yIHdvcmtzIHdpdGggc3BlY2lmaWMgdHlwZXMgb2YgcmVzb3VyY2VzLgorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZS5wcm9jZXNzPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZS50b29sYmFyPUdyYXBoaWNhbCBjb250cm9sIGVsZW1lbnQgb24gd2hpY2ggb24tc2NyZWVuIGJ1dHRvbnMsIGljb25zLCBtZW51cywgb3Igb3RoZXIgaW5wdXQgb3Igb3V0cHV0IGVsZW1lbnRzIGFyZSBwbGFjZWQuCitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlLnVzZXJ0YXNrPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUJQTU49CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlQlBNTi5icG1uPUFzc2lnbiB0aGUgYnBtbiB2aWV3IHRvIHRoaXMgY29udGFpbmVyLgorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUJhc2ljVGFibGU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlQ2hhcnQ9QXNzaWduIGEgY2hhcnQgdG8gdGhpcyBjb250YWluZXIuCitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlQ2hhcnQuY2hhcnQ9QXNzaWduIGEgY2hhcnQgdG8gdGhpcyBjb250YWluZXIuCitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRGlhbG9nPUFzc2lnbiBhIGRpYWxvZyB0byB0aGlzIGNvbnRhaW5lci4KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEaWFsb2cuZGlhbG9nPUFzc2lnbiBhIGRpYWxvZyB0byB0aGlzIGNvbnRhaW5lci4KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVFbGVtZW50PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUdyaWQ9QXNzaWduIGEgZ3JpZCB0byB0aGlzIGNvbnRhaW5lci4KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVHcmlkLmdyaWQ9QXNzaWduIGEgZ3JpZCB0byB0aGlzIGNvbnRhaW5lci4KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVJbXBvcnQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlSW1wb3J0LmltcG9ydD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVNb2RlbD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVPcmdhbml6YXRpb249QXNzaWduIGFuIG9yZ2FuaWdyYW0gdG8gdGhpcyBjb250YWluZXIuCitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlT3JnYW5pemF0aW9uLm9yZ2FuaWdyYW09QXNzaWduIGFuIG9yZ2FuaWdyYW0gdG8gdGhpcyBjb250YWluZXIuCitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUGFja2FnZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYWNrYWdlLnBhY2thZ2U9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUGFydD1BIHBhcnQgaXMgYSBjb250YWluZXIgZm9yIGEgdmlldy4KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYXJ0LmFjY2Vzc2liaWxpdHk9QSBydWxlIHN0cmluZyBkZXNjcmliaW5nIHRoZSBjb25kaXRpb25zIG9mIGFjY2Vzc2liaWxpdHkgb2YgdGhpcyBjb250YWluZXIuCitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUGFydC5kZXNjcmliZWRcIGJ5PVRoZSBkb2N1bWVudGF0aW9uIHN0cmluZyB3aGljaCBpcyB1c2VkIGJ5IHRoZSBhdXRvbWF0ZWQgZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3IKK29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYXJ0Lmljb25VUkk9QXNzaWduIGFuIGljb24gdmlhIGl0cyBVUkkuCitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUGFydC5pc0Nsb3NhYmxlPUFsbG93IHRoZSB1c2VyIHRvIGNsb3NlIHRoaXMgY29udGFpbmVyLgorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVBhcnQucGFydD1BIHBhcnQgaXMgYSBjb250YWluZXIgZm9yIGEgdmlldy4KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYXJ0LnNwYWNlVm9sdW1lPUEgbnVtYmVyIHJlcHJlc2VudGluZyB0aGUgcmVsYXRpdmUgc2l6ZSBvZiB0aGlzIGNvbnRhaW5lci4KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYXJ0LnZpZXc9QXNzaWduIGEgcHJlZGVmaW5lZCB2aWV3IHRvIHRoaXMgY29udGFpbmVyLgorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVBhcnRTdGFjaz1BIHBhcnQgc3RhY2sgY29udGFpbnMgYSBzdGFjayBvZiBwYXJ0cyBzaG93aW5nIHRoZSBjb250ZW50IG9mIG9uZSBwYXJ0IHdoaWxlIGRpc3BsYXlpbmcgb25seSB0aGUgaGVhZGVycyBvZiB0aGUgb3RoZXIgcGFydHMuCitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUGFydFN0YWNrLmFjY2Vzc2liaWxpdHk9QSBydWxlIHN0cmluZyBkZXNjcmliaW5nIHRoZSBjb25kaXRpb25zIG9mIGFjY2Vzc2liaWxpdHkgb2YgdGhpcyBjb250YWluZXIuCitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUGFydFN0YWNrLnBhcnRTdGFjaz1BIHBhcnQgc3RhY2sgY29udGFpbnMgYSBzdGFjayBvZiBwYXJ0cyBzaG93aW5nIHRoZSBjb250ZW50IG9mIG9uZSBwYXJ0IHdoaWxlIGRpc3BsYXlpbmcgb25seSB0aGUgaGVhZGVycyBvZiB0aGUgb3RoZXIgcGFydHMuCitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUGFydFN0YWNrLnNlbGVjdGVkRWxlbWVudD1TZWxlY3QgdGhlIGNvbnRhaW5lciB0aGF0IGlzIHNlbGVjdGVkIGluIHRoZSBmaXJzdCBwbGFjZS4KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYXJ0U3RhY2suc3BhY2VWb2x1bWU9QSBudW1iZXIgcmVwcmVzZW50aW5nIHRoZSByZWxhdGl2ZSBzaXplIG9mIHRoaXMgY29udGFpbmVyLgorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUmVwb3J0PUFzc2lnbiBhIHJlcG9ydCB0byB0aGlzIGNvbnRhaW5lci4KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVSZXBvcnQucmVwb3J0PUFzc2lnbiBhIHJlcG9ydCB0byB0aGlzIGNvbnRhaW5lci4KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyPUEgc2FzaCBjb250YWluZXIgZGlzcGxheXMgYWxsIGl0cyBjaGlsZHJlbiBhdCB0aGUgc2FtZSB0aW1lIGVpdGhlciBob3Jpem9udGFsbHkgb3IgdmVydGljYWxseSBhbGlnbmVkLiBEZWZhdWx0IGlzIHZlcnRpY2FsbHkgYWxpZ25lZC4KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyLmFjY2Vzc2liaWxpdHk9QSBydWxlIHN0cmluZyBkZXNjcmliaW5nIHRoZSBjb25kaXRpb25zIG9mIGFjY2Vzc2liaWxpdHkgb2YgdGhpcyBjb250YWluZXIuCitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlU2FzaENvbnRhaW5lci5vcmllbnRhdGlvbj1WZXJ0aWNhbCBvciBob3Jpem9udGFsIGFsaWdubWVudC4gRGVmYXVsdCBpcyB2ZXJ0aWNhbGx5IGFsaWduZWQuCitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlU2FzaENvbnRhaW5lci5zYXNoQ29udGFpbmVyPUEgc2FzaCBjb250YWluZXIgZGlzcGxheXMgYWxsIGl0cyBjaGlsZHJlbiBhdCB0aGUgc2FtZSB0aW1lIGVpdGhlciBob3Jpem9udGFsbHkgb3IgdmVydGljYWxseSBhbGlnbmVkLiBEZWZhdWx0IGlzIHZlcnRpY2FsbHkgYWxpZ25lZC4KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyLnNlbGVjdGVkRWxlbWVudD1TZWxlY3QgdGhlIGNvbnRhaW5lciB0aGF0IGlzIHNlbGVjdGVkIGluIHRoZSBmaXJzdCBwbGFjZS4KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyLnNwYWNlVm9sdW1lPUEgbnVtYmVyIHJlcHJlc2VudGluZyB0aGUgcmVsYXRpdmUgc2l6ZSBvZiB0aGlzIGNvbnRhaW5lci4KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVTZWxlY3Rpb249QXNzaWduIGEgc2VsZWN0IHRhYmxlIHRvIHRoaXMgY29udGFpbmVyLgorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVNlbGVjdGlvbi5zZWxlY3Q9QXNzaWduIGEgc2VsZWN0IHRhYmxlIHRvIHRoaXMgY29udGFpbmVyLgorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVRhYmxlPUFzc2lnbiBhIHRhYmxlIHRvIHRoaXMgY29udGFpbmVyLgorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVRhYmxlLnRhYmxlPUFzc2lnbiBhIHRhYmxlIHRvIHRoaXMgY29udGFpbmVyLgorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVRvcG9sb2d5PUFzc2lnbiBhIHRvcG9sb2d5IHRvIHRoaXMgY29udGFpbmVyLgorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVRvcG9sb2d5LnRvcG9sb2d5PUFzc2lnbiBhIHRvcG9sb2d5IHRvIHRoaXMgY29udGFpbmVyLgorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVVzZXJUYXNrUmVmZXJlbmNlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVVzZXJUYXNrUmVmZXJlbmNlLnVzZXJcIHRhc2s9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlVmlldz1Bc3NpZ24gYSBwcmVkZWZpbmVkIHZpZXcgdG8gdGhpcyBjb250YWluZXIuCitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlF1YWxpZmllZE5hbWU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlNhc2hPcmllbnRhdGlvbj1WZXJ0aWNhbCBvciBob3Jpem9udGFsIGFsaWdubWVudC4gRGVmYXVsdCBpcyB2ZXJ0aWNhbGx5IGFsaWduZWQuCitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlNhc2hPcmllbnRhdGlvbi5ob3Jpem9udGFsPWhvcml6b250YWxseSBhbGlnbmVkCitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlNhc2hPcmllbnRhdGlvbi52ZXJ0aWNhbD12ZXJ0aWNhbGx5IGFsaWduZWQKK29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuVFJBTlNMQVRBQkxFSUQ9VGhlIGluc2VydGVkIGlkIHdpbGwgYmUgbGlzdGVkIGluIHRoZSBpMThuIHByb3BlcnRpZXMgYXMga2V5IGFuZCB0cmFuc2xhdGlvbnMgY2FuIGJlIGFzc2lnbmVkIHRvIGl0Lgorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5UUkFOU0xBVEFCTEVTVFJJTkc9VGhlIGluc2VydGVkIHN0cmluZyB3aWxsIGJlIGxpc3RlZCBpbiB0aGUgaTE4biBwcm9wZXJ0aWVzIGFzIGtleSBhbmQgdHJhbnNsYXRpb25zIGNhbiBiZSBhc3NpZ25lZCB0byBpdC4KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuVmFsaWRJRD0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvaWNvbnMvQ3hHcmlkU291cmNlSW5wdXQucG5nIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9pY29ucy9DeEdyaWRTb3VyY2VJbnB1dC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBkY2MyMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvaWNvbnMvQ3hHcmlkU291cmNlSW5wdXQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvaWNvbnMvZHNsX2NoYXJ0LnBuZyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvaWNvbnMvZHNsX2NoYXJ0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjY5ZDg2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9pY29ucy9kc2xfY2hhcnQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvaWNvbnMvZHNsX2RpYWxvZy5naWYgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL2ljb25zL2RzbF9kaWFsb2cuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNzY0NWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL2ljb25zL2RzbF9kaWFsb2cuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvaWNvbnMvZHNsX2ltcG9ydC5wbmcgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL2ljb25zL2RzbF9pbXBvcnQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZmRjYzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL2ljb25zL2RzbF9pbXBvcnQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvaWNvbnMvZHNsX29yZ2FuaWdyYW0ucG5nIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9pY29ucy9kc2xfb3JnYW5pZ3JhbS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFmZjJkOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvaWNvbnMvZHNsX29yZ2FuaWdyYW0ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvaWNvbnMvZHNsX3BlcnNwZWN0aXZlLnBuZyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvaWNvbnMvZHNsX3BlcnNwZWN0aXZlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGU1YjZiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9pY29ucy9kc2xfcGVyc3BlY3RpdmUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvaWNvbnMvZHNsX3JlcG9ydC5naWYgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL2ljb25zL2RzbF9yZXBvcnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZWZiMDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL2ljb25zL2RzbF9yZXBvcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvaWNvbnMvZHNsX3RhYmxlLnBuZyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvaWNvbnMvZHNsX3RhYmxlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTc0ODkyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9pY29ucy9kc2xfdGFibGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvaWNvbnMvZHNsX3RvcG9sb2d5LnBuZyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvaWNvbnMvZHNsX3RvcG9sb2d5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmVjODIyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9pY29ucy9kc2xfdG9wb2xvZ3kucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvaWNvbnMvbW9kZWwucG5nIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9pY29ucy9tb2RlbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZmYjg1NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvaWNvbnMvbW9kZWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvaWNvbnMvcGFja2FnZS5naWYgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL2ljb25zL3BhY2thZ2UuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NTA2ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL2ljb25zL3BhY2thZ2UuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvbGljZW5zZS5odG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9saWNlbnNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU1NzlhNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvbGljZW5zZS5odG1sCkBAIC0wLDAgKzEsMTY0IEBACis8IS0tP3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/LS0+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKzx0aXRsZT5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keSBsYW5nPSJFTi1VUyI+Cis8aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KKzxwPkZlYnJ1YXJ5IDEsIDIwMTE8L3A+CisKKzxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKworPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCisgICAoQ09MTEVDVElWRUxZICJDT05URU5UIikuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCisgICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgorICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisKKzxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KKworPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlCisgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAKK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKKyAgICgiRVBMIikuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbworIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCis8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCitkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gCitzb3VyY2UgY29kZQorICAgcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIAorYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvcD4KKworPHVsPgorICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gCitmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgCittb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCisoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLjwvbGk+CisgICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSYjODQ4MjsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLjwvbGk+CisgICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgCitGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgCitzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyAKK25hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIAorb2YgdGhlIFBsdWctaW5zCisgICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KKyAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIAorRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIAorbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgorPC91bD4KKworPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSAKK2NvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCAKK2NvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAorSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKKygiRmVhdHVyZSBMaWNlbnNlcyIpLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueQorIGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQoraW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCis8dWw+CisgICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisgICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KKyAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+CisgICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorICAgICAgIDxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKzwvdWw+CisKKzxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIAoraW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0CisgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUKK2luc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSAKK0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgCitjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKK2luZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSAKK2ZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgCitmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgorU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSAKK3Rlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgCitnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgordGhhdCBkaXJlY3RvcnkuPC9wPgorCis8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIAorVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuCisgIFNPTUUgT0YgVEhFU0UKK09USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgorCis8dWw+CisgICAgICAgPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPik8L2xpPgorICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+CisgICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KKyAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+CisgICAgICAgPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KKyAgICAgICA8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgorPC91bD4KKworPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgCitDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIAorb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCitjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgCitnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCisKKzxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgorCis8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIAorZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCisgICBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIAorYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCisgICBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyAKK2NhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KKyAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IAorcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgorICAgKCJTcGVjaWZpY2F0aW9uIikuPC9wPgorCis8cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwKKyBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKKyAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0bworIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyAKK1RlY2hub2xvZ3kKKyAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIAorVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCAKK3RoZQorICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgCithY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+CisKKzxvbD4KKyAgICAgICA8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIAord2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQorICAgICAgIG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsIAorZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKKyAgICAgICBwcm9kdWN0LjwvbGk+CisgICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAKK21heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQorICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+CisgICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIAordGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCisgICAgICAgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSAKK1NvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKKyAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSAKK1NvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdAorIGdvdmVybgorICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCAKK3VzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiAKK1Vwb24gc3VjaAorICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgCit3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KKzwvb2w+CisKKzxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCis8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUKKyBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIAorYW5kL29yIHJlLWV4cG9ydCB0bworICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gCitzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAorY29uY2VybmluZyB0aGUgaW1wb3J0LAorICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiAKK3RoaXMgaXMgcGVybWl0dGVkLjwvcD4KKworPHA+PHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+CisKKworPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3BsdWdpbi54bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3BsdWdpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBkZTBjYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvcGx1Z2luLnhtbApAQCAtMCwwICsxLDYwNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KKworPHBsdWdpbj4KKworICAgIDxleHRlbnNpb24KKyAgICAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KKyAgICAgICAgPGVkaXRvcgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuUGVyc3BlY3RpdmVEc2xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuWHRleHRFZGl0b3IiCisgICAgICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuVGV4dEVkaXRvckFjdGlvbkNvbnRyaWJ1dG9yIgorICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIKKyAgICAgICAgICAgIGV4dGVuc2lvbnM9InBlcnNwZWN0aXZlIgorICAgICAgICAgICAgaWNvbj0iaWNvbnMvZHNsX3BlcnNwZWN0aXZlLnBuZyIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsIgorICAgICAgICAgICAgbWF0Y2hpbmdTdHJhdGVneT0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5QZXJzcGVjdGl2ZURzbEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmVkaXRvci5KYXZhRWRpdG9ySW5wdXRNYXRjaGVyIgorICAgICAgICAgICAgbmFtZT0iT1NCUCBQZXJzcGVjdGl2ZURzbCBFZGl0b3IiPgorICAgICAgICA8L2VkaXRvcj4KKyAgICA8L2V4dGVuc2lvbj4KKyAgICA8ZXh0ZW5zaW9uCisgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5oYW5kbGVycyI+CisgICAgICAgIDxoYW5kbGVyCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5QZXJzcGVjdGl2ZURzbEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5oeXBlcmxpbmtpbmcuT3BlbkRlY2xhcmF0aW9uSGFuZGxlciIKKyAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmh5cGVybGlua2luZy5PcGVuRGVjbGFyYXRpb24iPgorICAgICAgICAgICAgPGFjdGl2ZVdoZW4+CisgICAgICAgICAgICAgICAgPHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wuRWRpdG9yLm9wZW5lZCI+CisgICAgICAgICAgICAgICAgPC9yZWZlcmVuY2U+CisgICAgICAgICAgICA8L2FjdGl2ZVdoZW4+CisgICAgICAgIDwvaGFuZGxlcj4KKyAgICAgICAgPGhhbmRsZXIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLlBlcnNwZWN0aXZlRHNsRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmhhbmRsZXIuVmFsaWRhdGVBY3Rpb25IYW5kbGVyIgorICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsLnZhbGlkYXRlIj4KKyAgICAgICAgIDxhY3RpdmVXaGVuPgorICAgICAgICAgICAgPHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wuRWRpdG9yLm9wZW5lZCI+CisgICAgICAgICAgICA8L3JlZmVyZW5jZT4KKyAgICAgICAgIDwvYWN0aXZlV2hlbj4KKyAgICAgIAk8L2hhbmRsZXI+CisgICAgICAJPCEtLSBjb3B5IHF1YWxpZmllZCBuYW1lIC0tPgorICAgICAgICA8aGFuZGxlcgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuUGVyc3BlY3RpdmVEc2xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29weXF1YWxpZmllZG5hbWUuRWRpdG9yQ29weVF1YWxpZmllZE5hbWVIYW5kbGVyIgorICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29weXF1YWxpZmllZG5hbWUuRWRpdG9yQ29weVF1YWxpZmllZE5hbWUiPgorICAgICAgICAgICAgPGFjdGl2ZVdoZW4+CisJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wuRWRpdG9yLm9wZW5lZCIgLz4KKyAgICAgICAgICAgIDwvYWN0aXZlV2hlbj4KKyAgICAgICAgPC9oYW5kbGVyPgorICAgICAgICA8aGFuZGxlcgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuUGVyc3BlY3RpdmVEc2xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29weXF1YWxpZmllZG5hbWUuT3V0bGluZUNvcHlRdWFsaWZpZWROYW1lSGFuZGxlciIKKyAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvcHlxdWFsaWZpZWRuYW1lLk91dGxpbmVDb3B5UXVhbGlmaWVkTmFtZSI+CisgICAgICAgICAgICA8YWN0aXZlV2hlbj4KKyAgICAgICAgICAgIAk8YW5kPgorICAgICAgICAgICAgCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbC5YdGV4dEVkaXRvci5vcGVuZWQiIC8+CisJICAgICAgICAgICAgICAgIDxpdGVyYXRlPgorCQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5vdXRsaW5lLklPdXRsaW5lTm9kZSIgLz4KKwkJCQkJPC9pdGVyYXRlPgorCQkJCTwvYW5kPgorICAgICAgICAgICAgPC9hY3RpdmVXaGVuPgorICAgICAgICA8L2hhbmRsZXI+CisgICAgPC9leHRlbnNpb24+CisgICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5kZWZpbml0aW9ucyI+CisgICAgICAgIDxkZWZpbml0aW9uIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsLkVkaXRvci5vcGVuZWQiPgorICAgICAgICAgICAgPGFuZD4KKyAgICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0iaXNBY3RpdmVFZGl0b3JBbkluc3RhbmNlT2ZYdGV4dEVkaXRvciIvPgorICAgICAgICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJhY3RpdmVFZGl0b3IiPgorICAgICAgICAgICAgICAgICAgICA8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLlh0ZXh0RWRpdG9yLmxhbmd1YWdlTmFtZSIgCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbCIgCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiLz4KKyAgICAgICAgICAgICAgICA8L3dpdGg+ICAgICAgICAKKyAgICAgICAgICAgIDwvYW5kPgorICAgICAgICA8L2RlZmluaXRpb24+CisgICAgICAgIDxkZWZpbml0aW9uIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsLlh0ZXh0RWRpdG9yLm9wZW5lZCI+CisgICAgICAgICAgICA8YW5kPgorICAgICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJpc1h0ZXh0RWRpdG9yQWN0aXZlIi8+CisgICAgICAgICAgICAgICAgPHdpdGggdmFyaWFibGU9ImFjdGl2ZUVkaXRvciI+CisgICAgICAgICAgICAgICAgICAgIDx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuWHRleHRFZGl0b3IubGFuZ3VhZ2VOYW1lIiAKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsIiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIvPgorICAgICAgICAgICAgICAgIDwvd2l0aD4gICAgICAgIAorICAgICAgICAgICAgPC9hbmQ+CisgICAgICAgIDwvZGVmaW5pdGlvbj4KKyAgICA8L2V4dGVuc2lvbj4KKyAgICA8ZXh0ZW5zaW9uCisgICAgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KKyAgICAgICAgPHBhZ2UKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLlBlcnNwZWN0aXZlRHNsRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLnByZWZlcmVuY2VzLkxhbmd1YWdlUm9vdFByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wiCisgICAgICAgICAgICBpY29uPSJpY29ucy9kc2xfcGVyc3BlY3RpdmUucG5nIgorICAgICAgICAgICAgbmFtZT0iT1NCUCBQZXJzcGVjdGl2ZURzbCI+CisgICAgICAgICAgICA8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5rZXl3b3JkX1BlcnNwZWN0aXZlRHNsIi8+CisgICAgICAgIDwvcGFnZT4KKyAgICAgICAgPHBhZ2UKKyAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuUGVyc3BlY3RpdmVEc2xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iuc3ludGF4Y29sb3JpbmcuU3ludGF4Q29sb3JpbmdQcmVmZXJlbmNlUGFnZSIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsLmNvbG9yaW5nIgorICAgICAgICAgICAgaWNvbj0iaWNvbnMvZHNsX3BlcnNwZWN0aXZlLnBuZyIKKyAgICAgICAgICAgIG5hbWU9IlN5bnRheCBDb2xvcmluZyI+CisgICAgICAgICAgICA8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5rZXl3b3JkX1BlcnNwZWN0aXZlRHNsIi8+CisgICAgICAgIDwvcGFnZT4KKyAgICAgICAgPHBhZ2UKKyAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuUGVyc3BlY3RpdmVEc2xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IudGVtcGxhdGVzLlh0ZXh0VGVtcGxhdGVQcmVmZXJlbmNlUGFnZSIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsLnRlbXBsYXRlcyIKKyAgICAgICAgICAgIGljb249Imljb25zL2RzbF9wZXJzcGVjdGl2ZS5wbmciCisgICAgICAgICAgICBuYW1lPSJUZW1wbGF0ZXMiPgorICAgICAgICAgICAgPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkua2V5d29yZF9QZXJzcGVjdGl2ZURzbCIvPgorICAgICAgICA8L3BhZ2U+CisgICAgPC9leHRlbnNpb24+CisgICAgPGV4dGVuc2lvbgorICAgICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByb3BlcnR5UGFnZXMiPgorICAgICAgICA8cGFnZQorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuUGVyc3BlY3RpdmVEc2xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IucHJlZmVyZW5jZXMuTGFuZ3VhZ2VSb290UHJlZmVyZW5jZVBhZ2UiCisgICAgICAgICAgICBpY29uPSJpY29ucy9kc2xfcGVyc3BlY3RpdmUucG5nIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wiCisgICAgICAgICAgICBuYW1lPSJPU0JQIFBlcnNwZWN0aXZlRHNsIj4KKyAgICAgICAgICAgIDxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLmtleXdvcmRfUGVyc3BlY3RpdmVEc2wiLz4KKyAgICAgICAgICAgIDxlbmFibGVkV2hlbj4KKwkgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiLz4KKwkJCTwvZW5hYmxlZFdoZW4+CisJICAgICAgICA8ZmlsdGVyIG5hbWU9InByb2plY3ROYXR1cmUiIHZhbHVlPSJvcmcuZWNsaXBzZS54dGV4dC51aS5zaGFyZWQueHRleHROYXR1cmUiLz4KKyAgICAgICAgPC9wYWdlPgorICAgIDwvZXh0ZW5zaW9uPgorICAgIDxleHRlbnNpb24KKyAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmtleXdvcmRzIj4KKyAgICAgICAgPGtleXdvcmQKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLmtleXdvcmRfUGVyc3BlY3RpdmVEc2wiCisgICAgICAgICAgICBsYWJlbD0iT1NCUCBQZXJzcGVjdGl2ZURzbCIvPgorICAgIDwvZXh0ZW5zaW9uPgorICAgIDxleHRlbnNpb24KKyAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb21tYW5kcyI+CisgICAgICA8Y29tbWFuZAorICAgICAgICAgICAgZGVzY3JpcHRpb249IlRyaWdnZXIgZXhwZW5zaXZlIHZhbGlkYXRpb24iCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbC52YWxpZGF0ZSIKKyAgICAgICAgICAgIG5hbWU9IlZhbGlkYXRlIj4KKyAgICAgIDwvY29tbWFuZD4KKyAgICAgIDwhLS0gY29weSBxdWFsaWZpZWQgbmFtZSAtLT4KKyAgICAgIDxjb21tYW5kCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvcHlxdWFsaWZpZWRuYW1lLkVkaXRvckNvcHlRdWFsaWZpZWROYW1lIgorICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDb3B5IHRoZSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhlIHNlbGVjdGVkIGVsZW1lbnQiCisgICAgICAgICAgICBuYW1lPSJDb3B5IFF1YWxpZmllZCBOYW1lIj4KKyAgICAgIDwvY29tbWFuZD4KKyAgICAgIDxjb21tYW5kCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvcHlxdWFsaWZpZWRuYW1lLk91dGxpbmVDb3B5UXVhbGlmaWVkTmFtZSIKKyAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmVkaXQiCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ29weSB0aGUgcXVhbGlmaWVkIG5hbWUgZm9yIHRoZSBzZWxlY3RlZCBlbGVtZW50IgorICAgICAgICAgICAgbmFtZT0iQ29weSBRdWFsaWZpZWQgTmFtZSI+CisgICAgICA8L2NvbW1hbmQ+CisgICAgPC9leHRlbnNpb24+CisgICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgorICAgICAgICA8bWVudUNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgbG9jYXRpb25VUkk9InBvcHVwOiNUZXh0RWRpdG9yQ29udGV4dD9hZnRlcj1ncm91cC5lZGl0Ij4KKyAgICAgICAgICAgICA8Y29tbWFuZAorICAgICAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wudmFsaWRhdGUiCisgICAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgorICAgICAgICAgICAgICAgICB0b29sdGlwPSJUcmlnZ2VyIGV4cGVuc2l2ZSB2YWxpZGF0aW9uIj4KKyAgICAgICAgICAgIDx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KKyAgICAgICAgICAgICAgICA8cmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbC5FZGl0b3Iub3BlbmVkIj4KKyAgICAgICAgICAgICAgICA8L3JlZmVyZW5jZT4KKyAgICAgICAgICAgIDwvdmlzaWJsZVdoZW4+CisgICAgICAgICA8L2NvbW1hbmQ+ICAKKyAgICAgICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4KKyAgICAgICAgIDwhLS0gY29weSBxdWFsaWZpZWQgbmFtZSAtLT4KKyAgICAgICAgIDxtZW51Q29udHJpYnV0aW9uIGxvY2F0aW9uVVJJPSJwb3B1cDojVGV4dEVkaXRvckNvbnRleHQ/YWZ0ZXI9Y29weSI+CisgICAgICAgICAJPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29weXF1YWxpZmllZG5hbWUuRWRpdG9yQ29weVF1YWxpZmllZE5hbWUiIAorICAgICAgICAgCQlzdHlsZT0icHVzaCIgdG9vbHRpcD0iQ29weSBRdWFsaWZpZWQgTmFtZSI+CisgICAgICAgICAgICAJPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgorICAgICAgICAgICAgICAgIAk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbC5FZGl0b3Iub3BlbmVkIiAvPgorICAgICAgICAgICAgCTwvdmlzaWJsZVdoZW4+CisgICAgICAgICAJPC9jb21tYW5kPiAgCisgICAgICAgICA8L21lbnVDb250cmlidXRpb24+CisgICAgICAgICA8bWVudUNvbnRyaWJ1dGlvbiBsb2NhdGlvblVSST0ibWVudTplZGl0P2FmdGVyPWNvcHkiPgorICAgICAgICAgCTxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvcHlxdWFsaWZpZWRuYW1lLkVkaXRvckNvcHlRdWFsaWZpZWROYW1lIgorICAgICAgICAgICAgCXN0eWxlPSJwdXNoIiB0b29sdGlwPSJDb3B5IFF1YWxpZmllZCBOYW1lIj4KKyAgICAgICAgICAgIAk8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+CisgICAgICAgICAgICAgICAgCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsLkVkaXRvci5vcGVuZWQiIC8+CisgICAgICAgICAgICAJPC92aXNpYmxlV2hlbj4KKyAgICAgICAgIAk8L2NvbW1hbmQ+ICAKKyAgICAgICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4KKyAgICAgICAgIDxtZW51Q29udHJpYnV0aW9uIGxvY2F0aW9uVVJJPSJwb3B1cDpvcmcuZWNsaXBzZS54dGV4dC51aS5vdXRsaW5lP2FmdGVyPWFkZGl0aW9ucyI+CisJCQk8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb3B5cXVhbGlmaWVkbmFtZS5PdXRsaW5lQ29weVF1YWxpZmllZE5hbWUiIAorCQkJCXN0eWxlPSJwdXNoIiB0b29sdGlwPSJDb3B5IFF1YWxpZmllZCBOYW1lIj4KKyAgICAgICAgIAkJPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgorCSAgICAgICAgICAgIAk8YW5kPgorCSAgICAgICAgICAgIAkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wuWHRleHRFZGl0b3Iub3BlbmVkIiAvPgorCQkJCQkJPGl0ZXJhdGU+CisJCQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5vdXRsaW5lLklPdXRsaW5lTm9kZSIgLz4KKwkJCQkJCTwvaXRlcmF0ZT4KKwkJCQkJPC9hbmQ+CisJCQkJPC92aXNpYmxlV2hlbj4KKwkJCTwvY29tbWFuZD4KKyAgICAgICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4KKyAgICA8L2V4dGVuc2lvbj4KKyAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5tZW51cyI+CisJCTxtZW51Q29udHJpYnV0aW9uIGxvY2F0aW9uVVJJPSJwb3B1cDojVGV4dEVkaXRvckNvbnRleHQ/ZW5kb2Y9Z3JvdXAuZmluZCI+CisJCQk8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5GaW5kUmVmZXJlbmNlcyI+CisJCQkJPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgorICAgICAgICAgICAgICAgIAk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbC5FZGl0b3Iub3BlbmVkIj4KKyAgICAgICAgICAgICAgICAJPC9yZWZlcmVuY2U+CisgICAgICAgICAgICAJPC92aXNpYmxlV2hlbj4KKwkJCTwvY29tbWFuZD4KKwkJPC9tZW51Q29udHJpYnV0aW9uPgorCTwvZXh0ZW5zaW9uPgorCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzIj4KKwkgICAgPGhhbmRsZXIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLlBlcnNwZWN0aXZlRHNsRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmZpbmRyZWZzLkZpbmRSZWZlcmVuY2VzSGFuZGxlciIKKyAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLkZpbmRSZWZlcmVuY2VzIj4KKyAgICAgICAgICAgIDxhY3RpdmVXaGVuPgorICAgICAgICAgICAgICAgIDxyZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsLkVkaXRvci5vcGVuZWQiPgorICAgICAgICAgICAgICAgIDwvcmVmZXJlbmNlPgorICAgICAgICAgICAgPC9hY3RpdmVXaGVuPgorICAgICAgICA8L2hhbmRsZXI+CisgICAgPC9leHRlbnNpb24+ICAgCisKKzwhLS0gYWRkaW5nIHJlc291cmNlIGZhY3RvcmllcyAtLT4KKworCTxleHRlbnNpb24KKwkJcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5leHRlbnNpb25fcGFyc2VyIj4KKwkJPHBhcnNlcgorCQkJY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuUGVyc3BlY3RpdmVEc2xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5JUmVzb3VyY2VGYWN0b3J5IgorCQkJdHlwZT0icGVyc3BlY3RpdmUiPgorCQk8L3BhcnNlcj4KKwk8L2V4dGVuc2lvbj4KKwk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS54dGV4dC5leHRlbnNpb25fcmVzb3VyY2VTZXJ2aWNlUHJvdmlkZXIiPgorICAgICAgICA8cmVzb3VyY2VTZXJ2aWNlUHJvdmlkZXIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLlBlcnNwZWN0aXZlRHNsRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkucmVzb3VyY2UuSVJlc291cmNlVUlTZXJ2aWNlUHJvdmlkZXIiCisgICAgICAgICAgICB1cmlFeHRlbnNpb249InBlcnNwZWN0aXZlIj4KKyAgICAgICAgPC9yZXNvdXJjZVNlcnZpY2VQcm92aWRlcj4KKyAgICA8L2V4dGVuc2lvbj4KKworCisJPCEtLSBtYXJrZXIgZGVmaW5pdGlvbnMgZm9yIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wgLS0+CisJPGV4dGVuc2lvbgorCSAgICAgICAgaWQ9InBlcnNwZWN0aXZlZHNsLmNoZWNrLmZhc3QiCisJICAgICAgICBuYW1lPSJPU0JQIFBlcnNwZWN0aXZlRHNsIFByb2JsZW0iCisJICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyI+CisJICAgIDxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS54dGV4dC51aS5jaGVjay5mYXN0Ii8+CisJICAgIDxwZXJzaXN0ZW50IHZhbHVlPSJ0cnVlIi8+CisJPC9leHRlbnNpb24+CisJPGV4dGVuc2lvbgorCSAgICAgICAgaWQ9InBlcnNwZWN0aXZlZHNsLmNoZWNrLm5vcm1hbCIKKwkgICAgICAgIG5hbWU9Ik9TQlAgUGVyc3BlY3RpdmVEc2wgUHJvYmxlbSIKKwkgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KKwkgICAgPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmNoZWNrLm5vcm1hbCIvPgorCSAgICA8cGVyc2lzdGVudCB2YWx1ZT0idHJ1ZSIvPgorCTwvZXh0ZW5zaW9uPgorCTxleHRlbnNpb24KKwkgICAgICAgIGlkPSJwZXJzcGVjdGl2ZWRzbC5jaGVjay5leHBlbnNpdmUiCisJICAgICAgICBuYW1lPSJPU0JQIFBlcnNwZWN0aXZlRHNsIFByb2JsZW0iCisJICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyI+CisJICAgIDxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS54dGV4dC51aS5jaGVjay5leHBlbnNpdmUiLz4KKwkgICAgPHBlcnNpc3RlbnQgdmFsdWU9InRydWUiLz4KKwk8L2V4dGVuc2lvbj4KKworICAgPGV4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnh0ZXh0LmJ1aWxkZXIucGFydGljaXBhbnQiPgorICAgICAgPHBhcnRpY2lwYW50CisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5QZXJzcGVjdGl2ZURzbEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LmJ1aWxkZXIuSVh0ZXh0QnVpbGRlclBhcnRpY2lwYW50IgorICAgICAgICAgICAgZmlsZUV4dGVuc2lvbnM9InBlcnNwZWN0aXZlIgorICAgICAgICAgICAgPgorICAgICAgPC9wYXJ0aWNpcGFudD4KKyAgIDwvZXh0ZW5zaW9uPgorICAgPGV4dGVuc2lvbgorICAgICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+CisgICAgICAgIDxwYWdlCisgICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbCIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLlBlcnNwZWN0aXZlRHNsRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQuYnVpbGRlci5wcmVmZXJlbmNlcy5CdWlsZGVyUHJlZmVyZW5jZVBhZ2UiCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbC5jb21waWxlci5wcmVmZXJlbmNlUGFnZSIKKyAgICAgICAgICAgIGljb249Imljb25zL2RzbF9wZXJzcGVjdGl2ZS5wbmciCisgICAgICAgICAgICBuYW1lPSJDb21waWxlciI+CisgICAgICAgICAgICA8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5rZXl3b3JkX1BlcnNwZWN0aXZlRHNsIi8+CisgICAgICAgIDwvcGFnZT4KKyAgICA8L2V4dGVuc2lvbj4KKyAgICA8ZXh0ZW5zaW9uCisgICAgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJvcGVydHlQYWdlcyI+CisgICAgICAgIDxwYWdlCisgICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbCIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLlBlcnNwZWN0aXZlRHNsRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQuYnVpbGRlci5wcmVmZXJlbmNlcy5CdWlsZGVyUHJlZmVyZW5jZVBhZ2UiCisgICAgICAgICAgICBpY29uPSJpY29ucy9kc2xfcGVyc3BlY3RpdmUucG5nIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wuY29tcGlsZXIucHJvcGVydHlQYWdlIgorICAgICAgICAgICAgbmFtZT0iQ29tcGlsZXIiPgorICAgICAgICAgICAgPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkua2V5d29yZF9QZXJzcGVjdGl2ZURzbCIvPgorICAgICAgICAgICAgPGVuYWJsZWRXaGVuPgorCSAgICAgICAgICAgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIvPgorCQkJPC9lbmFibGVkV2hlbj4KKwkgICAgICAgIDxmaWx0ZXIgbmFtZT0icHJvamVjdE5hdHVyZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLnNoYXJlZC54dGV4dE5hdHVyZSIvPgorICAgICAgICA8L3BhZ2U+CisgICAgPC9leHRlbnNpb24+CisKKwk8IS0tIFF1aWNrIE91dGxpbmUgLS0+CisJPGV4dGVuc2lvbgorCQlwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgorCQk8aGFuZGxlciAKKwkJCWNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLlBlcnNwZWN0aXZlRHNsRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLm91dGxpbmUucXVpY2tvdXRsaW5lLlNob3dRdWlja091dGxpbmVBY3Rpb25IYW5kbGVyIgorCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iub3V0bGluZS5RdWlja091dGxpbmUiPgorCQkJPGFjdGl2ZVdoZW4+CisJCQkJPHJlZmVyZW5jZQorCQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wuRWRpdG9yLm9wZW5lZCI+CisJCQkJPC9yZWZlcmVuY2U+CisJCQk8L2FjdGl2ZVdoZW4+CisJCTwvaGFuZGxlcj4KKwk8L2V4dGVuc2lvbj4KKwk8ZXh0ZW5zaW9uCisJCXBvaW50PSJvcmcuZWNsaXBzZS51aS5jb21tYW5kcyI+CisJCTxjb21tYW5kCisJCQlkZXNjcmlwdGlvbj0iT3BlbiB0aGUgcXVpY2sgb3V0bGluZS4iCisJCQlpZD0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLm91dGxpbmUuUXVpY2tPdXRsaW5lIgorCQkJbmFtZT0iUXVpY2sgT3V0bGluZSI+CisJCTwvY29tbWFuZD4KKwk8L2V4dGVuc2lvbj4KKwk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5tZW51cyI+CisJCTxtZW51Q29udHJpYnV0aW9uCisJCQlsb2NhdGlvblVSST0icG9wdXA6I1RleHRFZGl0b3JDb250ZXh0P2FmdGVyPWdyb3VwLm9wZW4iPgorCQkJPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iub3V0bGluZS5RdWlja091dGxpbmUiCisJCQkJc3R5bGU9InB1c2giCisJCQkJdG9vbHRpcD0iT3BlbiBRdWljayBPdXRsaW5lIj4KKwkJCQk8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+CisJCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsLkVkaXRvci5vcGVuZWQiLz4KKwkJCQk8L3Zpc2libGVXaGVuPgorCQkJPC9jb21tYW5kPgorCQk8L21lbnVDb250cmlidXRpb24+CisJPC9leHRlbnNpb24+CisgICAgPCEtLSBxdWlja2ZpeCBtYXJrZXIgcmVzb2x1dGlvbiBnZW5lcmF0b3IgZm9yIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wgLS0+CisgICAgPGV4dGVuc2lvbgorICAgICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5tYXJrZXJSZXNvbHV0aW9uIj4KKyAgICAgICAgPG1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLlBlcnNwZWN0aXZlRHNsRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLnF1aWNrZml4Lk1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IiCisgICAgICAgICAgICBtYXJrZXJUeXBlPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLnBlcnNwZWN0aXZlZHNsLmNoZWNrLmZhc3QiPgorICAgICAgICAgICAgPGF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIG5hbWU9IkZJWEFCTEVfS0VZIgorICAgICAgICAgICAgICAgIHZhbHVlPSJ0cnVlIj4KKyAgICAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICA8L21hcmtlclJlc29sdXRpb25HZW5lcmF0b3I+CisgICAgICAgIDxtYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5QZXJzcGVjdGl2ZURzbEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5xdWlja2ZpeC5NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yIgorICAgICAgICAgICAgbWFya2VyVHlwZT0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5wZXJzcGVjdGl2ZWRzbC5jaGVjay5ub3JtYWwiPgorICAgICAgICAgICAgPGF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIG5hbWU9IkZJWEFCTEVfS0VZIgorICAgICAgICAgICAgICAgIHZhbHVlPSJ0cnVlIj4KKyAgICAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICA8L21hcmtlclJlc29sdXRpb25HZW5lcmF0b3I+CisgICAgICAgIDxtYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5QZXJzcGVjdGl2ZURzbEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5xdWlja2ZpeC5NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yIgorICAgICAgICAgICAgbWFya2VyVHlwZT0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5wZXJzcGVjdGl2ZWRzbC5jaGVjay5leHBlbnNpdmUiPgorICAgICAgICAgICAgPGF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIG5hbWU9IkZJWEFCTEVfS0VZIgorICAgICAgICAgICAgICAgIHZhbHVlPSJ0cnVlIj4KKyAgICAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICA8L21hcmtlclJlc29sdXRpb25HZW5lcmF0b3I+CisgICAgPC9leHRlbnNpb24+CisgICAJPCEtLSBSZW5hbWUgUmVmYWN0b3JpbmcgLS0+CisJPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgorCQk8aGFuZGxlciAKKwkJCWNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLlBlcnNwZWN0aXZlRHNsRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkucmVmYWN0b3JpbmcudWkuRGVmYXVsdFJlbmFtZUVsZW1lbnRIYW5kbGVyIgorCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5yZWZhY3RvcmluZy5SZW5hbWVFbGVtZW50Ij4KKwkJCTxhY3RpdmVXaGVuPgorCQkJCTxyZWZlcmVuY2UKKwkJCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsLkVkaXRvci5vcGVuZWQiPgorCQkJCTwvcmVmZXJlbmNlPgorCQkJPC9hY3RpdmVXaGVuPgorCQk8L2hhbmRsZXI+CisJPC9leHRlbnNpb24+CisgICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgorICAgICAgICAgPG1lbnVDb250cmlidXRpb24KKyAgICAgICAgICAgIGxvY2F0aW9uVVJJPSJwb3B1cDojVGV4dEVkaXRvckNvbnRleHQ/YWZ0ZXI9Z3JvdXAuZWRpdCI+CisgICAgICAgICA8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLnJlZmFjdG9yaW5nLlJlbmFtZUVsZW1lbnQiCisgICAgICAgICAgICAgICBzdHlsZT0icHVzaCI+CisgICAgICAgICAgICA8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+CisgICAgICAgICAgICAgICA8cmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wuRWRpdG9yLm9wZW5lZCI+CisgICAgICAgICAgICAgICA8L3JlZmVyZW5jZT4KKyAgICAgICAgICAgIDwvdmlzaWJsZVdoZW4+CisgICAgICAgICA8L2NvbW1hbmQ+CisgICAgICA8L21lbnVDb250cmlidXRpb24+CisgICA8L2V4dGVuc2lvbj4KKyAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+CisJICAgIDxwYWdlCisJICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbCIKKwkgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLlBlcnNwZWN0aXZlRHNsRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkucmVmYWN0b3JpbmcudWkuUmVmYWN0b3JpbmdQcmVmZXJlbmNlUGFnZSIKKwkgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsLnJlZmFjdG9yaW5nIgorICAgICAgICAgICAgaWNvbj0iaWNvbnMvZHNsX3BlcnNwZWN0aXZlLnBuZyIKKwkgICAgICAgIG5hbWU9IlJlZmFjdG9yaW5nIj4KKwkgICAgICAgIDxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLmtleXdvcmRfUGVyc3BlY3RpdmVEc2wiLz4KKwkgICAgPC9wYWdlPgorCTwvZXh0ZW5zaW9uPgorCis8IS0tIFR5cGUgSGllcmFyY2h5ICAtLT4KKwk8ZXh0ZW5zaW9uCisJCXBvaW50PSJvcmcuZWNsaXBzZS51aS5oYW5kbGVycyI+CisJCTxoYW5kbGVyIAorCQkJY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuUGVyc3BlY3RpdmVEc2xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5oaWVyYXJjaHkuT3BlblR5cGVIaWVyYXJjaHlIYW5kbGVyIgorCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5oaWVyYXJjaHkuT3BlblR5cGVIaWVyYXJjaHkiPgorCQkJPGFjdGl2ZVdoZW4+CisJCQkJPHJlZmVyZW5jZQorCQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wuRWRpdG9yLm9wZW5lZCI+CisJCQkJPC9yZWZlcmVuY2U+CisJCQk8L2FjdGl2ZVdoZW4+CisJCTwvaGFuZGxlcj4KKwkJPGhhbmRsZXIgCisJCQljbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5QZXJzcGVjdGl2ZURzbEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmhpZXJhcmNoeS5RdWlja1R5cGVIaWVyYXJjaHlIYW5kbGVyIgorCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS5qZHQudWkuZWRpdC50ZXh0LmphdmEub3Blbi5oaWVyYXJjaHkiPgorCQkJPGFjdGl2ZVdoZW4+CisJCQkJPHJlZmVyZW5jZQorCQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wuRWRpdG9yLm9wZW5lZCI+CisJCQkJPC9yZWZlcmVuY2U+CisJCQk8L2FjdGl2ZVdoZW4+CisJCTwvaGFuZGxlcj4KKwk8L2V4dGVuc2lvbj4KKwk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5tZW51cyI+CisJCTxtZW51Q29udHJpYnV0aW9uCisJCQlsb2NhdGlvblVSST0icG9wdXA6I1RleHRFZGl0b3JDb250ZXh0P2FmdGVyPWdyb3VwLm9wZW4iPgorCQkJPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5oaWVyYXJjaHkuT3BlblR5cGVIaWVyYXJjaHkiCisJCQkJc3R5bGU9InB1c2giCisJCQkJdG9vbHRpcD0iT3BlbiBUeXBlIEhpZXJhcmNoeSI+CisJCQkJPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgorCQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbC5FZGl0b3Iub3BlbmVkIi8+CisJCQkJPC92aXNpYmxlV2hlbj4KKwkJCTwvY29tbWFuZD4KKwkJPC9tZW51Q29udHJpYnV0aW9uPgorCQk8bWVudUNvbnRyaWJ1dGlvbgorCQkJbG9jYXRpb25VUkk9InBvcHVwOiNUZXh0RWRpdG9yQ29udGV4dD9hZnRlcj1ncm91cC5vcGVuIj4KKwkJCTxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuamR0LnVpLmVkaXQudGV4dC5qYXZhLm9wZW4uaGllcmFyY2h5IgorCQkJCXN0eWxlPSJwdXNoIgorCQkJCXRvb2x0aXA9IlF1aWNrIFR5cGUgSGllcmFyY2h5Ij4KKwkJCQk8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+CisJCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsLkVkaXRvci5vcGVuZWQiLz4KKwkJCQk8L3Zpc2libGVXaGVuPgorCQkJPC9jb21tYW5kPgorCQk8L21lbnVDb250cmlidXRpb24+CisJPC9leHRlbnNpb24+CisJPCEtLSBDYWxsIEhpZXJhY2h5IC0tPgorCTxleHRlbnNpb24KKwkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzIj4KKwkJPGhhbmRsZXIgCisJCQljbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5QZXJzcGVjdGl2ZURzbEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmhpZXJhcmNoeS5PcGVuQ2FsbEhpZXJhY2h5SGFuZGxlciIKKwkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkuaGllcmFyY2h5Lk9wZW5DYWxsSGllcmFyY2h5Ij4KKwkJCTxhY3RpdmVXaGVuPgorCQkJCTxyZWZlcmVuY2UKKwkJCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsLkVkaXRvci5vcGVuZWQiPgorCQkJCTwvcmVmZXJlbmNlPgorCQkJPC9hY3RpdmVXaGVuPgorCQk8L2hhbmRsZXI+CisJPC9leHRlbnNpb24+CisJCisJPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgorCQk8bWVudUNvbnRyaWJ1dGlvbgorCQkJbG9jYXRpb25VUkk9InBvcHVwOiNUZXh0RWRpdG9yQ29udGV4dD9hZnRlcj1ncm91cC5vcGVuIj4KKwkJCTxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkuaGllcmFyY2h5Lk9wZW5DYWxsSGllcmFyY2h5IgorCQkJCXN0eWxlPSJwdXNoIgorCQkJCXRvb2x0aXA9Ik9wZW4gQ2FsbCBIaWVyYXJjaHkiPgorCQkJCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KKwkJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wuRWRpdG9yLm9wZW5lZCIvPgorCQkJCTwvdmlzaWJsZVdoZW4+CisJCQk8L2NvbW1hbmQ+CisJCTwvbWVudUNvbnRyaWJ1dGlvbj4KKwk8L2V4dGVuc2lvbj4KKwk8ZXh0ZW5zaW9uCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0ZXJzIj4KKyAgICAgIDxmYWN0b3J5IGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLlBlcnNwZWN0aXZlRHNsRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQuYnVpbGRlci5zbWFwLlN0cmF0dW1CcmVha3BvaW50QWRhcHRlckZhY3RvcnkiCisgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuWHRleHRFZGl0b3IiPgorICAgICAgICAgPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JVG9nZ2xlQnJlYWtwb2ludHNUYXJnZXQiLz4KKyAgICAgIDwvZmFjdG9yeT4gCisgICA8L2V4dGVuc2lvbj4KKyAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvckFjdGlvbnMiPgorICAgICAgPGVkaXRvckNvbnRyaWJ1dGlvbiB0YXJnZXRJRD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbCIgCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsLnJ1bGVyQWN0aW9ucyI+CisJICAgICA8YWN0aW9uCisJICAgICAgICAgICAgIGxhYmVsPSJOb3QgVXNlZCIKKwkgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuUGVyc3BlY3RpdmVEc2xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLlJ1bGVyVG9nZ2xlQnJlYWtwb2ludEFjdGlvbkRlbGVnYXRlIgorCSAgICAgICAgICAgICBzdHlsZT0icHVzaCIKKwkgICAgICAgICAgICAgYWN0aW9uSUQ9IlJ1bGVyRG91YmxlQ2xpY2siCisJICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsLmRvdWJsZUNsaWNrQnJlYWtwb2ludEFjdGlvbiIvPgorCSAgPC9lZGl0b3JDb250cmlidXRpb24+CisgICA8L2V4dGVuc2lvbj4KKyAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgorICAgICAgPHZpZXdlckNvbnRyaWJ1dGlvbgorICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wuUnVsZXJDb250ZXh0IgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wuUnVsZXJQb3B1cEFjdGlvbnMiPgorICAgICAgICAgPGFjdGlvbgorICAgICAgICAgICAgbGFiZWw9IlRvZ2dsZSBCcmVha3BvaW50IgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuUGVyc3BlY3RpdmVEc2xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLlJ1bGVyVG9nZ2xlQnJlYWtwb2ludEFjdGlvbkRlbGVnYXRlIgorICAgICAgICAgICAgbWVudWJhclBhdGg9ImRlYnVnIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wucnVsZXJDb250ZXh0TWVudS50b2dnbGVCcmVha3BvaW50QWN0aW9uIj4KKyAgICAgICAgIDwvYWN0aW9uPgorICAgICAgICAgPGFjdGlvbgorICAgICAgICAgICAgbGFiZWw9Ik5vdCB1c2VkIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuUGVyc3BlY3RpdmVEc2xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLlJ1bGVyRW5hYmxlRGlzYWJsZUJyZWFrcG9pbnRBY3Rpb25EZWxlZ2F0ZSIKKyAgICAgICAgICAgIG1lbnViYXJQYXRoPSJkZWJ1ZyIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsLnJ1bGVyQ29udGV4dE1lbnUuZW5hYmxlRGlzYWJsZUJyZWFrcG9pbnRBY3Rpb24iPgorICAgICAgICAgPC9hY3Rpb24+CisgICAgICAgICA8YWN0aW9uCisgICAgICAgICAgIGxhYmVsPSJCcmVha3BvaW50IFByb3BlcnRpZXMiCisgICAgICAgICAgIGhlbHBDb250ZXh0SWQ9ImJyZWFrcG9pbnRfcHJvcGVydGllc19hY3Rpb25fY29udGV4dCIKKyAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuUGVyc3BlY3RpdmVEc2xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS5qZHQuZGVidWcudWkuYWN0aW9ucy5KYXZhQnJlYWtwb2ludFByb3BlcnRpZXNSdWxlckFjdGlvbkRlbGVnYXRlIgorICAgICAgICAgICBtZW51YmFyUGF0aD0iZ3JvdXAucHJvcGVydGllcyIKKyAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wucnVsZXJDb250ZXh0TWVudS5vcGVuQnJlYXBvaW50UHJvcGVydGllc0FjdGlvbiI+CisgICAgICAgICA8L2FjdGlvbj4KKyAgICAgIDwvdmlld2VyQ29udHJpYnV0aW9uPgorICAgPC9leHRlbnNpb24+CisgICAgPCEtLSBJbnRyb2R1Y2UgTG9jYWwgVmFyaWFibGUgUmVmYWN0b3JpbmcgLS0+CisJPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgorCQk8aGFuZGxlciAKKwkJCWNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLlBlcnNwZWN0aXZlRHNsRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkucmVmYWN0b3JpbmcuRXh0cmFjdFZhcmlhYmxlSGFuZGxlciIKKwkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkucmVmYWN0b3JpbmcuRXh0cmFjdExvY2FsVmFyaWFibGUiPgorCQkJPGFjdGl2ZVdoZW4+CisJCQkJPHJlZmVyZW5jZQorCQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wuRWRpdG9yLm9wZW5lZCI+CisJCQkJPC9yZWZlcmVuY2U+CisJCQk8L2FjdGl2ZVdoZW4+CisJCTwvaGFuZGxlcj4KKwk8L2V4dGVuc2lvbj4KKyAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5tZW51cyI+CisgICAgICAgICA8bWVudUNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgbG9jYXRpb25VUkk9InBvcHVwOiNUZXh0RWRpdG9yQ29udGV4dD9hZnRlcj1ncm91cC5lZGl0Ij4KKyAgICAgICAgIDxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkucmVmYWN0b3JpbmcuRXh0cmFjdExvY2FsVmFyaWFibGUiCisgICAgICAgICAgICAgICBzdHlsZT0icHVzaCI+CisgICAgICAgICAgICA8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+CisgICAgICAgICAgICAgICA8cmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wuRWRpdG9yLm9wZW5lZCI+CisgICAgICAgICAgICAgICA8L3JlZmVyZW5jZT4KKyAgICAgICAgICAgIDwvdmlzaWJsZVdoZW4+CisgICAgICAgICA8L2NvbW1hbmQ+CisgICAgICA8L21lbnVDb250cmlidXRpb24+CisgICA8L2V4dGVuc2lvbj4gIAorICAgPCEtLSBPcGVuIGltcGxlbWVudGF0aW9uIC0tPgorICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgorICAgICAgPGhhbmRsZXIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLlBlcnNwZWN0aXZlRHNsRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkubmF2aWdhdGlvbi5PcGVuSW1wbGVtZW50YXRpb25IYW5kbGVyIgorICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5PcGVuSW1wbGVtZW50YXRpb25Db21tYW5kIj4KKyAgICAgICAgICAgIDxhY3RpdmVXaGVuPgorCQkJCTxyZWZlcmVuY2UKKwkJCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsLkVkaXRvci5vcGVuZWQiPgorCQkJCTwvcmVmZXJlbmNlPgorCQkJPC9hY3RpdmVXaGVuPgorICAgICAgPC9oYW5kbGVyPgorICAgPC9leHRlbnNpb24+CisgICA8ZXh0ZW5zaW9uCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgorICAgICAgPGNvbW1hbmQKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLkNvbnZlcnRFNFBlcnNwZWN0aXZlVG9PU0JQIgorICAgICAgICAgICAgbmFtZT0iQ29udmVydCBFNCBwZXJzcGVjdGl2ZSI+CisgICAgICA8L2NvbW1hbmQ+CisgICA8L2V4dGVuc2lvbj4KKyAgPGV4dGVuc2lvbgorICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgorICAgICA8bWVudUNvbnRyaWJ1dGlvbgorICAgICAgICAgICBhbGxQb3B1cHM9InRydWUiCisgICAgICAgICAgIGxvY2F0aW9uVVJJPSJwb3B1cDpvcmcuZWNsaXBzZS51aS5wb3B1cC5hbnk/YWZ0ZXI9YWRkaXRpb25zIj4KKyAgICAgICAgPGNvbW1hbmQKKyAgICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLkNvbnZlcnRFNFBlcnNwZWN0aXZlVG9PU0JQIgorICAgICAgICAgICAgICBsYWJlbD0iQ29udmVydCB0byBPU0JQIFBlcnNwZWN0aXZlIG1vZGVsIgorICAgICAgICAgICAgICBzdHlsZT0icHVzaCI+CisJCSAgICAgICAgICAgPHZpc2libGVXaGVuPgorCQkgICAgICAgICAgIDxpdGVyYXRlCisJCSAgICAgICAgIAkJaWZFbXB0eT0iZmFsc2UiIAorCQkgICAgICAgICAJCW9wZXJhdG9yPSJvciI+CisJCSAgICAgICAgICAgICAgCQk8dGVzdAorCQkgICAgICAgICAgICAgICAgICAgIAlwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubmFtZSIKKwkJICAgICAgICAgICAgICAgICAgICAJdmFsdWU9IioubXBlcnNwZWN0aXZlIj4KKwkJICAgICAgICAgICAgIAkJPC90ZXN0PgorICAgICAgICAgICAgICAJICA8L2l0ZXJhdGU+CisgICAgICAgICAgIDwvdmlzaWJsZVdoZW4+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgPC9tZW51Q29udHJpYnV0aW9uPgorICA8L2V4dGVuc2lvbj4KKyAgPGV4dGVuc2lvbgorICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgorICAgICA8aGFuZGxlcgorICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5QZXJzcGVjdGl2ZURzbEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuaGFuZGxlci5Db252ZXJ0RTRQZXJzcGVjdGl2ZVRvT1NCUEhhbmRsZXIiCisgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5Db252ZXJ0RTRQZXJzcGVjdGl2ZVRvT1NCUCI+CisgICAgIDwvaGFuZGxlcj4KKyAgPC9leHRlbnNpb24+CisgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgorICAgICAgIDxtZW51Q29udHJpYnV0aW9uCisgICAgICAgICAgICBsb2NhdGlvblVSST0ibWVudTpuYXZpZ2F0ZT9hZnRlcj1vcGVuLmV4dDQiPgorICAgICAgICAgPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5PcGVuSW1wbGVtZW50YXRpb25Db21tYW5kIj4KKwkJPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgorICAgICAgICAgICAgICA8cmVmZXJlbmNlCisgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbC5FZGl0b3Iub3BlbmVkIj4KKyAgICAgICAgICAgICAgPC9yZWZlcmVuY2U+CisJCTwvdmlzaWJsZVdoZW4+CisgICAgICAgICA8L2NvbW1hbmQ+CisgICAgICA8L21lbnVDb250cmlidXRpb24+CisgICA8L2V4dGVuc2lvbj4KKworICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb21wYXJlLmNvbnRlbnRWaWV3ZXJzIj4KKyAgICA8dmlld2VyIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsLmNvbXBhcmUuY29udGVudFZpZXdlcnMiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5QZXJzcGVjdGl2ZURzbEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmNvbXBhcmUuSW5qZWN0YWJsZVZpZXdlckNyZWF0b3IiCisgICAgICAgICAgICBleHRlbnNpb25zPSJwZXJzcGVjdGl2ZSI+CisgICAgPC92aWV3ZXI+CisgIDwvZXh0ZW5zaW9uPgorICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb21wYXJlLmNvbnRlbnRNZXJnZVZpZXdlcnMiPgorICAgIDx2aWV3ZXIgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wuY29tcGFyZS5jb250ZW50TWVyZ2VWaWV3ZXJzIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuUGVyc3BlY3RpdmVEc2xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5jb21wYXJlLkluamVjdGFibGVWaWV3ZXJDcmVhdG9yIgorICAgICAgICAgICAgZXh0ZW5zaW9ucz0icGVyc3BlY3RpdmUiIGxhYmVsPSJQZXJzcGVjdGl2ZURzbCBDb21wYXJlIj4KKyAgICAgPC92aWV3ZXI+CisgIDwvZXh0ZW5zaW9uPgorICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLmRvY3VtZW50UHJvdmlkZXJzIj4KKyAgICA8cHJvdmlkZXIgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wuZWRpdG9ycy5kb2N1bWVudFByb3ZpZGVycyIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLlBlcnNwZWN0aXZlRHNsRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLm1vZGVsLlh0ZXh0RG9jdW1lbnRQcm92aWRlciIKKyAgICAgICAgICAgIGV4dGVuc2lvbnM9InBlcnNwZWN0aXZlIj4KKyAgICA8L3Byb3ZpZGVyPgorICA8L2V4dGVuc2lvbj4KKworPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3BsdWdpbi54bWxfZ2VuIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9wbHVnaW4ueG1sX2dlbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjJiMzA2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9wbHVnaW4ueG1sX2dlbgpAQCAtMCwwICsxLDU2MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KKworPHBsdWdpbj4KKworICAgIDxleHRlbnNpb24KKyAgICAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KKyAgICAgICAgPGVkaXRvcgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuUGVyc3BlY3RpdmVEc2xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuWHRleHRFZGl0b3IiCisgICAgICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuVGV4dEVkaXRvckFjdGlvbkNvbnRyaWJ1dG9yIgorICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIKKyAgICAgICAgICAgIGV4dGVuc2lvbnM9InBlcnNwZWN0aXZlIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wiCisgICAgICAgICAgICBtYXRjaGluZ1N0cmF0ZWd5PSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLlBlcnNwZWN0aXZlRHNsRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkuZWRpdG9yLkphdmFFZGl0b3JJbnB1dE1hdGNoZXIiCisgICAgICAgICAgICBuYW1lPSJQZXJzcGVjdGl2ZURzbCBFZGl0b3IiPgorICAgICAgICA8L2VkaXRvcj4KKyAgICA8L2V4dGVuc2lvbj4KKyAgICA8ZXh0ZW5zaW9uCisgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5oYW5kbGVycyI+CisgICAgICAgIDxoYW5kbGVyCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5QZXJzcGVjdGl2ZURzbEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5oeXBlcmxpbmtpbmcuT3BlbkRlY2xhcmF0aW9uSGFuZGxlciIKKyAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmh5cGVybGlua2luZy5PcGVuRGVjbGFyYXRpb24iPgorICAgICAgICAgICAgPGFjdGl2ZVdoZW4+CisgICAgICAgICAgICAgICAgPHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wuRWRpdG9yLm9wZW5lZCI+CisgICAgICAgICAgICAgICAgPC9yZWZlcmVuY2U+CisgICAgICAgICAgICA8L2FjdGl2ZVdoZW4+CisgICAgICAgIDwvaGFuZGxlcj4KKyAgICAgICAgPGhhbmRsZXIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLlBlcnNwZWN0aXZlRHNsRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmhhbmRsZXIuVmFsaWRhdGVBY3Rpb25IYW5kbGVyIgorICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsLnZhbGlkYXRlIj4KKyAgICAgICAgIDxhY3RpdmVXaGVuPgorICAgICAgICAgICAgPHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wuRWRpdG9yLm9wZW5lZCI+CisgICAgICAgICAgICA8L3JlZmVyZW5jZT4KKyAgICAgICAgIDwvYWN0aXZlV2hlbj4KKyAgICAgIAk8L2hhbmRsZXI+CisgICAgICAJPCEtLSBjb3B5IHF1YWxpZmllZCBuYW1lIC0tPgorICAgICAgICA8aGFuZGxlcgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuUGVyc3BlY3RpdmVEc2xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29weXF1YWxpZmllZG5hbWUuRWRpdG9yQ29weVF1YWxpZmllZE5hbWVIYW5kbGVyIgorICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29weXF1YWxpZmllZG5hbWUuRWRpdG9yQ29weVF1YWxpZmllZE5hbWUiPgorICAgICAgICAgICAgPGFjdGl2ZVdoZW4+CisJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wuRWRpdG9yLm9wZW5lZCIgLz4KKyAgICAgICAgICAgIDwvYWN0aXZlV2hlbj4KKyAgICAgICAgPC9oYW5kbGVyPgorICAgICAgICA8aGFuZGxlcgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuUGVyc3BlY3RpdmVEc2xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29weXF1YWxpZmllZG5hbWUuT3V0bGluZUNvcHlRdWFsaWZpZWROYW1lSGFuZGxlciIKKyAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvcHlxdWFsaWZpZWRuYW1lLk91dGxpbmVDb3B5UXVhbGlmaWVkTmFtZSI+CisgICAgICAgICAgICA8YWN0aXZlV2hlbj4KKyAgICAgICAgICAgIAk8YW5kPgorICAgICAgICAgICAgCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbC5YdGV4dEVkaXRvci5vcGVuZWQiIC8+CisJICAgICAgICAgICAgICAgIDxpdGVyYXRlPgorCQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5vdXRsaW5lLklPdXRsaW5lTm9kZSIgLz4KKwkJCQkJPC9pdGVyYXRlPgorCQkJCTwvYW5kPgorICAgICAgICAgICAgPC9hY3RpdmVXaGVuPgorICAgICAgICA8L2hhbmRsZXI+CisgICAgPC9leHRlbnNpb24+CisgICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5kZWZpbml0aW9ucyI+CisgICAgICAgIDxkZWZpbml0aW9uIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsLkVkaXRvci5vcGVuZWQiPgorICAgICAgICAgICAgPGFuZD4KKyAgICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0iaXNBY3RpdmVFZGl0b3JBbkluc3RhbmNlT2ZYdGV4dEVkaXRvciIvPgorICAgICAgICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJhY3RpdmVFZGl0b3IiPgorICAgICAgICAgICAgICAgICAgICA8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLlh0ZXh0RWRpdG9yLmxhbmd1YWdlTmFtZSIgCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbCIgCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiLz4KKyAgICAgICAgICAgICAgICA8L3dpdGg+ICAgICAgICAKKyAgICAgICAgICAgIDwvYW5kPgorICAgICAgICA8L2RlZmluaXRpb24+CisgICAgICAgIDxkZWZpbml0aW9uIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsLlh0ZXh0RWRpdG9yLm9wZW5lZCI+CisgICAgICAgICAgICA8YW5kPgorICAgICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJpc1h0ZXh0RWRpdG9yQWN0aXZlIi8+CisgICAgICAgICAgICAgICAgPHdpdGggdmFyaWFibGU9ImFjdGl2ZUVkaXRvciI+CisgICAgICAgICAgICAgICAgICAgIDx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuWHRleHRFZGl0b3IubGFuZ3VhZ2VOYW1lIiAKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsIiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIvPgorICAgICAgICAgICAgICAgIDwvd2l0aD4gICAgICAgIAorICAgICAgICAgICAgPC9hbmQ+CisgICAgICAgIDwvZGVmaW5pdGlvbj4KKyAgICA8L2V4dGVuc2lvbj4KKyAgICA8ZXh0ZW5zaW9uCisgICAgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KKyAgICAgICAgPHBhZ2UKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLlBlcnNwZWN0aXZlRHNsRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLnByZWZlcmVuY2VzLkxhbmd1YWdlUm9vdFByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wiCisgICAgICAgICAgICBuYW1lPSJQZXJzcGVjdGl2ZURzbCI+CisgICAgICAgICAgICA8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5rZXl3b3JkX1BlcnNwZWN0aXZlRHNsIi8+CisgICAgICAgIDwvcGFnZT4KKyAgICAgICAgPHBhZ2UKKyAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuUGVyc3BlY3RpdmVEc2xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iuc3ludGF4Y29sb3JpbmcuU3ludGF4Q29sb3JpbmdQcmVmZXJlbmNlUGFnZSIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsLmNvbG9yaW5nIgorICAgICAgICAgICAgbmFtZT0iU3ludGF4IENvbG9yaW5nIj4KKyAgICAgICAgICAgIDxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLmtleXdvcmRfUGVyc3BlY3RpdmVEc2wiLz4KKyAgICAgICAgPC9wYWdlPgorICAgICAgICA8cGFnZQorICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5QZXJzcGVjdGl2ZURzbEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci50ZW1wbGF0ZXMuWHRleHRUZW1wbGF0ZVByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wudGVtcGxhdGVzIgorICAgICAgICAgICAgbmFtZT0iVGVtcGxhdGVzIj4KKyAgICAgICAgICAgIDxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLmtleXdvcmRfUGVyc3BlY3RpdmVEc2wiLz4KKyAgICAgICAgPC9wYWdlPgorICAgIDwvZXh0ZW5zaW9uPgorICAgIDxleHRlbnNpb24KKyAgICAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzIj4KKyAgICAgICAgPHBhZ2UKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLlBlcnNwZWN0aXZlRHNsRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLnByZWZlcmVuY2VzLkxhbmd1YWdlUm9vdFByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wiCisgICAgICAgICAgICBuYW1lPSJQZXJzcGVjdGl2ZURzbCI+CisgICAgICAgICAgICA8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5rZXl3b3JkX1BlcnNwZWN0aXZlRHNsIi8+CisgICAgICAgICAgICA8ZW5hYmxlZFdoZW4+CisJICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ii8+CisJCQk8L2VuYWJsZWRXaGVuPgorCSAgICAgICAgPGZpbHRlciBuYW1lPSJwcm9qZWN0TmF0dXJlIiB2YWx1ZT0ib3JnLmVjbGlwc2UueHRleHQudWkuc2hhcmVkLnh0ZXh0TmF0dXJlIi8+CisgICAgICAgIDwvcGFnZT4KKyAgICA8L2V4dGVuc2lvbj4KKyAgICA8ZXh0ZW5zaW9uCisgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5rZXl3b3JkcyI+CisgICAgICAgIDxrZXl3b3JkCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5rZXl3b3JkX1BlcnNwZWN0aXZlRHNsIgorICAgICAgICAgICAgbGFiZWw9IlBlcnNwZWN0aXZlRHNsIi8+CisgICAgPC9leHRlbnNpb24+CisgICAgPGV4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzIj4KKyAgICAgIDxjb21tYW5kCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVHJpZ2dlciBleHBlbnNpdmUgdmFsaWRhdGlvbiIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsLnZhbGlkYXRlIgorICAgICAgICAgICAgbmFtZT0iVmFsaWRhdGUiPgorICAgICAgPC9jb21tYW5kPgorICAgICAgPCEtLSBjb3B5IHF1YWxpZmllZCBuYW1lIC0tPgorICAgICAgPGNvbW1hbmQKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29weXF1YWxpZmllZG5hbWUuRWRpdG9yQ29weVF1YWxpZmllZE5hbWUiCisgICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgorICAgICAgICAgICAgZGVzY3JpcHRpb249IkNvcHkgdGhlIHF1YWxpZmllZCBuYW1lIGZvciB0aGUgc2VsZWN0ZWQgZWxlbWVudCIKKyAgICAgICAgICAgIG5hbWU9IkNvcHkgUXVhbGlmaWVkIE5hbWUiPgorICAgICAgPC9jb21tYW5kPgorICAgICAgPGNvbW1hbmQKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29weXF1YWxpZmllZG5hbWUuT3V0bGluZUNvcHlRdWFsaWZpZWROYW1lIgorICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDb3B5IHRoZSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhlIHNlbGVjdGVkIGVsZW1lbnQiCisgICAgICAgICAgICBuYW1lPSJDb3B5IFF1YWxpZmllZCBOYW1lIj4KKyAgICAgIDwvY29tbWFuZD4KKyAgICA8L2V4dGVuc2lvbj4KKyAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5tZW51cyI+CisgICAgICAgIDxtZW51Q29udHJpYnV0aW9uCisgICAgICAgICAgICBsb2NhdGlvblVSST0icG9wdXA6I1RleHRFZGl0b3JDb250ZXh0P2FmdGVyPWdyb3VwLmVkaXQiPgorICAgICAgICAgICAgIDxjb21tYW5kCisgICAgICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbC52YWxpZGF0ZSIKKyAgICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCisgICAgICAgICAgICAgICAgIHRvb2x0aXA9IlRyaWdnZXIgZXhwZW5zaXZlIHZhbGlkYXRpb24iPgorICAgICAgICAgICAgPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgorICAgICAgICAgICAgICAgIDxyZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsLkVkaXRvci5vcGVuZWQiPgorICAgICAgICAgICAgICAgIDwvcmVmZXJlbmNlPgorICAgICAgICAgICAgPC92aXNpYmxlV2hlbj4KKyAgICAgICAgIDwvY29tbWFuZD4gIAorICAgICAgICAgPC9tZW51Q29udHJpYnV0aW9uPgorICAgICAgICAgPCEtLSBjb3B5IHF1YWxpZmllZCBuYW1lIC0tPgorICAgICAgICAgPG1lbnVDb250cmlidXRpb24gbG9jYXRpb25VUkk9InBvcHVwOiNUZXh0RWRpdG9yQ29udGV4dD9hZnRlcj1jb3B5Ij4KKyAgICAgICAgIAk8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb3B5cXVhbGlmaWVkbmFtZS5FZGl0b3JDb3B5UXVhbGlmaWVkTmFtZSIgCisgICAgICAgICAJCXN0eWxlPSJwdXNoIiB0b29sdGlwPSJDb3B5IFF1YWxpZmllZCBOYW1lIj4KKyAgICAgICAgICAgIAk8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+CisgICAgICAgICAgICAgICAgCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsLkVkaXRvci5vcGVuZWQiIC8+CisgICAgICAgICAgICAJPC92aXNpYmxlV2hlbj4KKyAgICAgICAgIAk8L2NvbW1hbmQ+ICAKKyAgICAgICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4KKyAgICAgICAgIDxtZW51Q29udHJpYnV0aW9uIGxvY2F0aW9uVVJJPSJtZW51OmVkaXQ/YWZ0ZXI9Y29weSI+CisgICAgICAgICAJPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29weXF1YWxpZmllZG5hbWUuRWRpdG9yQ29weVF1YWxpZmllZE5hbWUiCisgICAgICAgICAgICAJc3R5bGU9InB1c2giIHRvb2x0aXA9IkNvcHkgUXVhbGlmaWVkIE5hbWUiPgorICAgICAgICAgICAgCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KKyAgICAgICAgICAgICAgICAJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wuRWRpdG9yLm9wZW5lZCIgLz4KKyAgICAgICAgICAgIAk8L3Zpc2libGVXaGVuPgorICAgICAgICAgCTwvY29tbWFuZD4gIAorICAgICAgICAgPC9tZW51Q29udHJpYnV0aW9uPgorICAgICAgICAgPG1lbnVDb250cmlidXRpb24gbG9jYXRpb25VUkk9InBvcHVwOm9yZy5lY2xpcHNlLnh0ZXh0LnVpLm91dGxpbmU/YWZ0ZXI9YWRkaXRpb25zIj4KKwkJCTxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvcHlxdWFsaWZpZWRuYW1lLk91dGxpbmVDb3B5UXVhbGlmaWVkTmFtZSIgCisJCQkJc3R5bGU9InB1c2giIHRvb2x0aXA9IkNvcHkgUXVhbGlmaWVkIE5hbWUiPgorICAgICAgICAgCQk8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+CisJICAgICAgICAgICAgCTxhbmQ+CisJICAgICAgICAgICAgCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbC5YdGV4dEVkaXRvci5vcGVuZWQiIC8+CisJCQkJCQk8aXRlcmF0ZT4KKwkJCQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLm91dGxpbmUuSU91dGxpbmVOb2RlIiAvPgorCQkJCQkJPC9pdGVyYXRlPgorCQkJCQk8L2FuZD4KKwkJCQk8L3Zpc2libGVXaGVuPgorCQkJPC9jb21tYW5kPgorICAgICAgICAgPC9tZW51Q29udHJpYnV0aW9uPgorICAgIDwvZXh0ZW5zaW9uPgorICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4KKwkJPG1lbnVDb250cmlidXRpb24gbG9jYXRpb25VUkk9InBvcHVwOiNUZXh0RWRpdG9yQ29udGV4dD9lbmRvZj1ncm91cC5maW5kIj4KKwkJCTxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLkZpbmRSZWZlcmVuY2VzIj4KKwkJCQk8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+CisgICAgICAgICAgICAgICAgCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsLkVkaXRvci5vcGVuZWQiPgorICAgICAgICAgICAgICAgIAk8L3JlZmVyZW5jZT4KKyAgICAgICAgICAgIAk8L3Zpc2libGVXaGVuPgorCQkJPC9jb21tYW5kPgorCQk8L21lbnVDb250cmlidXRpb24+CisJPC9leHRlbnNpb24+CisJPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgorCSAgICA8aGFuZGxlcgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuUGVyc3BlY3RpdmVEc2xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuZmluZHJlZnMuRmluZFJlZmVyZW5jZXNIYW5kbGVyIgorICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuRmluZFJlZmVyZW5jZXMiPgorICAgICAgICAgICAgPGFjdGl2ZVdoZW4+CisgICAgICAgICAgICAgICAgPHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wuRWRpdG9yLm9wZW5lZCI+CisgICAgICAgICAgICAgICAgPC9yZWZlcmVuY2U+CisgICAgICAgICAgICA8L2FjdGl2ZVdoZW4+CisgICAgICAgIDwvaGFuZGxlcj4KKyAgICA8L2V4dGVuc2lvbj4gICAKKworPCEtLSBhZGRpbmcgcmVzb3VyY2UgZmFjdG9yaWVzIC0tPgorCisJPGV4dGVuc2lvbgorCQlwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmV4dGVuc2lvbl9wYXJzZXIiPgorCQk8cGFyc2VyCisJCQljbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5QZXJzcGVjdGl2ZURzbEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLklSZXNvdXJjZUZhY3RvcnkiCisJCQl0eXBlPSJwZXJzcGVjdGl2ZSI+CisJCTwvcGFyc2VyPgorCTwvZXh0ZW5zaW9uPgorCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnh0ZXh0LmV4dGVuc2lvbl9yZXNvdXJjZVNlcnZpY2VQcm92aWRlciI+CisgICAgICAgIDxyZXNvdXJjZVNlcnZpY2VQcm92aWRlcgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuUGVyc3BlY3RpdmVEc2xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5yZXNvdXJjZS5JUmVzb3VyY2VVSVNlcnZpY2VQcm92aWRlciIKKyAgICAgICAgICAgIHVyaUV4dGVuc2lvbj0icGVyc3BlY3RpdmUiPgorICAgICAgICA8L3Jlc291cmNlU2VydmljZVByb3ZpZGVyPgorICAgIDwvZXh0ZW5zaW9uPgorCisKKwk8IS0tIG1hcmtlciBkZWZpbml0aW9ucyBmb3Igb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbCAtLT4KKwk8ZXh0ZW5zaW9uCisJICAgICAgICBpZD0icGVyc3BlY3RpdmVkc2wuY2hlY2suZmFzdCIKKwkgICAgICAgIG5hbWU9IlBlcnNwZWN0aXZlRHNsIFByb2JsZW0iCisJICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyI+CisJICAgIDxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS54dGV4dC51aS5jaGVjay5mYXN0Ii8+CisJICAgIDxwZXJzaXN0ZW50IHZhbHVlPSJ0cnVlIi8+CisJPC9leHRlbnNpb24+CisJPGV4dGVuc2lvbgorCSAgICAgICAgaWQ9InBlcnNwZWN0aXZlZHNsLmNoZWNrLm5vcm1hbCIKKwkgICAgICAgIG5hbWU9IlBlcnNwZWN0aXZlRHNsIFByb2JsZW0iCisJICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyI+CisJICAgIDxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS54dGV4dC51aS5jaGVjay5ub3JtYWwiLz4KKwkgICAgPHBlcnNpc3RlbnQgdmFsdWU9InRydWUiLz4KKwk8L2V4dGVuc2lvbj4KKwk8ZXh0ZW5zaW9uCisJICAgICAgICBpZD0icGVyc3BlY3RpdmVkc2wuY2hlY2suZXhwZW5zaXZlIgorCSAgICAgICAgbmFtZT0iUGVyc3BlY3RpdmVEc2wgUHJvYmxlbSIKKwkgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KKwkgICAgPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmNoZWNrLmV4cGVuc2l2ZSIvPgorCSAgICA8cGVyc2lzdGVudCB2YWx1ZT0idHJ1ZSIvPgorCTwvZXh0ZW5zaW9uPgorCisgICA8ZXh0ZW5zaW9uCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UueHRleHQuYnVpbGRlci5wYXJ0aWNpcGFudCI+CisgICAgICA8cGFydGljaXBhbnQKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLlBlcnNwZWN0aXZlRHNsRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQuYnVpbGRlci5JWHRleHRCdWlsZGVyUGFydGljaXBhbnQiCisgICAgICAgICAgICBmaWxlRXh0ZW5zaW9ucz0icGVyc3BlY3RpdmUiCisgICAgICAgICAgICA+CisgICAgICA8L3BhcnRpY2lwYW50PgorICAgPC9leHRlbnNpb24+CisgICA8ZXh0ZW5zaW9uCisgICAgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KKyAgICAgICAgPHBhZ2UKKyAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuUGVyc3BlY3RpdmVEc2xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC5idWlsZGVyLnByZWZlcmVuY2VzLkJ1aWxkZXJQcmVmZXJlbmNlUGFnZSIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsLmNvbXBpbGVyLnByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgbmFtZT0iQ29tcGlsZXIiPgorICAgICAgICAgICAgPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkua2V5d29yZF9QZXJzcGVjdGl2ZURzbCIvPgorICAgICAgICA8L3BhZ2U+CisgICAgPC9leHRlbnNpb24+CisgICAgPGV4dGVuc2lvbgorICAgICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByb3BlcnR5UGFnZXMiPgorICAgICAgICA8cGFnZQorICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5QZXJzcGVjdGl2ZURzbEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LmJ1aWxkZXIucHJlZmVyZW5jZXMuQnVpbGRlclByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wuY29tcGlsZXIucHJvcGVydHlQYWdlIgorICAgICAgICAgICAgbmFtZT0iQ29tcGlsZXIiPgorICAgICAgICAgICAgPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkua2V5d29yZF9QZXJzcGVjdGl2ZURzbCIvPgorICAgICAgICAgICAgPGVuYWJsZWRXaGVuPgorCSAgICAgICAgICAgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIvPgorCQkJPC9lbmFibGVkV2hlbj4KKwkgICAgICAgIDxmaWx0ZXIgbmFtZT0icHJvamVjdE5hdHVyZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLnNoYXJlZC54dGV4dE5hdHVyZSIvPgorICAgICAgICA8L3BhZ2U+CisgICAgPC9leHRlbnNpb24+CisKKwk8IS0tIFF1aWNrIE91dGxpbmUgLS0+CisJPGV4dGVuc2lvbgorCQlwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgorCQk8aGFuZGxlciAKKwkJCWNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLlBlcnNwZWN0aXZlRHNsRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLm91dGxpbmUucXVpY2tvdXRsaW5lLlNob3dRdWlja091dGxpbmVBY3Rpb25IYW5kbGVyIgorCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iub3V0bGluZS5RdWlja091dGxpbmUiPgorCQkJPGFjdGl2ZVdoZW4+CisJCQkJPHJlZmVyZW5jZQorCQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wuRWRpdG9yLm9wZW5lZCI+CisJCQkJPC9yZWZlcmVuY2U+CisJCQk8L2FjdGl2ZVdoZW4+CisJCTwvaGFuZGxlcj4KKwk8L2V4dGVuc2lvbj4KKwk8ZXh0ZW5zaW9uCisJCXBvaW50PSJvcmcuZWNsaXBzZS51aS5jb21tYW5kcyI+CisJCTxjb21tYW5kCisJCQlkZXNjcmlwdGlvbj0iT3BlbiB0aGUgcXVpY2sgb3V0bGluZS4iCisJCQlpZD0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLm91dGxpbmUuUXVpY2tPdXRsaW5lIgorCQkJbmFtZT0iUXVpY2sgT3V0bGluZSI+CisJCTwvY29tbWFuZD4KKwk8L2V4dGVuc2lvbj4KKwk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5tZW51cyI+CisJCTxtZW51Q29udHJpYnV0aW9uCisJCQlsb2NhdGlvblVSST0icG9wdXA6I1RleHRFZGl0b3JDb250ZXh0P2FmdGVyPWdyb3VwLm9wZW4iPgorCQkJPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iub3V0bGluZS5RdWlja091dGxpbmUiCisJCQkJc3R5bGU9InB1c2giCisJCQkJdG9vbHRpcD0iT3BlbiBRdWljayBPdXRsaW5lIj4KKwkJCQk8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+CisJCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsLkVkaXRvci5vcGVuZWQiLz4KKwkJCQk8L3Zpc2libGVXaGVuPgorCQkJPC9jb21tYW5kPgorCQk8L21lbnVDb250cmlidXRpb24+CisJPC9leHRlbnNpb24+CisgICAgPCEtLSBxdWlja2ZpeCBtYXJrZXIgcmVzb2x1dGlvbiBnZW5lcmF0b3IgZm9yIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wgLS0+CisgICAgPGV4dGVuc2lvbgorICAgICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5tYXJrZXJSZXNvbHV0aW9uIj4KKyAgICAgICAgPG1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLlBlcnNwZWN0aXZlRHNsRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLnF1aWNrZml4Lk1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IiCisgICAgICAgICAgICBtYXJrZXJUeXBlPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLnBlcnNwZWN0aXZlZHNsLmNoZWNrLmZhc3QiPgorICAgICAgICAgICAgPGF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIG5hbWU9IkZJWEFCTEVfS0VZIgorICAgICAgICAgICAgICAgIHZhbHVlPSJ0cnVlIj4KKyAgICAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICA8L21hcmtlclJlc29sdXRpb25HZW5lcmF0b3I+CisgICAgICAgIDxtYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5QZXJzcGVjdGl2ZURzbEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5xdWlja2ZpeC5NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yIgorICAgICAgICAgICAgbWFya2VyVHlwZT0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5wZXJzcGVjdGl2ZWRzbC5jaGVjay5ub3JtYWwiPgorICAgICAgICAgICAgPGF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIG5hbWU9IkZJWEFCTEVfS0VZIgorICAgICAgICAgICAgICAgIHZhbHVlPSJ0cnVlIj4KKyAgICAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICA8L21hcmtlclJlc29sdXRpb25HZW5lcmF0b3I+CisgICAgICAgIDxtYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5QZXJzcGVjdGl2ZURzbEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5xdWlja2ZpeC5NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yIgorICAgICAgICAgICAgbWFya2VyVHlwZT0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5wZXJzcGVjdGl2ZWRzbC5jaGVjay5leHBlbnNpdmUiPgorICAgICAgICAgICAgPGF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIG5hbWU9IkZJWEFCTEVfS0VZIgorICAgICAgICAgICAgICAgIHZhbHVlPSJ0cnVlIj4KKyAgICAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICA8L21hcmtlclJlc29sdXRpb25HZW5lcmF0b3I+CisgICAgPC9leHRlbnNpb24+CisgICAJPCEtLSBSZW5hbWUgUmVmYWN0b3JpbmcgLS0+CisJPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgorCQk8aGFuZGxlciAKKwkJCWNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLlBlcnNwZWN0aXZlRHNsRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkucmVmYWN0b3JpbmcudWkuRGVmYXVsdFJlbmFtZUVsZW1lbnRIYW5kbGVyIgorCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5yZWZhY3RvcmluZy5SZW5hbWVFbGVtZW50Ij4KKwkJCTxhY3RpdmVXaGVuPgorCQkJCTxyZWZlcmVuY2UKKwkJCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsLkVkaXRvci5vcGVuZWQiPgorCQkJCTwvcmVmZXJlbmNlPgorCQkJPC9hY3RpdmVXaGVuPgorCQk8L2hhbmRsZXI+CisJPC9leHRlbnNpb24+CisgICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgorICAgICAgICAgPG1lbnVDb250cmlidXRpb24KKyAgICAgICAgICAgIGxvY2F0aW9uVVJJPSJwb3B1cDojVGV4dEVkaXRvckNvbnRleHQ/YWZ0ZXI9Z3JvdXAuZWRpdCI+CisgICAgICAgICA8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLnJlZmFjdG9yaW5nLlJlbmFtZUVsZW1lbnQiCisgICAgICAgICAgICAgICBzdHlsZT0icHVzaCI+CisgICAgICAgICAgICA8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+CisgICAgICAgICAgICAgICA8cmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wuRWRpdG9yLm9wZW5lZCI+CisgICAgICAgICAgICAgICA8L3JlZmVyZW5jZT4KKyAgICAgICAgICAgIDwvdmlzaWJsZVdoZW4+CisgICAgICAgICA8L2NvbW1hbmQ+CisgICAgICA8L21lbnVDb250cmlidXRpb24+CisgICA8L2V4dGVuc2lvbj4KKyAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+CisJICAgIDxwYWdlCisJICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbCIKKwkgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLlBlcnNwZWN0aXZlRHNsRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkucmVmYWN0b3JpbmcudWkuUmVmYWN0b3JpbmdQcmVmZXJlbmNlUGFnZSIKKwkgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsLnJlZmFjdG9yaW5nIgorCSAgICAgICAgbmFtZT0iUmVmYWN0b3JpbmciPgorCSAgICAgICAgPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkua2V5d29yZF9QZXJzcGVjdGl2ZURzbCIvPgorCSAgICA8L3BhZ2U+CisJPC9leHRlbnNpb24+CisKKzwhLS0gVHlwZSBIaWVyYXJjaHkgIC0tPgorCTxleHRlbnNpb24KKwkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzIj4KKwkJPGhhbmRsZXIgCisJCQljbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5QZXJzcGVjdGl2ZURzbEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmhpZXJhcmNoeS5PcGVuVHlwZUhpZXJhcmNoeUhhbmRsZXIiCisJCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmhpZXJhcmNoeS5PcGVuVHlwZUhpZXJhcmNoeSI+CisJCQk8YWN0aXZlV2hlbj4KKwkJCQk8cmVmZXJlbmNlCisJCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbC5FZGl0b3Iub3BlbmVkIj4KKwkJCQk8L3JlZmVyZW5jZT4KKwkJCTwvYWN0aXZlV2hlbj4KKwkJPC9oYW5kbGVyPgorCQk8aGFuZGxlciAKKwkJCWNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLlBlcnNwZWN0aXZlRHNsRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkuaGllcmFyY2h5LlF1aWNrVHlwZUhpZXJhcmNoeUhhbmRsZXIiCisJCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpkdC51aS5lZGl0LnRleHQuamF2YS5vcGVuLmhpZXJhcmNoeSI+CisJCQk8YWN0aXZlV2hlbj4KKwkJCQk8cmVmZXJlbmNlCisJCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbC5FZGl0b3Iub3BlbmVkIj4KKwkJCQk8L3JlZmVyZW5jZT4KKwkJCTwvYWN0aXZlV2hlbj4KKwkJPC9oYW5kbGVyPgorCTwvZXh0ZW5zaW9uPgorCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4KKwkJPG1lbnVDb250cmlidXRpb24KKwkJCWxvY2F0aW9uVVJJPSJwb3B1cDojVGV4dEVkaXRvckNvbnRleHQ/YWZ0ZXI9Z3JvdXAub3BlbiI+CisJCQk8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmhpZXJhcmNoeS5PcGVuVHlwZUhpZXJhcmNoeSIKKwkJCQlzdHlsZT0icHVzaCIKKwkJCQl0b29sdGlwPSJPcGVuIFR5cGUgSGllcmFyY2h5Ij4KKwkJCQk8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+CisJCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsLkVkaXRvci5vcGVuZWQiLz4KKwkJCQk8L3Zpc2libGVXaGVuPgorCQkJPC9jb21tYW5kPgorCQk8L21lbnVDb250cmlidXRpb24+CisJCTxtZW51Q29udHJpYnV0aW9uCisJCQlsb2NhdGlvblVSST0icG9wdXA6I1RleHRFZGl0b3JDb250ZXh0P2FmdGVyPWdyb3VwLm9wZW4iPgorCQkJPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5qZHQudWkuZWRpdC50ZXh0LmphdmEub3Blbi5oaWVyYXJjaHkiCisJCQkJc3R5bGU9InB1c2giCisJCQkJdG9vbHRpcD0iUXVpY2sgVHlwZSBIaWVyYXJjaHkiPgorCQkJCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KKwkJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wuRWRpdG9yLm9wZW5lZCIvPgorCQkJCTwvdmlzaWJsZVdoZW4+CisJCQk8L2NvbW1hbmQ+CisJCTwvbWVudUNvbnRyaWJ1dGlvbj4KKwk8L2V4dGVuc2lvbj4KKwk8IS0tIENhbGwgSGllcmFjaHkgLS0+CisJPGV4dGVuc2lvbgorCQlwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgorCQk8aGFuZGxlciAKKwkJCWNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLlBlcnNwZWN0aXZlRHNsRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkuaGllcmFyY2h5Lk9wZW5DYWxsSGllcmFjaHlIYW5kbGVyIgorCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5oaWVyYXJjaHkuT3BlbkNhbGxIaWVyYXJjaHkiPgorCQkJPGFjdGl2ZVdoZW4+CisJCQkJPHJlZmVyZW5jZQorCQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wuRWRpdG9yLm9wZW5lZCI+CisJCQkJPC9yZWZlcmVuY2U+CisJCQk8L2FjdGl2ZVdoZW4+CisJCTwvaGFuZGxlcj4KKwk8L2V4dGVuc2lvbj4KKwkKKwk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5tZW51cyI+CisJCTxtZW51Q29udHJpYnV0aW9uCisJCQlsb2NhdGlvblVSST0icG9wdXA6I1RleHRFZGl0b3JDb250ZXh0P2FmdGVyPWdyb3VwLm9wZW4iPgorCQkJPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5oaWVyYXJjaHkuT3BlbkNhbGxIaWVyYXJjaHkiCisJCQkJc3R5bGU9InB1c2giCisJCQkJdG9vbHRpcD0iT3BlbiBDYWxsIEhpZXJhcmNoeSI+CisJCQkJPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgorCQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbC5FZGl0b3Iub3BlbmVkIi8+CisJCQkJPC92aXNpYmxlV2hlbj4KKwkJCTwvY29tbWFuZD4KKwkJPC9tZW51Q29udHJpYnV0aW9uPgorCTwvZXh0ZW5zaW9uPgorCTxleHRlbnNpb24KKyAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgorICAgICAgPGZhY3RvcnkgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuUGVyc3BlY3RpdmVEc2xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC5idWlsZGVyLnNtYXAuU3RyYXR1bUJyZWFrcG9pbnRBZGFwdGVyRmFjdG9yeSIKKyAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5YdGV4dEVkaXRvciI+CisgICAgICAgICA8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklUb2dnbGVCcmVha3BvaW50c1RhcmdldCIvPgorICAgICAgPC9mYWN0b3J5PiAKKyAgIDwvZXh0ZW5zaW9uPgorICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9yQWN0aW9ucyI+CisgICAgICA8ZWRpdG9yQ29udHJpYnV0aW9uIHRhcmdldElEPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wucnVsZXJBY3Rpb25zIj4KKwkgICAgIDxhY3Rpb24KKwkgICAgICAgICAgICAgbGFiZWw9Ik5vdCBVc2VkIgorCSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5QZXJzcGVjdGl2ZURzbEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuUnVsZXJUb2dnbGVCcmVha3BvaW50QWN0aW9uRGVsZWdhdGUiCisJICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgorCSAgICAgICAgICAgICBhY3Rpb25JRD0iUnVsZXJEb3VibGVDbGljayIKKwkgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wuZG91YmxlQ2xpY2tCcmVha3BvaW50QWN0aW9uIi8+CisJICA8L2VkaXRvckNvbnRyaWJ1dGlvbj4KKyAgIDwvZXh0ZW5zaW9uPgorICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+CisgICAgICA8dmlld2VyQ29udHJpYnV0aW9uCisgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbC5SdWxlckNvbnRleHQiCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbC5SdWxlclBvcHVwQWN0aW9ucyI+CisgICAgICAgICA8YWN0aW9uCisgICAgICAgICAgICBsYWJlbD0iVG9nZ2xlIEJyZWFrcG9pbnQiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5QZXJzcGVjdGl2ZURzbEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuUnVsZXJUb2dnbGVCcmVha3BvaW50QWN0aW9uRGVsZWdhdGUiCisgICAgICAgICAgICBtZW51YmFyUGF0aD0iZGVidWciCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbC5ydWxlckNvbnRleHRNZW51LnRvZ2dsZUJyZWFrcG9pbnRBY3Rpb24iPgorICAgICAgICAgPC9hY3Rpb24+CisgICAgICAgICA8YWN0aW9uCisgICAgICAgICAgICBsYWJlbD0iTm90IHVzZWQiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5QZXJzcGVjdGl2ZURzbEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuUnVsZXJFbmFibGVEaXNhYmxlQnJlYWtwb2ludEFjdGlvbkRlbGVnYXRlIgorICAgICAgICAgICAgbWVudWJhclBhdGg9ImRlYnVnIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wucnVsZXJDb250ZXh0TWVudS5lbmFibGVEaXNhYmxlQnJlYWtwb2ludEFjdGlvbiI+CisgICAgICAgICA8L2FjdGlvbj4KKyAgICAgICAgIDxhY3Rpb24KKyAgICAgICAgICAgbGFiZWw9IkJyZWFrcG9pbnQgUHJvcGVydGllcyIKKyAgICAgICAgICAgaGVscENvbnRleHRJZD0iYnJlYWtwb2ludF9wcm9wZXJ0aWVzX2FjdGlvbl9jb250ZXh0IgorICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5QZXJzcGVjdGl2ZURzbEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aS5hY3Rpb25zLkphdmFCcmVha3BvaW50UHJvcGVydGllc1J1bGVyQWN0aW9uRGVsZWdhdGUiCisgICAgICAgICAgIG1lbnViYXJQYXRoPSJncm91cC5wcm9wZXJ0aWVzIgorICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbC5ydWxlckNvbnRleHRNZW51Lm9wZW5CcmVhcG9pbnRQcm9wZXJ0aWVzQWN0aW9uIj4KKyAgICAgICAgIDwvYWN0aW9uPgorICAgICAgPC92aWV3ZXJDb250cmlidXRpb24+CisgICA8L2V4dGVuc2lvbj4KKyAgICA8IS0tIEludHJvZHVjZSBMb2NhbCBWYXJpYWJsZSBSZWZhY3RvcmluZyAtLT4KKwk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5oYW5kbGVycyI+CisJCTxoYW5kbGVyIAorCQkJY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuUGVyc3BlY3RpdmVEc2xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5yZWZhY3RvcmluZy5FeHRyYWN0VmFyaWFibGVIYW5kbGVyIgorCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5yZWZhY3RvcmluZy5FeHRyYWN0TG9jYWxWYXJpYWJsZSI+CisJCQk8YWN0aXZlV2hlbj4KKwkJCQk8cmVmZXJlbmNlCisJCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbC5FZGl0b3Iub3BlbmVkIj4KKwkJCQk8L3JlZmVyZW5jZT4KKwkJCTwvYWN0aXZlV2hlbj4KKwkJPC9oYW5kbGVyPgorCTwvZXh0ZW5zaW9uPgorICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4KKyAgICAgICAgIDxtZW51Q29udHJpYnV0aW9uCisgICAgICAgICAgICBsb2NhdGlvblVSST0icG9wdXA6I1RleHRFZGl0b3JDb250ZXh0P2FmdGVyPWdyb3VwLmVkaXQiPgorICAgICAgICAgPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5yZWZhY3RvcmluZy5FeHRyYWN0TG9jYWxWYXJpYWJsZSIKKyAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIj4KKyAgICAgICAgICAgIDx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KKyAgICAgICAgICAgICAgIDxyZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbC5FZGl0b3Iub3BlbmVkIj4KKyAgICAgICAgICAgICAgIDwvcmVmZXJlbmNlPgorICAgICAgICAgICAgPC92aXNpYmxlV2hlbj4KKyAgICAgICAgIDwvY29tbWFuZD4KKyAgICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4KKyAgIDwvZXh0ZW5zaW9uPiAgCisgICA8IS0tIE9wZW4gaW1wbGVtZW50YXRpb24gLS0+CisgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5oYW5kbGVycyI+CisgICAgICA8aGFuZGxlcgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuUGVyc3BlY3RpdmVEc2xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5uYXZpZ2F0aW9uLk9wZW5JbXBsZW1lbnRhdGlvbkhhbmRsZXIiCisgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLk9wZW5JbXBsZW1lbnRhdGlvbkNvbW1hbmQiPgorICAgICAgICAgICAgPGFjdGl2ZVdoZW4+CisJCQkJPHJlZmVyZW5jZQorCQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wuRWRpdG9yLm9wZW5lZCI+CisJCQkJPC9yZWZlcmVuY2U+CisJCQk8L2FjdGl2ZVdoZW4+CisgICAgICA8L2hhbmRsZXI+CisgICA8L2V4dGVuc2lvbj4KKyA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5tZW51cyI+CisgICAgICAgPG1lbnVDb250cmlidXRpb24KKyAgICAgICAgICAgIGxvY2F0aW9uVVJJPSJtZW51Om5hdmlnYXRlP2FmdGVyPW9wZW4uZXh0NCI+CisgICAgICAgICA8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLk9wZW5JbXBsZW1lbnRhdGlvbkNvbW1hbmQiPgorCQk8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+CisgICAgICAgICAgICAgIDxyZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsLkVkaXRvci5vcGVuZWQiPgorICAgICAgICAgICAgICA8L3JlZmVyZW5jZT4KKwkJPC92aXNpYmxlV2hlbj4KKyAgICAgICAgIDwvY29tbWFuZD4KKyAgICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4KKyAgIDwvZXh0ZW5zaW9uPgorCisgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUuY29udGVudFZpZXdlcnMiPgorICAgIDx2aWV3ZXIgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wuY29tcGFyZS5jb250ZW50Vmlld2VycyIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLlBlcnNwZWN0aXZlRHNsRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuY29tcGFyZS5JbmplY3RhYmxlVmlld2VyQ3JlYXRvciIKKyAgICAgICAgICAgIGV4dGVuc2lvbnM9InBlcnNwZWN0aXZlIj4KKyAgICA8L3ZpZXdlcj4KKyAgPC9leHRlbnNpb24+CisgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUuY29udGVudE1lcmdlVmlld2VycyI+CisgICAgPHZpZXdlciBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbC5jb21wYXJlLmNvbnRlbnRNZXJnZVZpZXdlcnMiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5QZXJzcGVjdGl2ZURzbEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmNvbXBhcmUuSW5qZWN0YWJsZVZpZXdlckNyZWF0b3IiCisgICAgICAgICAgICBleHRlbnNpb25zPSJwZXJzcGVjdGl2ZSIgbGFiZWw9IlBlcnNwZWN0aXZlRHNsIENvbXBhcmUiPgorICAgICA8L3ZpZXdlcj4KKyAgPC9leHRlbnNpb24+CisgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMuZG9jdW1lbnRQcm92aWRlcnMiPgorICAgIDxwcm92aWRlciBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbC5lZGl0b3JzLmRvY3VtZW50UHJvdmlkZXJzIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuUGVyc3BlY3RpdmVEc2xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IubW9kZWwuWHRleHREb2N1bWVudFByb3ZpZGVyIgorICAgICAgICAgICAgZXh0ZW5zaW9ucz0icGVyc3BlY3RpdmUiPgorICAgIDwvcHJvdmlkZXI+CisgIDwvZXh0ZW5zaW9uPgorCis8L3BsdWdpbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvcG9tLnhtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjRhMjJjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9wb20ueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorPCEtLSMgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgLS0+Cis8IS0tIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIC0tPgorPCEtLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIC0tPgorPCEtLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgLS0+Cis8IS0tIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAtLT4KKzwhLS0jIC0tPgorPCEtLSMgQ29udHJpYnV0b3JzOiAtLT4KKzwhLS0jICAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAtLT4KKzwhLS0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmFnZ3JlZ2F0b3I8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjAuOS4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8cmVsYXRpdmVQYXRoPi4uPC9yZWxhdGl2ZVBhdGg+CisgICAgPC9wYXJlbnQ+CisgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aTwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmVjbGlwc2UtcGx1Z2luPC9wYWNrYWdpbmc+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL0Fic3RyYWN0UGVyc3BlY3RpdmVEc2xVaU1vZHVsZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvQWJzdHJhY3RQZXJzcGVjdGl2ZURzbFVpTW9kdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhhMTdlYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL0Fic3RyYWN0UGVyc3BlY3RpdmVEc2xVaU1vZHVsZS5qYXZhCkBAIC0wLDAgKzEsMzc0IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5EZWZhdWx0VWlNb2R1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47CisKKy8qKgorICogTWFudWFsIG1vZGlmaWNhdGlvbnMgZ28gdG8ge29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuUGVyc3BlY3RpdmVEc2xVaU1vZHVsZX0KKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQZXJzcGVjdGl2ZURzbFVpTW9kdWxlIGV4dGVuZHMgRGVmYXVsdFVpTW9kdWxlIHsKKwkKKwlwdWJsaWMgQWJzdHJhY3RQZXJzcGVjdGl2ZURzbFVpTW9kdWxlKEFic3RyYWN0VUlQbHVnaW4gcGx1Z2luKSB7CisJCXN1cGVyKHBsdWdpbik7CisJfQorCQorCQorCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmdlbmVyYXRvci5JbXBsaWNpdFVpRnJhZ21lbnQKKwlwdWJsaWMgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI8b3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuY29udGFpbmVycy5JQWxsQ29udGFpbmVyc1N0YXRlPiBwcm92aWRlSUFsbENvbnRhaW5lcnNTdGF0ZSgpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLnNoYXJlZC5BY2Nlc3MuZ2V0SmF2YVByb2plY3RzU3RhdGUoKTsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC51aS5nZW5lcmF0b3IuSW1wbGljaXRVaUZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuWHRleHRFZGl0b3I+IGJpbmRYdGV4dEVkaXRvcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmVkaXRvci5YYmFzZUVkaXRvci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC51aS5nZW5lcmF0b3IuSW1wbGljaXRVaUZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IubW9kZWwuWHRleHREb2N1bWVudFByb3ZpZGVyPiBiaW5kWHRleHREb2N1bWVudFByb3ZpZGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkuZWRpdG9yLlhiYXNlRG9jdW1lbnRQcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IucGFyc2VyLmFudGxyLlh0ZXh0QW50bHJHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuSVByb3Bvc2FsQ29uZmxpY3RIZWxwZXI+IGJpbmRJUHJvcG9zYWxDb25mbGljdEhlbHBlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LmFudGxyLkFudGxyUHJvcG9zYWxDb25mbGljdEhlbHBlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IucGFyc2VyLmFudGxyLlh0ZXh0QW50bHJHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUhpZ2hsaWdodGluZ0xleGVyKGNvbS5nb29nbGUuaW5qZWN0LkJpbmRlciBiaW5kZXIpIHsKKwkJYmluZGVyLmJpbmQob3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLkxleGVyLmNsYXNzKS5hbm5vdGF0ZWRXaXRoKGNvbS5nb29nbGUuaW5qZWN0Lm5hbWUuTmFtZXMubmFtZWQob3JnLmVjbGlwc2UueHRleHQudWkuTGV4ZXJVSUJpbmRpbmdzLkhJR0hMSUdIVElORykpLnRvKG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUucGFyc2VyLmFudGxyLmludGVybmFsLkludGVybmFsUGVyc3BlY3RpdmVEc2xMZXhlci5jbGFzcyk7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnBhcnNlci5hbnRsci5YdGV4dEFudGxyR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgdm9pZCBjb25maWd1cmVIaWdobGlnaHRpbmdUb2tlbkRlZlByb3ZpZGVyKGNvbS5nb29nbGUuaW5qZWN0LkJpbmRlciBiaW5kZXIpIHsKKwkJYmluZGVyLmJpbmQob3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLklUb2tlbkRlZlByb3ZpZGVyLmNsYXNzKS5hbm5vdGF0ZWRXaXRoKGNvbS5nb29nbGUuaW5qZWN0Lm5hbWUuTmFtZXMubmFtZWQob3JnLmVjbGlwc2UueHRleHQudWkuTGV4ZXJVSUJpbmRpbmdzLkhJR0hMSUdIVElORykpLnRvKG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5BbnRsclRva2VuRGVmUHJvdmlkZXIuY2xhc3MpOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5idWlsZGVyLkJ1aWxkZXJJbnRlZ3JhdGlvbkZyYWdtZW50CisJcHVibGljIHZvaWQgY29uZmlndXJlSVJlc291cmNlRGVzY3JpcHRpb25zQnVpbGRlclNjb3BlKGNvbS5nb29nbGUuaW5qZWN0LkJpbmRlciBiaW5kZXIpIHsKKwkJYmluZGVyLmJpbmQob3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuSVJlc291cmNlRGVzY3JpcHRpb25zLmNsYXNzKS5hbm5vdGF0ZWRXaXRoKGNvbS5nb29nbGUuaW5qZWN0Lm5hbWUuTmFtZXMubmFtZWQob3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuaW1wbC5SZXNvdXJjZURlc2NyaXB0aW9uc1Byb3ZpZGVyLk5BTUVEX0JVSUxERVJfU0NPUEUpKS50byhvcmcuZWNsaXBzZS54dGV4dC5idWlsZGVyLmNsdXN0ZXJpbmcuQ3VycmVudERlc2NyaXB0aW9ucy5SZXNvdXJjZVNldEF3YXJlLmNsYXNzKTsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IuYnVpbGRlci5CdWlsZGVySW50ZWdyYXRpb25GcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLklYdGV4dEVkaXRvckNhbGxiYWNrPiBiaW5kSVh0ZXh0RWRpdG9yQ2FsbGJhY2soKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5idWlsZGVyLm5hdHVyZS5OYXR1cmVBZGRpbmdFZGl0b3JDYWxsYmFjay5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IuYnVpbGRlci5CdWlsZGVySW50ZWdyYXRpb25GcmFnbWVudAorCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUlSZXNvdXJjZURlc2NyaXB0aW9uc1BlcnNpc3RlZChjb20uZ29vZ2xlLmluamVjdC5CaW5kZXIgYmluZGVyKSB7CisJCWJpbmRlci5iaW5kKG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLklSZXNvdXJjZURlc2NyaXB0aW9ucy5jbGFzcykuYW5ub3RhdGVkV2l0aChjb20uZ29vZ2xlLmluamVjdC5uYW1lLk5hbWVzLm5hbWVkKG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLmltcGwuUmVzb3VyY2VEZXNjcmlwdGlvbnNQcm92aWRlci5QRVJTSVNURURfREVTQ1JJUFRJT05TKSkudG8ob3JnLmVjbGlwc2UueHRleHQuYnVpbGRlci5idWlsZGVyU3RhdGUuSUJ1aWxkZXJTdGF0ZS5jbGFzcyk7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLmJ1aWxkZXIuQnVpbGRlckludGVncmF0aW9uRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5Eb2N1bWVudEJhc2VkRGlydHlSZXNvdXJjZT4gYmluZERvY3VtZW50QmFzZWREaXJ0eVJlc291cmNlKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQuYnVpbGRlci5pbXBsLlBlcnNpc3RlbnREYXRhQXdhcmVEaXJ0eVJlc291cmNlLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5nZW5lcmF0b3IuR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LmJ1aWxkZXIuSVh0ZXh0QnVpbGRlclBhcnRpY2lwYW50PiBiaW5kSVh0ZXh0QnVpbGRlclBhcnRpY2lwYW50KCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQuYnVpbGRlci5CdWlsZGVyUGFydGljaXBhbnQuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLmdlbmVyYXRvci5HZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdCBiaW5kSVdvcmtzcGFjZVJvb3RUb0luc3RhbmNlKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IuZ2VuZXJhdG9yLkdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIHZvaWQgY29uZmlndXJlQnVpbGRlclByZWZlcmVuY2VTdG9yZUluaXRpYWxpemVyKGNvbS5nb29nbGUuaW5qZWN0LkJpbmRlciBiaW5kZXIpIHsKKwkJYmluZGVyLmJpbmQob3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlU3RvcmVJbml0aWFsaXplci5jbGFzcykuYW5ub3RhdGVkV2l0aChjb20uZ29vZ2xlLmluamVjdC5uYW1lLk5hbWVzLm5hbWVkKCJidWlsZGVyUHJlZmVyZW5jZUluaXRpYWxpemVyIikpLnRvKG9yZy5lY2xpcHNlLnh0ZXh0LmJ1aWxkZXIucHJlZmVyZW5jZXMuQnVpbGRlclByZWZlcmVuY2VBY2Nlc3MuSW5pdGlhbGl6ZXIuY2xhc3MpOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmdlbmVyYXRvci5sYWJlbGluZy5MYWJlbFByb3ZpZGVyRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI+IGJpbmRJTGFiZWxQcm92aWRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmxhYmVsaW5nLlhiYXNlTGFiZWxQcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC51aS5nZW5lcmF0b3IubGFiZWxpbmcuTGFiZWxQcm92aWRlckZyYWdtZW50CisJcHVibGljIHZvaWQgY29uZmlndXJlUmVzb3VyY2VVSVNlcnZpY2VMYWJlbFByb3ZpZGVyKGNvbS5nb29nbGUuaW5qZWN0LkJpbmRlciBiaW5kZXIpIHsKKwkJYmluZGVyLmJpbmQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlci5jbGFzcykuYW5ub3RhdGVkV2l0aChvcmcuZWNsaXBzZS54dGV4dC51aS5yZXNvdXJjZS5SZXNvdXJjZVNlcnZpY2VEZXNjcmlwdGlvbkxhYmVsUHJvdmlkZXIuY2xhc3MpLnRvKG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmxhYmVsaW5nLlhiYXNlRGVzY3JpcHRpb25MYWJlbFByb3ZpZGVyLmNsYXNzKTsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC51aS5nZW5lcmF0b3Iub3V0bGluZS5PdXRsaW5lVHJlZVByb3ZpZGVyRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5vdXRsaW5lLklPdXRsaW5lVHJlZVByb3ZpZGVyPiBiaW5kSU91dGxpbmVUcmVlUHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLm91dGxpbmUuUGVyc3BlY3RpdmVEc2xPdXRsaW5lVHJlZVByb3ZpZGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmdlbmVyYXRvci5vdXRsaW5lLk91dGxpbmVUcmVlUHJvdmlkZXJGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLm91dGxpbmUuaW1wbC5JT3V0bGluZVRyZWVTdHJ1Y3R1cmVQcm92aWRlcj4gYmluZElPdXRsaW5lVHJlZVN0cnVjdHVyZVByb3ZpZGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5vdXRsaW5lLlBlcnNwZWN0aXZlRHNsT3V0bGluZVRyZWVQcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC51aS5nZW5lcmF0b3IucXVpY2tmaXguUXVpY2tmaXhQcm92aWRlckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IucXVpY2tmaXguSXNzdWVSZXNvbHV0aW9uUHJvdmlkZXI+IGJpbmRJc3N1ZVJlc29sdXRpb25Qcm92aWRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkucXVpY2tmaXguUGVyc3BlY3RpdmVEc2xRdWlja2ZpeFByb3ZpZGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmdlbmVyYXRvci5jb250ZW50QXNzaXN0LkNvbnRlbnRBc3Npc3RGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRQcm9wb3NhbFByb3ZpZGVyPiBiaW5kSUNvbnRlbnRQcm9wb3NhbFByb3ZpZGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5jb250ZW50YXNzaXN0LlBlcnNwZWN0aXZlRHNsUHJvcG9zYWxQcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IucGFyc2VyLmFudGxyLlh0ZXh0QW50bHJVaUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0Q29udGV4dC5GYWN0b3J5PiBiaW5kQ29udGVudEFzc2lzdENvbnRleHQkRmFjdG9yeSgpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LmFudGxyLlBhcnNlckJhc2VkQ29udGVudEFzc2lzdENvbnRleHRGYWN0b3J5LmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5wYXJzZXIuYW50bHIuWHRleHRBbnRsclVpR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LmFudGxyLklDb250ZW50QXNzaXN0UGFyc2VyPiBiaW5kSUNvbnRlbnRBc3Npc3RQYXJzZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLmNvbnRlbnRhc3Npc3QuYW50bHIuUGVyc3BlY3RpdmVEc2xQYXJzZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnBhcnNlci5hbnRsci5YdGV4dEFudGxyVWlHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUNvbnRlbnRBc3Npc3RMZXhlclByb3ZpZGVyKGNvbS5nb29nbGUuaW5qZWN0LkJpbmRlciBiaW5kZXIpIHsKKwkJYmluZGVyLmJpbmQob3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5jb250ZW50YXNzaXN0LmFudGxyLmludGVybmFsLkludGVybmFsUGVyc3BlY3RpdmVEc2xMZXhlci5jbGFzcykudG9Qcm92aWRlcihvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuTGV4ZXJQcm92aWRlci5jcmVhdGUob3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5jb250ZW50YXNzaXN0LmFudGxyLmludGVybmFsLkludGVybmFsUGVyc3BlY3RpdmVEc2xMZXhlci5jbGFzcykpOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5wYXJzZXIuYW50bHIuWHRleHRBbnRsclVpR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgdm9pZCBjb25maWd1cmVDb250ZW50QXNzaXN0TGV4ZXIoY29tLmdvb2dsZS5pbmplY3QuQmluZGVyIGJpbmRlcikgeworCQliaW5kZXIuYmluZChvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5hbnRsci5pbnRlcm5hbC5MZXhlci5jbGFzcykuYW5ub3RhdGVkV2l0aChjb20uZ29vZ2xlLmluamVjdC5uYW1lLk5hbWVzLm5hbWVkKG9yZy5lY2xpcHNlLnh0ZXh0LnVpLkxleGVyVUlCaW5kaW5ncy5DT05URU5UX0FTU0lTVCkpLnRvKG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuY29udGVudGFzc2lzdC5hbnRsci5pbnRlcm5hbC5JbnRlcm5hbFBlcnNwZWN0aXZlRHNsTGV4ZXIuY2xhc3MpOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmdlbmVyYXRvci5yZWZhY3RvcmluZy5SZWZhY3RvckVsZW1lbnROYW1lRnJhZ21lbnQKKwlwdWJsaWMgdm9pZCBjb25maWd1cmVJUHJlZmVyZW5jZVN0b3JlSW5pdGlhbGl6ZXIoY29tLmdvb2dsZS5pbmplY3QuQmluZGVyIGJpbmRlcikgeworCQliaW5kZXIuYmluZChvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VTdG9yZUluaXRpYWxpemVyLmNsYXNzKS5hbm5vdGF0ZWRXaXRoKGNvbS5nb29nbGUuaW5qZWN0Lm5hbWUuTmFtZXMubmFtZWQoIlJlZmFjdG9yaW5nUHJlZmVyZW5jZXMiKSkudG8ob3JnLmVjbGlwc2UueHRleHQudWkucmVmYWN0b3JpbmcudWkuUmVmYWN0b3JpbmdQcmVmZXJlbmNlcy5Jbml0aWFsaXplci5jbGFzcyk7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQudWkuZ2VuZXJhdG9yLnJlZmFjdG9yaW5nLlJlZmFjdG9yRWxlbWVudE5hbWVGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudWkucmVmYWN0b3JpbmcudWkuSVJlbmFtZVN1cHBvcnQuRmFjdG9yeT4gYmluZElSZW5hbWVTdXBwb3J0JEZhY3RvcnkoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMudWkucmVmYWN0b3JpbmcuSmR0UmVuYW1lU3VwcG9ydC5GYWN0b3J5LmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmdlbmVyYXRvci5yZWZhY3RvcmluZy5SZWZhY3RvckVsZW1lbnROYW1lRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLnJlZmFjdG9yaW5nLklSZW5hbWVTdHJhdGVneS5Qcm92aWRlcj4gYmluZElSZW5hbWVTdHJhdGVneSRQcm92aWRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy51aS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudC5Kdm1NZW1iZXJSZW5hbWVTdHJhdGVneS5Qcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC51aS5nZW5lcmF0b3IucmVmYWN0b3JpbmcuUmVmYWN0b3JFbGVtZW50TmFtZUZyYWdtZW50CisJcHVibGljIHZvaWQgY29uZmlndXJlSnZtTWVtYmVyUmVuYW1lU3RyYXRlZ3kkUHJvdmlkZXIkRGVsZWdhdGUoY29tLmdvb2dsZS5pbmplY3QuQmluZGVyIGJpbmRlcikgeworCQliaW5kZXIuYmluZChvcmcuZWNsaXBzZS54dGV4dC51aS5yZWZhY3RvcmluZy5JUmVuYW1lU3RyYXRlZ3kuUHJvdmlkZXIuY2xhc3MpLmFubm90YXRlZFdpdGgob3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLnVpLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50Lkp2bU1lbWJlclJlbmFtZVN0cmF0ZWd5LlByb3ZpZGVyLkRlbGVnYXRlLmNsYXNzKS50byhvcmcuZWNsaXBzZS54dGV4dC51aS5yZWZhY3RvcmluZy5pbXBsLkRlZmF1bHRSZW5hbWVTdHJhdGVneVByb3ZpZGVyLmNsYXNzKTsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IudHlwZXMuVHlwZXNHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgYmluZENsYXNzTG9hZGVyVG9JbnN0YW5jZSgpIHsKKwkJcmV0dXJuIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IudHlwZXMuVHlwZXNHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLmFjY2Vzcy5JSnZtVHlwZVByb3ZpZGVyLkZhY3Rvcnk+IGJpbmRJSnZtVHlwZVByb3ZpZGVyJEZhY3RvcnkoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuYWNjZXNzLmpkdC5KZHRUeXBlUHJvdmlkZXJGYWN0b3J5LmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci50eXBlcy5UeXBlc0dlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMueHRleHQuQWJzdHJhY3RUeXBlU2NvcGVQcm92aWRlcj4gYmluZEFic3RyYWN0VHlwZVNjb3BlUHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMueHRleHQudWkuSmR0QmFzZWRTaW1wbGVUeXBlU2NvcGVQcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IudHlwZXMuVHlwZXNHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLnh0ZXh0LnVpLklUeXBlc1Byb3Bvc2FsUHJvdmlkZXI+IGJpbmRJVHlwZXNQcm9wb3NhbFByb3ZpZGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLnh0ZXh0LnVpLkpkdFR5cGVzUHJvcG9zYWxQcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IudHlwZXMuVHlwZXNHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLmFjY2Vzcy5qZHQuSUphdmFQcm9qZWN0UHJvdmlkZXI+IGJpbmRJSmF2YVByb2plY3RQcm92aWRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy54dGV4dC51aS5YdGV4dFJlc291cmNlU2V0QmFzZWRQcm9qZWN0UHJvdmlkZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnR5cGVzLlR5cGVzR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LlByZWZpeE1hdGNoZXI+IGJpbmRQcmVmaXhNYXRjaGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuRlFOUHJlZml4TWF0Y2hlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IudHlwZXMuVHlwZXNHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLklWYWxpZGF0aW9uSm9iU2NoZWR1bGVyPiBiaW5kSVZhbGlkYXRpb25Kb2JTY2hlZHVsZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMueHRleHQudWkuSmR0VmFsaWRhdGlvbkpvYlNjaGVkdWxlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IudHlwZXMuVHlwZXNHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudWkucmVmYWN0b3JpbmcuaW1wbC5SZWZhY3RvcmluZ1Jlc291cmNlU2V0UHJvdmlkZXI+IGJpbmRSZWZhY3RvcmluZ1Jlc291cmNlU2V0UHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMudWkucmVmYWN0b3JpbmcuSnZtUmVmYWN0b3JpbmdSZXNvdXJjZVNldFByb3ZpZGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iuc3ludGF4Y29sb3JpbmcuQWJzdHJhY3RBbnRsclRva2VuVG9BdHRyaWJ1dGVJZE1hcHBlcj4gYmluZEFic3RyYWN0QW50bHJUb2tlblRvQXR0cmlidXRlSWRNYXBwZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5zeW50YXhjb2xvcmluZy5YYmFzZVRva2VuVG9BdHRyaWJ1dGVJZE1hcHBlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuQWJzdHJhY3RKYXZhQmFzZWRDb250ZW50UHJvcG9zYWxQcm92aWRlci5SZWZlcmVuY2VQcm9wb3NhbENyZWF0b3I+IGJpbmRBYnN0cmFjdEphdmFCYXNlZENvbnRlbnRQcm9wb3NhbFByb3ZpZGVyJFJlZmVyZW5jZVByb3Bvc2FsQ3JlYXRvcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmNvbnRlbnRhc3Npc3QuWGJhc2VSZWZlcmVuY2VQcm9wb3NhbENyZWF0b3IuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3Nvcj4gYmluZElDb250ZW50QXNzaXN0UHJvY2Vzc29yKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuUmVwZWF0ZWRDb250ZW50QXNzaXN0UHJvY2Vzc29yLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iuc3ludGF4Y29sb3JpbmcuSVNlbWFudGljSGlnaGxpZ2h0aW5nQ2FsY3VsYXRvcj4gYmluZElTZW1hbnRpY0hpZ2hsaWdodGluZ0NhbGN1bGF0b3IoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5oaWdobGlnaHRpbmcuWGJhc2VIaWdobGlnaHRpbmdDYWxjdWxhdG9yLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iuc3ludGF4Y29sb3JpbmcuSUhpZ2hsaWdodGluZ0NvbmZpZ3VyYXRpb24+IGJpbmRJSGlnaGxpZ2h0aW5nQ29uZmlndXJhdGlvbigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmhpZ2hsaWdodGluZy5YYmFzZUhpZ2hsaWdodGluZ0NvbmZpZ3VyYXRpb24uY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5ob3Zlci5JRU9iamVjdEhvdmVyUHJvdmlkZXI+IGJpbmRJRU9iamVjdEhvdmVyUHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5ob3Zlci5YYmFzZUhvdmVyUHJvdmlkZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5ob3Zlci5JRU9iamVjdEhvdmVyPiBiaW5kSUVPYmplY3RIb3ZlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmhvdmVyLlhiYXNlRGlzcGF0Y2hpbmdFT2JqZWN0VGV4dEhvdmVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuaG92ZXIuaHRtbC5JRU9iamVjdEhvdmVyRG9jdW1lbnRhdGlvblByb3ZpZGVyPiBiaW5kSUVPYmplY3RIb3ZlckRvY3VtZW50YXRpb25Qcm92aWRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmhvdmVyLlhiYXNlSG92ZXJEb2N1bWVudGF0aW9uUHJvdmlkZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5xdWlja2ZpeC5EZWZhdWx0UXVpY2tmaXhQcm92aWRlci5Dcm9zc1JlZlJlc29sdXRpb25Db252ZXJ0ZXI+IGJpbmREZWZhdWx0UXVpY2tmaXhQcm92aWRlciRDcm9zc1JlZlJlc29sdXRpb25Db252ZXJ0ZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5xdWlja2ZpeC5YYmFzZUNyb3NzUmVmUmVzb2x1dGlvbkNvbnZlcnRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCUBvcmcuZWNsaXBzZS54dGV4dC5zZXJ2aWNlLlNpbmdsZXRvbkJpbmRpbmcoZWFnZXI9dHJ1ZSkJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS52YWxpZGF0aW9uLlhiYXNlVUlWYWxpZGF0b3I+IGJpbmRYYmFzZVVJVmFsaWRhdG9yKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkudmFsaWRhdGlvbi5YYmFzZVVJVmFsaWRhdG9yLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuaHlwZXJsaW5raW5nLklIeXBlcmxpbmtIZWxwZXI+IGJpbmRJSHlwZXJsaW5rSGVscGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkubmF2aWdhdGlvbi5UeXBlTGl0ZXJhbEF3YXJlSHlwZXJsaW5rSGVscGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS50eXBlc3lzdGVtLmludGVybmFsLklGZWF0dXJlU2NvcGVUcmFja2VyLlByb3ZpZGVyPiBiaW5kSUZlYXR1cmVTY29wZVRyYWNrZXIkUHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS50eXBlc3lzdGVtLmludGVybmFsLk9wdGltaXppbmdGZWF0dXJlU2NvcGVUcmFja2VyUHJvdmlkZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5maW5kcmVmcy5GaW5kUmVmZXJlbmNlc0hhbmRsZXI+IGJpbmRGaW5kUmVmZXJlbmNlc0hhbmRsZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5qdm1tb2RlbC5maW5kcmVmcy5Kdm1Nb2RlbEZpbmRSZWZlcmVuY2VIYW5kbGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuZmluZHJlZnMuUmVmZXJlbmNlUXVlcnlFeGVjdXRvcj4gYmluZFJlZmVyZW5jZVF1ZXJ5RXhlY3V0b3IoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5qdm1tb2RlbC5maW5kcmVmcy5Kdm1Nb2RlbFJlZmVyZW5jZVF1ZXJ5RXhlY3V0b3IuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLnJlZmFjdG9yaW5nLklEZXBlbmRlbnRFbGVtZW50c0NhbGN1bGF0b3I+IGJpbmRJRGVwZW5kZW50RWxlbWVudHNDYWxjdWxhdG9yKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkuanZtbW9kZWwucmVmYWN0b3JpbmcuSnZtTW9kZWxEZXBlbmRlbnRFbGVtZW50c0NhbGN1bGF0b3IuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLnJlZmFjdG9yaW5nLklSZW5hbWVSZWZhY3RvcmluZ1Byb3ZpZGVyPiBiaW5kSVJlbmFtZVJlZmFjdG9yaW5nUHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5qdm1tb2RlbC5yZWZhY3RvcmluZy5qZHQuQ29tYmluZWRKdm1KZHRSZW5hbWVSZWZhY3RvcmluZ1Byb3ZpZGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5yZWZhY3RvcmluZy5JUmVmZXJlbmNlVXBkYXRlcj4gYmluZElSZWZlcmVuY2VVcGRhdGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkucmVmYWN0b3JpbmcuWGJhc2VSZWZlcmVuY2VVcGRhdGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5yZWZhY3RvcmluZy51aS5JUmVuYW1lQ29udGV4dEZhY3Rvcnk+IGJpbmRJUmVuYW1lQ29udGV4dEZhY3RvcnkoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5qdm1tb2RlbC5yZWZhY3RvcmluZy5qZHQuQ29tYmluZWRKdm1KZHRSZW5hbWVDb250ZXh0RmFjdG9yeS5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLnVpLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50LkpkdFJlbmFtZVBhcnRpY2lwYW50LkNvbnRleHRGYWN0b3J5PiBiaW5kSmR0UmVuYW1lUGFydGljaXBhbnQkQ29udGV4dEZhY3RvcnkoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5qdm1tb2RlbC5yZWZhY3RvcmluZy5Kdm1Nb2RlbEpkdFJlbmFtZVBhcnRpY2lwYW50Q29udGV4dC5Db250ZXh0RmFjdG9yeS5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudWkucmVmYWN0b3JpbmcuSVJlbmFtZVN0cmF0ZWd5PiBiaW5kSVJlbmFtZVN0cmF0ZWd5KCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkuanZtbW9kZWwucmVmYWN0b3JpbmcuRGVmYXVsdEp2bU1vZGVsUmVuYW1lU3RyYXRlZ3kuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5vdXRsaW5lLmltcGwuT3V0bGluZU5vZGVFbGVtZW50T3BlbmVyPiBiaW5kT3V0bGluZU5vZGVFbGVtZW50T3BlbmVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkuanZtbW9kZWwub3V0bGluZS5Kdm1PdXRsaW5lTm9kZUVsZW1lbnRPcGVuZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5HbG9iYWxVUklFZGl0b3JPcGVuZXI+IGJpbmRHbG9iYWxVUklFZGl0b3JPcGVuZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMudWkubmF2aWdhdGlvbi5HbG9iYWxEZXJpdmVkTWVtYmVyQXdhcmVVUklFZGl0b3JPcGVuZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5vY2N1cnJlbmNlcy5JT2NjdXJyZW5jZUNvbXB1dGVyPiBiaW5kSU9jY3VycmVuY2VDb21wdXRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmp2bW1vZGVsLm9jY3VycmVuY2UuSnZtTW9kZWxPY2N1cnJlbmNlQ29tcHV0ZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy51aS5xdWVyeS5JSmF2YVNlYXJjaFBhcnRpY2lwYXRpb24+IGJpbmRJSmF2YVNlYXJjaFBhcnRpY2lwYXRpb24oKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMudWkucXVlcnkuSUphdmFTZWFyY2hQYXJ0aWNpcGF0aW9uLk5vLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIHZvaWQgY29uZmlndXJlTGFuZ3VhZ2VTcGVjaWZpY1VSSUVkaXRvck9wZW5lcihjb20uZ29vZ2xlLmluamVjdC5CaW5kZXIgYmluZGVyKSB7CisJCWlmIChvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJLmlzV29ya2JlbmNoUnVubmluZygpKSB7IAorCQkJYmluZGVyLmJpbmQob3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLklVUklFZGl0b3JPcGVuZXIuY2xhc3MpLmFubm90YXRlZFdpdGgob3JnLmVjbGlwc2UueHRleHQudWkuTGFuZ3VhZ2VTcGVjaWZpYy5jbGFzcykudG8ob3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkuanZtbW9kZWwubmF2aWdhdGlvbi5EZXJpdmVkTWVtYmVyQXdhcmVFZGl0b3JPcGVuZXIuY2xhc3MpOyAKKwkJCWJpbmRlci5iaW5kKG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy51aS5uYXZpZ2F0aW9uLklEZXJpdmVkTWVtYmVyQXdhcmVFZGl0b3JPcGVuZXIuY2xhc3MpLnRvKG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmp2bW1vZGVsLm5hdmlnYXRpb24uRGVyaXZlZE1lbWJlckF3YXJlRWRpdG9yT3BlbmVyLmNsYXNzKTsgCisJCX07CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmtEZXRlY3Rvcj4gYmluZElIeXBlcmxpbmtEZXRlY3RvcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLm5hdmlnYXRpb24uWGJhc2VIeXBlcmxpbmtEZXRlY3Rvci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkucXVpY2tmaXguSmF2YVR5cGVRdWlja2ZpeGVzPiBiaW5kSmF2YVR5cGVRdWlja2ZpeGVzKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkucXVpY2tmaXguSmF2YVR5cGVRdWlja2ZpeGVzTm9JbXBvcnRTZWN0aW9uLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmdlbmVyYXRvci50ZW1wbGF0ZXMuQ29kZXRlbXBsYXRlc0dlbmVyYXRvckZyYWdtZW50CisJcHVibGljIGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyPG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmNvZGV0ZW1wbGF0ZXMudWkucHJlZmVyZW5jZXMuVGVtcGxhdGVzTGFuZ3VhZ2VDb25maWd1cmF0aW9uPiBwcm92aWRlVGVtcGxhdGVzTGFuZ3VhZ2VDb25maWd1cmF0aW9uKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQudWkuY29kZXRlbXBsYXRlcy51aS5BY2Nlc3NpYmxlQ29kZXRlbXBsYXRlc0FjdGl2YXRvci5nZXRUZW1wbGF0ZXNMYW5ndWFnZUNvbmZpZ3VyYXRpb25Qcm92aWRlcigpOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmdlbmVyYXRvci50ZW1wbGF0ZXMuQ29kZXRlbXBsYXRlc0dlbmVyYXRvckZyYWdtZW50CisJcHVibGljIGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyPG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmNvZGV0ZW1wbGF0ZXMudWkucmVnaXN0cnkuTGFuZ3VhZ2VSZWdpc3RyeT4gcHJvdmlkZUxhbmd1YWdlUmVnaXN0cnkoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC51aS5jb2RldGVtcGxhdGVzLnVpLkFjY2Vzc2libGVDb2RldGVtcGxhdGVzQWN0aXZhdG9yLmdldExhbmd1YWdlUmVnaXN0cnkoKTsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC51aS5nZW5lcmF0b3IudGVtcGxhdGVzLkNvZGV0ZW1wbGF0ZXNHZW5lcmF0b3JGcmFnbWVudAorCUBvcmcuZWNsaXBzZS54dGV4dC5zZXJ2aWNlLlNpbmdsZXRvbkJpbmRpbmcoZWFnZXI9dHJ1ZSkJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5jb2RldGVtcGxhdGVzLnVpLnJlZ2lzdHJ5Lkxhbmd1YWdlUmVnaXN0cmFyPiBiaW5kTGFuZ3VhZ2VSZWdpc3RyYXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC51aS5jb2RldGVtcGxhdGVzLnVpLnJlZ2lzdHJ5Lkxhbmd1YWdlUmVnaXN0cmFyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmdlbmVyYXRvci50ZW1wbGF0ZXMuQ29kZXRlbXBsYXRlc0dlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IudGVtcGxhdGVzLlh0ZXh0VGVtcGxhdGVQcmVmZXJlbmNlUGFnZT4gYmluZFh0ZXh0VGVtcGxhdGVQcmVmZXJlbmNlUGFnZSgpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmNvZGV0ZW1wbGF0ZXMudWkucHJlZmVyZW5jZXMuQWR2YW5jZWRUZW1wbGF0ZXNQcmVmZXJlbmNlUGFnZS5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC51aS5nZW5lcmF0b3IudGVtcGxhdGVzLkNvZGV0ZW1wbGF0ZXNHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudWkuY29kZXRlbXBsYXRlcy51aS5wYXJ0aWFsRWRpdGluZy5JUGFydGlhbENvbnRlbnRBc3Npc3RQYXJzZXI+IGJpbmRJUGFydGlhbENvbnRlbnRBc3Npc3RQYXJzZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLmNvbnRlbnRhc3Npc3QuYW50bHIuUGFydGlhbFBlcnNwZWN0aXZlRHNsQ29udGVudEFzc2lzdFBhcnNlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC51aS5nZW5lcmF0b3IuY29tcGFyZS5Db21wYXJlRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLmNvbXBhcmUuSVZpZXdlckNyZWF0b3I+IGJpbmRJVmlld2VyQ3JlYXRvcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmNvbXBhcmUuRGVmYXVsdFZpZXdlckNyZWF0b3IuY2xhc3M7CisJfQorCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL1BlcnNwZWN0aXZlRHNsRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL1BlcnNwZWN0aXZlRHNsRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjllOTIwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvUGVyc3BlY3RpdmVEc2xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmd1aWNlLkFic3RyYWN0R3VpY2VBd2FyZUV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5OworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3RvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuaW50ZXJuYWwuUGVyc3BlY3RpdmVEc2xBY3RpdmF0b3I7CisKKy8qKgorICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkLiBDdXN0b21pemF0aW9ucyBzaG91bGQgb25seSBoYXBwZW4gaW4gYSBuZXdseQorICogaW50cm9kdWNlZCBzdWJjbGFzcy4gCisgKi8KK3B1YmxpYyBjbGFzcyBQZXJzcGVjdGl2ZURzbEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RHdWljZUF3YXJlRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3RvcnkgeworCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEJ1bmRsZSBnZXRCdW5kbGUoKSB7CisJCXJldHVybiBQZXJzcGVjdGl2ZURzbEFjdGl2YXRvci5nZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSW5qZWN0b3IgZ2V0SW5qZWN0b3IoKSB7CisJCXJldHVybiBQZXJzcGVjdGl2ZURzbEFjdGl2YXRvci5nZXRJbnN0YW5jZSgpLmdldEluamVjdG9yKFBlcnNwZWN0aXZlRHNsQWN0aXZhdG9yLk9SR19FQ0xJUFNFX09TQlBfWFRFWFRfUEVSU1BFQ1RJVkVfUEVSU1BFQ1RJVkVEU0wpOworCX0KKwkKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvQWJzdHJhY3RQZXJzcGVjdGl2ZURzbFByb3Bvc2FsUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvQWJzdHJhY3RQZXJzcGVjdGl2ZURzbFByb3Bvc2FsUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWJjMmEzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9BYnN0cmFjdFBlcnNwZWN0aXZlRHNsUHJvcG9zYWxQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjI1IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuY29udGVudGFzc2lzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RDb250ZXh0OworCisvKioKKyAqIFJlcHJlc2VudHMgYSBnZW5lcmF0ZWQsIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Ygc3VwZXJjbGFzcyB7QGxpbmsgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuYW5ub3RhdGlvbnMudWkuY29udGVudGFzc2lzdC5YYmFzZVdpdGhBbm5vdGF0aW9uc1Byb3Bvc2FsUHJvdmlkZXJ9LgorICogTWV0aG9kcyBhcmUgZHluYW1pY2FsbHkgZGlzcGF0Y2hlZCBvbiB0aGUgZmlyc3QgcGFyYW1ldGVyLCBpLmUuLCB5b3UgY2FuIG92ZXJyaWRlIHRoZW0gCisgKiB3aXRoIGEgbW9yZSBjb25jcmV0ZSBzdWJ0eXBlLiAKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgQWJzdHJhY3RQZXJzcGVjdGl2ZURzbFByb3Bvc2FsUHJvdmlkZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5hbm5vdGF0aW9ucy51aS5jb250ZW50YXNzaXN0LlhiYXNlV2l0aEFubm90YXRpb25zUHJvcG9zYWxQcm92aWRlciB7CisJCQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUGVyc3BlY3RpdmVNb2RlbF9QYWNrYWdlcyhFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVBlcnNwZWN0aXZlUGFja2FnZV9OYW1lKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUGVyc3BlY3RpdmVQYWNrYWdlX0ltcG9ydHMoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVQZXJzcGVjdGl2ZVBhY2thZ2VfUGVyc3BlY3RpdmVzKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUGVyc3BlY3RpdmVJbXBvcnRfSW1wb3J0ZWROYW1lc3BhY2UoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVQZXJzcGVjdGl2ZV9OYW1lKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUGVyc3BlY3RpdmVfRGVzY3JpcHRpb24oRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVQZXJzcGVjdGl2ZV9EZXNjcmlwdGlvblZhbHVlKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUGVyc3BlY3RpdmVfUHJvY2VzcyhFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlsb29rdXBDcm9zc1JlZmVyZW5jZSgoKENyb3NzUmVmZXJlbmNlKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVQZXJzcGVjdGl2ZV9Vc2VyVGFzayhFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlsb29rdXBDcm9zc1JlZmVyZW5jZSgoKENyb3NzUmVmZXJlbmNlKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVQZXJzcGVjdGl2ZV9JY29uVVJJKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUGVyc3BlY3RpdmVfQWNjZXNzaWJpbGl0eVBocmFzZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVBlcnNwZWN0aXZlX1Rvb2xiYXIoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJbG9va3VwQ3Jvc3NSZWZlcmVuY2UoKChDcm9zc1JlZmVyZW5jZSlhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUGVyc3BlY3RpdmVfRWxlbWVudHMoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfRWxlbWVudElkKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX09yaWVudGF0aW9uKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX1NlbGVjdGVkRWxlbWVudChFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlsb29rdXBDcm9zc1JlZmVyZW5jZSgoKENyb3NzUmVmZXJlbmNlKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfQ29udGFpbmVyRGF0YShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lcl9BY2Nlc3NpYmlsaXR5UGhyYXNlKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX0VsZW1lbnRzKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUGVyc3BlY3RpdmVQYXJ0U3RhY2tfRWxlbWVudElkKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUGVyc3BlY3RpdmVQYXJ0U3RhY2tfU2VsZWN0ZWRFbGVtZW50KEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWxvb2t1cENyb3NzUmVmZXJlbmNlKCgoQ3Jvc3NSZWZlcmVuY2UpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVBlcnNwZWN0aXZlUGFydFN0YWNrX0NvbnRhaW5lckRhdGEoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVQZXJzcGVjdGl2ZVBhcnRTdGFja19BY2Nlc3NpYmlsaXR5UGhyYXNlKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUGVyc3BlY3RpdmVQYXJ0U3RhY2tfRWxlbWVudHMoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVQZXJzcGVjdGl2ZVBhcnRfRWxlbWVudElkKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUGVyc3BlY3RpdmVQYXJ0X0Rlc2NyaXB0aW9uKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUGVyc3BlY3RpdmVQYXJ0X0Rlc2NyaXB0aW9uVmFsdWUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVQZXJzcGVjdGl2ZVBhcnRfQ29udGFpbmVyRGF0YShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVBlcnNwZWN0aXZlUGFydF9BY2Nlc3NpYmlsaXR5UGhyYXNlKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUGVyc3BlY3RpdmVQYXJ0X0ljb25VUkkoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVQZXJzcGVjdGl2ZVBhcnRfVmlldyhFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVBlcnNwZWN0aXZlUGFydF9Jc0Nsb3NhYmxlKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUGVyc3BlY3RpdmVTZWxlY3Rpb25fUmVmKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWxvb2t1cENyb3NzUmVmZXJlbmNlKCgoQ3Jvc3NSZWZlcmVuY2UpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVBlcnNwZWN0aXZlVGFibGVfUmVmKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWxvb2t1cENyb3NzUmVmZXJlbmNlKCgoQ3Jvc3NSZWZlcmVuY2UpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVBlcnNwZWN0aXZlR3JpZF9SZWYoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJbG9va3VwQ3Jvc3NSZWZlcmVuY2UoKChDcm9zc1JlZmVyZW5jZSlhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUGVyc3BlY3RpdmVDaGFydF9SZWYoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJbG9va3VwQ3Jvc3NSZWZlcmVuY2UoKChDcm9zc1JlZmVyZW5jZSlhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUGVyc3BlY3RpdmVSZXBvcnRfUmVmKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWxvb2t1cENyb3NzUmVmZXJlbmNlKCgoQ3Jvc3NSZWZlcmVuY2UpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVBlcnNwZWN0aXZlT3JnYW5pemF0aW9uX1JlZihFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlsb29rdXBDcm9zc1JlZmVyZW5jZSgoKENyb3NzUmVmZXJlbmNlKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVQZXJzcGVjdGl2ZVRvcG9sb2d5X1JlZihFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlsb29rdXBDcm9zc1JlZmVyZW5jZSgoKENyb3NzUmVmZXJlbmNlKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVQZXJzcGVjdGl2ZURpYWxvZ19SZWYoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJbG9va3VwQ3Jvc3NSZWZlcmVuY2UoKChDcm9zc1JlZmVyZW5jZSlhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorICAgIAorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1BlcnNwZWN0aXZlTW9kZWwoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9QZXJzcGVjdGl2ZVBhY2thZ2UoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9QZXJzcGVjdGl2ZUltcG9ydChFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1BlcnNwZWN0aXZlKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfUGVyc3BlY3RpdmVFbGVtZW50KEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfUGVyc3BlY3RpdmVQYXJ0U3RhY2soRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9QZXJzcGVjdGl2ZVBhcnQoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9QZXJzcGVjdGl2ZVZpZXcoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9QZXJzcGVjdGl2ZVNlbGVjdGlvbihFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1BlcnNwZWN0aXZlVGFibGUoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9QZXJzcGVjdGl2ZUdyaWQoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9QZXJzcGVjdGl2ZUNoYXJ0KEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfUGVyc3BlY3RpdmVSZXBvcnQoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9QZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbihFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1BlcnNwZWN0aXZlVG9wb2xvZ3koRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9QZXJzcGVjdGl2ZURpYWxvZyhFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1BlcnNwZWN0aXZlQlBNTihFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1BlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZChFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1F1YWxpZmllZE5hbWUoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9WYWxpZElEKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfVFJBTlNMQVRBQkxFSUQoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9UUkFOU0xBVEFCTEVTVFJJTkcoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9TYXNoT3JpZW50YXRpb24oRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvUGFydGlhbFBlcnNwZWN0aXZlRHNsQ29udGVudEFzc2lzdFBhcnNlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9QYXJ0aWFsUGVyc3BlY3RpdmVEc2xDb250ZW50QXNzaXN0UGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY5ODVkNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvUGFydGlhbFBlcnNwZWN0aXZlRHNsQ29udGVudEFzc2lzdFBhcnNlci5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5jb250ZW50YXNzaXN0LmFudGxyOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuQWJzdHJhY3RSdWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmNvZGV0ZW1wbGF0ZXMudWkucGFydGlhbEVkaXRpbmcuSVBhcnRpYWxDb250ZW50QXNzaXN0UGFyc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LmFudGxyLkZvbGxvd0VsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuYW50bHIuaW50ZXJuYWwuQWJzdHJhY3RJbnRlcm5hbENvbnRlbnRBc3Npc3RQYXJzZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudXRpbC5Qb2x5bW9ycGhpY0Rpc3BhdGNoZXI7CisKKy8qKgorICogQGF1dGhvciBTZWJhc3RpYW4gWmFybmVrb3cgLSBJbml0aWFsIGNvbnRyaWJ1dGlvbiBhbmQgQVBJCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCitwdWJsaWMgY2xhc3MgUGFydGlhbFBlcnNwZWN0aXZlRHNsQ29udGVudEFzc2lzdFBhcnNlciBleHRlbmRzIFBlcnNwZWN0aXZlRHNsUGFyc2VyIGltcGxlbWVudHMgSVBhcnRpYWxDb250ZW50QXNzaXN0UGFyc2VyIHsKKworCXByaXZhdGUgQWJzdHJhY3RSdWxlIHJ1bGU7CisKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplRm9yKEFic3RyYWN0UnVsZSBydWxlKSB7CisJCXRoaXMucnVsZSA9IHJ1bGU7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBDb2xsZWN0aW9uPEZvbGxvd0VsZW1lbnQ+IGdldEZvbGxvd0VsZW1lbnRzKEFic3RyYWN0SW50ZXJuYWxDb250ZW50QXNzaXN0UGFyc2VyIHBhcnNlcikgeworCQlpZiAocnVsZSA9PSBudWxsIHx8IHJ1bGUuZUlzUHJveHkoKSkKKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKwkJU3RyaW5nIG1ldGhvZE5hbWUgPSAiZW50cnlSdWxlIiArIHJ1bGUuZ2V0TmFtZSgpOworCQlQb2x5bW9ycGhpY0Rpc3BhdGNoZXI8Q29sbGVjdGlvbjxGb2xsb3dFbGVtZW50Pj4gZGlzcGF0Y2hlciA9IAorCQkJbmV3IFBvbHltb3JwaGljRGlzcGF0Y2hlcjxDb2xsZWN0aW9uPEZvbGxvd0VsZW1lbnQ+PihtZXRob2ROYW1lLCAwLCAwLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHBhcnNlcikpOworCQlkaXNwYXRjaGVyLmludm9rZSgpOworCQlyZXR1cm4gcGFyc2VyLmdldEZvbGxvd0VsZW1lbnRzKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL1BlcnNwZWN0aXZlRHNsUGFyc2VyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL1BlcnNwZWN0aXZlRHNsUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ5NTQ0YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvUGVyc3BlY3RpdmVEc2xQYXJzZXIuamF2YQpAQCAtMCwwICsxLDU1OSBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLmNvbnRlbnRhc3Npc3QuYW50bHI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuUmVjb2duaXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuQWJzdHJhY3RFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LmFudGxyLkFic3RyYWN0Q29udGVudEFzc2lzdFBhcnNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5hbnRsci5Gb2xsb3dFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LmFudGxyLmludGVybmFsLkFic3RyYWN0SW50ZXJuYWxDb250ZW50QXNzaXN0UGFyc2VyOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5zZXJ2aWNlcy5QZXJzcGVjdGl2ZURzbEdyYW1tYXJBY2Nlc3M7CisKK3B1YmxpYyBjbGFzcyBQZXJzcGVjdGl2ZURzbFBhcnNlciBleHRlbmRzIEFic3RyYWN0Q29udGVudEFzc2lzdFBhcnNlciB7CisJCisJQEluamVjdAorCXByaXZhdGUgUGVyc3BlY3RpdmVEc2xHcmFtbWFyQWNjZXNzIGdyYW1tYXJBY2Nlc3M7CisJCisJcHJpdmF0ZSBNYXA8QWJzdHJhY3RFbGVtZW50LCBTdHJpbmc+IG5hbWVNYXBwaW5nczsKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5jb250ZW50YXNzaXN0LmFudGxyLmludGVybmFsLkludGVybmFsUGVyc3BlY3RpdmVEc2xQYXJzZXIgY3JlYXRlUGFyc2VyKCkgeworCQlvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLmNvbnRlbnRhc3Npc3QuYW50bHIuaW50ZXJuYWwuSW50ZXJuYWxQZXJzcGVjdGl2ZURzbFBhcnNlciByZXN1bHQgPSBuZXcgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5jb250ZW50YXNzaXN0LmFudGxyLmludGVybmFsLkludGVybmFsUGVyc3BlY3RpdmVEc2xQYXJzZXIobnVsbCk7CisJCXJlc3VsdC5zZXRHcmFtbWFyQWNjZXNzKGdyYW1tYXJBY2Nlc3MpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFJ1bGVOYW1lKEFic3RyYWN0RWxlbWVudCBlbGVtZW50KSB7CisJCWlmIChuYW1lTWFwcGluZ3MgPT0gbnVsbCkgeworCQkJbmFtZU1hcHBpbmdzID0gbmV3IEhhc2hNYXA8QWJzdHJhY3RFbGVtZW50LCBTdHJpbmc+KCkgeworCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCQkJCXsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVFbGVtZW50QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19QZXJzcGVjdGl2ZUVsZW1lbnRfX0FsdGVybmF0aXZlcyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVZpZXdBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSwgInJ1bGVfX1BlcnNwZWN0aXZlVmlld19fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzNfMSgpLCAicnVsZV9fWEFubm90YXRpb25fX0FsdGVybmF0aXZlc18zXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19YQXNzaWdubWVudF9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSwgInJ1bGVfX09wTXVsdGlBc3NpZ25fX0FsdGVybmF0aXZlcyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19PcEVxdWFsaXR5X19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzEoKSwgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19PcENvbXBhcmVfX0FsdGVybmF0aXZlcyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEFsdGVybmF0aXZlc181XzEoKSwgInJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc181XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEFsdGVybmF0aXZlc182XzEoKSwgInJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc182XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0T3BBZGRBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSwgInJ1bGVfX09wQWRkX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fT3BNdWx0aV9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0T3BVbmFyeUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fT3BVbmFyeV9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE9wUG9zdGZpeEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fT3BQb3N0Zml4X19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzEoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzFfMF8wXzBfMSgpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8wXzBfMF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEFsdGVybmF0aXZlc18xXzFfMF8wXzEoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMV8wXzBfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMV8xXzNfMSgpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8xXzNfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSwgInJ1bGVfX1hQcmltYXJ5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19YTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDb2xsZWN0aW9uTGl0ZXJhbEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fWENvbGxlY3Rpb25MaXRlcmFsX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMigpLCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldEFsdGVybmF0aXZlc18zKCksICJydWxlX19YQ2FzZVBhcnRfX0FsdGVybmF0aXZlc18zIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMSgpLCAicnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzIoKSwgInJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfM18xKCksICJydWxlX19YRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18zXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RmVhdHVyZUNhbGxJREFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fRmVhdHVyZUNhbGxJRF9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldElkT3JTdXBlckFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fSWRPclN1cGVyX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEFsdGVybmF0aXZlc180XzEoKSwgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FsdGVybmF0aXZlc180XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEJvb2xlYW5MaXRlcmFsQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzEoKSwgInJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMygpLCAicnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18zIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzFfMCgpLCAicnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXNfMV8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldEFsdGVybmF0aXZlc18xXzFfMSgpLCAicnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXNfMV8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzIoKSwgInJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzXzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzEoKSwgInJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzFfMF8zKCksICJydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18xXzBfMyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRTYXNoT3JpZW50YXRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSwgInJ1bGVfX1Nhc2hPcmllbnRhdGlvbl9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFja2FnZUFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19QZXJzcGVjdGl2ZVBhY2thZ2VfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFja2FnZUFjY2VzcygpLmdldEdyb3VwXzMoKSwgInJ1bGVfX1BlcnNwZWN0aXZlUGFja2FnZV9fR3JvdXBfM19fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUltcG9ydEFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19QZXJzcGVjdGl2ZUltcG9ydF9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQWNjZXNzKCkuZ2V0R3JvdXBfMygpLCAicnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwXzNfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRHcm91cF80KCksICJydWxlX19QZXJzcGVjdGl2ZV9fR3JvdXBfNF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldEdyb3VwXzVfMCgpLCAicnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwXzVfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldEdyb3VwXzVfMSgpLCAicnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwXzVfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldEdyb3VwXzVfMigpLCAicnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwXzVfMl9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRHcm91cF8zXzAoKSwgInJ1bGVfX1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lcl9fR3JvdXBfM18wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldEdyb3VwXzNfMSgpLCAicnVsZV9fUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX19Hcm91cF8zXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyQWNjZXNzKCkuZ2V0R3JvdXBfM18yKCksICJydWxlX19QZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfX0dyb3VwXzNfMl9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRHcm91cF8zXzMoKSwgInJ1bGVfX1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lcl9fR3JvdXBfM18zX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1BlcnNwZWN0aXZlUGFydFN0YWNrX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja0FjY2VzcygpLmdldEdyb3VwXzNfMCgpLCAicnVsZV9fUGVyc3BlY3RpdmVQYXJ0U3RhY2tfX0dyb3VwXzNfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja0FjY2VzcygpLmdldEdyb3VwXzNfMSgpLCAicnVsZV9fUGVyc3BlY3RpdmVQYXJ0U3RhY2tfX0dyb3VwXzNfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja0FjY2VzcygpLmdldEdyb3VwXzNfMigpLCAicnVsZV9fUGVyc3BlY3RpdmVQYXJ0U3RhY2tfX0dyb3VwXzNfMl9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fUGVyc3BlY3RpdmVQYXJ0X19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRHcm91cF8zXzAoKSwgInJ1bGVfX1BlcnNwZWN0aXZlUGFydF9fR3JvdXBfM18wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldEdyb3VwXzNfMSgpLCAicnVsZV9fUGVyc3BlY3RpdmVQYXJ0X19Hcm91cF8zXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0R3JvdXBfM18yKCksICJydWxlX19QZXJzcGVjdGl2ZVBhcnRfX0dyb3VwXzNfMl9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRHcm91cF8zXzMoKSwgInJ1bGVfX1BlcnNwZWN0aXZlUGFydF9fR3JvdXBfM18zX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldEdyb3VwXzNfNCgpLCAicnVsZV9fUGVyc3BlY3RpdmVQYXJ0X19Hcm91cF8zXzRfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTZWxlY3Rpb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fUGVyc3BlY3RpdmVTZWxlY3Rpb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVGFibGVBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fUGVyc3BlY3RpdmVUYWJsZV9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVHcmlkQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1BlcnNwZWN0aXZlR3JpZF9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVDaGFydEFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19QZXJzcGVjdGl2ZUNoYXJ0X19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVJlcG9ydEFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19QZXJzcGVjdGl2ZVJlcG9ydF9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVPcmdhbml6YXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fUGVyc3BlY3RpdmVPcmdhbml6YXRpb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVG9wb2xvZ3lBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fUGVyc3BlY3RpdmVUb3BvbG9neV9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVEaWFsb2dBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fUGVyc3BlY3RpdmVEaWFsb2dfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQlBNTkFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19QZXJzcGVjdGl2ZUJQTU5fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZEFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19QZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZEFjY2VzcygpLmdldEdyb3VwXzEoKSwgInJ1bGVfX1BlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9fR3JvdXBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVBY2Nlc3MoKS5nZXRHcm91cF8xKCksICJydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEdyb3VwXzMoKSwgInJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfM18xXzAoKSwgInJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEdyb3VwXzNfMV8wXzEoKSwgInJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpLmdldEdyb3VwXzAoKSwgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKS5nZXRHcm91cF8wXzAoKSwgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8wKCksICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8wXzAoKSwgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0R3JvdXBfMF8wXzAoKSwgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8wXzEoKSwgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0R3JvdXBfMF8xXzEoKSwgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8xKCksICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8xXzEoKSwgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0R3JvdXBfMV8xXzEoKSwgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0R3JvdXBfMCgpLCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRHcm91cF8wXzAoKSwgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRHcm91cF8wXzBfMCgpLCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0R3JvdXBfMF8xKCksICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0R3JvdXBfMF8xXzEoKSwgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEdyb3VwXzAoKSwgInJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0R3JvdXBfMSgpLCAicnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRHcm91cF8xXzEoKSwgInJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRHcm91cF8xXzFfMCgpLCAicnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0R3JvdXBfMV8xXzBfMCgpLCAicnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEdyb3VwXzUoKSwgInJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEdyb3VwXzYoKSwgInJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMSgpLCAicnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wKCksICJydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMF8wKCksICJydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xKCksICJydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMCgpLCAicnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMF8wKCksICJydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMSgpLCAicnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wKCksICJydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMF8wKCksICJydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzAoKSwgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMF8wKCksICJydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMF8wXzAoKSwgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzEoKSwgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMV8wKCksICJydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMV8wXzAoKSwgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRHcm91cF8xKCksICJydWxlX19PcENvbXBhcmVfX0dyb3VwXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMSgpLCAicnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMCgpLCAicnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wXzAoKSwgInJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyb3VwXzIoKSwgInJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyb3VwXzUoKSwgInJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyb3VwXzVfMV8wKCksICJydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JvdXBfNV8xXzBfMCgpLCAicnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JvdXBfNigpLCAicnVsZV9fT3BPdGhlcl9fR3JvdXBfNl9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JvdXBfNl8xXzAoKSwgInJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcm91cF82XzFfMF8wKCksICJydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzEoKSwgInJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMCgpLCAicnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzBfMCgpLCAicnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMSgpLCAicnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wKCksICJydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMF8wKCksICJydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25BY2Nlc3MoKS5nZXRHcm91cF8wKCksICJydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMSgpLCAicnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzAoKSwgInJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzBfMCgpLCAicnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldEdyb3VwXzEoKSwgInJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wKCksICJydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMCgpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfMV8wXzAoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfMV8wXzBfMCgpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMSgpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfMV8xXzAoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfMV8xXzBfMCgpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMV8xKCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMV8xXzIoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfMl9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8xXzFfMygpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8xXzFfM18xXzEoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMV8zXzFfMV8xKCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTZXRMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwXzMoKSwgInJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTZXRMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXBfM18xKCksICJydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwXzMoKSwgInJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTGlzdExpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cF8zXzEoKSwgInJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM18xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZUFjY2VzcygpLmdldEdyb3VwXzAoKSwgInJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXBfMF8wKCksICJydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXBfMSgpLCAicnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cF8xXzAoKSwgInJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cF8xXzBfMCgpLCAicnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXBfMV8wXzBfMSgpLCAicnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25JbkNsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uSW5DbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXBfMSgpLCAicnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXBfMCgpLCAicnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXBfMF8wKCksICJydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpLmdldEdyb3VwXzBfMF8xKCksICJydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXBfMF8wXzFfMSgpLCAicnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF82KCksICJydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzJfMCgpLCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzJfMF8wKCksICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8yXzBfMF8wKCksICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzJfMSgpLCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzJfMV8wKCksICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8yXzFfMF8wKCksICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzUoKSwgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldEdyb3VwXzIoKSwgInJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfMl9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRHcm91cF8zXzAoKSwgInJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfM18wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzAoKSwgInJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8wXzAoKSwgInJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzMoKSwgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfM18xKCksICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfNygpLCAicnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF83XzEoKSwgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83XzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFdoaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQmxvY2tFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhCbG9ja0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8yKCksICJydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF8yX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldEdyb3VwXzJfMCgpLCAicnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldEdyb3VwXzJfMF8wKCksICJydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRHcm91cF8zKCksICJydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfM19fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRGdWxsSnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzEoKSwgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8xXzIoKSwgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzMoKSwgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8zXzFfMSgpLCAicnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8zXzFfMV8xKCksICJydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfMygpLCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfM18yKCksICJydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zXzJfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEdyb3VwXzQoKSwgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEdyb3VwXzRfMV8xKCksICJydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfNF8xXzFfMSgpLCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQm9vbGVhbkxpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTnVsbExpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTnVtYmVyTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFN0cmluZ0xpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhUeXBlTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhUaHJvd0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFJldHVybkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzNfMCgpLCAicnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzNfMF8xKCksICJydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8zXzEoKSwgInJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMCgpLCAicnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8wXzAoKSwgInJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENhdGNoQ2xhdXNlQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0R3JvdXBfMSgpLCAicnVsZV9fTnVtYmVyX19Hcm91cF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldEdyb3VwXzFfMSgpLCAicnVsZV9fTnVtYmVyX19Hcm91cF8xXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0U3RhdGljUXVhbGlmaWVyQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1N0YXRpY1F1YWxpZmllcl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzAoKSwgInJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzBfMSgpLCAicnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cF8wXzFfMCgpLCAicnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0QXJyYXlCcmFja2V0c0FjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZBY2Nlc3MoKS5nZXRHcm91cF8wKCksICJydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZBY2Nlc3MoKS5nZXRHcm91cF8wXzEoKSwgInJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0R3JvdXBfMF8xXzEoKSwgInJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzEoKSwgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXBfMV8yKCksICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXBfMV80KCksICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXBfMV80XzAoKSwgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzFfNF8wXzAoKSwgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXBfMV80XzIoKSwgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzFfNF8yXzIoKSwgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzJfMCgpLCAicnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXBfMl8xKCksICJydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRBbmRlZEFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFuZGVkQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVBhcmFtZXRlckFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19Kdm1UeXBlUGFyYW1ldGVyX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUGFyYW1ldGVyQWNjZXNzKCkuZ2V0R3JvdXBfMSgpLCAicnVsZV9fSnZtVHlwZVBhcmFtZXRlcl9fR3JvdXBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEdyb3VwXzFfMCgpLCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8xXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0QWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVNb2RlbEFjY2VzcygpLmdldFBhY2thZ2VzQXNzaWdubWVudCgpLCAicnVsZV9fUGVyc3BlY3RpdmVNb2RlbF9fUGFja2FnZXNBc3NpZ25tZW50Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFja2FnZUFjY2VzcygpLmdldE5hbWVBc3NpZ25tZW50XzIoKSwgInJ1bGVfX1BlcnNwZWN0aXZlUGFja2FnZV9fTmFtZUFzc2lnbm1lbnRfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhY2thZ2VBY2Nlc3MoKS5nZXRJbXBvcnRzQXNzaWdubWVudF8zXzEoKSwgInJ1bGVfX1BlcnNwZWN0aXZlUGFja2FnZV9fSW1wb3J0c0Fzc2lnbm1lbnRfM18xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFja2FnZUFjY2VzcygpLmdldFBlcnNwZWN0aXZlc0Fzc2lnbm1lbnRfM18yKCksICJydWxlX19QZXJzcGVjdGl2ZVBhY2thZ2VfX1BlcnNwZWN0aXZlc0Fzc2lnbm1lbnRfM18yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlSW1wb3J0QWNjZXNzKCkuZ2V0SW1wb3J0ZWROYW1lc3BhY2VBc3NpZ25tZW50XzEoKSwgInJ1bGVfX1BlcnNwZWN0aXZlSW1wb3J0X19JbXBvcnRlZE5hbWVzcGFjZUFzc2lnbm1lbnRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldE5hbWVBc3NpZ25tZW50XzIoKSwgInJ1bGVfX1BlcnNwZWN0aXZlX19OYW1lQXNzaWdubWVudF8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQWNjZXNzKCkuZ2V0RGVzY3JpcHRpb25Bc3NpZ25tZW50XzNfMCgpLCAicnVsZV9fUGVyc3BlY3RpdmVfX0Rlc2NyaXB0aW9uQXNzaWdubWVudF8zXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXREZXNjcmlwdGlvblZhbHVlQXNzaWdubWVudF8zXzEoKSwgInJ1bGVfX1BlcnNwZWN0aXZlX19EZXNjcmlwdGlvblZhbHVlQXNzaWdubWVudF8zXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRQcm9jZXNzQXNzaWdubWVudF80XzEoKSwgInJ1bGVfX1BlcnNwZWN0aXZlX19Qcm9jZXNzQXNzaWdubWVudF80XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRVc2VyVGFza0Fzc2lnbm1lbnRfNF8zKCksICJydWxlX19QZXJzcGVjdGl2ZV9fVXNlclRhc2tBc3NpZ25tZW50XzRfMyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldEljb25VUklBc3NpZ25tZW50XzVfMF8xKCksICJydWxlX19QZXJzcGVjdGl2ZV9fSWNvblVSSUFzc2lnbm1lbnRfNV8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRBY2Nlc3NpYmlsaXR5UGhyYXNlQXNzaWdubWVudF81XzFfMSgpLCAicnVsZV9fUGVyc3BlY3RpdmVfX0FjY2Vzc2liaWxpdHlQaHJhc2VBc3NpZ25tZW50XzVfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQWNjZXNzKCkuZ2V0VG9vbGJhckFzc2lnbm1lbnRfNV8yXzEoKSwgInJ1bGVfX1BlcnNwZWN0aXZlX19Ub29sYmFyQXNzaWdubWVudF81XzJfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF83KCksICJydWxlX19QZXJzcGVjdGl2ZV9fRWxlbWVudHNBc3NpZ25tZW50XzciKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyQWNjZXNzKCkuZ2V0RWxlbWVudElkQXNzaWdubWVudF8yKCksICJydWxlX19QZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfX0VsZW1lbnRJZEFzc2lnbm1lbnRfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRPcmllbnRhdGlvbkFzc2lnbm1lbnRfM18wXzEoKSwgInJ1bGVfX1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lcl9fT3JpZW50YXRpb25Bc3NpZ25tZW50XzNfMF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldFNlbGVjdGVkRWxlbWVudEFzc2lnbm1lbnRfM18xXzEoKSwgInJ1bGVfX1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lcl9fU2VsZWN0ZWRFbGVtZW50QXNzaWdubWVudF8zXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRDb250YWluZXJEYXRhQXNzaWdubWVudF8zXzJfMSgpLCAicnVsZV9fUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX19Db250YWluZXJEYXRhQXNzaWdubWVudF8zXzJfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRBY2Nlc3NpYmlsaXR5UGhyYXNlQXNzaWdubWVudF8zXzNfMSgpLCAicnVsZV9fUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX19BY2Nlc3NpYmlsaXR5UGhyYXNlQXNzaWdubWVudF8zXzNfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfNSgpLCAicnVsZV9fUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX19FbGVtZW50c0Fzc2lnbm1lbnRfNSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja0FjY2VzcygpLmdldEVsZW1lbnRJZEFzc2lnbm1lbnRfMigpLCAicnVsZV9fUGVyc3BlY3RpdmVQYXJ0U3RhY2tfX0VsZW1lbnRJZEFzc2lnbm1lbnRfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja0FjY2VzcygpLmdldFNlbGVjdGVkRWxlbWVudEFzc2lnbm1lbnRfM18wXzEoKSwgInJ1bGVfX1BlcnNwZWN0aXZlUGFydFN0YWNrX19TZWxlY3RlZEVsZW1lbnRBc3NpZ25tZW50XzNfMF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrQWNjZXNzKCkuZ2V0Q29udGFpbmVyRGF0YUFzc2lnbm1lbnRfM18xXzEoKSwgInJ1bGVfX1BlcnNwZWN0aXZlUGFydFN0YWNrX19Db250YWluZXJEYXRhQXNzaWdubWVudF8zXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja0FjY2VzcygpLmdldEFjY2Vzc2liaWxpdHlQaHJhc2VBc3NpZ25tZW50XzNfMl8xKCksICJydWxlX19QZXJzcGVjdGl2ZVBhcnRTdGFja19fQWNjZXNzaWJpbGl0eVBocmFzZUFzc2lnbm1lbnRfM18yXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfNSgpLCAicnVsZV9fUGVyc3BlY3RpdmVQYXJ0U3RhY2tfX0VsZW1lbnRzQXNzaWdubWVudF81Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldEVsZW1lbnRJZEFzc2lnbm1lbnRfMigpLCAicnVsZV9fUGVyc3BlY3RpdmVQYXJ0X19FbGVtZW50SWRBc3NpZ25tZW50XzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0RGVzY3JpcHRpb25Bc3NpZ25tZW50XzNfMF8wKCksICJydWxlX19QZXJzcGVjdGl2ZVBhcnRfX0Rlc2NyaXB0aW9uQXNzaWdubWVudF8zXzBfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXREZXNjcmlwdGlvblZhbHVlQXNzaWdubWVudF8zXzBfMSgpLCAicnVsZV9fUGVyc3BlY3RpdmVQYXJ0X19EZXNjcmlwdGlvblZhbHVlQXNzaWdubWVudF8zXzBfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRDb250YWluZXJEYXRhQXNzaWdubWVudF8zXzFfMSgpLCAicnVsZV9fUGVyc3BlY3RpdmVQYXJ0X19Db250YWluZXJEYXRhQXNzaWdubWVudF8zXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRBY2Nlc3NpYmlsaXR5UGhyYXNlQXNzaWdubWVudF8zXzJfMSgpLCAicnVsZV9fUGVyc3BlY3RpdmVQYXJ0X19BY2Nlc3NpYmlsaXR5UGhyYXNlQXNzaWdubWVudF8zXzJfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRJY29uVVJJQXNzaWdubWVudF8zXzNfMSgpLCAicnVsZV9fUGVyc3BlY3RpdmVQYXJ0X19JY29uVVJJQXNzaWdubWVudF8zXzNfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRWaWV3QXNzaWdubWVudF8zXzRfMSgpLCAicnVsZV9fUGVyc3BlY3RpdmVQYXJ0X19WaWV3QXNzaWdubWVudF8zXzRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRJc0Nsb3NhYmxlQXNzaWdubWVudF8zXzUoKSwgInJ1bGVfX1BlcnNwZWN0aXZlUGFydF9fSXNDbG9zYWJsZUFzc2lnbm1lbnRfM181Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2VsZWN0aW9uQWNjZXNzKCkuZ2V0UmVmQXNzaWdubWVudF8yKCksICJydWxlX19QZXJzcGVjdGl2ZVNlbGVjdGlvbl9fUmVmQXNzaWdubWVudF8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVGFibGVBY2Nlc3MoKS5nZXRSZWZBc3NpZ25tZW50XzIoKSwgInJ1bGVfX1BlcnNwZWN0aXZlVGFibGVfX1JlZkFzc2lnbm1lbnRfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUdyaWRBY2Nlc3MoKS5nZXRSZWZBc3NpZ25tZW50XzIoKSwgInJ1bGVfX1BlcnNwZWN0aXZlR3JpZF9fUmVmQXNzaWdubWVudF8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQ2hhcnRBY2Nlc3MoKS5nZXRSZWZBc3NpZ25tZW50XzIoKSwgInJ1bGVfX1BlcnNwZWN0aXZlQ2hhcnRfX1JlZkFzc2lnbm1lbnRfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVJlcG9ydEFjY2VzcygpLmdldFJlZkFzc2lnbm1lbnRfMigpLCAicnVsZV9fUGVyc3BlY3RpdmVSZXBvcnRfX1JlZkFzc2lnbm1lbnRfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbkFjY2VzcygpLmdldFJlZkFzc2lnbm1lbnRfMigpLCAicnVsZV9fUGVyc3BlY3RpdmVPcmdhbml6YXRpb25fX1JlZkFzc2lnbm1lbnRfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVRvcG9sb2d5QWNjZXNzKCkuZ2V0UmVmQXNzaWdubWVudF8yKCksICJydWxlX19QZXJzcGVjdGl2ZVRvcG9sb2d5X19SZWZBc3NpZ25tZW50XzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVEaWFsb2dBY2Nlc3MoKS5nZXRSZWZBc3NpZ25tZW50XzIoKSwgInJ1bGVfX1BlcnNwZWN0aXZlRGlhbG9nX19SZWZBc3NpZ25tZW50XzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRBbm5vdGF0aW9uVHlwZUFzc2lnbm1lbnRfMigpLCAicnVsZV9fWEFubm90YXRpb25fX0Fubm90YXRpb25UeXBlQXNzaWdubWVudF8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0RWxlbWVudFZhbHVlUGFpcnNBc3NpZ25tZW50XzNfMV8wXzAoKSwgInJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEVsZW1lbnRWYWx1ZVBhaXJzQXNzaWdubWVudF8zXzFfMF8xXzEoKSwgInJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0VmFsdWVBc3NpZ25tZW50XzNfMV8xKCksICJydWxlX19YQW5ub3RhdGlvbl9fVmFsdWVBc3NpZ25tZW50XzNfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpLmdldEVsZW1lbnRBc3NpZ25tZW50XzBfMF8wKCksICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0VsZW1lbnRBc3NpZ25tZW50XzBfMF8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpLmdldFZhbHVlQXNzaWdubWVudF8xKCksICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX1ZhbHVlQXNzaWdubWVudF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzAoKSwgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0RWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEoKSwgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSgpLCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzFfMV8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzAoKSwgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzFfMSgpLCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0RmVhdHVyZUFzc2lnbm1lbnRfMF8xKCksICJydWxlX19YQXNzaWdubWVudF9fRmVhdHVyZUFzc2lnbm1lbnRfMF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0VmFsdWVBc3NpZ25tZW50XzBfMygpLCAicnVsZV9fWEFzc2lnbm1lbnRfX1ZhbHVlQXNzaWdubWVudF8wXzMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEoKSwgInJ1bGVfX1hBc3NpZ25tZW50X19GZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMV8xKCksICJydWxlX19YQXNzaWdubWVudF9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSgpLCAicnVsZV9fWE9yRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEoKSwgInJ1bGVfX1hPckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSgpLCAicnVsZV9fWEFuZEV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSgpLCAicnVsZV9fWEFuZEV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xKCksICJydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSgpLCAicnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0VHlwZUFzc2lnbm1lbnRfMV8wXzEoKSwgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fVHlwZUFzc2lnbm1lbnRfMV8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUFzc2lnbm1lbnRfMV8xXzBfMF8xKCksICJydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8wXzBfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMV8xKCksICJydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSgpLCAicnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xKCksICJydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xKCksICJydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSgpLCAicnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEoKSwgInJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xKCksICJydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25BY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8wXzEoKSwgInJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvbkFjY2VzcygpLmdldE9wZXJhbmRBc3NpZ25tZW50XzBfMigpLCAicnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19PcGVyYW5kQXNzaWdubWVudF8wXzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRUeXBlQXNzaWdubWVudF8xXzEoKSwgInJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8xXzBfMSgpLCAicnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0U3RhdGljQXNzaWdubWVudF8xXzBfMF8wXzFfMSgpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19FeHBsaWNpdFN0YXRpY0Fzc2lnbm1lbnRfMV8wXzBfMF8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMF8yKCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzBfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRWYWx1ZUFzc2lnbm1lbnRfMV8wXzEoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVmFsdWVBc3NpZ25tZW50XzFfMF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldE51bGxTYWZlQXNzaWdubWVudF8xXzFfMF8wXzFfMSgpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19OdWxsU2FmZUFzc2lnbm1lbnRfMV8xXzBfMF8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RXhwbGljaXRTdGF0aWNBc3NpZ25tZW50XzFfMV8wXzBfMV8yKCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0V4cGxpY2l0U3RhdGljQXNzaWdubWVudF8xXzFfMF8wXzFfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRUeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzFfMV8xKCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0VHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMl8xKCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8xXzJfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8xXzFfMigpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8xXzFfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRFeHBsaWNpdE9wZXJhdGlvbkNhbGxBc3NpZ25tZW50XzFfMV8zXzAoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRXhwbGljaXRPcGVyYXRpb25DYWxsQXNzaWdubWVudF8xXzFfM18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldE1lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMCgpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0TWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8xXzAoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8xXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0TWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8xXzFfMSgpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldE1lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV80KCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV80Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTZXRMaXRlcmFsQWNjZXNzKCkuZ2V0RWxlbWVudHNBc3NpZ25tZW50XzNfMCgpLCAicnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfM18xXzEoKSwgInJ1bGVfX1hTZXRMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsQWNjZXNzKCkuZ2V0RWxlbWVudHNBc3NpZ25tZW50XzNfMCgpLCAicnVsZV9fWExpc3RMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbEFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8zXzFfMSgpLCAicnVsZV9fWExpc3RMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXREZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzFfMF8wXzAoKSwgInJ1bGVfX1hDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzFfMF8wXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXREZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzFfMF8wXzFfMSgpLCAicnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0RXhwbGljaXRTeW50YXhBc3NpZ25tZW50XzFfMF8xKCksICJydWxlX19YQ2xvc3VyZV9fRXhwbGljaXRTeW50YXhBc3NpZ25tZW50XzFfMF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0RXhwcmVzc2lvbkFzc2lnbm1lbnRfMigpLCAicnVsZV9fWENsb3N1cmVfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25JbkNsb3N1cmVBY2Nlc3MoKS5nZXRFeHByZXNzaW9uc0Fzc2lnbm1lbnRfMV8wKCksICJydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fRXhwcmVzc2lvbnNBc3NpZ25tZW50XzFfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlQWNjZXNzKCkuZ2V0RGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8wXzBfMV8wKCksICJydWxlX19YU2hvcnRDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzBfMF8xXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpLmdldERlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMF8wXzFfMV8xKCksICJydWxlX19YU2hvcnRDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzBfMF8xXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlQWNjZXNzKCkuZ2V0RXhwbGljaXRTeW50YXhBc3NpZ25tZW50XzBfMF8yKCksICJydWxlX19YU2hvcnRDbG9zdXJlX19FeHBsaWNpdFN5bnRheEFzc2lnbm1lbnRfMF8wXzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpLmdldEV4cHJlc3Npb25Bc3NpZ25tZW50XzEoKSwgInJ1bGVfX1hTaG9ydENsb3N1cmVfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WElmRXhwcmVzc2lvbkFjY2VzcygpLmdldElmQXNzaWdubWVudF8zKCksICJydWxlX19YSWZFeHByZXNzaW9uX19JZkFzc2lnbm1lbnRfMyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkuZ2V0VGhlbkFzc2lnbm1lbnRfNSgpLCAicnVsZV9fWElmRXhwcmVzc2lvbl9fVGhlbkFzc2lnbm1lbnRfNSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RWxzZUFzc2lnbm1lbnRfNl8xKCksICJydWxlX19YSWZFeHByZXNzaW9uX19FbHNlQXNzaWdubWVudF82XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXREZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yXzBfMF8wXzEoKSwgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yXzBfMF8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRTd2l0Y2hBc3NpZ25tZW50XzJfMF8xKCksICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fU3dpdGNoQXNzaWdubWVudF8yXzBfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldERlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzJfMV8wXzBfMCgpLCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzJfMV8wXzBfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldFN3aXRjaEFzc2lnbm1lbnRfMl8xXzEoKSwgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Td2l0Y2hBc3NpZ25tZW50XzJfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Q2FzZXNBc3NpZ25tZW50XzQoKSwgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19DYXNlc0Fzc2lnbm1lbnRfNCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldERlZmF1bHRBc3NpZ25tZW50XzVfMigpLCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0RlZmF1bHRBc3NpZ25tZW50XzVfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRUeXBlR3VhcmRBc3NpZ25tZW50XzEoKSwgInJ1bGVfX1hDYXNlUGFydF9fVHlwZUd1YXJkQXNzaWdubWVudF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldENhc2VBc3NpZ25tZW50XzJfMSgpLCAicnVsZV9fWENhc2VQYXJ0X19DYXNlQXNzaWdubWVudF8yXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0QWNjZXNzKCkuZ2V0VGhlbkFzc2lnbm1lbnRfM18wXzEoKSwgInJ1bGVfX1hDYXNlUGFydF9fVGhlbkFzc2lnbm1lbnRfM18wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0QWNjZXNzKCkuZ2V0RmFsbFRocm91Z2hBc3NpZ25tZW50XzNfMSgpLCAicnVsZV9fWENhc2VQYXJ0X19GYWxsVGhyb3VnaEFzc2lnbm1lbnRfM18xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldERlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzBfMF8zKCksICJydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzBfMF8zIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEZvckV4cHJlc3Npb25Bc3NpZ25tZW50XzEoKSwgInJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRm9yRXhwcmVzc2lvbkFzc2lnbm1lbnRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRFYWNoRXhwcmVzc2lvbkFzc2lnbm1lbnRfMygpLCAicnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19FYWNoRXhwcmVzc2lvbkFzc2lnbm1lbnRfMyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEluaXRFeHByZXNzaW9uc0Fzc2lnbm1lbnRfM18wKCksICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fSW5pdEV4cHJlc3Npb25zQXNzaWdubWVudF8zXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRJbml0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzNfMV8xKCksICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fSW5pdEV4cHJlc3Npb25zQXNzaWdubWVudF8zXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEV4cHJlc3Npb25Bc3NpZ25tZW50XzUoKSwgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF81Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0VXBkYXRlRXhwcmVzc2lvbnNBc3NpZ25tZW50XzdfMCgpLCAicnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX1VwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRVcGRhdGVFeHByZXNzaW9uc0Fzc2lnbm1lbnRfN18xXzEoKSwgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19VcGRhdGVFeHByZXNzaW9uc0Fzc2lnbm1lbnRfN18xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRFYWNoRXhwcmVzc2lvbkFzc2lnbm1lbnRfOSgpLCAicnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0VhY2hFeHByZXNzaW9uQXNzaWdubWVudF85Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhXaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRQcmVkaWNhdGVBc3NpZ25tZW50XzMoKSwgInJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX1ByZWRpY2F0ZUFzc2lnbm1lbnRfMyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Qm9keUFzc2lnbm1lbnRfNSgpLCAicnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fQm9keUFzc2lnbm1lbnRfNSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRCb2R5QXNzaWdubWVudF8yKCksICJydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0JvZHlBc3NpZ25tZW50XzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WERvV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UHJlZGljYXRlQXNzaWdubWVudF81KCksICJydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX1ByZWRpY2F0ZUFzc2lnbm1lbnRfNSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQmxvY2tFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzJfMCgpLCAicnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fRXhwcmVzc2lvbnNBc3NpZ25tZW50XzJfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldFdyaXRlYWJsZUFzc2lnbm1lbnRfMV8wKCksICJydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fV3JpdGVhYmxlQXNzaWdubWVudF8xXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRUeXBlQXNzaWdubWVudF8yXzBfMF8wKCksICJydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fVHlwZUFzc2lnbm1lbnRfMl8wXzBfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldE5hbWVBc3NpZ25tZW50XzJfMF8wXzEoKSwgInJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19OYW1lQXNzaWdubWVudF8yXzBfMF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0TmFtZUFzc2lnbm1lbnRfMl8xKCksICJydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fTmFtZUFzc2lnbm1lbnRfMl8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0UmlnaHRBc3NpZ25tZW50XzNfMSgpLCAicnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1JpZ2h0QXNzaWdubWVudF8zXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCkuZ2V0UGFyYW1ldGVyVHlwZUFzc2lnbm1lbnRfMCgpLCAicnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19QYXJhbWV0ZXJUeXBlQXNzaWdubWVudF8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bUZvcm1hbFBhcmFtZXRlckFjY2VzcygpLmdldE5hbWVBc3NpZ25tZW50XzEoKSwgInJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fTmFtZUFzc2lnbm1lbnRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRGdWxsSnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCkuZ2V0UGFyYW1ldGVyVHlwZUFzc2lnbm1lbnRfMCgpLCAicnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fUGFyYW1ldGVyVHlwZUFzc2lnbm1lbnRfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRGdWxsSnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCkuZ2V0TmFtZUFzc2lnbm1lbnRfMSgpLCAicnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fTmFtZUFzc2lnbm1lbnRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRUeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzEoKSwgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFR5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMl8xKCksICJydWxlX19YRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMl8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzIoKSwgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRFeHBsaWNpdE9wZXJhdGlvbkNhbGxBc3NpZ25tZW50XzNfMCgpLCAicnVsZV9fWEZlYXR1cmVDYWxsX19FeHBsaWNpdE9wZXJhdGlvbkNhbGxBc3NpZ25tZW50XzNfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRGZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzAoKSwgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMV8wKCksICJydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMV8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMV8xXzEoKSwgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8xXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRGZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfNCgpLCAicnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfNCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0Q29uc3RydWN0b3JBc3NpZ25tZW50XzIoKSwgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0NvbnN0cnVjdG9yQXNzaWdubWVudF8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRUeXBlQXJndW1lbnRzQXNzaWdubWVudF8zXzEoKSwgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzNfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0VHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18yXzEoKSwgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzNfMl8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbEFzc2lnbm1lbnRfNF8wKCksICJydWxlX19YQ29uc3RydWN0b3JDYWxsX19FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbEFzc2lnbm1lbnRfNF8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRBcmd1bWVudHNBc3NpZ25tZW50XzRfMV8wKCksICJydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRBcmd1bWVudHNBc3NpZ25tZW50XzRfMV8xXzAoKSwgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0QXJndW1lbnRzQXNzaWdubWVudF80XzFfMV8xXzEoKSwgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRBcmd1bWVudHNBc3NpZ25tZW50XzUoKSwgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQm9vbGVhbkxpdGVyYWxBY2Nlc3MoKS5nZXRJc1RydWVBc3NpZ25tZW50XzFfMSgpLCAicnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Jc1RydWVBc3NpZ25tZW50XzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTnVtYmVyTGl0ZXJhbEFjY2VzcygpLmdldFZhbHVlQXNzaWdubWVudF8xKCksICJydWxlX19YTnVtYmVyTGl0ZXJhbF9fVmFsdWVBc3NpZ25tZW50XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFN0cmluZ0xpdGVyYWxBY2Nlc3MoKS5nZXRWYWx1ZUFzc2lnbm1lbnRfMSgpLCAicnVsZV9fWFN0cmluZ0xpdGVyYWxfX1ZhbHVlQXNzaWdubWVudF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhUeXBlTGl0ZXJhbEFjY2VzcygpLmdldFR5cGVBc3NpZ25tZW50XzMoKSwgInJ1bGVfX1hUeXBlTGl0ZXJhbF9fVHlwZUFzc2lnbm1lbnRfMyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYVHlwZUxpdGVyYWxBY2Nlc3MoKS5nZXRBcnJheURpbWVuc2lvbnNBc3NpZ25tZW50XzQoKSwgInJ1bGVfX1hUeXBlTGl0ZXJhbF9fQXJyYXlEaW1lbnNpb25zQXNzaWdubWVudF80Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhUaHJvd0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRFeHByZXNzaW9uQXNzaWdubWVudF8yKCksICJydWxlX19YVGhyb3dFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhSZXR1cm5FeHByZXNzaW9uQWNjZXNzKCkuZ2V0RXhwcmVzc2lvbkFzc2lnbm1lbnRfMigpLCAicnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRFeHByZXNzaW9uQXNzaWdubWVudF8yKCksICJydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldENhdGNoQ2xhdXNlc0Fzc2lnbm1lbnRfM18wXzAoKSwgInJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmluYWxseUV4cHJlc3Npb25Bc3NpZ25tZW50XzNfMF8xXzEoKSwgInJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19GaW5hbGx5RXhwcmVzc2lvbkFzc2lnbm1lbnRfM18wXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldEZpbmFsbHlFeHByZXNzaW9uQXNzaWdubWVudF8zXzFfMSgpLCAicnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0ZpbmFsbHlFeHByZXNzaW9uQXNzaWdubWVudF8zXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFBhcmFtQXNzaWdubWVudF8xKCksICJydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fUGFyYW1Bc3NpZ25tZW50XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRFeHByZXNzaW9uQXNzaWdubWVudF8zKCksICJydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2F0Y2hDbGF1c2VBY2Nlc3MoKS5nZXREZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yKCksICJydWxlX19YQ2F0Y2hDbGF1c2VfX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENhdGNoQ2xhdXNlQWNjZXNzKCkuZ2V0RXhwcmVzc2lvbkFzc2lnbm1lbnRfNCgpLCAicnVsZV9fWENhdGNoQ2xhdXNlX19FeHByZXNzaW9uQXNzaWdubWVudF80Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZBY2Nlc3MoKS5nZXRQYXJhbVR5cGVzQXNzaWdubWVudF8wXzFfMCgpLCAicnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUGFyYW1UeXBlc0Fzc2lnbm1lbnRfMF8xXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldFBhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8xXzEoKSwgInJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1BhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldFJldHVyblR5cGVBc3NpZ25tZW50XzIoKSwgInJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1JldHVyblR5cGVBc3NpZ25tZW50XzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRUeXBlQXNzaWdubWVudF8wKCksICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fVHlwZUFzc2lnbm1lbnRfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xKCksICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRBcmd1bWVudHNBc3NpZ25tZW50XzFfMl8xKCksICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzJfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldFR5cGVBc3NpZ25tZW50XzFfNF8xKCksICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fVHlwZUFzc2lnbm1lbnRfMV80XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRBcmd1bWVudHNBc3NpZ25tZW50XzFfNF8yXzEoKSwgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfNF8yXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRBcmd1bWVudHNBc3NpZ25tZW50XzFfNF8yXzJfMSgpLCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMl8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldENvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMCgpLCAicnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8wXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0Q29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8xKCksICJydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRDb25zdHJhaW50c0Fzc2lnbm1lbnRfMl8xXzAoKSwgInJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMV8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldENvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMSgpLCAicnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZEFjY2VzcygpLmdldFR5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEoKSwgInJ1bGVfX0p2bVVwcGVyQm91bmRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZEFuZGVkQWNjZXNzKCkuZ2V0VHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSgpLCAicnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRBY2Nlc3MoKS5nZXRUeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xKCksICJydWxlX19Kdm1Mb3dlckJvdW5kX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRBbmRlZEFjY2VzcygpLmdldFR5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEoKSwgInJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUGFyYW1ldGVyQWNjZXNzKCkuZ2V0TmFtZUFzc2lnbm1lbnRfMCgpLCAicnVsZV9fSnZtVHlwZVBhcmFtZXRlcl9fTmFtZUFzc2lnbm1lbnRfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUGFyYW1ldGVyQWNjZXNzKCkuZ2V0Q29uc3RyYWludHNBc3NpZ25tZW50XzFfMCgpLCAicnVsZV9fSnZtVHlwZVBhcmFtZXRlcl9fQ29uc3RyYWludHNBc3NpZ25tZW50XzFfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUGFyYW1ldGVyQWNjZXNzKCkuZ2V0Q29uc3RyYWludHNBc3NpZ25tZW50XzFfMSgpLCAicnVsZV9fSnZtVHlwZVBhcmFtZXRlcl9fQ29uc3RyYWludHNBc3NpZ25tZW50XzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0U2VjdGlvbkFjY2VzcygpLmdldEltcG9ydERlY2xhcmF0aW9uc0Fzc2lnbm1lbnQoKSwgInJ1bGVfX1hJbXBvcnRTZWN0aW9uX19JbXBvcnREZWNsYXJhdGlvbnNBc3NpZ25tZW50Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldFN0YXRpY0Fzc2lnbm1lbnRfMV8wXzAoKSwgInJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fU3RhdGljQXNzaWdubWVudF8xXzBfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRFeHRlbnNpb25Bc3NpZ25tZW50XzFfMF8xKCksICJydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0V4dGVuc2lvbkFzc2lnbm1lbnRfMV8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0SW1wb3J0ZWRUeXBlQXNzaWdubWVudF8xXzBfMigpLCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZFR5cGVBc3NpZ25tZW50XzFfMF8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldFdpbGRjYXJkQXNzaWdubWVudF8xXzBfM18wKCksICJydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX1dpbGRjYXJkQXNzaWdubWVudF8xXzBfM18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldE1lbWJlck5hbWVBc3NpZ25tZW50XzFfMF8zXzEoKSwgInJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fTWVtYmVyTmFtZUFzc2lnbm1lbnRfMV8wXzNfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRJbXBvcnRlZFR5cGVBc3NpZ25tZW50XzFfMSgpLCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZFR5cGVBc3NpZ25tZW50XzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRJbXBvcnRlZE5hbWVzcGFjZUFzc2lnbm1lbnRfMV8yKCksICJydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkTmFtZXNwYWNlQXNzaWdubWVudF8xXzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF81KCksICJydWxlX19QZXJzcGVjdGl2ZV9fVW5vcmRlcmVkR3JvdXBfNSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksICJydWxlX19QZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfX1Vub3JkZXJlZEdyb3VwXzMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksICJydWxlX19QZXJzcGVjdGl2ZVBhcnRTdGFja19fVW5vcmRlcmVkR3JvdXBfMyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksICJydWxlX19QZXJzcGVjdGl2ZVBhcnRfX1Vub3JkZXJlZEdyb3VwXzMiKTsKKwkJCQl9CisJCQl9OworCQl9CisJCXJldHVybiBuYW1lTWFwcGluZ3MuZ2V0KGVsZW1lbnQpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxGb2xsb3dFbGVtZW50PiBnZXRGb2xsb3dFbGVtZW50cyhBYnN0cmFjdEludGVybmFsQ29udGVudEFzc2lzdFBhcnNlciBwYXJzZXIpIHsKKwkJdHJ5IHsKKwkJCW9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuY29udGVudGFzc2lzdC5hbnRsci5pbnRlcm5hbC5JbnRlcm5hbFBlcnNwZWN0aXZlRHNsUGFyc2VyIHR5cGVkUGFyc2VyID0gKG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuY29udGVudGFzc2lzdC5hbnRsci5pbnRlcm5hbC5JbnRlcm5hbFBlcnNwZWN0aXZlRHNsUGFyc2VyKSBwYXJzZXI7CisJCQl0eXBlZFBhcnNlci5lbnRyeVJ1bGVQZXJzcGVjdGl2ZU1vZGVsKCk7CisJCQlyZXR1cm4gdHlwZWRQYXJzZXIuZ2V0Rm9sbG93RWxlbWVudHMoKTsKKwkJfSBjYXRjaChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgeworCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOworCQl9CQkKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZ1tdIGdldEluaXRpYWxIaWRkZW5Ub2tlbnMoKSB7CisJCXJldHVybiBuZXcgU3RyaW5nW10geyAiUlVMRV9XUyIsICJSVUxFX01MX0NPTU1FTlQiLCAiUlVMRV9TTF9DT01NRU5UIiB9OworCX0KKwkKKwlwdWJsaWMgUGVyc3BlY3RpdmVEc2xHcmFtbWFyQWNjZXNzIGdldEdyYW1tYXJBY2Nlc3MoKSB7CisJCXJldHVybiB0aGlzLmdyYW1tYXJBY2Nlc3M7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldEdyYW1tYXJBY2Nlc3MoUGVyc3BlY3RpdmVEc2xHcmFtbWFyQWNjZXNzIGdyYW1tYXJBY2Nlc3MpIHsKKwkJdGhpcy5ncmFtbWFyQWNjZXNzID0gZ3JhbW1hckFjY2VzczsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZjQzZDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZwpAQCAtMCwwICsxLDEwMDE0IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCitncmFtbWFyIEludGVybmFsUGVyc3BlY3RpdmVEc2w7CisKK29wdGlvbnMgeworCXN1cGVyQ2xhc3M9QWJzdHJhY3RJbnRlcm5hbENvbnRlbnRBc3Npc3RQYXJzZXI7CisJYmFja3RyYWNrPXRydWU7CisJCit9CisKK0BsZXhlcjo6aGVhZGVyIHsKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5jb250ZW50YXNzaXN0LmFudGxyLmludGVybmFsOworCisvLyBIYWNrOiBVc2Ugb3VyIG93biBMZXhlciBzdXBlcmNsYXNzIGJ5IG1lYW5zIG9mIGltcG9ydC4gCisvLyBDdXJyZW50bHkgdGhlcmUgaXMgbm8gb3RoZXIgd2F5IHRvIHNwZWNpZnkgdGhlIHN1cGVyY2xhc3MgZm9yIHRoZSBsZXhlci4KK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5hbnRsci5pbnRlcm5hbC5MZXhlcjsKK30KKworQHBhcnNlcjo6aGVhZGVyIHsKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5jb250ZW50YXNzaXN0LmFudGxyLmludGVybmFsOyAKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuaW1wbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuWHRleHRUb2tlblN0cmVhbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuWHRleHRUb2tlblN0cmVhbS5IaWRkZW5Ub2tlbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuYW50bHIuaW50ZXJuYWwuQWJzdHJhY3RJbnRlcm5hbENvbnRlbnRBc3Npc3RQYXJzZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuYW50bHIuaW50ZXJuYWwuREZBOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuc2VydmljZXMuUGVyc3BlY3RpdmVEc2xHcmFtbWFyQWNjZXNzOworCit9CisKK0BwYXJzZXI6Om1lbWJlcnMgeworIAorIAlwcml2YXRlIFBlcnNwZWN0aXZlRHNsR3JhbW1hckFjY2VzcyBncmFtbWFyQWNjZXNzOworIAkKKyAgICBwdWJsaWMgdm9pZCBzZXRHcmFtbWFyQWNjZXNzKFBlcnNwZWN0aXZlRHNsR3JhbW1hckFjY2VzcyBncmFtbWFyQWNjZXNzKSB7CisgICAgCXRoaXMuZ3JhbW1hckFjY2VzcyA9IGdyYW1tYXJBY2Nlc3M7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBHcmFtbWFyIGdldEdyYW1tYXIoKSB7CisgICAgCXJldHVybiBncmFtbWFyQWNjZXNzLmdldEdyYW1tYXIoKTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZUZvclRva2VuTmFtZShTdHJpbmcgdG9rZW5OYW1lKSB7CisgICAgCXJldHVybiB0b2tlbk5hbWU7CisgICAgfQorCit9CisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlUGVyc3BlY3RpdmVNb2RlbAorZW50cnlSdWxlUGVyc3BlY3RpdmVNb2RlbCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVNb2RlbFJ1bGUoKSk7IH0KKwkgcnVsZVBlcnNwZWN0aXZlTW9kZWwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZU1vZGVsUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFBlcnNwZWN0aXZlTW9kZWwKK3J1bGVQZXJzcGVjdGl2ZU1vZGVsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlTW9kZWxBY2Nlc3MoKS5nZXRQYWNrYWdlc0Fzc2lnbm1lbnQoKSk7IH0KKyhydWxlX19QZXJzcGVjdGl2ZU1vZGVsX19QYWNrYWdlc0Fzc2lnbm1lbnQpKgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlTW9kZWxBY2Nlc3MoKS5nZXRQYWNrYWdlc0Fzc2lnbm1lbnQoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVQZXJzcGVjdGl2ZVBhY2thZ2UKK2VudHJ5UnVsZVBlcnNwZWN0aXZlUGFja2FnZSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYWNrYWdlUnVsZSgpKTsgfQorCSBydWxlUGVyc3BlY3RpdmVQYWNrYWdlCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYWNrYWdlUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFBlcnNwZWN0aXZlUGFja2FnZQorcnVsZVBlcnNwZWN0aXZlUGFja2FnZQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhY2thZ2VBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1BlcnNwZWN0aXZlUGFja2FnZV9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYWNrYWdlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVQZXJzcGVjdGl2ZUltcG9ydAorZW50cnlSdWxlUGVyc3BlY3RpdmVJbXBvcnQgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlSW1wb3J0UnVsZSgpKTsgfQorCSBydWxlUGVyc3BlY3RpdmVJbXBvcnQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUltcG9ydFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBQZXJzcGVjdGl2ZUltcG9ydAorcnVsZVBlcnNwZWN0aXZlSW1wb3J0CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlSW1wb3J0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19QZXJzcGVjdGl2ZUltcG9ydF9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVJbXBvcnRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVBlcnNwZWN0aXZlCitlbnRyeVJ1bGVQZXJzcGVjdGl2ZSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVSdWxlKCkpOyB9CisJIHJ1bGVQZXJzcGVjdGl2ZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFBlcnNwZWN0aXZlCitydWxlUGVyc3BlY3RpdmUKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1BlcnNwZWN0aXZlX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlUGVyc3BlY3RpdmVFbGVtZW50CitlbnRyeVJ1bGVQZXJzcGVjdGl2ZUVsZW1lbnQgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlRWxlbWVudFJ1bGUoKSk7IH0KKwkgcnVsZVBlcnNwZWN0aXZlRWxlbWVudAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlRWxlbWVudFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBQZXJzcGVjdGl2ZUVsZW1lbnQKK3J1bGVQZXJzcGVjdGl2ZUVsZW1lbnQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVFbGVtZW50QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fUGVyc3BlY3RpdmVFbGVtZW50X19BbHRlcm5hdGl2ZXMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVFbGVtZW50QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyCitlbnRyeVJ1bGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lclJ1bGUoKSk7IH0KKwkgcnVsZVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lcgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lclJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIKK3J1bGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19QZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlUGVyc3BlY3RpdmVQYXJ0U3RhY2sKK2VudHJ5UnVsZVBlcnNwZWN0aXZlUGFydFN0YWNrIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja1J1bGUoKSk7IH0KKwkgcnVsZVBlcnNwZWN0aXZlUGFydFN0YWNrCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgUGVyc3BlY3RpdmVQYXJ0U3RhY2sKK3J1bGVQZXJzcGVjdGl2ZVBhcnRTdGFjaworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja0FjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fUGVyc3BlY3RpdmVQYXJ0U3RhY2tfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVQZXJzcGVjdGl2ZVBhcnQKK2VudHJ5UnVsZVBlcnNwZWN0aXZlUGFydCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0UnVsZSgpKTsgfQorCSBydWxlUGVyc3BlY3RpdmVQYXJ0Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0UnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFBlcnNwZWN0aXZlUGFydAorcnVsZVBlcnNwZWN0aXZlUGFydAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1BlcnNwZWN0aXZlUGFydF9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVQZXJzcGVjdGl2ZVZpZXcKK2VudHJ5UnVsZVBlcnNwZWN0aXZlVmlldyAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVWaWV3UnVsZSgpKTsgfQorCSBydWxlUGVyc3BlY3RpdmVWaWV3Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVWaWV3UnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFBlcnNwZWN0aXZlVmlldworcnVsZVBlcnNwZWN0aXZlVmlldworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVZpZXdBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19QZXJzcGVjdGl2ZVZpZXdfX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVZpZXdBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVQZXJzcGVjdGl2ZVNlbGVjdGlvbgorZW50cnlSdWxlUGVyc3BlY3RpdmVTZWxlY3Rpb24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2VsZWN0aW9uUnVsZSgpKTsgfQorCSBydWxlUGVyc3BlY3RpdmVTZWxlY3Rpb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNlbGVjdGlvblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBQZXJzcGVjdGl2ZVNlbGVjdGlvbgorcnVsZVBlcnNwZWN0aXZlU2VsZWN0aW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2VsZWN0aW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19QZXJzcGVjdGl2ZVNlbGVjdGlvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTZWxlY3Rpb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVBlcnNwZWN0aXZlVGFibGUKK2VudHJ5UnVsZVBlcnNwZWN0aXZlVGFibGUgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVGFibGVSdWxlKCkpOyB9CisJIHJ1bGVQZXJzcGVjdGl2ZVRhYmxlCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVUYWJsZVJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBQZXJzcGVjdGl2ZVRhYmxlCitydWxlUGVyc3BlY3RpdmVUYWJsZQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVRhYmxlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19QZXJzcGVjdGl2ZVRhYmxlX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVRhYmxlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVQZXJzcGVjdGl2ZUdyaWQKK2VudHJ5UnVsZVBlcnNwZWN0aXZlR3JpZCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVHcmlkUnVsZSgpKTsgfQorCSBydWxlUGVyc3BlY3RpdmVHcmlkCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVHcmlkUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFBlcnNwZWN0aXZlR3JpZAorcnVsZVBlcnNwZWN0aXZlR3JpZAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUdyaWRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1BlcnNwZWN0aXZlR3JpZF9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVHcmlkQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVQZXJzcGVjdGl2ZUNoYXJ0CitlbnRyeVJ1bGVQZXJzcGVjdGl2ZUNoYXJ0IAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUNoYXJ0UnVsZSgpKTsgfQorCSBydWxlUGVyc3BlY3RpdmVDaGFydAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQ2hhcnRSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgUGVyc3BlY3RpdmVDaGFydAorcnVsZVBlcnNwZWN0aXZlQ2hhcnQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVDaGFydEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fUGVyc3BlY3RpdmVDaGFydF9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVDaGFydEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlUGVyc3BlY3RpdmVSZXBvcnQKK2VudHJ5UnVsZVBlcnNwZWN0aXZlUmVwb3J0IAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVJlcG9ydFJ1bGUoKSk7IH0KKwkgcnVsZVBlcnNwZWN0aXZlUmVwb3J0Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVSZXBvcnRSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgUGVyc3BlY3RpdmVSZXBvcnQKK3J1bGVQZXJzcGVjdGl2ZVJlcG9ydAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVJlcG9ydEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fUGVyc3BlY3RpdmVSZXBvcnRfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUmVwb3J0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbgorZW50cnlSdWxlUGVyc3BlY3RpdmVPcmdhbml6YXRpb24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlT3JnYW5pemF0aW9uUnVsZSgpKTsgfQorCSBydWxlUGVyc3BlY3RpdmVPcmdhbml6YXRpb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbgorcnVsZVBlcnNwZWN0aXZlT3JnYW5pemF0aW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlT3JnYW5pemF0aW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19QZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVPcmdhbml6YXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVBlcnNwZWN0aXZlVG9wb2xvZ3kKK2VudHJ5UnVsZVBlcnNwZWN0aXZlVG9wb2xvZ3kgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVG9wb2xvZ3lSdWxlKCkpOyB9CisJIHJ1bGVQZXJzcGVjdGl2ZVRvcG9sb2d5Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVUb3BvbG9neVJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBQZXJzcGVjdGl2ZVRvcG9sb2d5CitydWxlUGVyc3BlY3RpdmVUb3BvbG9neQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVRvcG9sb2d5QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19QZXJzcGVjdGl2ZVRvcG9sb2d5X19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVRvcG9sb2d5QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVQZXJzcGVjdGl2ZURpYWxvZworZW50cnlSdWxlUGVyc3BlY3RpdmVEaWFsb2cgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlRGlhbG9nUnVsZSgpKTsgfQorCSBydWxlUGVyc3BlY3RpdmVEaWFsb2cKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZURpYWxvZ1J1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBQZXJzcGVjdGl2ZURpYWxvZworcnVsZVBlcnNwZWN0aXZlRGlhbG9nCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlRGlhbG9nQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19QZXJzcGVjdGl2ZURpYWxvZ19fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVEaWFsb2dBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVBlcnNwZWN0aXZlQlBNTgorZW50cnlSdWxlUGVyc3BlY3RpdmVCUE1OIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUJQTU5SdWxlKCkpOyB9CisJIHJ1bGVQZXJzcGVjdGl2ZUJQTU4KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUJQTU5SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgUGVyc3BlY3RpdmVCUE1OCitydWxlUGVyc3BlY3RpdmVCUE1OCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQlBNTkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fUGVyc3BlY3RpdmVCUE1OX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUJQTU5BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZAorZW50cnlSdWxlUGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRSdWxlKCkpOyB9CisJIHJ1bGVQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgUGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkCitydWxlUGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fUGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVF1YWxpZmllZE5hbWUKK2VudHJ5UnVsZVF1YWxpZmllZE5hbWUgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVSdWxlKCkpOyB9CisJIHJ1bGVRdWFsaWZpZWROYW1lCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZVJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBRdWFsaWZpZWROYW1lCitydWxlUXVhbGlmaWVkTmFtZQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVWYWxpZElECitlbnRyeVJ1bGVWYWxpZElEIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRWYWxpZElEUnVsZSgpKTsgfQorCSBydWxlVmFsaWRJRAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFZhbGlkSURSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgVmFsaWRJRAorcnVsZVZhbGlkSUQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VmFsaWRJREFjY2VzcygpLmdldElEVGVybWluYWxSdWxlQ2FsbCgpKTsgfQorCVJVTEVfSUQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRWYWxpZElEQWNjZXNzKCkuZ2V0SURUZXJtaW5hbFJ1bGVDYWxsKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlVFJBTlNMQVRBQkxFSUQKK2VudHJ5UnVsZVRSQU5TTEFUQUJMRUlEIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUUkFOU0xBVEFCTEVJRFJ1bGUoKSk7IH0KKwkgcnVsZVRSQU5TTEFUQUJMRUlECit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VFJBTlNMQVRBQkxFSURSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgVFJBTlNMQVRBQkxFSUQKK3J1bGVUUkFOU0xBVEFCTEVJRAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUUkFOU0xBVEFCTEVJREFjY2VzcygpLmdldElEVGVybWluYWxSdWxlQ2FsbCgpKTsgfQorCVJVTEVfSUQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUUkFOU0xBVEFCTEVJREFjY2VzcygpLmdldElEVGVybWluYWxSdWxlQ2FsbCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVRSQU5TTEFUQUJMRVNUUklORworZW50cnlSdWxlVFJBTlNMQVRBQkxFU1RSSU5HIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUUkFOU0xBVEFCTEVTVFJJTkdSdWxlKCkpOyB9CisJIHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUUkFOU0xBVEFCTEVTVFJJTkdSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgVFJBTlNMQVRBQkxFU1RSSU5HCitydWxlVFJBTlNMQVRBQkxFU1RSSU5HCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFRSQU5TTEFUQUJMRVNUUklOR0FjY2VzcygpLmdldFNUUklOR1Rlcm1pbmFsUnVsZUNhbGwoKSk7IH0KKwlSVUxFX1NUUklORworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFRSQU5TTEFUQUJMRVNUUklOR0FjY2VzcygpLmdldFNUUklOR1Rlcm1pbmFsUnVsZUNhbGwoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQW5ub3RhdGlvbgorZW50cnlSdWxlWEFubm90YXRpb24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uUnVsZSgpKTsgfQorCSBydWxlWEFubm90YXRpb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQW5ub3RhdGlvbgorcnVsZVhBbm5vdGF0aW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcgorZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJSdWxlKCkpOyB9CisJIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyCitydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QKK2VudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkpOyB9CisJIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0CitydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZQorZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpKTsgfQorCSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZQorcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uCitlbnRyeVJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkpOyB9CisJIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uCitydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWEV4cHJlc3Npb24KK2VudHJ5UnVsZVhFeHByZXNzaW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgcnVsZVhFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWEV4cHJlc3Npb24KK3J1bGVYRXhwcmVzc2lvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbkFjY2VzcygpLmdldFhBc3NpZ25tZW50UGFyc2VyUnVsZUNhbGwoKSk7IH0KKwlydWxlWEFzc2lnbm1lbnQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbkFjY2VzcygpLmdldFhBc3NpZ25tZW50UGFyc2VyUnVsZUNhbGwoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQXNzaWdubWVudAorZW50cnlSdWxlWEFzc2lnbm1lbnQgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpKTsgfQorCSBydWxlWEFzc2lnbm1lbnQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQXNzaWdubWVudAorcnVsZVhBc3NpZ25tZW50CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fWEFzc2lnbm1lbnRfX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZU9wU2luZ2xlQXNzaWduCitlbnRyeVJ1bGVPcFNpbmdsZUFzc2lnbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BTaW5nbGVBc3NpZ25SdWxlKCkpOyB9CisJIHJ1bGVPcFNpbmdsZUFzc2lnbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wU2luZ2xlQXNzaWduUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIE9wU2luZ2xlQXNzaWduCitydWxlT3BTaW5nbGVBc3NpZ24KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BTaW5nbGVBc3NpZ25BY2Nlc3MoKS5nZXRFcXVhbHNTaWduS2V5d29yZCgpKTsgfQorCisJJz0nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BTaW5nbGVBc3NpZ25BY2Nlc3MoKS5nZXRFcXVhbHNTaWduS2V5d29yZCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZU9wTXVsdGlBc3NpZ24KK2VudHJ5UnVsZU9wTXVsdGlBc3NpZ24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25SdWxlKCkpOyB9CisJIHJ1bGVPcE11bHRpQXNzaWduCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBPcE11bHRpQXNzaWduCitydWxlT3BNdWx0aUFzc2lnbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fT3BNdWx0aUFzc2lnbl9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYT3JFeHByZXNzaW9uCitlbnRyeVJ1bGVYT3JFeHByZXNzaW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBydWxlWE9yRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWE9yRXhwcmVzc2lvbgorcnVsZVhPckV4cHJlc3Npb24KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlT3BPcgorZW50cnlSdWxlT3BPciAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPclJ1bGUoKSk7IH0KKwkgcnVsZU9wT3IKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE9yUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIE9wT3IKK3J1bGVPcE9yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3JBY2Nlc3MoKS5nZXRWZXJ0aWNhbExpbmVWZXJ0aWNhbExpbmVLZXl3b3JkKCkpOyB9CisKKwknfHwnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPckFjY2VzcygpLmdldFZlcnRpY2FsTGluZVZlcnRpY2FsTGluZUtleXdvcmQoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQW5kRXhwcmVzc2lvbgorZW50cnlSdWxlWEFuZEV4cHJlc3Npb24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBydWxlWEFuZEV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQW5kRXhwcmVzc2lvbgorcnVsZVhBbmRFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZU9wQW5kCitlbnRyeVJ1bGVPcEFuZCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBbmRSdWxlKCkpOyB9CisJIHJ1bGVPcEFuZAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wQW5kUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIE9wQW5kCitydWxlT3BBbmQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBbmRBY2Nlc3MoKS5nZXRBbXBlcnNhbmRBbXBlcnNhbmRLZXl3b3JkKCkpOyB9CisKKwknJiYnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBbmRBY2Nlc3MoKS5nZXRBbXBlcnNhbmRBbXBlcnNhbmRLZXl3b3JkKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWEVxdWFsaXR5RXhwcmVzc2lvbgorZW50cnlSdWxlWEVxdWFsaXR5RXhwcmVzc2lvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhFcXVhbGl0eUV4cHJlc3Npb24KK3J1bGVYRXF1YWxpdHlFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZU9wRXF1YWxpdHkKK2VudHJ5UnVsZU9wRXF1YWxpdHkgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlSdWxlKCkpOyB9CisJIHJ1bGVPcEVxdWFsaXR5Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BFcXVhbGl0eVJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBPcEVxdWFsaXR5CitydWxlT3BFcXVhbGl0eQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fT3BFcXVhbGl0eV9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24KK2VudHJ5UnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhSZWxhdGlvbmFsRXhwcmVzc2lvbgorcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVPcENvbXBhcmUKK2VudHJ5UnVsZU9wQ29tcGFyZSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlUnVsZSgpKTsgfQorCSBydWxlT3BDb21wYXJlCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIE9wQ29tcGFyZQorcnVsZU9wQ29tcGFyZQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19PcENvbXBhcmVfX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24KK2VudHJ5UnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbgorcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVPcE90aGVyCitlbnRyeVJ1bGVPcE90aGVyIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyUnVsZSgpKTsgfQorCSBydWxlT3BPdGhlcgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgT3BPdGhlcgorcnVsZU9wT3RoZXIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWEFkZGl0aXZlRXhwcmVzc2lvbgorZW50cnlSdWxlWEFkZGl0aXZlRXhwcmVzc2lvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhBZGRpdGl2ZUV4cHJlc3Npb24KK3J1bGVYQWRkaXRpdmVFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZU9wQWRkCitlbnRyeVJ1bGVPcEFkZCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBZGRSdWxlKCkpOyB9CisJIHJ1bGVPcEFkZAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wQWRkUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIE9wQWRkCitydWxlT3BBZGQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBZGRBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19PcEFkZF9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wQWRkQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbgorZW50cnlSdWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24KK3J1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZU9wTXVsdGkKK2VudHJ5UnVsZU9wTXVsdGkgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlSdWxlKCkpOyB9CisJIHJ1bGVPcE11bHRpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aVJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBPcE11bHRpCitydWxlT3BNdWx0aQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fT3BNdWx0aV9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYVW5hcnlPcGVyYXRpb24KK2VudHJ5UnVsZVhVbmFyeU9wZXJhdGlvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKTsgfQorCSBydWxlWFVuYXJ5T3BlcmF0aW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhVbmFyeU9wZXJhdGlvbgorcnVsZVhVbmFyeU9wZXJhdGlvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19YVW5hcnlPcGVyYXRpb25fX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVPcFVuYXJ5CitlbnRyeVJ1bGVPcFVuYXJ5IAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcFVuYXJ5UnVsZSgpKTsgfQorCSBydWxlT3BVbmFyeQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wVW5hcnlSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgT3BVbmFyeQorcnVsZU9wVW5hcnkKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BVbmFyeUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKHJ1bGVfX09wVW5hcnlfX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcFVuYXJ5QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWENhc3RlZEV4cHJlc3Npb24KK2VudHJ5UnVsZVhDYXN0ZWRFeHByZXNzaW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgcnVsZVhDYXN0ZWRFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWENhc3RlZEV4cHJlc3Npb24KK3J1bGVYQ2FzdGVkRXhwcmVzc2lvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYUG9zdGZpeE9wZXJhdGlvbgorZW50cnlSdWxlWFBvc3RmaXhPcGVyYXRpb24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpKTsgfQorCSBydWxlWFBvc3RmaXhPcGVyYXRpb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYUG9zdGZpeE9wZXJhdGlvbgorcnVsZVhQb3N0Zml4T3BlcmF0aW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZU9wUG9zdGZpeAorZW50cnlSdWxlT3BQb3N0Zml4IAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcFBvc3RmaXhSdWxlKCkpOyB9CisJIHJ1bGVPcFBvc3RmaXgKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcFBvc3RmaXhSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgT3BQb3N0Zml4CitydWxlT3BQb3N0Zml4CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wUG9zdGZpeEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKHJ1bGVfX09wUG9zdGZpeF9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wUG9zdGZpeEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhNZW1iZXJGZWF0dXJlQ2FsbAorZW50cnlSdWxlWE1lbWJlckZlYXR1cmVDYWxsIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkpOyB9CisJIHJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWE1lbWJlckZlYXR1cmVDYWxsCitydWxlWE1lbWJlckZlYXR1cmVDYWxsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhQcmltYXJ5RXhwcmVzc2lvbgorZW50cnlSdWxlWFByaW1hcnlFeHByZXNzaW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkpOyB9CisJIHJ1bGVYUHJpbWFyeUV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWFByaW1hcnlFeHByZXNzaW9uCitydWxlWFByaW1hcnlFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKHJ1bGVfX1hQcmltYXJ5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhMaXRlcmFsCitlbnRyeVJ1bGVYTGl0ZXJhbCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxSdWxlKCkpOyB9CisJIHJ1bGVYTGl0ZXJhbAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhMaXRlcmFsCitydWxlWExpdGVyYWwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19YTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWENvbGxlY3Rpb25MaXRlcmFsCitlbnRyeVJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDb2xsZWN0aW9uTGl0ZXJhbFJ1bGUoKSk7IH0KKwkgcnVsZVhDb2xsZWN0aW9uTGl0ZXJhbAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDb2xsZWN0aW9uTGl0ZXJhbFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQ29sbGVjdGlvbkxpdGVyYWwKK3J1bGVYQ29sbGVjdGlvbkxpdGVyYWwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbGxlY3Rpb25MaXRlcmFsQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fWENvbGxlY3Rpb25MaXRlcmFsX19BbHRlcm5hdGl2ZXMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbGxlY3Rpb25MaXRlcmFsQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWFNldExpdGVyYWwKK2VudHJ5UnVsZVhTZXRMaXRlcmFsIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbFJ1bGUoKSk7IH0KKwkgcnVsZVhTZXRMaXRlcmFsCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWFNldExpdGVyYWwKK3J1bGVYU2V0TGl0ZXJhbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTZXRMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYTGlzdExpdGVyYWwKK2VudHJ5UnVsZVhMaXN0TGl0ZXJhbCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsUnVsZSgpKTsgfQorCSBydWxlWExpc3RMaXRlcmFsCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhMaXN0TGl0ZXJhbAorcnVsZVhMaXN0TGl0ZXJhbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTGlzdExpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQ2xvc3VyZQorZW50cnlSdWxlWENsb3N1cmUgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlUnVsZSgpKTsgfQorCSBydWxlWENsb3N1cmUKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZVJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQ2xvc3VyZQorcnVsZVhDbG9zdXJlCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlCitlbnRyeVJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25JbkNsb3N1cmVSdWxlKCkpOyB9CisJIHJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uSW5DbG9zdXJlUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhFeHByZXNzaW9uSW5DbG9zdXJlCitydWxlWEV4cHJlc3Npb25JbkNsb3N1cmUKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25JbkNsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbkluQ2xvc3VyZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWFNob3J0Q2xvc3VyZQorZW50cnlSdWxlWFNob3J0Q2xvc3VyZSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZVJ1bGUoKSk7IH0KKwkgcnVsZVhTaG9ydENsb3N1cmUKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhTaG9ydENsb3N1cmUKK3J1bGVYU2hvcnRDbG9zdXJlCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbgorZW50cnlSdWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkpOyB9CisJIHJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uCitydWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhJZkV4cHJlc3Npb24KK2VudHJ5UnVsZVhJZkV4cHJlc3Npb24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25SdWxlKCkpOyB9CisJIHJ1bGVYSWZFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WElmRXhwcmVzc2lvblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYSWZFeHByZXNzaW9uCitydWxlWElmRXhwcmVzc2lvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYU3dpdGNoRXhwcmVzc2lvbgorZW50cnlSdWxlWFN3aXRjaEV4cHJlc3Npb24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBydWxlWFN3aXRjaEV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYU3dpdGNoRXhwcmVzc2lvbgorcnVsZVhTd2l0Y2hFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhDYXNlUGFydAorZW50cnlSdWxlWENhc2VQYXJ0IAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRSdWxlKCkpOyB9CisJIHJ1bGVYQ2FzZVBhcnQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWENhc2VQYXJ0CitydWxlWENhc2VQYXJ0CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhGb3JMb29wRXhwcmVzc2lvbgorZW50cnlSdWxlWEZvckxvb3BFeHByZXNzaW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25SdWxlKCkpOyB9CisJIHJ1bGVYRm9yTG9vcEV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWEZvckxvb3BFeHByZXNzaW9uCitydWxlWEZvckxvb3BFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhCYXNpY0Zvckxvb3BFeHByZXNzaW9uCitlbnRyeVJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25SdWxlKCkpOyB9CisJIHJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uCitydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWFdoaWxlRXhwcmVzc2lvbgorZW50cnlSdWxlWFdoaWxlRXhwcmVzc2lvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFdoaWxlRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgcnVsZVhXaGlsZUV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYV2hpbGVFeHByZXNzaW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhXaGlsZUV4cHJlc3Npb24KK3J1bGVYV2hpbGVFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhXaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhXaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhEb1doaWxlRXhwcmVzc2lvbgorZW50cnlSdWxlWERvV2hpbGVFeHByZXNzaW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25SdWxlKCkpOyB9CisJIHJ1bGVYRG9XaGlsZUV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWERvV2hpbGVFeHByZXNzaW9uCitydWxlWERvV2hpbGVFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhEb1doaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhCbG9ja0V4cHJlc3Npb24KK2VudHJ5UnVsZVhCbG9ja0V4cHJlc3Npb24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCbG9ja0V4cHJlc3Npb25SdWxlKCkpOyB9CisJIHJ1bGVYQmxvY2tFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEJsb2NrRXhwcmVzc2lvblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQmxvY2tFeHByZXNzaW9uCitydWxlWEJsb2NrRXhwcmVzc2lvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQmxvY2tFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQmxvY2tFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24KK2VudHJ5UnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpKTsgfQorCSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbgorcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19YRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYVmFyaWFibGVEZWNsYXJhdGlvbgorZW50cnlSdWxlWFZhcmlhYmxlRGVjbGFyYXRpb24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uUnVsZSgpKTsgfQorCSBydWxlWFZhcmlhYmxlRGVjbGFyYXRpb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYVmFyaWFibGVEZWNsYXJhdGlvbgorcnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUp2bUZvcm1hbFBhcmFtZXRlcgorZW50cnlSdWxlSnZtRm9ybWFsUGFyYW1ldGVyIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Gb3JtYWxQYXJhbWV0ZXJSdWxlKCkpOyB9CisJIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Gb3JtYWxQYXJhbWV0ZXJSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgSnZtRm9ybWFsUGFyYW1ldGVyCitydWxlSnZtRm9ybWFsUGFyYW1ldGVyCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bUZvcm1hbFBhcmFtZXRlckFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIKK2VudHJ5UnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJSdWxlKCkpOyB9CisJIHJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RnVsbEp2bUZvcm1hbFBhcmFtZXRlclJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBGdWxsSnZtRm9ybWFsUGFyYW1ldGVyCitydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlcgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGdWxsSnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRGdWxsSnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYRmVhdHVyZUNhbGwKK2VudHJ5UnVsZVhGZWF0dXJlQ2FsbCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsUnVsZSgpKTsgfQorCSBydWxlWEZlYXR1cmVDYWxsCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhGZWF0dXJlQ2FsbAorcnVsZVhGZWF0dXJlQ2FsbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVGZWF0dXJlQ2FsbElECitlbnRyeVJ1bGVGZWF0dXJlQ2FsbElEIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGZWF0dXJlQ2FsbElEUnVsZSgpKTsgfQorCSBydWxlRmVhdHVyZUNhbGxJRAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEZlYXR1cmVDYWxsSURSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgRmVhdHVyZUNhbGxJRAorcnVsZUZlYXR1cmVDYWxsSUQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RmVhdHVyZUNhbGxJREFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKHJ1bGVfX0ZlYXR1cmVDYWxsSURfX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRGZWF0dXJlQ2FsbElEQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlSWRPclN1cGVyCitlbnRyeVJ1bGVJZE9yU3VwZXIgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldElkT3JTdXBlclJ1bGUoKSk7IH0KKwkgcnVsZUlkT3JTdXBlcgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldElkT3JTdXBlclJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBJZE9yU3VwZXIKK3J1bGVJZE9yU3VwZXIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SWRPclN1cGVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fSWRPclN1cGVyX19BbHRlcm5hdGl2ZXMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SWRPclN1cGVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWENvbnN0cnVjdG9yQ2FsbAorZW50cnlSdWxlWENvbnN0cnVjdG9yQ2FsbCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbFJ1bGUoKSk7IH0KKwkgcnVsZVhDb25zdHJ1Y3RvckNhbGwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhDb25zdHJ1Y3RvckNhbGwKK3J1bGVYQ29uc3RydWN0b3JDYWxsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhCb29sZWFuTGl0ZXJhbAorZW50cnlSdWxlWEJvb2xlYW5MaXRlcmFsIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQm9vbGVhbkxpdGVyYWxSdWxlKCkpOyB9CisJIHJ1bGVYQm9vbGVhbkxpdGVyYWwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQm9vbGVhbkxpdGVyYWxSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWEJvb2xlYW5MaXRlcmFsCitydWxlWEJvb2xlYW5MaXRlcmFsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCb29sZWFuTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQm9vbGVhbkxpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhOdWxsTGl0ZXJhbAorZW50cnlSdWxlWE51bGxMaXRlcmFsIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTnVsbExpdGVyYWxSdWxlKCkpOyB9CisJIHJ1bGVYTnVsbExpdGVyYWwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTnVsbExpdGVyYWxSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWE51bGxMaXRlcmFsCitydWxlWE51bGxMaXRlcmFsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhOdWxsTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTnVsbExpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhOdW1iZXJMaXRlcmFsCitlbnRyeVJ1bGVYTnVtYmVyTGl0ZXJhbCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE51bWJlckxpdGVyYWxSdWxlKCkpOyB9CisJIHJ1bGVYTnVtYmVyTGl0ZXJhbAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhOdW1iZXJMaXRlcmFsUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhOdW1iZXJMaXRlcmFsCitydWxlWE51bWJlckxpdGVyYWwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE51bWJlckxpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTnVtYmVyTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWFN0cmluZ0xpdGVyYWwKK2VudHJ5UnVsZVhTdHJpbmdMaXRlcmFsIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3RyaW5nTGl0ZXJhbFJ1bGUoKSk7IH0KKwkgcnVsZVhTdHJpbmdMaXRlcmFsCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFN0cmluZ0xpdGVyYWxSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWFN0cmluZ0xpdGVyYWwKK3J1bGVYU3RyaW5nTGl0ZXJhbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3RyaW5nTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTdHJpbmdMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYVHlwZUxpdGVyYWwKK2VudHJ5UnVsZVhUeXBlTGl0ZXJhbCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsUnVsZSgpKTsgfQorCSBydWxlWFR5cGVMaXRlcmFsCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhUeXBlTGl0ZXJhbAorcnVsZVhUeXBlTGl0ZXJhbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVHlwZUxpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYVGhyb3dFeHByZXNzaW9uCitlbnRyeVJ1bGVYVGhyb3dFeHByZXNzaW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVGhyb3dFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBydWxlWFRocm93RXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhUaHJvd0V4cHJlc3Npb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWFRocm93RXhwcmVzc2lvbgorcnVsZVhUaHJvd0V4cHJlc3Npb24KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFRocm93RXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFRocm93RXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWFJldHVybkV4cHJlc3Npb24KK2VudHJ5UnVsZVhSZXR1cm5FeHByZXNzaW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUmV0dXJuRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgcnVsZVhSZXR1cm5FeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFJldHVybkV4cHJlc3Npb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWFJldHVybkV4cHJlc3Npb24KK3J1bGVYUmV0dXJuRXhwcmVzc2lvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUmV0dXJuRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhSZXR1cm5FeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbgorZW50cnlSdWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBydWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbgorcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uCitlbnRyeVJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25SdWxlKCkpOyB9CisJIHJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uCitydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWENhdGNoQ2xhdXNlCitlbnRyeVJ1bGVYQ2F0Y2hDbGF1c2UgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXRjaENsYXVzZVJ1bGUoKSk7IH0KKwkgcnVsZVhDYXRjaENsYXVzZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDYXRjaENsYXVzZVJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQ2F0Y2hDbGF1c2UKK3J1bGVYQ2F0Y2hDbGF1c2UKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhdGNoQ2xhdXNlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDYXRjaENsYXVzZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlTnVtYmVyCitlbnRyeVJ1bGVOdW1iZXIgCitAaW5pdCB7CisJSGlkZGVuVG9rZW5zIG15SGlkZGVuVG9rZW5TdGF0ZSA9ICgoWHRleHRUb2tlblN0cmVhbSlpbnB1dCkuc2V0SGlkZGVuVG9rZW5zKCk7Cit9Cis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE51bWJlclJ1bGUoKSk7IH0KKwkgcnVsZU51bWJlcgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE51bWJlclJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKK2ZpbmFsbHkgeworCW15SGlkZGVuVG9rZW5TdGF0ZS5yZXN0b3JlKCk7Cit9CisKKy8vIFJ1bGUgTnVtYmVyCitydWxlTnVtYmVyCisgICAgQGluaXQgeworCQlIaWRkZW5Ub2tlbnMgbXlIaWRkZW5Ub2tlblN0YXRlID0gKChYdGV4dFRva2VuU3RyZWFtKWlucHV0KS5zZXRIaWRkZW5Ub2tlbnMoKTsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCW15SGlkZGVuVG9rZW5TdGF0ZS5yZXN0b3JlKCk7Cit9CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVKdm1UeXBlUmVmZXJlbmNlCitlbnRyeVJ1bGVKdm1UeXBlUmVmZXJlbmNlIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUmVmZXJlbmNlUnVsZSgpKTsgfQorCSBydWxlSnZtVHlwZVJlZmVyZW5jZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgSnZtVHlwZVJlZmVyZW5jZQorcnVsZUp2bVR5cGVSZWZlcmVuY2UKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlQXJyYXlCcmFja2V0cworZW50cnlSdWxlQXJyYXlCcmFja2V0cyAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0QXJyYXlCcmFja2V0c1J1bGUoKSk7IH0KKwkgcnVsZUFycmF5QnJhY2tldHMKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRBcnJheUJyYWNrZXRzUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIEFycmF5QnJhY2tldHMKK3J1bGVBcnJheUJyYWNrZXRzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEFycmF5QnJhY2tldHNBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEFycmF5QnJhY2tldHNBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhGdW5jdGlvblR5cGVSZWYKK2VudHJ5UnVsZVhGdW5jdGlvblR5cGVSZWYgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZSdWxlKCkpOyB9CisJIHJ1bGVYRnVuY3Rpb25UeXBlUmVmCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZlJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYRnVuY3Rpb25UeXBlUmVmCitydWxlWEZ1bmN0aW9uVHlwZVJlZgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZQorZW50cnlSdWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlUnVsZSgpKTsgfQorCSBydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZVJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZQorcnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQorZW50cnlSdWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VSdWxlKCkpOyB9CisJIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCitydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKHJ1bGVfX0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZQorZW50cnlSdWxlSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VSdWxlKCkpOyB9CisJIHJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlCitydWxlSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUp2bVVwcGVyQm91bmQKK2VudHJ5UnVsZUp2bVVwcGVyQm91bmQgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRSdWxlKCkpOyB9CisJIHJ1bGVKdm1VcHBlckJvdW5kCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBKdm1VcHBlckJvdW5kCitydWxlSnZtVXBwZXJCb3VuZAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19Kdm1VcHBlckJvdW5kX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVKdm1VcHBlckJvdW5kQW5kZWQKK2VudHJ5UnVsZUp2bVVwcGVyQm91bmRBbmRlZCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZEFuZGVkUnVsZSgpKTsgfQorCSBydWxlSnZtVXBwZXJCb3VuZEFuZGVkCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZEFuZGVkUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIEp2bVVwcGVyQm91bmRBbmRlZAorcnVsZUp2bVVwcGVyQm91bmRBbmRlZAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kQW5kZWRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZEFuZGVkQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVKdm1Mb3dlckJvdW5kCitlbnRyeVJ1bGVKdm1Mb3dlckJvdW5kIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Mb3dlckJvdW5kUnVsZSgpKTsgfQorCSBydWxlSnZtTG93ZXJCb3VuZAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgSnZtTG93ZXJCb3VuZAorcnVsZUp2bUxvd2VyQm91bmQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlSnZtTG93ZXJCb3VuZEFuZGVkCitlbnRyeVJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRBbmRlZFJ1bGUoKSk7IH0KKwkgcnVsZUp2bUxvd2VyQm91bmRBbmRlZAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRBbmRlZFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBKdm1Mb3dlckJvdW5kQW5kZWQKK3J1bGVKdm1Mb3dlckJvdW5kQW5kZWQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFuZGVkQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRBbmRlZEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQKK2VudHJ5UnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRSdWxlKCkpOyB9CisJIHJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkCitydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWEltcG9ydERlY2xhcmF0aW9uCitlbnRyeVJ1bGVYSW1wb3J0RGVjbGFyYXRpb24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvblJ1bGUoKSk7IH0KKwkgcnVsZVhJbXBvcnREZWNsYXJhdGlvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYSW1wb3J0RGVjbGFyYXRpb24KK3J1bGVYSW1wb3J0RGVjbGFyYXRpb24KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0CitlbnRyeVJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydFJ1bGUoKSk7IH0KKwkgcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQKK3J1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMCkqCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisvLyBSdWxlIFNhc2hPcmllbnRhdGlvbgorcnVsZVNhc2hPcmllbnRhdGlvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFNhc2hPcmllbnRhdGlvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKHJ1bGVfX1Nhc2hPcmllbnRhdGlvbl9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFNhc2hPcmllbnRhdGlvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCitydWxlX19QZXJzcGVjdGl2ZUVsZW1lbnRfX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlRWxlbWVudEFjY2VzcygpLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lclBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKwlydWxlUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVFbGVtZW50QWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVFbGVtZW50QWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tQYXJzZXJSdWxlQ2FsbF8xKCkpOyB9CisJcnVsZVBlcnNwZWN0aXZlUGFydFN0YWNrCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVFbGVtZW50QWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tQYXJzZXJSdWxlQ2FsbF8xKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUVsZW1lbnRBY2Nlc3MoKS5nZXRQZXJzcGVjdGl2ZVBhcnRQYXJzZXJSdWxlQ2FsbF8yKCkpOyB9CisJcnVsZVBlcnNwZWN0aXZlUGFydAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlRWxlbWVudEFjY2VzcygpLmdldFBlcnNwZWN0aXZlUGFydFBhcnNlclJ1bGVDYWxsXzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QZXJzcGVjdGl2ZVZpZXdfX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVmlld0FjY2VzcygpLmdldFBlcnNwZWN0aXZlU2VsZWN0aW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorCXJ1bGVQZXJzcGVjdGl2ZVNlbGVjdGlvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVmlld0FjY2VzcygpLmdldFBlcnNwZWN0aXZlU2VsZWN0aW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVWaWV3QWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVUYWJsZVBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKwlydWxlUGVyc3BlY3RpdmVUYWJsZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVmlld0FjY2VzcygpLmdldFBlcnNwZWN0aXZlVGFibGVQYXJzZXJSdWxlQ2FsbF8xKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVZpZXdBY2Nlc3MoKS5nZXRQZXJzcGVjdGl2ZUNoYXJ0UGFyc2VyUnVsZUNhbGxfMigpKTsgfQorCXJ1bGVQZXJzcGVjdGl2ZUNoYXJ0Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVWaWV3QWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVDaGFydFBhcnNlclJ1bGVDYWxsXzIoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVmlld0FjY2VzcygpLmdldFBlcnNwZWN0aXZlUmVwb3J0UGFyc2VyUnVsZUNhbGxfMygpKTsgfQorCXJ1bGVQZXJzcGVjdGl2ZVJlcG9ydAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVmlld0FjY2VzcygpLmdldFBlcnNwZWN0aXZlUmVwb3J0UGFyc2VyUnVsZUNhbGxfMygpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVWaWV3QWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVPcmdhbml6YXRpb25QYXJzZXJSdWxlQ2FsbF80KCkpOyB9CisJcnVsZVBlcnNwZWN0aXZlT3JnYW5pemF0aW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVWaWV3QWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVPcmdhbml6YXRpb25QYXJzZXJSdWxlQ2FsbF80KCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVZpZXdBY2Nlc3MoKS5nZXRQZXJzcGVjdGl2ZVRvcG9sb2d5UGFyc2VyUnVsZUNhbGxfNSgpKTsgfQorCXJ1bGVQZXJzcGVjdGl2ZVRvcG9sb2d5Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVWaWV3QWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVUb3BvbG9neVBhcnNlclJ1bGVDYWxsXzUoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVmlld0FjY2VzcygpLmdldFBlcnNwZWN0aXZlRGlhbG9nUGFyc2VyUnVsZUNhbGxfNigpKTsgfQorCXJ1bGVQZXJzcGVjdGl2ZURpYWxvZworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVmlld0FjY2VzcygpLmdldFBlcnNwZWN0aXZlRGlhbG9nUGFyc2VyUnVsZUNhbGxfNigpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVWaWV3QWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVCUE1OUGFyc2VyUnVsZUNhbGxfNygpKTsgfQorCXJ1bGVQZXJzcGVjdGl2ZUJQTU4KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVZpZXdBY2Nlc3MoKS5nZXRQZXJzcGVjdGl2ZUJQTU5QYXJzZXJSdWxlQ2FsbF83KCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVZpZXdBY2Nlc3MoKS5nZXRQZXJzcGVjdGl2ZUdyaWRQYXJzZXJSdWxlQ2FsbF84KCkpOyB9CisJcnVsZVBlcnNwZWN0aXZlR3JpZAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVmlld0FjY2VzcygpLmdldFBlcnNwZWN0aXZlR3JpZFBhcnNlclJ1bGVDYWxsXzgoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbl9fQWx0ZXJuYXRpdmVzXzNfMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfM18xXzAoKSk7IH0KKyhydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRHcm91cF8zXzFfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRWYWx1ZUFzc2lnbm1lbnRfM18xXzEoKSk7IH0KKyhydWxlX19YQW5ub3RhdGlvbl9fVmFsdWVBc3NpZ25tZW50XzNfMV8xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0VmFsdWVBc3NpZ25tZW50XzNfMV8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEdyb3VwXzAoKSk7IH0KKyhydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0R3JvdXBfMSgpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEdyb3VwXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRHcm91cF8wKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRHcm91cF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMSgpKTsgfQorCXJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25PckV4cHJlc3Npb25fX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEFubm90YXRpb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CisJcnVsZVhBbm5vdGF0aW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQW5ub3RhdGlvblBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xKCkpOyB9CisJcnVsZVhFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQXNzaWdubWVudF9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRHcm91cF8wKCkpOyB9CisocnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRHcm91cF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEdyb3VwXzEoKSk7IH0KKyhydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEdyb3VwXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19PcE11bHRpQXNzaWduX19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0UGx1c1NpZ25FcXVhbHNTaWduS2V5d29yZF8wKCkpOyB9CisKKwknKz0nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldFBsdXNTaWduRXF1YWxzU2lnbktleXdvcmRfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEh5cGhlbk1pbnVzRXF1YWxzU2lnbktleXdvcmRfMSgpKTsgfQorCisJJy09JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRIeXBoZW5NaW51c0VxdWFsc1NpZ25LZXl3b3JkXzEoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRBc3Rlcmlza0VxdWFsc1NpZ25LZXl3b3JkXzIoKSk7IH0KKworCScqPScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0QXN0ZXJpc2tFcXVhbHNTaWduS2V5d29yZF8yKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0U29saWR1c0VxdWFsc1NpZ25LZXl3b3JkXzMoKSk7IH0KKworCScvPScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0U29saWR1c0VxdWFsc1NpZ25LZXl3b3JkXzMoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRQZXJjZW50U2lnbkVxdWFsc1NpZ25LZXl3b3JkXzQoKSk7IH0KKworCSclPScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0UGVyY2VudFNpZ25FcXVhbHNTaWduS2V5d29yZF80KCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0R3JvdXBfNSgpKTsgfQorKHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEdyb3VwXzUoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRHcm91cF82KCkpOyB9CisocnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0R3JvdXBfNigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX09wRXF1YWxpdHlfX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlBY2Nlc3MoKS5nZXRFcXVhbHNTaWduRXF1YWxzU2lnbktleXdvcmRfMCgpKTsgfQorCisJJz09JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlBY2Nlc3MoKS5nZXRFcXVhbHNTaWduRXF1YWxzU2lnbktleXdvcmRfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BFcXVhbGl0eUFjY2VzcygpLmdldEV4Y2xhbWF0aW9uTWFya0VxdWFsc1NpZ25LZXl3b3JkXzEoKSk7IH0KKworCSchPScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5QWNjZXNzKCkuZ2V0RXhjbGFtYXRpb25NYXJrRXF1YWxzU2lnbktleXdvcmRfMSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BFcXVhbGl0eUFjY2VzcygpLmdldEVxdWFsc1NpZ25FcXVhbHNTaWduRXF1YWxzU2lnbktleXdvcmRfMigpKTsgfQorCisJJz09PScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5QWNjZXNzKCkuZ2V0RXF1YWxzU2lnbkVxdWFsc1NpZ25FcXVhbHNTaWduS2V5d29yZF8yKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5QWNjZXNzKCkuZ2V0RXhjbGFtYXRpb25NYXJrRXF1YWxzU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzMoKSk7IH0KKworCSchPT0nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BFcXVhbGl0eUFjY2VzcygpLmdldEV4Y2xhbWF0aW9uTWFya0VxdWFsc1NpZ25FcXVhbHNTaWduS2V5d29yZF8zKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMCgpKTsgfQorKHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8xKCkpOyB9CisocnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fT3BDb21wYXJlX19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25FcXVhbHNTaWduS2V5d29yZF8wKCkpOyB9CisKKwknPj0nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduRXF1YWxzU2lnbktleXdvcmRfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlQWNjZXNzKCkuZ2V0R3JvdXBfMSgpKTsgfQorKHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRHcm91cF8xKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzIoKSk7IH0KKworCSc+JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZUFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfMigpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF8zKCkpOyB9CisKKwknPCcgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0SHlwaGVuTWludXNHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzAoKSk7IH0KKworCSctPicgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0SHlwaGVuTWludXNHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRGdWxsU3RvcEZ1bGxTdG9wTGVzc1RoYW5TaWduS2V5d29yZF8xKCkpOyB9CisKKwknLi48JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRGdWxsU3RvcEZ1bGxTdG9wTGVzc1RoYW5TaWduS2V5d29yZF8xKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JvdXBfMigpKTsgfQorKHJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyb3VwXzIoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRGdWxsU3RvcEZ1bGxTdG9wS2V5d29yZF8zKCkpOyB9CisKKwknLi4nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEZ1bGxTdG9wRnVsbFN0b3BLZXl3b3JkXzMoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRFcXVhbHNTaWduR3JlYXRlclRoYW5TaWduS2V5d29yZF80KCkpOyB9CisKKwknPT4nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEVxdWFsc1NpZ25HcmVhdGVyVGhhblNpZ25LZXl3b3JkXzQoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcm91cF81KCkpOyB9CisocnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JvdXBfNSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyb3VwXzYoKSk7IH0KKyhydWxlX19PcE90aGVyX19Hcm91cF82X18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcm91cF82KCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduR3JlYXRlclRoYW5TaWduS2V5d29yZF83KCkpOyB9CisKKwknPD4nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldExlc3NUaGFuU2lnbkdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNygpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldFF1ZXN0aW9uTWFya0NvbG9uS2V5d29yZF84KCkpOyB9CisKKwknPzonIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldFF1ZXN0aW9uTWFya0NvbG9uS2V5d29yZF84KCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzXzVfMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcm91cF81XzFfMCgpKTsgfQorKHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcm91cF81XzFfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNV8xXzEoKSk7IH0KKworCSc+JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzVfMV8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzXzZfMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcm91cF82XzFfMCgpKTsgfQorKHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcm91cF82XzFfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfNl8xXzEoKSk7IH0KKworCSc8JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzZfMV8xKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0RXF1YWxzU2lnbkdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNl8xXzIoKSk7IH0KKworCSc9PicgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0RXF1YWxzU2lnbkdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNl8xXzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19PcEFkZF9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBZGRBY2Nlc3MoKS5nZXRQbHVzU2lnbktleXdvcmRfMCgpKTsgfQorCisJJysnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBZGRBY2Nlc3MoKS5nZXRQbHVzU2lnbktleXdvcmRfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBZGRBY2Nlc3MoKS5nZXRIeXBoZW5NaW51c0tleXdvcmRfMSgpKTsgfQorCisJJy0nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBZGRBY2Nlc3MoKS5nZXRIeXBoZW5NaW51c0tleXdvcmRfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX09wTXVsdGlfX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBY2Nlc3MoKS5nZXRBc3Rlcmlza0tleXdvcmRfMCgpKTsgfQorCisJJyonIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFjY2VzcygpLmdldEFzdGVyaXNrS2V5d29yZF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQWNjZXNzKCkuZ2V0QXN0ZXJpc2tBc3Rlcmlza0tleXdvcmRfMSgpKTsgfQorCisJJyoqJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBY2Nlc3MoKS5nZXRBc3Rlcmlza0FzdGVyaXNrS2V5d29yZF8xKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQWNjZXNzKCkuZ2V0U29saWR1c0tleXdvcmRfMigpKTsgfQorCisJJy8nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFjY2VzcygpLmdldFNvbGlkdXNLZXl3b3JkXzIoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBY2Nlc3MoKS5nZXRQZXJjZW50U2lnbktleXdvcmRfMygpKTsgfQorCisJJyUnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFjY2VzcygpLmdldFBlcmNlbnRTaWduS2V5d29yZF8zKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25BY2Nlc3MoKS5nZXRHcm91cF8wKCkpOyB9CisocnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvbkFjY2VzcygpLmdldEdyb3VwXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMSgpKTsgfQorCXJ1bGVYQ2FzdGVkRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX09wVW5hcnlfX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wVW5hcnlBY2Nlc3MoKS5nZXRFeGNsYW1hdGlvbk1hcmtLZXl3b3JkXzAoKSk7IH0KKworCSchJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wVW5hcnlBY2Nlc3MoKS5nZXRFeGNsYW1hdGlvbk1hcmtLZXl3b3JkXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wVW5hcnlBY2Nlc3MoKS5nZXRIeXBoZW5NaW51c0tleXdvcmRfMSgpKTsgfQorCisJJy0nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BVbmFyeUFjY2VzcygpLmdldEh5cGhlbk1pbnVzS2V5d29yZF8xKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcFVuYXJ5QWNjZXNzKCkuZ2V0UGx1c1NpZ25LZXl3b3JkXzIoKSk7IH0KKworCScrJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wVW5hcnlBY2Nlc3MoKS5nZXRQbHVzU2lnbktleXdvcmRfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX09wUG9zdGZpeF9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BQb3N0Zml4QWNjZXNzKCkuZ2V0UGx1c1NpZ25QbHVzU2lnbktleXdvcmRfMCgpKTsgfQorCisJJysrJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wUG9zdGZpeEFjY2VzcygpLmdldFBsdXNTaWduUGx1c1NpZ25LZXl3b3JkXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wUG9zdGZpeEFjY2VzcygpLmdldEh5cGhlbk1pbnVzSHlwaGVuTWludXNLZXl3b3JkXzEoKSk7IH0KKworCSctLScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcFBvc3RmaXhBY2Nlc3MoKS5nZXRIeXBoZW5NaW51c0h5cGhlbk1pbnVzS2V5d29yZF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMCgpKTsgfQorKHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfMV8xKCkpOyB9CisocnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfMV8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8wXzBfMF8xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RnVsbFN0b3BLZXl3b3JkXzFfMF8wXzBfMV8wKCkpOyB9CisKKwknLicgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRGdWxsU3RvcEtleXdvcmRfMV8wXzBfMF8xXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0U3RhdGljQXNzaWdubWVudF8xXzBfMF8wXzFfMSgpKTsgfQorKHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRXhwbGljaXRTdGF0aWNBc3NpZ25tZW50XzFfMF8wXzBfMV8xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0U3RhdGljQXNzaWdubWVudF8xXzBfMF8wXzFfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMV8wXzBfMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZ1bGxTdG9wS2V5d29yZF8xXzFfMF8wXzFfMCgpKTsgfQorCisJJy4nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RnVsbFN0b3BLZXl3b3JkXzFfMV8wXzBfMV8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXROdWxsU2FmZUFzc2lnbm1lbnRfMV8xXzBfMF8xXzEoKSk7IH0KKyhydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX051bGxTYWZlQXNzaWdubWVudF8xXzFfMF8wXzFfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXROdWxsU2FmZUFzc2lnbm1lbnRfMV8xXzBfMF8xXzEoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0U3RhdGljQXNzaWdubWVudF8xXzFfMF8wXzFfMigpKTsgfQorKHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRXhwbGljaXRTdGF0aWNBc3NpZ25tZW50XzFfMV8wXzBfMV8yKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0U3RhdGljQXNzaWdubWVudF8xXzFfMF8wXzFfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMV8zXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRNZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzAoKSk7IH0KKyhydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRNZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMV8zXzFfMSgpKTsgfQorKHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMV8zXzFfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hQcmltYXJ5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENvbnN0cnVjdG9yQ2FsbFBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKwlydWxlWENvbnN0cnVjdG9yQ2FsbAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhDb25zdHJ1Y3RvckNhbGxQYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmxvY2tFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMSgpKTsgfQorCXJ1bGVYQmxvY2tFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJsb2NrRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhTd2l0Y2hFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMigpKTsgfQorCXJ1bGVYU3dpdGNoRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhTd2l0Y2hFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMigpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8zKCkpOyB9CisoCXJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbikKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzMoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhGZWF0dXJlQ2FsbFBhcnNlclJ1bGVDYWxsXzQoKSk7IH0KKwlydWxlWEZlYXR1cmVDYWxsCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEZlYXR1cmVDYWxsUGFyc2VyUnVsZUNhbGxfNCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WExpdGVyYWxQYXJzZXJSdWxlQ2FsbF81KCkpOyB9CisJcnVsZVhMaXRlcmFsCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WExpdGVyYWxQYXJzZXJSdWxlQ2FsbF81KCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSWZFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfNigpKTsgfQorCXJ1bGVYSWZFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WElmRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzYoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhGb3JMb29wRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzcoKSk7IH0KKygJcnVsZVhGb3JMb29wRXhwcmVzc2lvbikKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYRm9yTG9vcEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF83KCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzgoKSk7IH0KKwlydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzgoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhXaGlsZUV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF85KCkpOyB9CisJcnVsZVhXaGlsZUV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYV2hpbGVFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfOSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WERvV2hpbGVFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMTAoKSk7IH0KKwlydWxlWERvV2hpbGVFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WERvV2hpbGVFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMTAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhUaHJvd0V4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xMSgpKTsgfQorCXJ1bGVYVGhyb3dFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFRocm93RXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzExKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYUmV0dXJuRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEyKCkpOyB9CisJcnVsZVhSZXR1cm5FeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFJldHVybkV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xMigpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xMygpKTsgfQorCXJ1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMTMoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzE0KCkpOyB9CisJcnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzE0KCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWExpdGVyYWxfX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsQWNjZXNzKCkuZ2V0WENvbGxlY3Rpb25MaXRlcmFsUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorCXJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbEFjY2VzcygpLmdldFhDb2xsZWN0aW9uTGl0ZXJhbFBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsQWNjZXNzKCkuZ2V0WENsb3N1cmVQYXJzZXJSdWxlQ2FsbF8xKCkpOyB9CisoCXJ1bGVYQ2xvc3VyZSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbEFjY2VzcygpLmdldFhDbG9zdXJlUGFyc2VyUnVsZUNhbGxfMSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxBY2Nlc3MoKS5nZXRYQm9vbGVhbkxpdGVyYWxQYXJzZXJSdWxlQ2FsbF8yKCkpOyB9CisJcnVsZVhCb29sZWFuTGl0ZXJhbAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsQWNjZXNzKCkuZ2V0WEJvb2xlYW5MaXRlcmFsUGFyc2VyUnVsZUNhbGxfMigpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxBY2Nlc3MoKS5nZXRYTnVtYmVyTGl0ZXJhbFBhcnNlclJ1bGVDYWxsXzMoKSk7IH0KKwlydWxlWE51bWJlckxpdGVyYWwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbEFjY2VzcygpLmdldFhOdW1iZXJMaXRlcmFsUGFyc2VyUnVsZUNhbGxfMygpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxBY2Nlc3MoKS5nZXRYTnVsbExpdGVyYWxQYXJzZXJSdWxlQ2FsbF80KCkpOyB9CisJcnVsZVhOdWxsTGl0ZXJhbAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsQWNjZXNzKCkuZ2V0WE51bGxMaXRlcmFsUGFyc2VyUnVsZUNhbGxfNCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxBY2Nlc3MoKS5nZXRYU3RyaW5nTGl0ZXJhbFBhcnNlclJ1bGVDYWxsXzUoKSk7IH0KKwlydWxlWFN0cmluZ0xpdGVyYWwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbEFjY2VzcygpLmdldFhTdHJpbmdMaXRlcmFsUGFyc2VyUnVsZUNhbGxfNSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxBY2Nlc3MoKS5nZXRYVHlwZUxpdGVyYWxQYXJzZXJSdWxlQ2FsbF82KCkpOyB9CisJcnVsZVhUeXBlTGl0ZXJhbAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsQWNjZXNzKCkuZ2V0WFR5cGVMaXRlcmFsUGFyc2VyUnVsZUNhbGxfNigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hDb2xsZWN0aW9uTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbGxlY3Rpb25MaXRlcmFsQWNjZXNzKCkuZ2V0WFNldExpdGVyYWxQYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CisJcnVsZVhTZXRMaXRlcmFsCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbGxlY3Rpb25MaXRlcmFsQWNjZXNzKCkuZ2V0WFNldExpdGVyYWxQYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29sbGVjdGlvbkxpdGVyYWxBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxQYXJzZXJSdWxlQ2FsbF8xKCkpOyB9CisJcnVsZVhMaXN0TGl0ZXJhbAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDb2xsZWN0aW9uTGl0ZXJhbEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbFBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzJfMCgpKTsgfQorKHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8yXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMl8xKCkpOyB9CisocnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzJfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hDYXNlUGFydF9fQWx0ZXJuYXRpdmVzXzMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRHcm91cF8zXzAoKSk7IH0KKyhydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzNfMF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRHcm91cF8zXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldEZhbGxUaHJvdWdoQXNzaWdubWVudF8zXzEoKSk7IH0KKyhydWxlX19YQ2FzZVBhcnRfX0ZhbGxUaHJvdWdoQXNzaWdubWVudF8zXzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0QWNjZXNzKCkuZ2V0RmFsbFRocm91Z2hBc3NpZ25tZW50XzNfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CisJcnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKwlydWxlWEV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldFdyaXRlYWJsZUFzc2lnbm1lbnRfMV8wKCkpOyB9CisocnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1dyaXRlYWJsZUFzc2lnbm1lbnRfMV8wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0V3JpdGVhYmxlQXNzaWdubWVudF8xXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0VmFsS2V5d29yZF8xXzEoKSk7IH0KKworCSd2YWwnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRWYWxLZXl3b3JkXzFfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfMl8wKCkpOyB9CisocnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldEdyb3VwXzJfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXROYW1lQXNzaWdubWVudF8yXzEoKSk7IH0KKyhydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fTmFtZUFzc2lnbm1lbnRfMl8xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0TmFtZUFzc2lnbm1lbnRfMl8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfM18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8wKCkpOyB9CisocnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8zXzFfMSgpKTsgfQorKHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfM18xXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19GZWF0dXJlQ2FsbElEX19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGZWF0dXJlQ2FsbElEQWNjZXNzKCkuZ2V0VmFsaWRJRFBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKwlydWxlVmFsaWRJRAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEZlYXR1cmVDYWxsSURBY2Nlc3MoKS5nZXRWYWxpZElEUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RmVhdHVyZUNhbGxJREFjY2VzcygpLmdldEV4dGVuZHNLZXl3b3JkXzEoKSk7IH0KKworCSdleHRlbmRzJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEZlYXR1cmVDYWxsSURBY2Nlc3MoKS5nZXRFeHRlbmRzS2V5d29yZF8xKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGZWF0dXJlQ2FsbElEQWNjZXNzKCkuZ2V0U3RhdGljS2V5d29yZF8yKCkpOyB9CisKKwknc3RhdGljJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEZlYXR1cmVDYWxsSURBY2Nlc3MoKS5nZXRTdGF0aWNLZXl3b3JkXzIoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEZlYXR1cmVDYWxsSURBY2Nlc3MoKS5nZXRJbXBvcnRLZXl3b3JkXzMoKSk7IH0KKworCSdpbXBvcnQnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RmVhdHVyZUNhbGxJREFjY2VzcygpLmdldEltcG9ydEtleXdvcmRfMygpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RmVhdHVyZUNhbGxJREFjY2VzcygpLmdldEV4dGVuc2lvbktleXdvcmRfNCgpKTsgfQorCisJJ2V4dGVuc2lvbicgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRGZWF0dXJlQ2FsbElEQWNjZXNzKCkuZ2V0RXh0ZW5zaW9uS2V5d29yZF80KCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fSWRPclN1cGVyX19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRJZE9yU3VwZXJBY2Nlc3MoKS5nZXRGZWF0dXJlQ2FsbElEUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorCXJ1bGVGZWF0dXJlQ2FsbElECit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SWRPclN1cGVyQWNjZXNzKCkuZ2V0RmVhdHVyZUNhbGxJRFBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldElkT3JTdXBlckFjY2VzcygpLmdldFN1cGVyS2V5d29yZF8xKCkpOyB9CisKKwknc3VwZXInIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SWRPclN1cGVyQWNjZXNzKCkuZ2V0U3VwZXJLZXl3b3JkXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQ29uc3RydWN0b3JDYWxsX19BbHRlcm5hdGl2ZXNfNF8xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEFyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzAoKSk7IH0KKyhydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRBcmd1bWVudHNBc3NpZ25tZW50XzRfMV8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfNF8xXzEoKSk7IH0KKyhydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfNF8xXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQm9vbGVhbkxpdGVyYWxfX0FsdGVybmF0aXZlc18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJvb2xlYW5MaXRlcmFsQWNjZXNzKCkuZ2V0RmFsc2VLZXl3b3JkXzFfMCgpKTsgfQorCisJJ2ZhbHNlJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhCb29sZWFuTGl0ZXJhbEFjY2VzcygpLmdldEZhbHNlS2V5d29yZF8xXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCb29sZWFuTGl0ZXJhbEFjY2VzcygpLmdldElzVHJ1ZUFzc2lnbm1lbnRfMV8xKCkpOyB9CisocnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Jc1RydWVBc3NpZ25tZW50XzFfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQm9vbGVhbkxpdGVyYWxBY2Nlc3MoKS5nZXRJc1RydWVBc3NpZ25tZW50XzFfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfM18wKCkpOyB9CisocnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzNfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8zXzEoKSk7IH0KKyhydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18xX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfM18xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJBY2Nlc3MoKS5nZXRIRVhUZXJtaW5hbFJ1bGVDYWxsXzAoKSk7IH0KKwlSVUxFX0hFWAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldEhFWFRlcm1pbmFsUnVsZUNhbGxfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0R3JvdXBfMSgpKTsgfQorKHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJBY2Nlc3MoKS5nZXRHcm91cF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXNfMV8wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0SU5UVGVybWluYWxSdWxlQ2FsbF8xXzBfMCgpKTsgfQorCVJVTEVfSU5UCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0SU5UVGVybWluYWxSdWxlQ2FsbF8xXzBfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0REVDSU1BTFRlcm1pbmFsUnVsZUNhbGxfMV8wXzEoKSk7IH0KKwlSVUxFX0RFQ0lNQUwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJBY2Nlc3MoKS5nZXRERUNJTUFMVGVybWluYWxSdWxlQ2FsbF8xXzBfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX051bWJlcl9fQWx0ZXJuYXRpdmVzXzFfMV8xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0SU5UVGVybWluYWxSdWxlQ2FsbF8xXzFfMV8wKCkpOyB9CisJUlVMRV9JTlQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJBY2Nlc3MoKS5nZXRJTlRUZXJtaW5hbFJ1bGVDYWxsXzFfMV8xXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldERFQ0lNQUxUZXJtaW5hbFJ1bGVDYWxsXzFfMV8xXzEoKSk7IH0KKwlSVUxFX0RFQ0lNQUwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJBY2Nlc3MoKS5nZXRERUNJTUFMVGVybWluYWxSdWxlQ2FsbF8xXzFfMV8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzAoKSk7IH0KKyhydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0WEZ1bmN0aW9uVHlwZVJlZlBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKwlydWxlWEZ1bmN0aW9uVHlwZVJlZgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRYRnVuY3Rpb25UeXBlUmVmUGFyc2VyUnVsZUNhbGxfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0SnZtVHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKwlydWxlSnZtVHlwZVJlZmVyZW5jZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEp2bVR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xKCkpOyB9CisJcnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlc18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXBfMl8wKCkpOyB9CisocnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXBfMl8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cF8yXzEoKSk7IH0KKyhydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cF8yXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wKCkpOyB9CisocnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8xXzBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRJbXBvcnRlZFR5cGVBc3NpZ25tZW50XzFfMSgpKTsgfQorKHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRUeXBlQXNzaWdubWVudF8xXzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0SW1wb3J0ZWRUeXBlQXNzaWdubWVudF8xXzEoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEltcG9ydGVkTmFtZXNwYWNlQXNzaWdubWVudF8xXzIoKSk7IH0KKyhydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkTmFtZXNwYWNlQXNzaWdubWVudF8xXzIpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0SW1wb3J0ZWROYW1lc3BhY2VBc3NpZ25tZW50XzFfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzFfMF8zCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0V2lsZGNhcmRBc3NpZ25tZW50XzFfMF8zXzAoKSk7IH0KKyhydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX1dpbGRjYXJkQXNzaWdubWVudF8xXzBfM18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldFdpbGRjYXJkQXNzaWdubWVudF8xXzBfM18wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRNZW1iZXJOYW1lQXNzaWdubWVudF8xXzBfM18xKCkpOyB9CisocnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19NZW1iZXJOYW1lQXNzaWdubWVudF8xXzBfM18xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldE1lbWJlck5hbWVBc3NpZ25tZW50XzFfMF8zXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19TYXNoT3JpZW50YXRpb25fX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFNhc2hPcmllbnRhdGlvbkFjY2VzcygpLmdldEhPUklaT05UQUxFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKSk7IH0KKygJJ2hvcml6b250YWwnIAorKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFNhc2hPcmllbnRhdGlvbkFjY2VzcygpLmdldEhPUklaT05UQUxFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFNhc2hPcmllbnRhdGlvbkFjY2VzcygpLmdldFZFUlRJQ0FMRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xKCkpOyB9CisoCSd2ZXJ0aWNhbCcgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0U2FzaE9yaWVudGF0aW9uQWNjZXNzKCkuZ2V0VkVSVElDQUxFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworcnVsZV9fUGVyc3BlY3RpdmVQYWNrYWdlX19Hcm91cF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGVyc3BlY3RpdmVQYWNrYWdlX19Hcm91cF9fMF9fSW1wbAorCXJ1bGVfX1BlcnNwZWN0aXZlUGFja2FnZV9fR3JvdXBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVQYWNrYWdlX19Hcm91cF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFja2FnZUFjY2VzcygpLmdldFBlcnNwZWN0aXZlUGFja2FnZUFjdGlvbl8wKCkpOyB9CisoCisKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhY2thZ2VBY2Nlc3MoKS5nZXRQZXJzcGVjdGl2ZVBhY2thZ2VBY3Rpb25fMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUGVyc3BlY3RpdmVQYWNrYWdlX19Hcm91cF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGVyc3BlY3RpdmVQYWNrYWdlX19Hcm91cF9fMV9fSW1wbAorCXJ1bGVfX1BlcnNwZWN0aXZlUGFja2FnZV9fR3JvdXBfXzIKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVQYWNrYWdlX19Hcm91cF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFja2FnZUFjY2VzcygpLmdldFBhY2thZ2VLZXl3b3JkXzEoKSk7IH0KKworCSdwYWNrYWdlJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFja2FnZUFjY2VzcygpLmdldFBhY2thZ2VLZXl3b3JkXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1BlcnNwZWN0aXZlUGFja2FnZV9fR3JvdXBfXzIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlUGFja2FnZV9fR3JvdXBfXzJfX0ltcGwKKwlydWxlX19QZXJzcGVjdGl2ZVBhY2thZ2VfX0dyb3VwX18zCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BlcnNwZWN0aXZlUGFja2FnZV9fR3JvdXBfXzJfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhY2thZ2VBY2Nlc3MoKS5nZXROYW1lQXNzaWdubWVudF8yKCkpOyB9CisocnVsZV9fUGVyc3BlY3RpdmVQYWNrYWdlX19OYW1lQXNzaWdubWVudF8yKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFja2FnZUFjY2VzcygpLmdldE5hbWVBc3NpZ25tZW50XzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1BlcnNwZWN0aXZlUGFja2FnZV9fR3JvdXBfXzMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlUGFja2FnZV9fR3JvdXBfXzNfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVQYWNrYWdlX19Hcm91cF9fM19fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFja2FnZUFjY2VzcygpLmdldEdyb3VwXzMoKSk7IH0KKyhydWxlX19QZXJzcGVjdGl2ZVBhY2thZ2VfX0dyb3VwXzNfXzApPworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFja2FnZUFjY2VzcygpLmdldEdyb3VwXzMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworCisKKworCitydWxlX19QZXJzcGVjdGl2ZVBhY2thZ2VfX0dyb3VwXzNfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlUGFja2FnZV9fR3JvdXBfM19fMF9fSW1wbAorCXJ1bGVfX1BlcnNwZWN0aXZlUGFja2FnZV9fR3JvdXBfM19fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QZXJzcGVjdGl2ZVBhY2thZ2VfX0dyb3VwXzNfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhY2thZ2VBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8zXzAoKSk7IH0KKworCSd7JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFja2FnZUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzNfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUGVyc3BlY3RpdmVQYWNrYWdlX19Hcm91cF8zX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QZXJzcGVjdGl2ZVBhY2thZ2VfX0dyb3VwXzNfXzFfX0ltcGwKKwlydWxlX19QZXJzcGVjdGl2ZVBhY2thZ2VfX0dyb3VwXzNfXzIKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVQYWNrYWdlX19Hcm91cF8zX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYWNrYWdlQWNjZXNzKCkuZ2V0SW1wb3J0c0Fzc2lnbm1lbnRfM18xKCkpOyB9CisocnVsZV9fUGVyc3BlY3RpdmVQYWNrYWdlX19JbXBvcnRzQXNzaWdubWVudF8zXzEpKgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFja2FnZUFjY2VzcygpLmdldEltcG9ydHNBc3NpZ25tZW50XzNfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUGVyc3BlY3RpdmVQYWNrYWdlX19Hcm91cF8zX18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QZXJzcGVjdGl2ZVBhY2thZ2VfX0dyb3VwXzNfXzJfX0ltcGwKKwlydWxlX19QZXJzcGVjdGl2ZVBhY2thZ2VfX0dyb3VwXzNfXzMKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVQYWNrYWdlX19Hcm91cF8zX18yX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYWNrYWdlQWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVzQXNzaWdubWVudF8zXzIoKSk7IH0KKyhydWxlX19QZXJzcGVjdGl2ZVBhY2thZ2VfX1BlcnNwZWN0aXZlc0Fzc2lnbm1lbnRfM18yKSoKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhY2thZ2VBY2Nlc3MoKS5nZXRQZXJzcGVjdGl2ZXNBc3NpZ25tZW50XzNfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUGVyc3BlY3RpdmVQYWNrYWdlX19Hcm91cF8zX18zCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QZXJzcGVjdGl2ZVBhY2thZ2VfX0dyb3VwXzNfXzNfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVQYWNrYWdlX19Hcm91cF8zX18zX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYWNrYWdlQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzNfMygpKTsgfQorCisJJ30nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYWNrYWdlQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzNfMygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCisKKworCisKK3J1bGVfX1BlcnNwZWN0aXZlSW1wb3J0X19Hcm91cF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGVyc3BlY3RpdmVJbXBvcnRfX0dyb3VwX18wX19JbXBsCisJcnVsZV9fUGVyc3BlY3RpdmVJbXBvcnRfX0dyb3VwX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BlcnNwZWN0aXZlSW1wb3J0X19Hcm91cF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlSW1wb3J0QWNjZXNzKCkuZ2V0SW1wb3J0S2V5d29yZF8wKCkpOyB9CisKKwknaW1wb3J0JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlSW1wb3J0QWNjZXNzKCkuZ2V0SW1wb3J0S2V5d29yZF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19QZXJzcGVjdGl2ZUltcG9ydF9fR3JvdXBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlSW1wb3J0X19Hcm91cF9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QZXJzcGVjdGl2ZUltcG9ydF9fR3JvdXBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUltcG9ydEFjY2VzcygpLmdldEltcG9ydGVkTmFtZXNwYWNlQXNzaWdubWVudF8xKCkpOyB9CisocnVsZV9fUGVyc3BlY3RpdmVJbXBvcnRfX0ltcG9ydGVkTmFtZXNwYWNlQXNzaWdubWVudF8xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlSW1wb3J0QWNjZXNzKCkuZ2V0SW1wb3J0ZWROYW1lc3BhY2VBc3NpZ25tZW50XzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QZXJzcGVjdGl2ZV9fR3JvdXBfXzBfX0ltcGwKKwlydWxlX19QZXJzcGVjdGl2ZV9fR3JvdXBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRQZXJzcGVjdGl2ZUFjdGlvbl8wKCkpOyB9CisoCisKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldFBlcnNwZWN0aXZlQWN0aW9uXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1BlcnNwZWN0aXZlX19Hcm91cF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwX18xX19JbXBsCisJcnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwX18yCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BlcnNwZWN0aXZlX19Hcm91cF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVLZXl3b3JkXzEoKSk7IH0KKworCSdwZXJzcGVjdGl2ZScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldFBlcnNwZWN0aXZlS2V5d29yZF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19QZXJzcGVjdGl2ZV9fR3JvdXBfXzIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlX19Hcm91cF9fMl9fSW1wbAorCXJ1bGVfX1BlcnNwZWN0aXZlX19Hcm91cF9fMworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QZXJzcGVjdGl2ZV9fR3JvdXBfXzJfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldE5hbWVBc3NpZ25tZW50XzIoKSk7IH0KKyhydWxlX19QZXJzcGVjdGl2ZV9fTmFtZUFzc2lnbm1lbnRfMikKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldE5hbWVBc3NpZ25tZW50XzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1BlcnNwZWN0aXZlX19Hcm91cF9fMworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwX18zX19JbXBsCisJcnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwX180Cis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BlcnNwZWN0aXZlX19Hcm91cF9fM19fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQWNjZXNzKCkuZ2V0R3JvdXBfMygpKTsgfQorKHJ1bGVfX1BlcnNwZWN0aXZlX19Hcm91cF8zX18wKT8KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldEdyb3VwXzMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1BlcnNwZWN0aXZlX19Hcm91cF9fNAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwX180X19JbXBsCisJcnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwX181Cis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BlcnNwZWN0aXZlX19Hcm91cF9fNF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQWNjZXNzKCkuZ2V0R3JvdXBfNCgpKTsgfQorKHJ1bGVfX1BlcnNwZWN0aXZlX19Hcm91cF80X18wKT8KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldEdyb3VwXzQoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1BlcnNwZWN0aXZlX19Hcm91cF9fNQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwX181X19JbXBsCisJcnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwX182Cis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BlcnNwZWN0aXZlX19Hcm91cF9fNV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNSgpKTsgfQorKHJ1bGVfX1BlcnNwZWN0aXZlX19Vbm9yZGVyZWRHcm91cF81KQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwX182CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QZXJzcGVjdGl2ZV9fR3JvdXBfXzZfX0ltcGwKKwlydWxlX19QZXJzcGVjdGl2ZV9fR3JvdXBfXzcKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwX182X19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF82KCkpOyB9CisKKwkneycgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzYoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1BlcnNwZWN0aXZlX19Hcm91cF9fNworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwX183X19JbXBsCisJcnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwX184Cis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BlcnNwZWN0aXZlX19Hcm91cF9fN19fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQWNjZXNzKCkuZ2V0RWxlbWVudHNBc3NpZ25tZW50XzcoKSk7IH0KKyhydWxlX19QZXJzcGVjdGl2ZV9fRWxlbWVudHNBc3NpZ25tZW50XzcpKgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQWNjZXNzKCkuZ2V0RWxlbWVudHNBc3NpZ25tZW50XzcoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1BlcnNwZWN0aXZlX19Hcm91cF9fOAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwX184X19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BlcnNwZWN0aXZlX19Hcm91cF9fOF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzgoKSk7IH0KKworCSd9JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzgoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK3J1bGVfX1BlcnNwZWN0aXZlX19Hcm91cF8zX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QZXJzcGVjdGl2ZV9fR3JvdXBfM19fMF9fSW1wbAorCXJ1bGVfX1BlcnNwZWN0aXZlX19Hcm91cF8zX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BlcnNwZWN0aXZlX19Hcm91cF8zX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXREZXNjcmlwdGlvbkFzc2lnbm1lbnRfM18wKCkpOyB9CisocnVsZV9fUGVyc3BlY3RpdmVfX0Rlc2NyaXB0aW9uQXNzaWdubWVudF8zXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXREZXNjcmlwdGlvbkFzc2lnbm1lbnRfM18wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19QZXJzcGVjdGl2ZV9fR3JvdXBfM19fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwXzNfXzFfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwXzNfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldERlc2NyaXB0aW9uVmFsdWVBc3NpZ25tZW50XzNfMSgpKTsgfQorKHJ1bGVfX1BlcnNwZWN0aXZlX19EZXNjcmlwdGlvblZhbHVlQXNzaWdubWVudF8zXzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXREZXNjcmlwdGlvblZhbHVlQXNzaWdubWVudF8zXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwXzRfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlX19Hcm91cF80X18wX19JbXBsCisJcnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwXzRfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwXzRfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldFByb2Nlc3NLZXl3b3JkXzRfMCgpKTsgfQorCisJJ3Byb2Nlc3MnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRQcm9jZXNzS2V5d29yZF80XzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1BlcnNwZWN0aXZlX19Hcm91cF80X18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QZXJzcGVjdGl2ZV9fR3JvdXBfNF9fMV9fSW1wbAorCXJ1bGVfX1BlcnNwZWN0aXZlX19Hcm91cF80X18yCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BlcnNwZWN0aXZlX19Hcm91cF80X18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRQcm9jZXNzQXNzaWdubWVudF80XzEoKSk7IH0KKyhydWxlX19QZXJzcGVjdGl2ZV9fUHJvY2Vzc0Fzc2lnbm1lbnRfNF8xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQWNjZXNzKCkuZ2V0UHJvY2Vzc0Fzc2lnbm1lbnRfNF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19QZXJzcGVjdGl2ZV9fR3JvdXBfNF9fMgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwXzRfXzJfX0ltcGwKKwlydWxlX19QZXJzcGVjdGl2ZV9fR3JvdXBfNF9fMworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QZXJzcGVjdGl2ZV9fR3JvdXBfNF9fMl9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQWNjZXNzKCkuZ2V0VXNlcnRhc2tLZXl3b3JkXzRfMigpKTsgfQorCisJJ3VzZXJ0YXNrJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQWNjZXNzKCkuZ2V0VXNlcnRhc2tLZXl3b3JkXzRfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwXzRfXzMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlX19Hcm91cF80X18zX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BlcnNwZWN0aXZlX19Hcm91cF80X18zX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRVc2VyVGFza0Fzc2lnbm1lbnRfNF8zKCkpOyB9CisocnVsZV9fUGVyc3BlY3RpdmVfX1VzZXJUYXNrQXNzaWdubWVudF80XzMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRVc2VyVGFza0Fzc2lnbm1lbnRfNF8zKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKKworCisKKworcnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwXzVfMF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwXzVfMF9fMF9fSW1wbAorCXJ1bGVfX1BlcnNwZWN0aXZlX19Hcm91cF81XzBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwXzVfMF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQWNjZXNzKCkuZ2V0SWNvblVSSUtleXdvcmRfNV8wXzAoKSk7IH0KKworCSdpY29uVVJJJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQWNjZXNzKCkuZ2V0SWNvblVSSUtleXdvcmRfNV8wXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1BlcnNwZWN0aXZlX19Hcm91cF81XzBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlX19Hcm91cF81XzBfXzFfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwXzVfMF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQWNjZXNzKCkuZ2V0SWNvblVSSUFzc2lnbm1lbnRfNV8wXzEoKSk7IH0KKyhydWxlX19QZXJzcGVjdGl2ZV9fSWNvblVSSUFzc2lnbm1lbnRfNV8wXzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRJY29uVVJJQXNzaWdubWVudF81XzBfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCitydWxlX19QZXJzcGVjdGl2ZV9fR3JvdXBfNV8xX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QZXJzcGVjdGl2ZV9fR3JvdXBfNV8xX18wX19JbXBsCisJcnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwXzVfMV9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QZXJzcGVjdGl2ZV9fR3JvdXBfNV8xX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRBY2Nlc3NpYmlsaXR5S2V5d29yZF81XzFfMCgpKTsgfQorCisJJ2FjY2Vzc2liaWxpdHknIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRBY2Nlc3NpYmlsaXR5S2V5d29yZF81XzFfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwXzVfMV9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwXzVfMV9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QZXJzcGVjdGl2ZV9fR3JvdXBfNV8xX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRBY2Nlc3NpYmlsaXR5UGhyYXNlQXNzaWdubWVudF81XzFfMSgpKTsgfQorKHJ1bGVfX1BlcnNwZWN0aXZlX19BY2Nlc3NpYmlsaXR5UGhyYXNlQXNzaWdubWVudF81XzFfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldEFjY2Vzc2liaWxpdHlQaHJhc2VBc3NpZ25tZW50XzVfMV8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX1BlcnNwZWN0aXZlX19Hcm91cF81XzJfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlX19Hcm91cF81XzJfXzBfX0ltcGwKKwlydWxlX19QZXJzcGVjdGl2ZV9fR3JvdXBfNV8yX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BlcnNwZWN0aXZlX19Hcm91cF81XzJfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldFRvb2xiYXJLZXl3b3JkXzVfMl8wKCkpOyB9CisKKwkndG9vbGJhcicgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldFRvb2xiYXJLZXl3b3JkXzVfMl8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19QZXJzcGVjdGl2ZV9fR3JvdXBfNV8yX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QZXJzcGVjdGl2ZV9fR3JvdXBfNV8yX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BlcnNwZWN0aXZlX19Hcm91cF81XzJfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldFRvb2xiYXJBc3NpZ25tZW50XzVfMl8xKCkpOyB9CisocnVsZV9fUGVyc3BlY3RpdmVfX1Rvb2xiYXJBc3NpZ25tZW50XzVfMl8xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQWNjZXNzKCkuZ2V0VG9vbGJhckFzc2lnbm1lbnRfNV8yXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX19Hcm91cF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX19Hcm91cF9fMF9fSW1wbAorCXJ1bGVfX1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lcl9fR3JvdXBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX19Hcm91cF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjdGlvbl8wKCkpOyB9CisoCisKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY3Rpb25fMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX19Hcm91cF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX19Hcm91cF9fMV9fSW1wbAorCXJ1bGVfX1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lcl9fR3JvdXBfXzIKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX19Hcm91cF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldFNhc2hDb250YWluZXJLZXl3b3JkXzEoKSk7IH0KKworCSdzYXNoQ29udGFpbmVyJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldFNhc2hDb250YWluZXJLZXl3b3JkXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lcl9fR3JvdXBfXzIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lcl9fR3JvdXBfXzJfX0ltcGwKKwlydWxlX19QZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfX0dyb3VwX18zCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lcl9fR3JvdXBfXzJfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRFbGVtZW50SWRBc3NpZ25tZW50XzIoKSk7IH0KKyhydWxlX19QZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfX0VsZW1lbnRJZEFzc2lnbm1lbnRfMikKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRFbGVtZW50SWRBc3NpZ25tZW50XzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lcl9fR3JvdXBfXzMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lcl9fR3JvdXBfXzNfX0ltcGwKKwlydWxlX19QZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfX0dyb3VwX180Cis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lcl9fR3JvdXBfXzNfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCkpOyB9CisocnVsZV9fUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX19Vbm9yZGVyZWRHcm91cF8zKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lcl9fR3JvdXBfXzQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lcl9fR3JvdXBfXzRfX0ltcGwKKwlydWxlX19QZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfX0dyb3VwX181Cis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lcl9fR3JvdXBfXzRfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF80KCkpOyB9CisKKwkneycgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF80KCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19QZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfX0dyb3VwX181CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfX0dyb3VwX181X19JbXBsCisJcnVsZV9fUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX19Hcm91cF9fNgorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfX0dyb3VwX181X19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyQWNjZXNzKCkuZ2V0RWxlbWVudHNBc3NpZ25tZW50XzUoKSk7IH0KKyhydWxlX19QZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfX0VsZW1lbnRzQXNzaWdubWVudF81KSoKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfNSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX19Hcm91cF9fNgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX19Hcm91cF9fNl9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfX0dyb3VwX182X19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzYoKSk7IH0KKworCSd9JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF82KCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKKworCisKKworCisKKworCisKKworcnVsZV9fUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX19Hcm91cF8zXzBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lcl9fR3JvdXBfM18wX18wX19JbXBsCisJcnVsZV9fUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX19Hcm91cF8zXzBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX19Hcm91cF8zXzBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRPcmllbnRhdGlvbktleXdvcmRfM18wXzAoKSk7IH0KKworCSdvcmllbnRhdGlvbicgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRPcmllbnRhdGlvbktleXdvcmRfM18wXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lcl9fR3JvdXBfM18wX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfX0dyb3VwXzNfMF9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfX0dyb3VwXzNfMF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldE9yaWVudGF0aW9uQXNzaWdubWVudF8zXzBfMSgpKTsgfQorKHJ1bGVfX1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lcl9fT3JpZW50YXRpb25Bc3NpZ25tZW50XzNfMF8xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldE9yaWVudGF0aW9uQXNzaWdubWVudF8zXzBfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCitydWxlX19QZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfX0dyb3VwXzNfMV9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX19Hcm91cF8zXzFfXzBfX0ltcGwKKwlydWxlX19QZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfX0dyb3VwXzNfMV9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfX0dyb3VwXzNfMV9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldFNlbGVjdGVkRWxlbWVudEtleXdvcmRfM18xXzAoKSk7IH0KKworCSdzZWxlY3RlZEVsZW1lbnQnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyQWNjZXNzKCkuZ2V0U2VsZWN0ZWRFbGVtZW50S2V5d29yZF8zXzFfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX19Hcm91cF8zXzFfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lcl9fR3JvdXBfM18xX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lcl9fR3JvdXBfM18xX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyQWNjZXNzKCkuZ2V0U2VsZWN0ZWRFbGVtZW50QXNzaWdubWVudF8zXzFfMSgpKTsgfQorKHJ1bGVfX1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lcl9fU2VsZWN0ZWRFbGVtZW50QXNzaWdubWVudF8zXzFfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRTZWxlY3RlZEVsZW1lbnRBc3NpZ25tZW50XzNfMV8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lcl9fR3JvdXBfM18yX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfX0dyb3VwXzNfMl9fMF9fSW1wbAorCXJ1bGVfX1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lcl9fR3JvdXBfM18yX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lcl9fR3JvdXBfM18yX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyQWNjZXNzKCkuZ2V0U3BhY2VWb2x1bWVLZXl3b3JkXzNfMl8wKCkpOyB9CisKKwknc3BhY2VWb2x1bWUnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyQWNjZXNzKCkuZ2V0U3BhY2VWb2x1bWVLZXl3b3JkXzNfMl8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19QZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfX0dyb3VwXzNfMl9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX19Hcm91cF8zXzJfXzFfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX19Hcm91cF8zXzJfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRDb250YWluZXJEYXRhQXNzaWdubWVudF8zXzJfMSgpKTsgfQorKHJ1bGVfX1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lcl9fQ29udGFpbmVyRGF0YUFzc2lnbm1lbnRfM18yXzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyQWNjZXNzKCkuZ2V0Q29udGFpbmVyRGF0YUFzc2lnbm1lbnRfM18yXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX19Hcm91cF8zXzNfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lcl9fR3JvdXBfM18zX18wX19JbXBsCisJcnVsZV9fUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX19Hcm91cF8zXzNfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX19Hcm91cF8zXzNfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRBY2Nlc3NpYmlsaXR5S2V5d29yZF8zXzNfMCgpKTsgfQorCisJJ2FjY2Vzc2liaWxpdHknIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyQWNjZXNzKCkuZ2V0QWNjZXNzaWJpbGl0eUtleXdvcmRfM18zXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lcl9fR3JvdXBfM18zX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfX0dyb3VwXzNfM19fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfX0dyb3VwXzNfM19fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldEFjY2Vzc2liaWxpdHlQaHJhc2VBc3NpZ25tZW50XzNfM18xKCkpOyB9CisocnVsZV9fUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX19BY2Nlc3NpYmlsaXR5UGhyYXNlQXNzaWdubWVudF8zXzNfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRBY2Nlc3NpYmlsaXR5UGhyYXNlQXNzaWdubWVudF8zXzNfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCitydWxlX19QZXJzcGVjdGl2ZVBhcnRTdGFja19fR3JvdXBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlUGFydFN0YWNrX19Hcm91cF9fMF9fSW1wbAorCXJ1bGVfX1BlcnNwZWN0aXZlUGFydFN0YWNrX19Hcm91cF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QZXJzcGVjdGl2ZVBhcnRTdGFja19fR3JvdXBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja0FjY2VzcygpLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrQWN0aW9uXzAoKSk7IH0KKygKKworKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrQWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY3Rpb25fMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUGVyc3BlY3RpdmVQYXJ0U3RhY2tfX0dyb3VwX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QZXJzcGVjdGl2ZVBhcnRTdGFja19fR3JvdXBfXzFfX0ltcGwKKwlydWxlX19QZXJzcGVjdGl2ZVBhcnRTdGFja19fR3JvdXBfXzIKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVQYXJ0U3RhY2tfX0dyb3VwX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY2Nlc3MoKS5nZXRQYXJ0U3RhY2tLZXl3b3JkXzEoKSk7IH0KKworCSdwYXJ0U3RhY2snIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY2Nlc3MoKS5nZXRQYXJ0U3RhY2tLZXl3b3JkXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1BlcnNwZWN0aXZlUGFydFN0YWNrX19Hcm91cF9fMgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGVyc3BlY3RpdmVQYXJ0U3RhY2tfX0dyb3VwX18yX19JbXBsCisJcnVsZV9fUGVyc3BlY3RpdmVQYXJ0U3RhY2tfX0dyb3VwX18zCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BlcnNwZWN0aXZlUGFydFN0YWNrX19Hcm91cF9fMl9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrQWNjZXNzKCkuZ2V0RWxlbWVudElkQXNzaWdubWVudF8yKCkpOyB9CisocnVsZV9fUGVyc3BlY3RpdmVQYXJ0U3RhY2tfX0VsZW1lbnRJZEFzc2lnbm1lbnRfMikKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja0FjY2VzcygpLmdldEVsZW1lbnRJZEFzc2lnbm1lbnRfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUGVyc3BlY3RpdmVQYXJ0U3RhY2tfX0dyb3VwX18zCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QZXJzcGVjdGl2ZVBhcnRTdGFja19fR3JvdXBfXzNfX0ltcGwKKwlydWxlX19QZXJzcGVjdGl2ZVBhcnRTdGFja19fR3JvdXBfXzQKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVQYXJ0U3RhY2tfX0dyb3VwX18zX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCkpOyB9CisocnVsZV9fUGVyc3BlY3RpdmVQYXJ0U3RhY2tfX1Vub3JkZXJlZEdyb3VwXzMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19QZXJzcGVjdGl2ZVBhcnRTdGFja19fR3JvdXBfXzQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlUGFydFN0YWNrX19Hcm91cF9fNF9fSW1wbAorCXJ1bGVfX1BlcnNwZWN0aXZlUGFydFN0YWNrX19Hcm91cF9fNQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QZXJzcGVjdGl2ZVBhcnRTdGFja19fR3JvdXBfXzRfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja0FjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzQoKSk7IH0KKworCSd7JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfNCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUGVyc3BlY3RpdmVQYXJ0U3RhY2tfX0dyb3VwX181CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QZXJzcGVjdGl2ZVBhcnRTdGFja19fR3JvdXBfXzVfX0ltcGwKKwlydWxlX19QZXJzcGVjdGl2ZVBhcnRTdGFja19fR3JvdXBfXzYKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVQYXJ0U3RhY2tfX0dyb3VwX181X19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfNSgpKTsgfQorKHJ1bGVfX1BlcnNwZWN0aXZlUGFydFN0YWNrX19FbGVtZW50c0Fzc2lnbm1lbnRfNSkqCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfNSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUGVyc3BlY3RpdmVQYXJ0U3RhY2tfX0dyb3VwX182CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QZXJzcGVjdGl2ZVBhcnRTdGFja19fR3JvdXBfXzZfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVQYXJ0U3RhY2tfX0dyb3VwX182X19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNigpKTsgfQorCisJJ30nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCisKKworCisKKworCisKKworCisKK3J1bGVfX1BlcnNwZWN0aXZlUGFydFN0YWNrX19Hcm91cF8zXzBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlUGFydFN0YWNrX19Hcm91cF8zXzBfXzBfX0ltcGwKKwlydWxlX19QZXJzcGVjdGl2ZVBhcnRTdGFja19fR3JvdXBfM18wX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BlcnNwZWN0aXZlUGFydFN0YWNrX19Hcm91cF8zXzBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja0FjY2VzcygpLmdldFNlbGVjdGVkRWxlbWVudEtleXdvcmRfM18wXzAoKSk7IH0KKworCSdzZWxlY3RlZEVsZW1lbnQnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY2Nlc3MoKS5nZXRTZWxlY3RlZEVsZW1lbnRLZXl3b3JkXzNfMF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19QZXJzcGVjdGl2ZVBhcnRTdGFja19fR3JvdXBfM18wX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QZXJzcGVjdGl2ZVBhcnRTdGFja19fR3JvdXBfM18wX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BlcnNwZWN0aXZlUGFydFN0YWNrX19Hcm91cF8zXzBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja0FjY2VzcygpLmdldFNlbGVjdGVkRWxlbWVudEFzc2lnbm1lbnRfM18wXzEoKSk7IH0KKyhydWxlX19QZXJzcGVjdGl2ZVBhcnRTdGFja19fU2VsZWN0ZWRFbGVtZW50QXNzaWdubWVudF8zXzBfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja0FjY2VzcygpLmdldFNlbGVjdGVkRWxlbWVudEFzc2lnbm1lbnRfM18wXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fUGVyc3BlY3RpdmVQYXJ0U3RhY2tfX0dyb3VwXzNfMV9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGVyc3BlY3RpdmVQYXJ0U3RhY2tfX0dyb3VwXzNfMV9fMF9fSW1wbAorCXJ1bGVfX1BlcnNwZWN0aXZlUGFydFN0YWNrX19Hcm91cF8zXzFfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVQYXJ0U3RhY2tfX0dyb3VwXzNfMV9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrQWNjZXNzKCkuZ2V0U3BhY2VWb2x1bWVLZXl3b3JkXzNfMV8wKCkpOyB9CisKKwknc3BhY2VWb2x1bWUnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY2Nlc3MoKS5nZXRTcGFjZVZvbHVtZUtleXdvcmRfM18xXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1BlcnNwZWN0aXZlUGFydFN0YWNrX19Hcm91cF8zXzFfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlUGFydFN0YWNrX19Hcm91cF8zXzFfXzFfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVQYXJ0U3RhY2tfX0dyb3VwXzNfMV9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrQWNjZXNzKCkuZ2V0Q29udGFpbmVyRGF0YUFzc2lnbm1lbnRfM18xXzEoKSk7IH0KKyhydWxlX19QZXJzcGVjdGl2ZVBhcnRTdGFja19fQ29udGFpbmVyRGF0YUFzc2lnbm1lbnRfM18xXzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY2Nlc3MoKS5nZXRDb250YWluZXJEYXRhQXNzaWdubWVudF8zXzFfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCitydWxlX19QZXJzcGVjdGl2ZVBhcnRTdGFja19fR3JvdXBfM18yX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QZXJzcGVjdGl2ZVBhcnRTdGFja19fR3JvdXBfM18yX18wX19JbXBsCisJcnVsZV9fUGVyc3BlY3RpdmVQYXJ0U3RhY2tfX0dyb3VwXzNfMl9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QZXJzcGVjdGl2ZVBhcnRTdGFja19fR3JvdXBfM18yX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY2Nlc3MoKS5nZXRBY2Nlc3NpYmlsaXR5S2V5d29yZF8zXzJfMCgpKTsgfQorCisJJ2FjY2Vzc2liaWxpdHknIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY2Nlc3MoKS5nZXRBY2Nlc3NpYmlsaXR5S2V5d29yZF8zXzJfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUGVyc3BlY3RpdmVQYXJ0U3RhY2tfX0dyb3VwXzNfMl9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGVyc3BlY3RpdmVQYXJ0U3RhY2tfX0dyb3VwXzNfMl9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QZXJzcGVjdGl2ZVBhcnRTdGFja19fR3JvdXBfM18yX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY2Nlc3MoKS5nZXRBY2Nlc3NpYmlsaXR5UGhyYXNlQXNzaWdubWVudF8zXzJfMSgpKTsgfQorKHJ1bGVfX1BlcnNwZWN0aXZlUGFydFN0YWNrX19BY2Nlc3NpYmlsaXR5UGhyYXNlQXNzaWdubWVudF8zXzJfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja0FjY2VzcygpLmdldEFjY2Vzc2liaWxpdHlQaHJhc2VBc3NpZ25tZW50XzNfMl8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX1BlcnNwZWN0aXZlUGFydF9fR3JvdXBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlUGFydF9fR3JvdXBfXzBfX0ltcGwKKwlydWxlX19QZXJzcGVjdGl2ZVBhcnRfX0dyb3VwX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BlcnNwZWN0aXZlUGFydF9fR3JvdXBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRQZXJzcGVjdGl2ZVBhcnRBY3Rpb25fMCgpKTsgfQorKAorCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVQYXJ0QWN0aW9uXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1BlcnNwZWN0aXZlUGFydF9fR3JvdXBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlUGFydF9fR3JvdXBfXzFfX0ltcGwKKwlydWxlX19QZXJzcGVjdGl2ZVBhcnRfX0dyb3VwX18yCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BlcnNwZWN0aXZlUGFydF9fR3JvdXBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRQYXJ0S2V5d29yZF8xKCkpOyB9CisKKwkncGFydCcgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRQYXJ0S2V5d29yZF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19QZXJzcGVjdGl2ZVBhcnRfX0dyb3VwX18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QZXJzcGVjdGl2ZVBhcnRfX0dyb3VwX18yX19JbXBsCisJcnVsZV9fUGVyc3BlY3RpdmVQYXJ0X19Hcm91cF9fMworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QZXJzcGVjdGl2ZVBhcnRfX0dyb3VwX18yX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0RWxlbWVudElkQXNzaWdubWVudF8yKCkpOyB9CisocnVsZV9fUGVyc3BlY3RpdmVQYXJ0X19FbGVtZW50SWRBc3NpZ25tZW50XzIpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0RWxlbWVudElkQXNzaWdubWVudF8yKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19QZXJzcGVjdGl2ZVBhcnRfX0dyb3VwX18zCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QZXJzcGVjdGl2ZVBhcnRfX0dyb3VwX18zX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BlcnNwZWN0aXZlUGFydF9fR3JvdXBfXzNfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCkpOyB9CisocnVsZV9fUGVyc3BlY3RpdmVQYXJ0X19Vbm9yZGVyZWRHcm91cF8zKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworCisKKworCitydWxlX19QZXJzcGVjdGl2ZVBhcnRfX0dyb3VwXzNfMF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGVyc3BlY3RpdmVQYXJ0X19Hcm91cF8zXzBfXzBfX0ltcGwKKwlydWxlX19QZXJzcGVjdGl2ZVBhcnRfX0dyb3VwXzNfMF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QZXJzcGVjdGl2ZVBhcnRfX0dyb3VwXzNfMF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldERlc2NyaXB0aW9uQXNzaWdubWVudF8zXzBfMCgpKTsgfQorKHJ1bGVfX1BlcnNwZWN0aXZlUGFydF9fRGVzY3JpcHRpb25Bc3NpZ25tZW50XzNfMF8wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldERlc2NyaXB0aW9uQXNzaWdubWVudF8zXzBfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUGVyc3BlY3RpdmVQYXJ0X19Hcm91cF8zXzBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlUGFydF9fR3JvdXBfM18wX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BlcnNwZWN0aXZlUGFydF9fR3JvdXBfM18wX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0RGVzY3JpcHRpb25WYWx1ZUFzc2lnbm1lbnRfM18wXzEoKSk7IH0KKyhydWxlX19QZXJzcGVjdGl2ZVBhcnRfX0Rlc2NyaXB0aW9uVmFsdWVBc3NpZ25tZW50XzNfMF8xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldERlc2NyaXB0aW9uVmFsdWVBc3NpZ25tZW50XzNfMF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX1BlcnNwZWN0aXZlUGFydF9fR3JvdXBfM18xX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QZXJzcGVjdGl2ZVBhcnRfX0dyb3VwXzNfMV9fMF9fSW1wbAorCXJ1bGVfX1BlcnNwZWN0aXZlUGFydF9fR3JvdXBfM18xX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BlcnNwZWN0aXZlUGFydF9fR3JvdXBfM18xX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0U3BhY2VWb2x1bWVLZXl3b3JkXzNfMV8wKCkpOyB9CisKKwknc3BhY2VWb2x1bWUnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0U3BhY2VWb2x1bWVLZXl3b3JkXzNfMV8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19QZXJzcGVjdGl2ZVBhcnRfX0dyb3VwXzNfMV9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGVyc3BlY3RpdmVQYXJ0X19Hcm91cF8zXzFfXzFfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVQYXJ0X19Hcm91cF8zXzFfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRDb250YWluZXJEYXRhQXNzaWdubWVudF8zXzFfMSgpKTsgfQorKHJ1bGVfX1BlcnNwZWN0aXZlUGFydF9fQ29udGFpbmVyRGF0YUFzc2lnbm1lbnRfM18xXzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0Q29udGFpbmVyRGF0YUFzc2lnbm1lbnRfM18xXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fUGVyc3BlY3RpdmVQYXJ0X19Hcm91cF8zXzJfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlUGFydF9fR3JvdXBfM18yX18wX19JbXBsCisJcnVsZV9fUGVyc3BlY3RpdmVQYXJ0X19Hcm91cF8zXzJfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVQYXJ0X19Hcm91cF8zXzJfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRBY2Nlc3NpYmlsaXR5S2V5d29yZF8zXzJfMCgpKTsgfQorCisJJ2FjY2Vzc2liaWxpdHknIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0QWNjZXNzaWJpbGl0eUtleXdvcmRfM18yXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1BlcnNwZWN0aXZlUGFydF9fR3JvdXBfM18yX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QZXJzcGVjdGl2ZVBhcnRfX0dyb3VwXzNfMl9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QZXJzcGVjdGl2ZVBhcnRfX0dyb3VwXzNfMl9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldEFjY2Vzc2liaWxpdHlQaHJhc2VBc3NpZ25tZW50XzNfMl8xKCkpOyB9CisocnVsZV9fUGVyc3BlY3RpdmVQYXJ0X19BY2Nlc3NpYmlsaXR5UGhyYXNlQXNzaWdubWVudF8zXzJfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRBY2Nlc3NpYmlsaXR5UGhyYXNlQXNzaWdubWVudF8zXzJfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCitydWxlX19QZXJzcGVjdGl2ZVBhcnRfX0dyb3VwXzNfM19fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGVyc3BlY3RpdmVQYXJ0X19Hcm91cF8zXzNfXzBfX0ltcGwKKwlydWxlX19QZXJzcGVjdGl2ZVBhcnRfX0dyb3VwXzNfM19fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QZXJzcGVjdGl2ZVBhcnRfX0dyb3VwXzNfM19fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldEljb25VUklLZXl3b3JkXzNfM18wKCkpOyB9CisKKwknaWNvblVSSScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRJY29uVVJJS2V5d29yZF8zXzNfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUGVyc3BlY3RpdmVQYXJ0X19Hcm91cF8zXzNfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlUGFydF9fR3JvdXBfM18zX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BlcnNwZWN0aXZlUGFydF9fR3JvdXBfM18zX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0SWNvblVSSUFzc2lnbm1lbnRfM18zXzEoKSk7IH0KKyhydWxlX19QZXJzcGVjdGl2ZVBhcnRfX0ljb25VUklBc3NpZ25tZW50XzNfM18xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldEljb25VUklBc3NpZ25tZW50XzNfM18xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX1BlcnNwZWN0aXZlUGFydF9fR3JvdXBfM180X18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QZXJzcGVjdGl2ZVBhcnRfX0dyb3VwXzNfNF9fMF9fSW1wbAorCXJ1bGVfX1BlcnNwZWN0aXZlUGFydF9fR3JvdXBfM180X18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BlcnNwZWN0aXZlUGFydF9fR3JvdXBfM180X18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0Vmlld0tleXdvcmRfM180XzAoKSk7IH0KKworCSd2aWV3JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldFZpZXdLZXl3b3JkXzNfNF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19QZXJzcGVjdGl2ZVBhcnRfX0dyb3VwXzNfNF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGVyc3BlY3RpdmVQYXJ0X19Hcm91cF8zXzRfXzFfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVQYXJ0X19Hcm91cF8zXzRfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRWaWV3QXNzaWdubWVudF8zXzRfMSgpKTsgfQorKHJ1bGVfX1BlcnNwZWN0aXZlUGFydF9fVmlld0Fzc2lnbm1lbnRfM180XzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0Vmlld0Fzc2lnbm1lbnRfM180XzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fUGVyc3BlY3RpdmVTZWxlY3Rpb25fX0dyb3VwX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QZXJzcGVjdGl2ZVNlbGVjdGlvbl9fR3JvdXBfXzBfX0ltcGwKKwlydWxlX19QZXJzcGVjdGl2ZVNlbGVjdGlvbl9fR3JvdXBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVTZWxlY3Rpb25fX0dyb3VwX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTZWxlY3Rpb25BY2Nlc3MoKS5nZXRQZXJzcGVjdGl2ZVNlbGVjdGlvbkFjdGlvbl8wKCkpOyB9CisoCisKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNlbGVjdGlvbkFjY2VzcygpLmdldFBlcnNwZWN0aXZlU2VsZWN0aW9uQWN0aW9uXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1BlcnNwZWN0aXZlU2VsZWN0aW9uX19Hcm91cF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGVyc3BlY3RpdmVTZWxlY3Rpb25fX0dyb3VwX18xX19JbXBsCisJcnVsZV9fUGVyc3BlY3RpdmVTZWxlY3Rpb25fX0dyb3VwX18yCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BlcnNwZWN0aXZlU2VsZWN0aW9uX19Hcm91cF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2VsZWN0aW9uQWNjZXNzKCkuZ2V0U2VsZWN0S2V5d29yZF8xKCkpOyB9CisKKwknc2VsZWN0JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2VsZWN0aW9uQWNjZXNzKCkuZ2V0U2VsZWN0S2V5d29yZF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19QZXJzcGVjdGl2ZVNlbGVjdGlvbl9fR3JvdXBfXzIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlU2VsZWN0aW9uX19Hcm91cF9fMl9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QZXJzcGVjdGl2ZVNlbGVjdGlvbl9fR3JvdXBfXzJfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNlbGVjdGlvbkFjY2VzcygpLmdldFJlZkFzc2lnbm1lbnRfMigpKTsgfQorKHJ1bGVfX1BlcnNwZWN0aXZlU2VsZWN0aW9uX19SZWZBc3NpZ25tZW50XzIpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTZWxlY3Rpb25BY2Nlc3MoKS5nZXRSZWZBc3NpZ25tZW50XzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworCisKK3J1bGVfX1BlcnNwZWN0aXZlVGFibGVfX0dyb3VwX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QZXJzcGVjdGl2ZVRhYmxlX19Hcm91cF9fMF9fSW1wbAorCXJ1bGVfX1BlcnNwZWN0aXZlVGFibGVfX0dyb3VwX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BlcnNwZWN0aXZlVGFibGVfX0dyb3VwX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVUYWJsZUFjY2VzcygpLmdldFBlcnNwZWN0aXZlVGFibGVBY3Rpb25fMCgpKTsgfQorKAorCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVUYWJsZUFjY2VzcygpLmdldFBlcnNwZWN0aXZlVGFibGVBY3Rpb25fMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUGVyc3BlY3RpdmVUYWJsZV9fR3JvdXBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlVGFibGVfX0dyb3VwX18xX19JbXBsCisJcnVsZV9fUGVyc3BlY3RpdmVUYWJsZV9fR3JvdXBfXzIKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVUYWJsZV9fR3JvdXBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVRhYmxlQWNjZXNzKCkuZ2V0VGFibGVLZXl3b3JkXzEoKSk7IH0KKworCSd0YWJsZScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVRhYmxlQWNjZXNzKCkuZ2V0VGFibGVLZXl3b3JkXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1BlcnNwZWN0aXZlVGFibGVfX0dyb3VwX18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QZXJzcGVjdGl2ZVRhYmxlX19Hcm91cF9fMl9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QZXJzcGVjdGl2ZVRhYmxlX19Hcm91cF9fMl9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVGFibGVBY2Nlc3MoKS5nZXRSZWZBc3NpZ25tZW50XzIoKSk7IH0KKyhydWxlX19QZXJzcGVjdGl2ZVRhYmxlX19SZWZBc3NpZ25tZW50XzIpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVUYWJsZUFjY2VzcygpLmdldFJlZkFzc2lnbm1lbnRfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCisKKworcnVsZV9fUGVyc3BlY3RpdmVHcmlkX19Hcm91cF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGVyc3BlY3RpdmVHcmlkX19Hcm91cF9fMF9fSW1wbAorCXJ1bGVfX1BlcnNwZWN0aXZlR3JpZF9fR3JvdXBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVHcmlkX19Hcm91cF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlR3JpZEFjY2VzcygpLmdldFBlcnNwZWN0aXZlR3JpZEFjdGlvbl8wKCkpOyB9CisoCisKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUdyaWRBY2Nlc3MoKS5nZXRQZXJzcGVjdGl2ZUdyaWRBY3Rpb25fMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUGVyc3BlY3RpdmVHcmlkX19Hcm91cF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGVyc3BlY3RpdmVHcmlkX19Hcm91cF9fMV9fSW1wbAorCXJ1bGVfX1BlcnNwZWN0aXZlR3JpZF9fR3JvdXBfXzIKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVHcmlkX19Hcm91cF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlR3JpZEFjY2VzcygpLmdldEdyaWRLZXl3b3JkXzEoKSk7IH0KKworCSdncmlkJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlR3JpZEFjY2VzcygpLmdldEdyaWRLZXl3b3JkXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1BlcnNwZWN0aXZlR3JpZF9fR3JvdXBfXzIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlR3JpZF9fR3JvdXBfXzJfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVHcmlkX19Hcm91cF9fMl9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlR3JpZEFjY2VzcygpLmdldFJlZkFzc2lnbm1lbnRfMigpKTsgfQorKHJ1bGVfX1BlcnNwZWN0aXZlR3JpZF9fUmVmQXNzaWdubWVudF8yKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlR3JpZEFjY2VzcygpLmdldFJlZkFzc2lnbm1lbnRfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCisKKworcnVsZV9fUGVyc3BlY3RpdmVDaGFydF9fR3JvdXBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlQ2hhcnRfX0dyb3VwX18wX19JbXBsCisJcnVsZV9fUGVyc3BlY3RpdmVDaGFydF9fR3JvdXBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVDaGFydF9fR3JvdXBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUNoYXJ0QWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVDaGFydEFjdGlvbl8wKCkpOyB9CisoCisKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUNoYXJ0QWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVDaGFydEFjdGlvbl8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19QZXJzcGVjdGl2ZUNoYXJ0X19Hcm91cF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGVyc3BlY3RpdmVDaGFydF9fR3JvdXBfXzFfX0ltcGwKKwlydWxlX19QZXJzcGVjdGl2ZUNoYXJ0X19Hcm91cF9fMgorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QZXJzcGVjdGl2ZUNoYXJ0X19Hcm91cF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQ2hhcnRBY2Nlc3MoKS5nZXRDaGFydEtleXdvcmRfMSgpKTsgfQorCisJJ2NoYXJ0JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQ2hhcnRBY2Nlc3MoKS5nZXRDaGFydEtleXdvcmRfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUGVyc3BlY3RpdmVDaGFydF9fR3JvdXBfXzIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlQ2hhcnRfX0dyb3VwX18yX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BlcnNwZWN0aXZlQ2hhcnRfX0dyb3VwX18yX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVDaGFydEFjY2VzcygpLmdldFJlZkFzc2lnbm1lbnRfMigpKTsgfQorKHJ1bGVfX1BlcnNwZWN0aXZlQ2hhcnRfX1JlZkFzc2lnbm1lbnRfMikKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUNoYXJ0QWNjZXNzKCkuZ2V0UmVmQXNzaWdubWVudF8yKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKKworCitydWxlX19QZXJzcGVjdGl2ZVJlcG9ydF9fR3JvdXBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlUmVwb3J0X19Hcm91cF9fMF9fSW1wbAorCXJ1bGVfX1BlcnNwZWN0aXZlUmVwb3J0X19Hcm91cF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QZXJzcGVjdGl2ZVJlcG9ydF9fR3JvdXBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVJlcG9ydEFjY2VzcygpLmdldFBlcnNwZWN0aXZlUmVwb3J0QWN0aW9uXzAoKSk7IH0KKygKKworKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUmVwb3J0QWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVSZXBvcnRBY3Rpb25fMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUGVyc3BlY3RpdmVSZXBvcnRfX0dyb3VwX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QZXJzcGVjdGl2ZVJlcG9ydF9fR3JvdXBfXzFfX0ltcGwKKwlydWxlX19QZXJzcGVjdGl2ZVJlcG9ydF9fR3JvdXBfXzIKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVSZXBvcnRfX0dyb3VwX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVSZXBvcnRBY2Nlc3MoKS5nZXRSZXBvcnRLZXl3b3JkXzEoKSk7IH0KKworCSdyZXBvcnQnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVSZXBvcnRBY2Nlc3MoKS5nZXRSZXBvcnRLZXl3b3JkXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1BlcnNwZWN0aXZlUmVwb3J0X19Hcm91cF9fMgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGVyc3BlY3RpdmVSZXBvcnRfX0dyb3VwX18yX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BlcnNwZWN0aXZlUmVwb3J0X19Hcm91cF9fMl9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUmVwb3J0QWNjZXNzKCkuZ2V0UmVmQXNzaWdubWVudF8yKCkpOyB9CisocnVsZV9fUGVyc3BlY3RpdmVSZXBvcnRfX1JlZkFzc2lnbm1lbnRfMikKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVJlcG9ydEFjY2VzcygpLmdldFJlZkFzc2lnbm1lbnRfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCisKKworcnVsZV9fUGVyc3BlY3RpdmVPcmdhbml6YXRpb25fX0dyb3VwX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbl9fR3JvdXBfXzBfX0ltcGwKKwlydWxlX19QZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbl9fR3JvdXBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVPcmdhbml6YXRpb25fX0dyb3VwX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVPcmdhbml6YXRpb25BY2Nlc3MoKS5nZXRQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbkFjdGlvbl8wKCkpOyB9CisoCisKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbkFjY2VzcygpLmdldFBlcnNwZWN0aXZlT3JnYW5pemF0aW9uQWN0aW9uXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1BlcnNwZWN0aXZlT3JnYW5pemF0aW9uX19Hcm91cF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGVyc3BlY3RpdmVPcmdhbml6YXRpb25fX0dyb3VwX18xX19JbXBsCisJcnVsZV9fUGVyc3BlY3RpdmVPcmdhbml6YXRpb25fX0dyb3VwX18yCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BlcnNwZWN0aXZlT3JnYW5pemF0aW9uX19Hcm91cF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlT3JnYW5pemF0aW9uQWNjZXNzKCkuZ2V0T3JnYW5pZ3JhbUtleXdvcmRfMSgpKTsgfQorCisJJ29yZ2FuaWdyYW0nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVPcmdhbml6YXRpb25BY2Nlc3MoKS5nZXRPcmdhbmlncmFtS2V5d29yZF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19QZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbl9fR3JvdXBfXzIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlT3JnYW5pemF0aW9uX19Hcm91cF9fMl9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbl9fR3JvdXBfXzJfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbkFjY2VzcygpLmdldFJlZkFzc2lnbm1lbnRfMigpKTsgfQorKHJ1bGVfX1BlcnNwZWN0aXZlT3JnYW5pemF0aW9uX19SZWZBc3NpZ25tZW50XzIpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVPcmdhbml6YXRpb25BY2Nlc3MoKS5nZXRSZWZBc3NpZ25tZW50XzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworCisKK3J1bGVfX1BlcnNwZWN0aXZlVG9wb2xvZ3lfX0dyb3VwX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QZXJzcGVjdGl2ZVRvcG9sb2d5X19Hcm91cF9fMF9fSW1wbAorCXJ1bGVfX1BlcnNwZWN0aXZlVG9wb2xvZ3lfX0dyb3VwX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BlcnNwZWN0aXZlVG9wb2xvZ3lfX0dyb3VwX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVUb3BvbG9neUFjY2VzcygpLmdldFBlcnNwZWN0aXZlVG9wb2xvZ3lBY3Rpb25fMCgpKTsgfQorKAorCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVUb3BvbG9neUFjY2VzcygpLmdldFBlcnNwZWN0aXZlVG9wb2xvZ3lBY3Rpb25fMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUGVyc3BlY3RpdmVUb3BvbG9neV9fR3JvdXBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlVG9wb2xvZ3lfX0dyb3VwX18xX19JbXBsCisJcnVsZV9fUGVyc3BlY3RpdmVUb3BvbG9neV9fR3JvdXBfXzIKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVUb3BvbG9neV9fR3JvdXBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVRvcG9sb2d5QWNjZXNzKCkuZ2V0VG9wb2xvZ3lLZXl3b3JkXzEoKSk7IH0KKworCSd0b3BvbG9neScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVRvcG9sb2d5QWNjZXNzKCkuZ2V0VG9wb2xvZ3lLZXl3b3JkXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1BlcnNwZWN0aXZlVG9wb2xvZ3lfX0dyb3VwX18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QZXJzcGVjdGl2ZVRvcG9sb2d5X19Hcm91cF9fMl9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QZXJzcGVjdGl2ZVRvcG9sb2d5X19Hcm91cF9fMl9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVG9wb2xvZ3lBY2Nlc3MoKS5nZXRSZWZBc3NpZ25tZW50XzIoKSk7IH0KKyhydWxlX19QZXJzcGVjdGl2ZVRvcG9sb2d5X19SZWZBc3NpZ25tZW50XzIpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVUb3BvbG9neUFjY2VzcygpLmdldFJlZkFzc2lnbm1lbnRfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCisKKworcnVsZV9fUGVyc3BlY3RpdmVEaWFsb2dfX0dyb3VwX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QZXJzcGVjdGl2ZURpYWxvZ19fR3JvdXBfXzBfX0ltcGwKKwlydWxlX19QZXJzcGVjdGl2ZURpYWxvZ19fR3JvdXBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVEaWFsb2dfX0dyb3VwX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVEaWFsb2dBY2Nlc3MoKS5nZXRQZXJzcGVjdGl2ZURpYWxvZ0FjdGlvbl8wKCkpOyB9CisoCisKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZURpYWxvZ0FjY2VzcygpLmdldFBlcnNwZWN0aXZlRGlhbG9nQWN0aW9uXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1BlcnNwZWN0aXZlRGlhbG9nX19Hcm91cF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGVyc3BlY3RpdmVEaWFsb2dfX0dyb3VwX18xX19JbXBsCisJcnVsZV9fUGVyc3BlY3RpdmVEaWFsb2dfX0dyb3VwX18yCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BlcnNwZWN0aXZlRGlhbG9nX19Hcm91cF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlRGlhbG9nQWNjZXNzKCkuZ2V0RGlhbG9nS2V5d29yZF8xKCkpOyB9CisKKwknZGlhbG9nJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlRGlhbG9nQWNjZXNzKCkuZ2V0RGlhbG9nS2V5d29yZF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19QZXJzcGVjdGl2ZURpYWxvZ19fR3JvdXBfXzIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlRGlhbG9nX19Hcm91cF9fMl9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QZXJzcGVjdGl2ZURpYWxvZ19fR3JvdXBfXzJfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZURpYWxvZ0FjY2VzcygpLmdldFJlZkFzc2lnbm1lbnRfMigpKTsgfQorKHJ1bGVfX1BlcnNwZWN0aXZlRGlhbG9nX19SZWZBc3NpZ25tZW50XzIpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVEaWFsb2dBY2Nlc3MoKS5nZXRSZWZBc3NpZ25tZW50XzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworCisKK3J1bGVfX1BlcnNwZWN0aXZlQlBNTl9fR3JvdXBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlQlBNTl9fR3JvdXBfXzBfX0ltcGwKKwlydWxlX19QZXJzcGVjdGl2ZUJQTU5fX0dyb3VwX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BlcnNwZWN0aXZlQlBNTl9fR3JvdXBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUJQTU5BY2Nlc3MoKS5nZXRQZXJzcGVjdGl2ZUJQTU5BY3Rpb25fMCgpKTsgfQorKAorCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVCUE1OQWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVCUE1OQWN0aW9uXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1BlcnNwZWN0aXZlQlBNTl9fR3JvdXBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlQlBNTl9fR3JvdXBfXzFfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVCUE1OX19Hcm91cF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQlBNTkFjY2VzcygpLmdldEJwbW5LZXl3b3JkXzEoKSk7IH0KKworCSdicG1uJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQlBNTkFjY2VzcygpLmdldEJwbW5LZXl3b3JkXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fUGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkX19Hcm91cF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkX19Hcm91cF9fMF9fSW1wbAorCXJ1bGVfX1BlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9fR3JvdXBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkX19Hcm91cF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZEFjY2VzcygpLmdldFF1YWxpZmllZE5hbWVQYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CisJcnVsZVF1YWxpZmllZE5hbWUKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRBY2Nlc3MoKS5nZXRRdWFsaWZpZWROYW1lUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkX19Hcm91cF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkX19Hcm91cF9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkQWNjZXNzKCkuZ2V0R3JvdXBfMSgpKTsgfQorKHJ1bGVfX1BlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9fR3JvdXBfMV9fMCk/Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkQWNjZXNzKCkuZ2V0R3JvdXBfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCitydWxlX19QZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwXzFfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9fR3JvdXBfMV9fMF9fSW1wbAorCXJ1bGVfX1BlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9fR3JvdXBfMV9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwXzFfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRBY2Nlc3MoKS5nZXRGdWxsU3RvcEtleXdvcmRfMV8wKCkpOyB9CisKKwknLicgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRBY2Nlc3MoKS5nZXRGdWxsU3RvcEtleXdvcmRfMV8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19QZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwXzFfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9fR3JvdXBfMV9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwXzFfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRBY2Nlc3MoKS5nZXRBc3Rlcmlza0tleXdvcmRfMV8xKCkpOyB9CisKKwknKicgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRBY2Nlc3MoKS5nZXRBc3Rlcmlza0tleXdvcmRfMV8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMF9fSW1wbAorCXJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUFjY2VzcygpLmdldFZhbGlkSURQYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CisJcnVsZVZhbGlkSUQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lQWNjZXNzKCkuZ2V0VmFsaWRJRFBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVBY2Nlc3MoKS5nZXRHcm91cF8xKCkpOyB9CisocnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMCkqCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUFjY2VzcygpLmdldEdyb3VwXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMF9fSW1wbAorCXJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVBY2Nlc3MoKS5nZXRGdWxsU3RvcEtleXdvcmRfMV8wKCkpOyB9CisoCisJJy4nIAorKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVBY2Nlc3MoKS5nZXRGdWxsU3RvcEtleXdvcmRfMV8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lQWNjZXNzKCkuZ2V0VmFsaWRJRFBhcnNlclJ1bGVDYWxsXzFfMSgpKTsgfQorCXJ1bGVWYWxpZElECit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUFjY2VzcygpLmdldFZhbGlkSURQYXJzZXJSdWxlQ2FsbF8xXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzBfX0ltcGwKKwlydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRYQW5ub3RhdGlvbkFjdGlvbl8wKCkpOyB9CisoCisKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldFhBbm5vdGF0aW9uQWN0aW9uXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18xX19JbXBsCisJcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18yCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0Q29tbWVyY2lhbEF0S2V5d29yZF8xKCkpOyB9CisKKwknQCcgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldENvbW1lcmNpYWxBdEtleXdvcmRfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzJfX0ltcGwKKwlydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzMKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18yX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRBbm5vdGF0aW9uVHlwZUFzc2lnbm1lbnRfMigpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uX19Bbm5vdGF0aW9uVHlwZUFzc2lnbm1lbnRfMikKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEFubm90YXRpb25UeXBlQXNzaWdubWVudF8yKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fM19fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzNfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEdyb3VwXzMoKSk7IH0KKyhydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMCk/Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRHcm91cF8zKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKKworCisKKworcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18wX19JbXBsCisJcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldExlZnRQYXJlbnRoZXNpc0tleXdvcmRfM18wKCkpOyB9CisoCisJJygnIAorKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8zXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMV9fSW1wbAorCXJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18yCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfM18xKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25fX0FsdGVybmF0aXZlc18zXzEpPworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzNfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18yX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18yX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF8zXzIoKSk7IH0KKworCScpJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfM18yKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKKworCitydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMF9fSW1wbAorCXJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEVsZW1lbnRWYWx1ZVBhaXJzQXNzaWdubWVudF8zXzFfMF8wKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25fX0VsZW1lbnRWYWx1ZVBhaXJzQXNzaWdubWVudF8zXzFfMF8wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0RWxlbWVudFZhbHVlUGFpcnNBc3NpZ25tZW50XzNfMV8wXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfM18xXzBfMSgpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18wKSoKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEdyb3VwXzNfMV8wXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18wX19JbXBsCisJcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldENvbW1hS2V5d29yZF8zXzFfMF8xXzAoKSk7IH0KKworCScsJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzNfMV8wXzFfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRFbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMV8xKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25fX0VsZW1lbnRWYWx1ZVBhaXJzQXNzaWdubWVudF8zXzFfMF8xXzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRFbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMV8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzBfX0ltcGwKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKS5nZXRHcm91cF8wKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpLmdldEdyb3VwXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzFfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpLmdldFZhbHVlQXNzaWdubWVudF8xKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19WYWx1ZUFzc2lnbm1lbnRfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKS5nZXRWYWx1ZUFzc2lnbm1lbnRfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF9fMF9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKS5nZXRHcm91cF8wXzAoKSk7IH0KKyhydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKS5nZXRHcm91cF8wXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzBfX0ltcGwKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpLmdldEVsZW1lbnRBc3NpZ25tZW50XzBfMF8wKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19FbGVtZW50QXNzaWdubWVudF8wXzBfMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKS5nZXRFbGVtZW50QXNzaWdubWVudF8wXzBfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyQWNjZXNzKCkuZ2V0RXF1YWxzU2lnbktleXdvcmRfMF8wXzEoKSk7IH0KKworCSc9JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpLmdldEVxdWFsc1NpZ25LZXl3b3JkXzBfMF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzBfX0ltcGwKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0R3JvdXBfMF8wKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8wXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzFfX0ltcGwKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18yCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0R3JvdXBfMF8xKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18wKT8KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0R3JvdXBfMF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18yX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzJfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0UmlnaHRTcXVhcmVCcmFja2V0S2V5d29yZF8wXzIoKSk7IH0KKworCSddJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRSaWdodFNxdWFyZUJyYWNrZXRLZXl3b3JkXzBfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCisKKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfXzBfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEdyb3VwXzBfMF8wKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEdyb3VwXzBfMF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18wX19JbXBsCisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsQWN0aW9uXzBfMF8wXzAoKSk7IH0KKygKKworKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxBY3Rpb25fMF8wXzBfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18xX19JbXBsCisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzIKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0TnVtYmVyU2lnbktleXdvcmRfMF8wXzBfMSgpKTsgfQorCisJJyMnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldE51bWJlclNpZ25LZXl3b3JkXzBfMF8wXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMl9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMl9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRMZWZ0U3F1YXJlQnJhY2tldEtleXdvcmRfMF8wXzBfMigpKTsgfQorCisJJ1snIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldExlZnRTcXVhcmVCcmFja2V0S2V5d29yZF8wXzBfMF8yKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKKworCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMF9fSW1wbAorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0RWxlbWVudHNBc3NpZ25tZW50XzBfMV8wKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8wXzFfMSgpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18wKSoKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0R3JvdXBfMF8xXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18wX19JbXBsCisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzBfMV8xXzAoKSk7IH0KKworCScsJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfMF8xXzFfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzBfX0ltcGwKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IH0KKwlydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzFfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8xXzEoKSk7IH0KKyhydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzApPworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8xXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzBfX0ltcGwKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkpOyB9CisoCisKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8xXzFfMSgpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8xXzFfMSgpKTsgfQorKQorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0R3JvdXBfMV8xXzEoKSk7IH0KKyhydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMCkqCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEdyb3VwXzFfMV8xKCkpOyB9CispCispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMF9fSW1wbAorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldENvbW1hS2V5d29yZF8xXzFfMV8wKCkpOyB9CisKKwknLCcgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzFfMV8xXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSgpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8xXzFfMV8xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzBfX0ltcGwKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0R3JvdXBfMF8wKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEdyb3VwXzBfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18xX19JbXBsCisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzIKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEdyb3VwXzBfMSgpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzApPworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0R3JvdXBfMF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzJfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzJfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldFJpZ2h0U3F1YXJlQnJhY2tldEtleXdvcmRfMF8yKCkpOyB9CisKKwknXScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldFJpZ2h0U3F1YXJlQnJhY2tldEtleXdvcmRfMF8yKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKKworCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wX18wX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEdyb3VwXzBfMF8wKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0R3JvdXBfMF8wXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMF9fSW1wbAorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEFjdGlvbl8wXzBfMF8wKCkpOyB9CisoCisKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEFjdGlvbl8wXzBfMF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMV9fSW1wbAorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMgorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldE51bWJlclNpZ25LZXl3b3JkXzBfMF8wXzEoKSk7IH0KKworCScjJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0TnVtYmVyU2lnbktleXdvcmRfMF8wXzBfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzJfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18yX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRMZWZ0U3F1YXJlQnJhY2tldEtleXdvcmRfMF8wXzBfMigpKTsgfQorCisJJ1snIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRMZWZ0U3F1YXJlQnJhY2tldEtleXdvcmRfMF8wXzBfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCisKKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMF9fSW1wbAorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0RWxlbWVudHNBc3NpZ25tZW50XzBfMV8wKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8wXzFfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRHcm91cF8wXzFfMSgpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMCkqCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRHcm91cF8wXzFfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMF9fSW1wbAorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldENvbW1hS2V5d29yZF8wXzFfMV8wKCkpOyB9CisKKwknLCcgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldENvbW1hS2V5d29yZF8wXzFfMV8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0RWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18wX19JbXBsCisJcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhBc3NpZ25tZW50QWN0aW9uXzBfMCgpKTsgfQorKAorCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFjdGlvbl8wXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMV9fSW1wbAorCXJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18yCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8wXzEoKSk7IH0KKyhydWxlX19YQXNzaWdubWVudF9fRmVhdHVyZUFzc2lnbm1lbnRfMF8xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0RmVhdHVyZUFzc2lnbm1lbnRfMF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzJfX0ltcGwKKwlydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMl9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0T3BTaW5nbGVBc3NpZ25QYXJzZXJSdWxlQ2FsbF8wXzIoKSk7IH0KKwlydWxlT3BTaW5nbGVBc3NpZ24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldE9wU2luZ2xlQXNzaWduUGFyc2VyUnVsZUNhbGxfMF8yKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzNfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzNfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFZhbHVlQXNzaWdubWVudF8wXzMoKSk7IH0KKyhydWxlX19YQXNzaWdubWVudF9fVmFsdWVBc3NpZ25tZW50XzBfMykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFZhbHVlQXNzaWdubWVudF8wXzMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworCisKKworCitydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzBfX0ltcGwKKwlydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WE9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgfQorCXJ1bGVYT3JFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYT3JFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzFfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEdyb3VwXzFfMSgpKTsgfQorKHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzApPworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0R3JvdXBfMV8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzBfX0ltcGwKKwlydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEdyb3VwXzFfMV8wKCkpOyB9CisocnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0R3JvdXBfMV8xXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzFfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMSgpKTsgfQorKHJ1bGVfX1hBc3NpZ25tZW50X19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMV8xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCitydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF9fMF9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEdyb3VwXzFfMV8wXzAoKSk7IH0KKyhydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfMF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEdyb3VwXzFfMV8wXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCitydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfMF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzBfX0ltcGwKKwlydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfMF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfMF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpKTsgfQorKAorCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfMF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzFfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzFfMV8wXzBfMSgpKTsgfQorKHJ1bGVfX1hBc3NpZ25tZW50X19GZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMF9fSW1wbAorCXJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzVfMCgpKTsgfQorCisJJzwnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfNV8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18xX19JbXBsCisJcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMgorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfNV8xKCkpOyB9CisKKwknPCcgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF81XzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzJfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMl9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRFcXVhbHNTaWduS2V5d29yZF81XzIoKSk7IH0KKworCSc9JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRFcXVhbHNTaWduS2V5d29yZF81XzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworCisKK3J1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzBfX0ltcGwKKwlydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF82XzAoKSk7IH0KKworCSc+JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzZfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMV9fSW1wbAorCXJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzIKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzZfMSgpKTsgfQorKAorCSc+JyAKKyk/Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNl8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18yX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzJfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduRXF1YWxzU2lnbktleXdvcmRfNl8yKCkpOyB9CisKKwknPj0nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzZfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCisKKworcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsCisJcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEFuZEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CisJcnVsZVhBbmRFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhBbmRFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzEoKSk7IH0KKyhydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18wKSoKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCitydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsCisJcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMCgpKTsgfQorKHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEoKSk7IH0KKyhydWxlX19YT3JFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMF8wKCkpOyB9CisocnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsCisJcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSk7IH0KKygKKworKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEoKSk7IH0KKyhydWxlX19YT3JFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsCisJcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKwlydWxlWEVxdWFsaXR5RXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMSgpKTsgfQorKHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18wKSoKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsCisJcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMCgpKTsgfQorKHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEoKSk7IH0KKyhydWxlX19YQW5kRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCitydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wudG9rZW5zIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLnRva2VucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODM3ZmFjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLnRva2VucwpAQCAtMCwwICsxLDIxMyBAQAorJyEnPTQwCisnIT0nPTIyCisnIT09Jz0yNAorJyMnPTgzCisnJSc9MzkKKyclPSc9MjAKKycmJic9MTUKKycmJz0xMDcKKycoJz03OQorJyknPTgwCisnKic9MzYKKycqKic9MzcKKycqPSc9MTgKKycrJz0zNAorJysrJz00MQorJys9Jz0xNgorJywnPTgxCisnLSc9MzUKKyctLSc9NDIKKyctPSc9MTcKKyctPic9MjgKKycuJz00MworJy4uJz0zMAorJy4uPCc9MjkKKycvJz0zOAorJy89Jz0xOQorJzonPTkxCisnOjonPTExMAorJzsnPTg3CisnPCc9MjcKKyc8Pic9MzIKKyc9Jz0xMworJz09Jz0yMQorJz09PSc9MjMKKyc9Pic9MzEKKyc+Jz0yNgorJz49Jz0yNQorJz8nPTEwNgorJz8uJz0xMTEKKyc/Oic9MzMKKydAJz03OAorJ1snPTg0CisnXSc9ODIKKydhY2Nlc3NpYmlsaXR5Jz02MAorJ2FzJz04NgorJ2JwbW4nPTc3CisnY2FzZSc9OTMKKydjYXRjaCc9MTA1CisnY2hhcnQnPTcyCisnZGVmYXVsdCc9OTIKKydkZXNjcmliZWQgYnknPTEwOAorJ2RpYWxvZyc9NzYKKydkbyc9OTYKKydlbHNlJz04OQorJ2V4dGVuZHMnPTQ1CisnZXh0ZW5zaW9uJz00OAorJ2ZhbHNlJz01MAorJ2ZpbmFsbHknPTEwMworJ2Zvcic9OTQKKydncmlkJz03MQorJ2hvcml6b250YWwnPTUxCisnaWNvblVSSSc9NTkKKydpZic9ODgKKydpbXBvcnQnPTQ3CisnaW5zdGFuY2VvZic9ODUKKydpc0Nsb3NhYmxlJz0xMDkKKyduZXcnPTk3CisnbnVsbCc9OTgKKydvcmdhbmlncmFtJz03NAorJ29yaWVudGF0aW9uJz02MworJ3BhY2thZ2UnPTUzCisncGFydCc9NjcKKydwYXJ0U3RhY2snPTY2CisncGVyc3BlY3RpdmUnPTU2CisncHJvY2Vzcyc9NTcKKydyZXBvcnQnPTczCisncmV0dXJuJz0xMDEKKydzYXNoQ29udGFpbmVyJz02MgorJ3NlbGVjdCc9NjkKKydzZWxlY3RlZEVsZW1lbnQnPTY0Cisnc3BhY2VWb2x1bWUnPTY1Cisnc3RhdGljJz00NgorJ3N1cGVyJz00OQorJ3N3aXRjaCc9OTAKKydzeW5jaHJvbml6ZWQnPTEwNAorJ3RhYmxlJz03MAorJ3Rocm93Jz0xMDAKKyd0b29sYmFyJz02MQorJ3RvcG9sb2d5Jz03NQorJ3RydWUnPTExNAorJ3RyeSc9MTAyCisndHlwZW9mJz05OQorJ3VzZXJ0YXNrJz01OAorJ3ZhbCc9NDQKKyd2YXInPTExMworJ3ZlcnRpY2FsJz01MgorJ3ZpZXcnPTY4Cisnd2hpbGUnPTk1Cisneyc9NTQKKyd8Jz0xMTIKKyd8fCc9MTQKKyd9Jz01NQorUlVMRV9BTllfT1RIRVI9MTIKK1JVTEVfREVDSU1BTD04CitSVUxFX0hFWD02CitSVUxFX0lEPTQKK1JVTEVfSU5UPTcKK1JVTEVfTUxfQ09NTUVOVD05CitSVUxFX1NMX0NPTU1FTlQ9MTAKK1JVTEVfU1RSSU5HPTUKK1JVTEVfV1M9MTEKK1RfXzEwMD0xMDAKK1RfXzEwMT0xMDEKK1RfXzEwMj0xMDIKK1RfXzEwMz0xMDMKK1RfXzEwND0xMDQKK1RfXzEwNT0xMDUKK1RfXzEwNj0xMDYKK1RfXzEwNz0xMDcKK1RfXzEwOD0xMDgKK1RfXzEwOT0xMDkKK1RfXzExMD0xMTAKK1RfXzExMT0xMTEKK1RfXzExMj0xMTIKK1RfXzExMz0xMTMKK1RfXzExND0xMTQKK1RfXzEzPTEzCitUX18xND0xNAorVF9fMTU9MTUKK1RfXzE2PTE2CitUX18xNz0xNworVF9fMTg9MTgKK1RfXzE5PTE5CitUX18yMD0yMAorVF9fMjE9MjEKK1RfXzIyPTIyCitUX18yMz0yMworVF9fMjQ9MjQKK1RfXzI1PTI1CitUX18yNj0yNgorVF9fMjc9MjcKK1RfXzI4PTI4CitUX18yOT0yOQorVF9fMzA9MzAKK1RfXzMxPTMxCitUX18zMj0zMgorVF9fMzM9MzMKK1RfXzM0PTM0CitUX18zNT0zNQorVF9fMzY9MzYKK1RfXzM3PTM3CitUX18zOD0zOAorVF9fMzk9MzkKK1RfXzQwPTQwCitUX180MT00MQorVF9fNDI9NDIKK1RfXzQzPTQzCitUX180ND00NAorVF9fNDU9NDUKK1RfXzQ2PTQ2CitUX180Nz00NworVF9fNDg9NDgKK1RfXzQ5PTQ5CitUX181MD01MAorVF9fNTE9NTEKK1RfXzUyPTUyCitUX181Mz01MworVF9fNTQ9NTQKK1RfXzU1PTU1CitUX181Nj01NgorVF9fNTc9NTcKK1RfXzU4PTU4CitUX181OT01OQorVF9fNjA9NjAKK1RfXzYxPTYxCitUX182Mj02MgorVF9fNjM9NjMKK1RfXzY0PTY0CitUX182NT02NQorVF9fNjY9NjYKK1RfXzY3PTY3CitUX182OD02OAorVF9fNjk9NjkKK1RfXzcwPTcwCitUX183MT03MQorVF9fNzI9NzIKK1RfXzczPTczCitUX183ND03NAorVF9fNzU9NzUKK1RfXzc2PTc2CitUX183Nz03NworVF9fNzg9NzgKK1RfXzc5PTc5CitUX184MD04MAorVF9fODE9ODEKK1RfXzgyPTgyCitUX184Mz04MworVF9fODQ9ODQKK1RfXzg1PTg1CitUX184Nj04NgorVF9fODc9ODcKK1RfXzg4PTg4CitUX184OT04OQorVF9fOTA9OTAKK1RfXzkxPTkxCitUX185Mj05MgorVF9fOTM9OTMKK1RfXzk0PTk0CitUX185NT05NQorVF9fOTY9OTYKK1RfXzk3PTk3CitUX185OD05OAorVF9fOTk9OTkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbExleGVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2xMZXhlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NjVlNTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2xMZXhlci5qYXZhCkBAIC0wLDAgKzEsNDY5OSBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLmNvbnRlbnRhc3Npc3QuYW50bHIuaW50ZXJuYWw7CisKKy8vIEhhY2s6IFVzZSBvdXIgb3duIExleGVyIHN1cGVyY2xhc3MgYnkgbWVhbnMgb2YgaW1wb3J0LiAKKy8vIEN1cnJlbnRseSB0aGVyZSBpcyBubyBvdGhlciB3YXkgdG8gc3BlY2lmeSB0aGUgc3VwZXJjbGFzcyBmb3IgdGhlIGxleGVyLgoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LmFudGxyLmludGVybmFsLkxleGVyOworCisKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS4qOworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBJbnRlcm5hbFBlcnNwZWN0aXZlRHNsTGV4ZXIgZXh0ZW5kcyBMZXhlciB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9IRVg9NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181MD01MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181OT01OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181NT01NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181Nj01NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181Nz01NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181OD01ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181MT01MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181Mj01MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181Mz01MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181ND01NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182MD02MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182MT02MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX0lEPTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9JTlQ9NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182Nj02NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX01MX0NPTU1FTlQ9OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182Nz02NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182OD02ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182OT02OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182Mj02MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182Mz02MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182ND02NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182NT02NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zNz0zNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zOD0zODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zOT0zOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zMz0zMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zND0zNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zNT0zNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zNj0zNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zMD0zMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zMT0zMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zMj0zMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180OD00ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180OT00OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180ND00NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180NT00NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180Nj00NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180Nz00NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180MD00MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180MT00MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180Mj00MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180Mz00MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185MT05MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDA9MTAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzkyPTkyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzkzPTkzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwMj0xMDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTQ9OTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTAxPTEwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185MD05MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xOT0xOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNT0xNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNj0xNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNz0xNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xOD0xODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185OT05OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMz0xMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xND0xNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185NT05NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185Nj05NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185Nz05NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185OD05ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX0RFQ0lNQUw9ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNj0yNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNz0yNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yOD0yODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yOT0yOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMj0yMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMz0yMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yND0yNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNT0yNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMD0yMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMT0yMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183MD03MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183MT03MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183Mj03MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX1NUUklORz01OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfU0xfQ09NTUVOVD0xMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183Nz03NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183OD03ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183OT03OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183Mz03MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFT0Y9LTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzQ9NzQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTE0PTExNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183NT03NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183Nj03NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184MD04MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMTE9MTExOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzgxPTgxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExMD0xMTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODI9ODI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTEzPTExMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184Mz04MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMTI9MTEyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfV1M9MTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9BTllfT1RIRVI9MTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODg9ODg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTA4PTEwODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184OT04OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDc9MTA3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwOT0xMDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODQ9ODQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTA0PTEwNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184NT04NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDM9MTAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzg2PTg2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwNj0xMDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODc9ODc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTA1PTEwNTsKKworICAgIC8vIGRlbGVnYXRlcworICAgIC8vIGRlbGVnYXRvcnMKKworICAgIHB1YmxpYyBJbnRlcm5hbFBlcnNwZWN0aXZlRHNsTGV4ZXIoKSB7O30gCisgICAgcHVibGljIEludGVybmFsUGVyc3BlY3RpdmVEc2xMZXhlcihDaGFyU3RyZWFtIGlucHV0KSB7CisgICAgICAgIHRoaXMoaW5wdXQsIG5ldyBSZWNvZ25pemVyU2hhcmVkU3RhdGUoKSk7CisgICAgfQorICAgIHB1YmxpYyBJbnRlcm5hbFBlcnNwZWN0aXZlRHNsTGV4ZXIoQ2hhclN0cmVhbSBpbnB1dCwgUmVjb2duaXplclNoYXJlZFN0YXRlIHN0YXRlKSB7CisgICAgICAgIHN1cGVyKGlucHV0LHN0YXRlKTsKKworICAgIH0KKyAgICBwdWJsaWMgU3RyaW5nIGdldEdyYW1tYXJGaWxlTmFtZSgpIHsgcmV0dXJuICIuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZyI7IH0KKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTE6NzogKCAnPScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTE6OTogJz0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnPScpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEyOjc6ICggJ3x8JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMjo5OiAnfHwnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgifHwiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEzOjc6ICggJyYmJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMzo5OiAnJiYnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiJiYiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE0Ojc6ICggJys9JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNDo5OiAnKz0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiKz0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE1Ojc6ICggJy09JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNTo5OiAnLT0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiLT0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xOCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE2Ojc6ICggJyo9JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNjo5OiAnKj0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiKj0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xOSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xOTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE3Ojc6ICggJy89JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNzo5OiAnLz0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiLz0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE4Ojc6ICggJyU9JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxODo5OiAnJT0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiJT0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjAiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIxIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE5Ojc6ICggJz09JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOTo5OiAnPT0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiPT0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIwOjc6ICggJyE9JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMDo5OiAnIT0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiIT0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIzIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIxOjc6ICggJz09PScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjE6OTogJz09PScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCI9PT0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzI0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yNDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIyOjc6ICggJyE9PScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjI6OTogJyE9PScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIhPT0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzI1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yNTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIzOjc6ICggJz49JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMzo5OiAnPj0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiPj0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzI2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yNjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI0Ojc6ICggJz4nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI0Ojk6ICc+JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJz4nKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzI2IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yNyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjc7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNTo3OiAoICc8JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNTo5OiAnPCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCc8Jyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yNyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzI4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzI4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjY6NzogKCAnLT4nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2Ojk6ICctPicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCItPiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yOCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzI5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzI5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjc6NzogKCAnLi48JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNzo5OiAnLi48JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIi4uPCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yOSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMzAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzMwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzMwOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjg6NzogKCAnLi4nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI4Ojk6ICcuLicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIuLiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18zMCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMzEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzMxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzMxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjk6NzogKCAnPT4nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI5Ojk6ICc9PicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCI9PiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18zMSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMzIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzMyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzMyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzA6NzogKCAnPD4nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMwOjk6ICc8PicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCI8PiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18zMiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMzMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzMzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzMzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzE6NzogKCAnPzonICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMxOjk6ICc/OicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCI/OiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18zMyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMzQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzM0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzM0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzI6NzogKCAnKycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzI6OTogJysnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnKycpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMzQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzM1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18zNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18zNTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMzOjc6ICggJy0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMzOjk6ICctJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJy0nKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzM1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18zNiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMzYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMzY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozNDo3OiAoICcqJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozNDo5OiAnKicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCcqJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18zNiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMzciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzM3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzM3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzU6NzogKCAnKionICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjM1Ojk6ICcqKicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIqKiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18zNyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMzgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzM4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzM4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzY6NzogKCAnLycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzY6OTogJy8nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnLycpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMzgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzM5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18zOSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18zOTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjM3Ojc6ICggJyUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjM3Ojk6ICclJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJyUnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzM5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX180MCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNDAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNDA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozODo3OiAoICchJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozODo5OiAnIScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCchJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX180MCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNDEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzQxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzQxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mzk6NzogKCAnKysnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjM5Ojk6ICcrKycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIrKyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX180MSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNDIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzQyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzQyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NDA6NzogKCAnLS0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQwOjk6ICctLScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCItLSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX180MiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNDMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzQzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzQzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NDE6NzogKCAnLicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NDE6OTogJy4nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnLicpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNDMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzQ0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX180NCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX180NDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQyOjc6ICggJ3ZhbCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NDI6OTogJ3ZhbCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ2YWwiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNDQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzQ1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX180NSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX180NTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQzOjc6ICggJ2V4dGVuZHMnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQzOjk6ICdleHRlbmRzJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImV4dGVuZHMiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNDUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzQ2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX180NigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX180NjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQ0Ojc6ICggJ3N0YXRpYycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NDQ6OTogJ3N0YXRpYycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJzdGF0aWMiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNDYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzQ3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX180NygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX180NzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQ1Ojc6ICggJ2ltcG9ydCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NDU6OTogJ2ltcG9ydCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJpbXBvcnQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNDciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzQ4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX180OCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX180ODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQ2Ojc6ICggJ2V4dGVuc2lvbicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NDY6OTogJ2V4dGVuc2lvbicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJleHRlbnNpb24iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNDgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzQ5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX180OSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX180OTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQ3Ojc6ICggJ3N1cGVyJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo0Nzo5OiAnc3VwZXInCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgic3VwZXIiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNDkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzUwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX181MCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX181MDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQ4Ojc6ICggJ2ZhbHNlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo0ODo5OiAnZmFsc2UnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZmFsc2UiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNTAiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzUxIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX181MSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX181MTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQ5Ojc6ICggJ2hvcml6b250YWwnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQ5Ojk6ICdob3Jpem9udGFsJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImhvcml6b250YWwiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNTEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzUyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX181MigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX181MjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjUwOjc6ICggJ3ZlcnRpY2FsJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo1MDo5OiAndmVydGljYWwnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidmVydGljYWwiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNTIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzUzIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX181MygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX181MzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjUxOjc6ICggJ3BhY2thZ2UnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjUxOjk6ICdwYWNrYWdlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInBhY2thZ2UiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNTMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzU0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX181NCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX181NDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjUyOjc6ICggJ3snICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjUyOjk6ICd7JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJ3snKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzU0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX181NSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNTUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNTU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo1Mzo3OiAoICd9JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo1Mzo5OiAnfScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCd9Jyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181NSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNTYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzU2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzU2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTQ6NzogKCAncGVyc3BlY3RpdmUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjU0Ojk6ICdwZXJzcGVjdGl2ZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJwZXJzcGVjdGl2ZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181NiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNTciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzU3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzU3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTU6NzogKCAncHJvY2VzcycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTU6OTogJ3Byb2Nlc3MnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicHJvY2VzcyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181NyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNTgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzU4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzU4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTY6NzogKCAndXNlcnRhc2snICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjU2Ojk6ICd1c2VydGFzaycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ1c2VydGFzayIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181OCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNTkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzU5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzU5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTc6NzogKCAnaWNvblVSSScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTc6OTogJ2ljb25VUkknCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiaWNvblVSSSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181OSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNjAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzYwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzYwOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTg6NzogKCAnYWNjZXNzaWJpbGl0eScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTg6OTogJ2FjY2Vzc2liaWxpdHknCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiYWNjZXNzaWJpbGl0eSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX182MCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNjEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzYxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzYxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTk6NzogKCAndG9vbGJhcicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTk6OTogJ3Rvb2xiYXInCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidG9vbGJhciIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX182MSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNjIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzYyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzYyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjA6NzogKCAnc2FzaENvbnRhaW5lcicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjA6OTogJ3Nhc2hDb250YWluZXInCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgic2FzaENvbnRhaW5lciIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX182MiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNjMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzYzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzYzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjE6NzogKCAnb3JpZW50YXRpb24nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjYxOjk6ICdvcmllbnRhdGlvbicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJvcmllbnRhdGlvbiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX182MyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNjQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzY0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzY0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjI6NzogKCAnc2VsZWN0ZWRFbGVtZW50JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo2Mjo5OiAnc2VsZWN0ZWRFbGVtZW50JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInNlbGVjdGVkRWxlbWVudCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX182NCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNjUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzY1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzY1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjM6NzogKCAnc3BhY2VWb2x1bWUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjYzOjk6ICdzcGFjZVZvbHVtZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJzcGFjZVZvbHVtZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX182NSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNjYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzY2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzY2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjQ6NzogKCAncGFydFN0YWNrJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo2NDo5OiAncGFydFN0YWNrJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInBhcnRTdGFjayIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX182NiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNjciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzY3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzY3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjU6NzogKCAncGFydCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjU6OTogJ3BhcnQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicGFydCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX182NyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNjgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzY4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzY4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjY6NzogKCAndmlldycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjY6OTogJ3ZpZXcnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidmlldyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX182OCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNjkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzY5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzY5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Njc6NzogKCAnc2VsZWN0JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo2Nzo5OiAnc2VsZWN0JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInNlbGVjdCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX182OSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNzAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzcwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzcwOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Njg6NzogKCAndGFibGUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjY4Ojk6ICd0YWJsZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ0YWJsZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX183MCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNzEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzcxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzcxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Njk6NzogKCAnZ3JpZCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Njk6OTogJ2dyaWQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZ3JpZCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX183MSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNzIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzcyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzcyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NzA6NzogKCAnY2hhcnQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjcwOjk6ICdjaGFydCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJjaGFydCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX183MiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNzMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzczKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzczOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NzE6NzogKCAncmVwb3J0JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo3MTo5OiAncmVwb3J0JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInJlcG9ydCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX183MyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNzQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzc0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzc0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NzI6NzogKCAnb3JnYW5pZ3JhbScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NzI6OTogJ29yZ2FuaWdyYW0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgib3JnYW5pZ3JhbSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX183NCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNzUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzc1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzc1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NzM6NzogKCAndG9wb2xvZ3knICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjczOjk6ICd0b3BvbG9neScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ0b3BvbG9neSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX183NSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNzYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzc2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzc2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NzQ6NzogKCAnZGlhbG9nJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo3NDo5OiAnZGlhbG9nJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImRpYWxvZyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX183NiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNzciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzc3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzc3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NzU6NzogKCAnYnBtbicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NzU6OTogJ2JwbW4nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiYnBtbiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX183NyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNzgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzc4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzc4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NzY6NzogKCAnQCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NzY6OTogJ0AnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnQCcpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNzgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzc5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX183OSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183OTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjc3Ojc6ICggJygnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjc3Ojk6ICcoJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJygnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzc5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX184MCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fODAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo3ODo3OiAoICcpJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo3ODo5OiAnKScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCcpJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX184MCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fODEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzgxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzgxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Nzk6NzogKCAnLCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Nzk6OTogJywnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnLCcpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fODEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzgyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX184MigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184MjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgwOjc6ICggJ10nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgwOjk6ICddJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJ10nKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzgyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX184MyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fODMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4MTo3OiAoICcjJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4MTo5OiAnIycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCcjJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX184MyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fODQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzg0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzg0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODI6NzogKCAnWycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODI6OTogJ1snCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnWycpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fODQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzg1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX184NSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184NTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgzOjc6ICggJ2luc3RhbmNlb2YnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgzOjk6ICdpbnN0YW5jZW9mJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImluc3RhbmNlb2YiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fODUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzg2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX184NigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184NjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjg0Ojc6ICggJ2FzJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4NDo5OiAnYXMnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiYXMiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fODYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzg3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX184NygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184NzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjg1Ojc6ICggJzsnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjg1Ojk6ICc7JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJzsnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzg3IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX184OCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fODgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODg7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4Njo3OiAoICdpZicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODY6OTogJ2lmJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImlmIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzg4IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX184OSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fODkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODk7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4Nzo3OiAoICdlbHNlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4Nzo5OiAnZWxzZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJlbHNlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzg5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX185MCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fOTAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4ODo3OiAoICdzd2l0Y2gnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjg4Ojk6ICdzd2l0Y2gnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgic3dpdGNoIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzkwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX185MSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fOTEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4OTo3OiAoICc6JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4OTo5OiAnOicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCc6Jyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX185MSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fOTIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzkyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzkyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6OTA6NzogKCAnZGVmYXVsdCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6OTA6OTogJ2RlZmF1bHQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZGVmYXVsdCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX185MiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fOTMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzkzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzkzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6OTE6NzogKCAnY2FzZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6OTE6OTogJ2Nhc2UnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiY2FzZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX185MyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fOTQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzk0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzk0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6OTI6NzogKCAnZm9yJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo5Mjo5OiAnZm9yJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImZvciIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX185NCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fOTUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzk1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzk1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6OTM6NzogKCAnd2hpbGUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjkzOjk6ICd3aGlsZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ3aGlsZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX185NSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fOTYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzk2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzk2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6OTQ6NzogKCAnZG8nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjk0Ojk6ICdkbycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJkbyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX185NiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fOTciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzk3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzk3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6OTU6NzogKCAnbmV3JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo5NTo5OiAnbmV3JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIm5ldyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX185NyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fOTgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzk4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzk4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6OTY6NzogKCAnbnVsbCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6OTY6OTogJ251bGwnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgibnVsbCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX185OCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fOTkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzk5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzk5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6OTc6NzogKCAndHlwZW9mJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo5Nzo5OiAndHlwZW9mJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInR5cGVvZiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX185OSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTAwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMDAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTAwOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6OTg6ODogKCAndGhyb3cnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjk4OjEwOiAndGhyb3cnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidGhyb3ciKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTAwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMDEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEwMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo5OTo4OiAoICdyZXR1cm4nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjk5OjEwOiAncmV0dXJuJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInJldHVybiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMDEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEwMiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTAyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEwMjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwMDo4OiAoICd0cnknICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwMDoxMDogJ3RyeScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ0cnkiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTAyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMDMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEwMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDE6ODogKCAnZmluYWxseScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTAxOjEwOiAnZmluYWxseScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJmaW5hbGx5Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEwMyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTA0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMDQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTA0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTAyOjg6ICggJ3N5bmNocm9uaXplZCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTAyOjEwOiAnc3luY2hyb25pemVkJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInN5bmNocm9uaXplZCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMDQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEwNSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTA1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEwNTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwMzo4OiAoICdjYXRjaCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTAzOjEwOiAnY2F0Y2gnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiY2F0Y2giKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTA1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMDYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEwNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDQ6ODogKCAnPycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTA0OjEwOiAnPycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCc/Jyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMDYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEwNyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTA3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEwNzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwNTo4OiAoICcmJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDU6MTA6ICcmJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJyYnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEwNyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTA4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMDgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTA4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTA2Ojg6ICggJ2Rlc2NyaWJlZCBieScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTA2OjEwOiAnZGVzY3JpYmVkIGJ5JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImRlc2NyaWJlZCBieSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMDgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEwOSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTA5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEwOTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwNzo4OiAoICdpc0Nsb3NhYmxlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDc6MTA6ICdpc0Nsb3NhYmxlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImlzQ2xvc2FibGUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTA5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMTAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzExMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMTA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDg6ODogKCAnOjonICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwODoxMDogJzo6JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIjo6Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzExMCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTExIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMTEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTExOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTA5Ojg6ICggJz8uJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDk6MTA6ICc/LicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCI/LiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMTEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzExMiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTEyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzExMjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjExMDo4OiAoICd8JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMTA6MTA6ICd8JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJ3wnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzExMiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTEzIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMTMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTEzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTExOjg6ICggJ3ZhcicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTExOjEwOiAndmFyJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInZhciIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMTMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzExNCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTE0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzExNDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjExMjo4OiAoICd0cnVlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMTI6MTA6ICd0cnVlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInRydWUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTE0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJSVUxFX0hFWCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtUlVMRV9IRVgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9IRVg7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjMyOToxMDogKCAoICcweCcgfCAnMFgnICkgKCAnMCcgLi4gJzknIHwgJ2EnIC4uICdmJyB8ICdBJyAuLiAnRicgfCAnXycgKSsgKCAnIycgKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkgfCAoICdsJyB8ICdMJyApICkgKT8gKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjYzMjk6MTI6ICggJzB4JyB8ICcwWCcgKSAoICcwJyAuLiAnOScgfCAnYScgLi4gJ2YnIHwgJ0EnIC4uICdGJyB8ICdfJyApKyAoICcjJyAoICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgKSB8ICggJ2wnIHwgJ0wnICkgKSApPworICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjYzMjk6MTI6ICggJzB4JyB8ICcwWCcgKQorICAgICAgICAgICAgaW50IGFsdDE9MjsKKyAgICAgICAgICAgIGludCBMQTFfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQTFfMD09JzAnKSApIHsKKyAgICAgICAgICAgICAgICBpbnQgTEExXzEgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgIGlmICggKExBMV8xPT0neCcpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxPTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExXzE9PSdYJykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDE9MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxLCAxLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxLCAwLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQxKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjYzMjk6MTM6ICcweCcKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXRjaCgiMHgiKTsgCisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2MzI5OjE4OiAnMFgnCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goIjBYIik7IAorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjMyOToyNDogKCAnMCcgLi4gJzknIHwgJ2EnIC4uICdmJyB8ICdBJyAuLiAnRicgfCAnXycgKSsKKyAgICAgICAgICAgIGludCBjbnQyPTA7CisgICAgICAgICAgICBsb29wMjoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0Mj0yOworICAgICAgICAgICAgICAgIGludCBMQTJfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgaWYgKCAoKExBMl8wPj0nMCcgJiYgTEEyXzA8PSc5Jyl8fChMQTJfMD49J0EnICYmIExBMl8wPD0nRicpfHxMQTJfMD09J18nfHwoTEEyXzA+PSdhJyAmJiBMQTJfMDw9J2YnKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDI9MTsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MikgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggKGlucHV0LkxBKDEpPj0nMCcgJiYgaW5wdXQuTEEoMSk8PSc5Jyl8fChpbnB1dC5MQSgxKT49J0EnICYmIGlucHV0LkxBKDEpPD0nRicpfHxpbnB1dC5MQSgxKT09J18nfHwoaW5wdXQuTEEoMSk+PSdhJyAmJiBpbnB1dC5MQSgxKTw9J2YnKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGVsc2UgeworICAgICAgICAgICAgCSAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgIAkgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG1zZTt9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGlmICggY250MiA+PSAxICkgYnJlYWsgbG9vcDI7CisgICAgICAgICAgICAgICAgICAgICAgICBFYXJseUV4aXRFeGNlcHRpb24gZWVlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRWFybHlFeGl0RXhjZXB0aW9uKDIsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVlZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY250MisrOworICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2MzI5OjU4OiAoICcjJyAoICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgKSB8ICggJ2wnIHwgJ0wnICkgKSApPworICAgICAgICAgICAgaW50IGFsdDQ9MjsKKyAgICAgICAgICAgIGludCBMQTRfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQTRfMD09JyMnKSApIHsKKyAgICAgICAgICAgICAgICBhbHQ0PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjMyOTo1OTogJyMnICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyApIHwgKCAnbCcgfCAnTCcgKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goJyMnKTsgCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2MzI5OjYzOiAoICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgKSB8ICggJ2wnIHwgJ0wnICkgKQorICAgICAgICAgICAgICAgICAgICBpbnQgYWx0Mz0yOworICAgICAgICAgICAgICAgICAgICBpbnQgTEEzXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTNfMD09J0InfHxMQTNfMD09J2InKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBM18wPT0nTCd8fExBM18wPT0nbCcpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0Mz0yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAzLCAwLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2MzI5OjY0OiAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbnB1dC5MQSgxKT09J0InfHxpbnB1dC5MQSgxKT09J2InICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbXNlO30KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW5wdXQuTEEoMSk9PSdJJ3x8aW5wdXQuTEEoMSk9PSdpJyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG1zZTt9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjYzMjk6ODQ6ICggJ2wnIHwgJ0wnICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbnB1dC5MQSgxKT09J0wnfHxpbnB1dC5MQSgxKT09J2wnICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbXNlO30KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJSVUxFX0hFWCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiUlVMRV9JTlQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVJVTEVfSU5UKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFJVTEVfSU5UOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjYzMzE6MTA6ICggJzAnIC4uICc5JyAoICcwJyAuLiAnOScgfCAnXycgKSogKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjYzMzE6MTI6ICcwJyAuLiAnOScgKCAnMCcgLi4gJzknIHwgJ18nICkqCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaFJhbmdlKCcwJywnOScpOyAKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2MzMxOjIxOiAoICcwJyAuLiAnOScgfCAnXycgKSoKKyAgICAgICAgICAgIGxvb3A1OgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQ1PTI7CisgICAgICAgICAgICAgICAgaW50IExBNV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoICgoTEE1XzA+PScwJyAmJiBMQTVfMDw9JzknKXx8TEE1XzA9PSdfJykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDU9MTsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NSkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggKGlucHV0LkxBKDEpPj0nMCcgJiYgaW5wdXQuTEEoMSk8PSc5Jyl8fGlucHV0LkxBKDEpPT0nXycgKSB7CisgICAgICAgICAgICAJICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBlbHNlIHsKKyAgICAgICAgICAgIAkgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAJICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBtc2U7fQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBicmVhayBsb29wNTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJSVUxFX0lOVCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiUlVMRV9ERUNJTUFMIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1SVUxFX0RFQ0lNQUwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9ERUNJTUFMOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjYzMzM6MTQ6ICggUlVMRV9JTlQgKCAoICdlJyB8ICdFJyApICggJysnIHwgJy0nICk/IFJVTEVfSU5UICk/ICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyB8ICdkJyB8ICdEJyApIHwgKCAnbCcgfCAnTCcgfCAnZCcgfCAnRCcgfCAnZicgfCAnRicgKSApPyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjMzMzoxNjogUlVMRV9JTlQgKCAoICdlJyB8ICdFJyApICggJysnIHwgJy0nICk/IFJVTEVfSU5UICk/ICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyB8ICdkJyB8ICdEJyApIHwgKCAnbCcgfCAnTCcgfCAnZCcgfCAnRCcgfCAnZicgfCAnRicgKSApPworICAgICAgICAgICAgeworICAgICAgICAgICAgbVJVTEVfSU5UKCk7IAorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjYzMzM6MjU6ICggKCAnZScgfCAnRScgKSAoICcrJyB8ICctJyApPyBSVUxFX0lOVCApPworICAgICAgICAgICAgaW50IGFsdDc9MjsKKyAgICAgICAgICAgIGludCBMQTdfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQTdfMD09J0UnfHxMQTdfMD09J2UnKSApIHsKKyAgICAgICAgICAgICAgICBhbHQ3PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDcpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjMzMzoyNjogKCAnZScgfCAnRScgKSAoICcrJyB8ICctJyApPyBSVUxFX0lOVAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggaW5wdXQuTEEoMSk9PSdFJ3x8aW5wdXQuTEEoMSk9PSdlJyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG1zZTt9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjYzMzM6MzY6ICggJysnIHwgJy0nICk/CisgICAgICAgICAgICAgICAgICAgIGludCBhbHQ2PTI7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTZfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKExBNl8wPT0nKyd8fExBNl8wPT0nLScpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0Nj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NikgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbnB1dC5MQSgxKT09JysnfHxpbnB1dC5MQSgxKT09Jy0nICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbXNlO30KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBtUlVMRV9JTlQoKTsgCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjMzMzo1ODogKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knIHwgJ2QnIHwgJ0QnICkgfCAoICdsJyB8ICdMJyB8ICdkJyB8ICdEJyB8ICdmJyB8ICdGJyApICk/CisgICAgICAgICAgICBpbnQgYWx0OD0zOworICAgICAgICAgICAgaW50IExBOF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBOF8wPT0nQid8fExBOF8wPT0nYicpICkgeworICAgICAgICAgICAgICAgIGFsdDg9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE4XzA9PSdEJ3x8TEE4XzA9PSdGJ3x8TEE4XzA9PSdMJ3x8TEE4XzA9PSdkJ3x8TEE4XzA9PSdmJ3x8TEE4XzA9PSdsJykgKSB7CisgICAgICAgICAgICAgICAgYWx0OD0yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQ4KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjYzMzM6NTk6ICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgfCAnZCcgfCAnRCcgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggaW5wdXQuTEEoMSk9PSdCJ3x8aW5wdXQuTEEoMSk9PSdiJyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG1zZTt9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBpbnB1dC5MQSgxKT09J0QnfHxpbnB1dC5MQSgxKT09J0knfHxpbnB1dC5MQSgxKT09J2QnfHxpbnB1dC5MQSgxKT09J2knICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbXNlO30KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjYzMzM6ODc6ICggJ2wnIHwgJ0wnIHwgJ2QnIHwgJ0QnIHwgJ2YnIHwgJ0YnICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIGlucHV0LkxBKDEpPT0nRCd8fGlucHV0LkxBKDEpPT0nRid8fGlucHV0LkxBKDEpPT0nTCd8fGlucHV0LkxBKDEpPT0nZCd8fGlucHV0LkxBKDEpPT0nZid8fGlucHV0LkxBKDEpPT0nbCcgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBtc2U7fQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlJVTEVfREVDSU1BTCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiUlVMRV9JRCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtUlVMRV9JRCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX0lEOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjYzMzU6OTogKCAoICdeJyApPyAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJyQnIHwgJ18nICkgKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICckJyB8ICdfJyB8ICcwJyAuLiAnOScgKSogKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjYzMzU6MTE6ICggJ14nICk/ICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnJCcgfCAnXycgKSAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJyQnIHwgJ18nIHwgJzAnIC4uICc5JyApKgorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjYzMzU6MTE6ICggJ14nICk/CisgICAgICAgICAgICBpbnQgYWx0OT0yOworICAgICAgICAgICAgaW50IExBOV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBOV8wPT0nXicpICkgeworICAgICAgICAgICAgICAgIGFsdDk9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0OSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2MzM1OjExOiAnXicKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXRjaCgnXicpOyAKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggaW5wdXQuTEEoMSk9PSckJ3x8KGlucHV0LkxBKDEpPj0nQScgJiYgaW5wdXQuTEEoMSk8PSdaJyl8fGlucHV0LkxBKDEpPT0nXyd8fChpbnB1dC5MQSgxKT49J2EnICYmIGlucHV0LkxBKDEpPD0neicpICkgeworICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbXNlO30KKworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjYzMzU6NDQ6ICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnJCcgfCAnXycgfCAnMCcgLi4gJzknICkqCisgICAgICAgICAgICBsb29wMTA6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDEwPTI7CisgICAgICAgICAgICAgICAgaW50IExBMTBfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEExMF8wPT0nJCd8fChMQTEwXzA+PScwJyAmJiBMQTEwXzA8PSc5Jyl8fChMQTEwXzA+PSdBJyAmJiBMQTEwXzA8PSdaJyl8fExBMTBfMD09J18nfHwoTEExMF8wPj0nYScgJiYgTEExMF8wPD0neicpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTA9MTsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTApIHsKKyAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIGlucHV0LkxBKDEpPT0nJCd8fChpbnB1dC5MQSgxKT49JzAnICYmIGlucHV0LkxBKDEpPD0nOScpfHwoaW5wdXQuTEEoMSk+PSdBJyAmJiBpbnB1dC5MQSgxKTw9J1onKXx8aW5wdXQuTEEoMSk9PSdfJ3x8KGlucHV0LkxBKDEpPj0nYScgJiYgaW5wdXQuTEEoMSk8PSd6JykgKSB7CisgICAgICAgICAgICAJICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBlbHNlIHsKKyAgICAgICAgICAgIAkgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAJICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBtc2U7fQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiUlVMRV9JRCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiUlVMRV9TVFJJTkciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVJVTEVfU1RSSU5HKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFJVTEVfU1RSSU5HOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjYzMzc6MTM6ICggKCAnXCInICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXCInICkgKSApKiAoICdcIicgKT8gfCAnXFwnJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1xcJycgKSApICkqICggJ1xcJycgKT8gKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjMzNzoxNTogKCAnXCInICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXCInICkgKSApKiAoICdcIicgKT8gfCAnXFwnJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1xcJycgKSApICkqICggJ1xcJycgKT8gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjYzMzc6MTU6ICggJ1wiJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1wiJyApICkgKSogKCAnXCInICk/IHwgJ1xcJycgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcXCcnICkgKSApKiAoICdcXCcnICk/ICkKKyAgICAgICAgICAgIGludCBhbHQxNT0yOworICAgICAgICAgICAgaW50IExBMTVfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQTE1XzA9PSdcIicpICkgeworICAgICAgICAgICAgICAgIGFsdDE1PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggKExBMTVfMD09J1wnJykgKSB7CisgICAgICAgICAgICAgICAgYWx0MTU9MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDE1LCAwLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQxNSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2MzM3OjE2OiAnXCInICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXCInICkgKSApKiAoICdcIicgKT8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXRjaCgnXCInKTsgCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2MzM3OjIwOiAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1wiJyApICkgKSoKKyAgICAgICAgICAgICAgICAgICAgbG9vcDExOgorICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTE9MzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTExXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExMV8wPT0nXFwnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQxMT0xOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoTEExMV8wPj0nXHUwMDAwJyAmJiBMQTExXzA8PSchJyl8fChMQTExXzA+PScjJyAmJiBMQTExXzA8PSdbJyl8fChMQTExXzA+PSddJyAmJiBMQTExXzA8PSdcdUZGRkYnKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTE9MjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDExKSB7CisgICAgICAgICAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2MzM3OjIxOiAnXFxcXCcgLgorICAgICAgICAgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBtYXRjaCgnXFwnKTsgCisgICAgICAgICAgICAgICAgICAgIAkgICAgbWF0Y2hBbnkoKTsgCisKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAljYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2MzM3OjI4OiB+ICggKCAnXFxcXCcgfCAnXCInICkgKQorICAgICAgICAgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIChpbnB1dC5MQSgxKT49J1x1MDAwMCcgJiYgaW5wdXQuTEEoMSk8PSchJyl8fChpbnB1dC5MQSgxKT49JyMnICYmIGlucHV0LkxBKDEpPD0nWycpfHwoaW5wdXQuTEEoMSk+PSddJyAmJiBpbnB1dC5MQSgxKTw9J1x1RkZGRicpICkgeworICAgICAgICAgICAgICAgICAgICAJICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbXNlO30KKworCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2MzM3OjQ0OiAoICdcIicgKT8KKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdDEyPTI7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTEyXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTEyXzA9PSdcIicpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTI9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2MzM3OjQ0OiAnXCInCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoKCdcIicpOyAKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2MzM3OjQ5OiAnXFwnJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1xcJycgKSApICkqICggJ1xcJycgKT8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXRjaCgnXCcnKTsgCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2MzM3OjU0OiAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1xcJycgKSApICkqCisgICAgICAgICAgICAgICAgICAgIGxvb3AxMzoKKyAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDEzPTM7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExM18wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBMTNfMD09J1xcJykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTM9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBMTNfMD49J1x1MDAwMCcgJiYgTEExM18wPD0nJicpfHwoTEExM18wPj0nKCcgJiYgTEExM18wPD0nWycpfHwoTEExM18wPj0nXScgJiYgTEExM18wPD0nXHVGRkZGJykpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDEzPTI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMykgeworICAgICAgICAgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjMzNzo1NTogJ1xcXFwnIC4KKyAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgbWF0Y2goJ1xcJyk7IAorICAgICAgICAgICAgICAgICAgICAJICAgIG1hdGNoQW55KCk7IAorCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAJY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjMzNzo2MjogfiAoICggJ1xcXFwnIHwgJ1xcJycgKSApCisgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggKGlucHV0LkxBKDEpPj0nXHUwMDAwJyAmJiBpbnB1dC5MQSgxKTw9JyYnKXx8KGlucHV0LkxBKDEpPj0nKCcgJiYgaW5wdXQuTEEoMSk8PSdbJyl8fChpbnB1dC5MQSgxKT49J10nICYmIGlucHV0LkxBKDEpPD0nXHVGRkZGJykgKSB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCSAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgICAgICAgICAJICAgICAgICB0aHJvdyBtc2U7fQorCisKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjYzMzc6Nzk6ICggJ1xcJycgKT8KKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdDE0PTI7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTE0XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTE0XzA9PSdcJycpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTQ9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2MzM3Ojc5OiAnXFwnJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCgnXCcnKTsgCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlJVTEVfU1RSSU5HIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJSVUxFX01MX0NPTU1FTlQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVJVTEVfTUxfQ09NTUVOVCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX01MX0NPTU1FTlQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjMzOToxNzogKCAnLyonICggb3B0aW9ucyB7Z3JlZWR5PWZhbHNlOyB9IDogLiApKiAnKi8nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2MzM5OjE5OiAnLyonICggb3B0aW9ucyB7Z3JlZWR5PWZhbHNlOyB9IDogLiApKiAnKi8nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiLyoiKTsgCisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2MzM5OjI0OiAoIG9wdGlvbnMge2dyZWVkeT1mYWxzZTsgfSA6IC4gKSoKKyAgICAgICAgICAgIGxvb3AxNjoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTY9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExNl8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTE2XzA9PScqJykgKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTE2XzEgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTE2XzE9PScvJykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQxNj0yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBMTZfMT49J1x1MDAwMCcgJiYgTEExNl8xPD0nLicpfHwoTEExNl8xPj0nMCcgJiYgTEExNl8xPD0nXHVGRkZGJykpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoTEExNl8wPj0nXHUwMDAwJyAmJiBMQTE2XzA8PScpJyl8fChMQTE2XzA+PScrJyAmJiBMQTE2XzA8PSdcdUZGRkYnKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDE2PTE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE2KSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjYzMzk6NTI6IC4KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBtYXRjaEFueSgpOyAKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworICAgICAgICAgICAgbWF0Y2goIiovIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlJVTEVfTUxfQ09NTUVOVCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiUlVMRV9TTF9DT01NRU5UIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1SVUxFX1NMX0NPTU1FTlQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9TTF9DT01NRU5UOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjYzNDE6MTc6ICggJy8vJyAofiAoICggJ1xcbicgfCAnXFxyJyApICkgKSogKCAoICdcXHInICk/ICdcXG4nICk/ICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2MzQxOjE5OiAnLy8nICh+ICggKCAnXFxuJyB8ICdcXHInICkgKSApKiAoICggJ1xccicgKT8gJ1xcbicgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIvLyIpOyAKKworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjYzNDE6MjQ6ICh+ICggKCAnXFxuJyB8ICdcXHInICkgKSApKgorICAgICAgICAgICAgbG9vcDE3OgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQxNz0yOworICAgICAgICAgICAgICAgIGludCBMQTE3XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgIGlmICggKChMQTE3XzA+PSdcdTAwMDAnICYmIExBMTdfMDw9J1x0Jyl8fChMQTE3XzA+PSdcdTAwMEInICYmIExBMTdfMDw9J1xmJyl8fChMQTE3XzA+PSdcdTAwMEUnICYmIExBMTdfMDw9J1x1RkZGRicpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTc9MTsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTcpIHsKKyAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjM0MToyNDogfiAoICggJ1xcbicgfCAnXFxyJyApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIChpbnB1dC5MQSgxKT49J1x1MDAwMCcgJiYgaW5wdXQuTEEoMSk8PSdcdCcpfHwoaW5wdXQuTEEoMSk+PSdcdTAwMEInICYmIGlucHV0LkxBKDEpPD0nXGYnKXx8KGlucHV0LkxBKDEpPj0nXHUwMDBFJyAmJiBpbnB1dC5MQSgxKTw9J1x1RkZGRicpICkgeworICAgICAgICAgICAgCSAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgZWxzZSB7CisgICAgICAgICAgICAJICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgCSAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbXNlO30KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDE3OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjM0MTo0MDogKCAoICdcXHInICk/ICdcXG4nICk/CisgICAgICAgICAgICBpbnQgYWx0MTk9MjsKKyAgICAgICAgICAgIGludCBMQTE5XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoTEExOV8wPT0nXG4nfHxMQTE5XzA9PSdccicpICkgeworICAgICAgICAgICAgICAgIGFsdDE5PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE5KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjYzNDE6NDE6ICggJ1xccicgKT8gJ1xcbicKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjM0MTo0MTogKCAnXFxyJyApPworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTg9MjsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBMThfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKExBMThfMD09J1xyJykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQxOD0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjYzNDE6NDE6ICdcXHInCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoKCdccicpOyAKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goJ1xuJyk7IAorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJSVUxFX1NMX0NPTU1FTlQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlJVTEVfV1MiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVJVTEVfV1MoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9XUzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2MzQzOjk6ICggKCAnICcgfCAnXFx0JyB8ICdcXHInIHwgJ1xcbicgKSsgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjYzNDM6MTE6ICggJyAnIHwgJ1xcdCcgfCAnXFxyJyB8ICdcXG4nICkrCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjM0MzoxMTogKCAnICcgfCAnXFx0JyB8ICdcXHInIHwgJ1xcbicgKSsKKyAgICAgICAgICAgIGludCBjbnQyMD0wOworICAgICAgICAgICAgbG9vcDIwOgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQyMD0yOworICAgICAgICAgICAgICAgIGludCBMQTIwXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgIGlmICggKChMQTIwXzA+PSdcdCcgJiYgTEEyMF8wPD0nXG4nKXx8TEEyMF8wPT0nXHInfHxMQTIwXzA9PScgJykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDIwPTE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDIwKSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6CisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAoaW5wdXQuTEEoMSk+PSdcdCcgJiYgaW5wdXQuTEEoMSk8PSdcbicpfHxpbnB1dC5MQSgxKT09J1xyJ3x8aW5wdXQuTEEoMSk9PScgJyApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGVsc2UgeworICAgICAgICAgICAgCSAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgIAkgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG1zZTt9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGlmICggY250MjAgPj0gMSApIGJyZWFrIGxvb3AyMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVhcmx5RXhpdEV4Y2VwdGlvbiBlZWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFYXJseUV4aXRFeGNlcHRpb24oMjAsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVlZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY250MjArKzsKKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlJVTEVfV1MiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlJVTEVfQU5ZX09USEVSIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1SVUxFX0FOWV9PVEhFUigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX0FOWV9PVEhFUjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2MzQ1OjE2OiAoIC4gKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjYzNDU6MTg6IC4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoQW55KCk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJSVUxFX0FOWV9PVEhFUiIKKworICAgIHB1YmxpYyB2b2lkIG1Ub2tlbnMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjg6ICggVF9fMTMgfCBUX18xNCB8IFRfXzE1IHwgVF9fMTYgfCBUX18xNyB8IFRfXzE4IHwgVF9fMTkgfCBUX18yMCB8IFRfXzIxIHwgVF9fMjIgfCBUX18yMyB8IFRfXzI0IHwgVF9fMjUgfCBUX18yNiB8IFRfXzI3IHwgVF9fMjggfCBUX18yOSB8IFRfXzMwIHwgVF9fMzEgfCBUX18zMiB8IFRfXzMzIHwgVF9fMzQgfCBUX18zNSB8IFRfXzM2IHwgVF9fMzcgfCBUX18zOCB8IFRfXzM5IHwgVF9fNDAgfCBUX180MSB8IFRfXzQyIHwgVF9fNDMgfCBUX180NCB8IFRfXzQ1IHwgVF9fNDYgfCBUX180NyB8IFRfXzQ4IHwgVF9fNDkgfCBUX181MCB8IFRfXzUxIHwgVF9fNTIgfCBUX181MyB8IFRfXzU0IHwgVF9fNTUgfCBUX181NiB8IFRfXzU3IHwgVF9fNTggfCBUX181OSB8IFRfXzYwIHwgVF9fNjEgfCBUX182MiB8IFRfXzYzIHwgVF9fNjQgfCBUX182NSB8IFRfXzY2IHwgVF9fNjcgfCBUX182OCB8IFRfXzY5IHwgVF9fNzAgfCBUX183MSB8IFRfXzcyIHwgVF9fNzMgfCBUX183NCB8IFRfXzc1IHwgVF9fNzYgfCBUX183NyB8IFRfXzc4IHwgVF9fNzkgfCBUX184MCB8IFRfXzgxIHwgVF9fODIgfCBUX184MyB8IFRfXzg0IHwgVF9fODUgfCBUX184NiB8IFRfXzg3IHwgVF9fODggfCBUX184OSB8IFRfXzkwIHwgVF9fOTEgfCBUX185MiB8IFRfXzkzIHwgVF9fOTQgfCBUX185NSB8IFRfXzk2IHwgVF9fOTcgfCBUX185OCB8IFRfXzk5IHwgVF9fMTAwIHwgVF9fMTAxIHwgVF9fMTAyIHwgVF9fMTAzIHwgVF9fMTA0IHwgVF9fMTA1IHwgVF9fMTA2IHwgVF9fMTA3IHwgVF9fMTA4IHwgVF9fMTA5IHwgVF9fMTEwIHwgVF9fMTExIHwgVF9fMTEyIHwgVF9fMTEzIHwgVF9fMTE0IHwgUlVMRV9IRVggfCBSVUxFX0lOVCB8IFJVTEVfREVDSU1BTCB8IFJVTEVfSUQgfCBSVUxFX1NUUklORyB8IFJVTEVfTUxfQ09NTUVOVCB8IFJVTEVfU0xfQ09NTUVOVCB8IFJVTEVfV1MgfCBSVUxFX0FOWV9PVEhFUiApCisgICAgICAgIGludCBhbHQyMT0xMTE7CisgICAgICAgIGFsdDIxID0gZGZhMjEucHJlZGljdChpbnB1dCk7CisgICAgICAgIHN3aXRjaCAoYWx0MjEpIHsKKyAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MToxMDogVF9fMTMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjE2OiBUX18xNAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MjI6IFRfXzE1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MToyODogVF9fMTYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjM0OiBUX18xNworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NDA6IFRfXzE4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xOCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTo0NjogVF9fMTkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjUyOiBUX18yMAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NTg6IFRfXzIxCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NjQ6IFRfXzIyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NzA6IFRfXzIzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NzY6IFRfXzI0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yNCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6ODI6IFRfXzI1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yNSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6ODg6IFRfXzI2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yNigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6OTQ6IFRfXzI3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yNygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MTAwOiBUX18yOAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjEwNjogVF9fMjkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzI5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MToxMTI6IFRfXzMwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18zMCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MTE4OiBUX18zMQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMzEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjEyNDogVF9fMzIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzMyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MToxMzA6IFRfXzMzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18zMygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MTM2OiBUX18zNAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMzQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjE0MjogVF9fMzUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzM1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MToxNDg6IFRfXzM2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18zNigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MTU0OiBUX18zNworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMzcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjE2MDogVF9fMzgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzM4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MToxNjY6IFRfXzM5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18zOSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MTcyOiBUX180MAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNDAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjE3ODogVF9fNDEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzQxKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MToxODQ6IFRfXzQyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX180MigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MTkwOiBUX180MworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNDMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjE5NjogVF9fNDQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzQ0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MToyMDI6IFRfXzQ1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX180NSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MjA4OiBUX180NgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNDYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjIxNDogVF9fNDcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzQ3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzNiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MToyMjA6IFRfXzQ4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX180OCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MjI2OiBUX180OQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNDkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjIzMjogVF9fNTAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzUwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MToyMzg6IFRfXzUxCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX181MSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MjQ0OiBUX181MgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNTIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjI1MDogVF9fNTMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzUzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0MiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MToyNTY6IFRfXzU0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX181NCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MjYyOiBUX181NQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNTUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjI2ODogVF9fNTYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzU2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0NSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MToyNzQ6IFRfXzU3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX181NygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MjgwOiBUX181OAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNTgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjI4NjogVF9fNTkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzU5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0OCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MToyOTI6IFRfXzYwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX182MCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6Mjk4OiBUX182MQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNjEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDUwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjMwNDogVF9fNjIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzYyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1MSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTozMTA6IFRfXzYzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX182MygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MzE2OiBUX182NAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNjQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDUzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjMyMjogVF9fNjUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzY1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1NCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTozMjg6IFRfXzY2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX182NigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MzM0OiBUX182NworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNjcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjM0MDogVF9fNjgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzY4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1NyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTozNDY6IFRfXzY5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX182OSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MzUyOiBUX183MAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNzAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjM1ODogVF9fNzEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzcxKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2MCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTozNjQ6IFRfXzcyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX183MigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MzcwOiBUX183MworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNzMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDYyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjM3NjogVF9fNzQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzc0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2MyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTozODI6IFRfXzc1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX183NSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6Mzg4OiBUX183NgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNzYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjM5NDogVF9fNzcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzc3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2NiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTo0MDA6IFRfXzc4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX183OCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NDA2OiBUX183OQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNzkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjQxMjogVF9fODAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzgwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2OSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTo0MTg6IFRfXzgxCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX184MSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NDI0OiBUX184MgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fODIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDcxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjQzMDogVF9fODMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzgzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3MiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTo0MzY6IFRfXzg0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX184NCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NDQyOiBUX184NQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fODUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjQ0ODogVF9fODYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzg2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3NSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTo0NTQ6IFRfXzg3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX184NygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NDYwOiBUX184OAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fODgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjQ2NjogVF9fODkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzg5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3OCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTo0NzI6IFRfXzkwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX185MCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NDc4OiBUX185MQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fOTEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDgwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjQ4NDogVF9fOTIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzkyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4MSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTo0OTA6IFRfXzkzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX185MygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NDk2OiBUX185NAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fOTQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDgzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjUwMjogVF9fOTUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzk1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4NCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTo1MDg6IFRfXzk2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX185NigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NTE0OiBUX185NworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fOTcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDg2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjUyMDogVF9fOTgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzk4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4NyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTo1MjY6IFRfXzk5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX185OSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NTMyOiBUX18xMDAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEwMCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NTM5OiBUX18xMDEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEwMSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NTQ2OiBUX18xMDIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEwMigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NTUzOiBUX18xMDMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEwMygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NTYwOiBUX18xMDQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEwNCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NTY3OiBUX18xMDUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEwNSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NTc0OiBUX18xMDYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEwNigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NTgxOiBUX18xMDcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEwNygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NTg4OiBUX18xMDgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEwOCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NTk1OiBUX18xMDkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEwOSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NjAyOiBUX18xMTAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzExMCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NjA5OiBUX18xMTEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzExMSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTAwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjYxNjogVF9fMTEyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMTIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwMSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTo2MjM6IFRfXzExMworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTEzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NjMwOiBUX18xMTQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzExNCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTAzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjYzNzogUlVMRV9IRVgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfSEVYKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NjQ2OiBSVUxFX0lOVAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtUlVMRV9JTlQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwNSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTo2NTU6IFJVTEVfREVDSU1BTAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtUlVMRV9ERUNJTUFMKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NjY4OiBSVUxFX0lECisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1SVUxFX0lEKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6Njc2OiBSVUxFX1NUUklORworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtUlVMRV9TVFJJTkcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwOCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTo2ODg6IFJVTEVfTUxfQ09NTUVOVAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtUlVMRV9NTF9DT01NRU5UKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NzA0OiBSVUxFX1NMX0NPTU1FTlQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfU0xfQ09NTUVOVCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTEwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjcyMDogUlVMRV9XUworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtUlVMRV9XUygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTExIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjcyODogUlVMRV9BTllfT1RIRVIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfQU5ZX09USEVSKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKworICAgIH0KKworCisgICAgcHJvdGVjdGVkIERGQTIxIGRmYTIxID0gbmV3IERGQTIxKHRoaXMpOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjFfZW90UyA9CisgICAgICAgICJcMVx1ZmZmZlwxXDY1XDFcNjdcMVw3MVwxXDc0XDFcMTAwXDFcMTAzXDFcMTA3XDFcMTExXDFcMTEzXDFcMTE1IisKKyAgICAgICAgIlwxXDExN1wxXDEyMVwxXDEyNFw3XDEzMFwyXHVmZmZmXDExXDEzMFwxMFx1ZmZmZlwxXHUwMDhhXDJcMTMwXDIiKworICAgICAgICAiXHUwMDkwXDFcNjJcNVx1ZmZmZlwxXHUwMDk1XDI2XHVmZmZmXDFcdTAwOTdcNVx1ZmZmZlwxXHUwMDk5XDRcdWZmZmYiKworICAgICAgICAiXDNcMTMwXDFcdWZmZmZcMTRcMTMwXDFcdTAwYWFcMTBcMTMwXDJcdWZmZmZcMlwxMzBcMVx1MDBiNlwxNFwxMzAiKworICAgICAgICAiXDFcdTAwYzlcMVwxMzBcMTJcdWZmZmZcM1wxMzBcMVx1ZmZmZlwxXHUwMDkwXDEyXHVmZmZmXDFcdTAwY2VcMSIrCisgICAgICAgICJcdTAwY2ZcMTZcMTMwXDFcdWZmZmZcMlwxMzBcMVx1MDBlMFwxMFwxMzBcMVx1ZmZmZlw1XDEzMFwxXHUwMGVlIisKKyAgICAgICAgIlwxNFwxMzBcMVx1ZmZmZlwyXDEzMFwxXHUwMGZkXDFcMTMwXDJcdWZmZmZcMVwxMzBcMVx1MDEwMFwxXDEzMCIrCisgICAgICAgICJcMVx1MDEwMlwxNFwxMzBcMVx1ZmZmZlwzXDEzMFwxXHUwMTEzXDExXDEzMFwxXHVmZmZmXDFcdTAxMWRcMlwxMzAiKworICAgICAgICAiXDFcdTAxMjBcMVwxMzBcMVx1MDEyMlw2XDEzMFwxXHUwMTI5XDFcMTMwXDFcdWZmZmZcMVx1MDEyYlwxXDEzMCIrCisgICAgICAgICJcMVx1ZmZmZlwxXDEzMFwxXHVmZmZmXDFcMTMwXDFcdTAxMzBcMTFcMTMwXDFcdTAxM2FcNFwxMzBcMVx1ZmZmZiIrCisgICAgICAgICJcNlwxMzBcMVx1MDE0NVwxXDEzMFwxXHUwMTQ3XDFcdWZmZmZcMlwxMzBcMVx1ZmZmZlwxXHUwMTRhXDFcdWZmZmYiKworICAgICAgICAiXDFcdTAxNGJcNVwxMzBcMVx1ZmZmZlwxXHUwMTUxXDFcdWZmZmZcM1wxMzBcMVx1MDE1NVwxXHVmZmZmXDFcMTMwIisKKyAgICAgICAgIlwxXHUwMTU4XDFcMTMwXDFcdTAxNWFcMVwxMzBcMVx1MDE1Y1wzXDEzMFwxXHVmZmZmXDEyXDEzMFwxXHVmZmZmIisKKyAgICAgICAgIlwxXHUwMTZhXDFcdWZmZmZcMlwxMzBcMlx1ZmZmZlwxXHUwMTZkXDFcdTAxNmVcMVx1MDE2ZlwyXDEzMFwxXHVmZmZmIisKKyAgICAgICAgIlwxXDEzMFwxXHUwMTczXDFcMTMwXDFcdWZmZmZcMlwxMzBcMVx1ZmZmZlwxXDEzMFwxXHVmZmZmXDFcMTMwXDEiKworICAgICAgICAiXHVmZmZmXDFcdTAxNzlcMlwxMzBcMVx1MDE3Y1wxXDEzMFwxXHUwMTdlXDJcMTMwXDFcdTAxODFcMlwxMzBcMSIrCisgICAgICAgICJcdTAxODRcMVwxMzBcMVx1ZmZmZlwyXDEzMFwzXHVmZmZmXDFcdTAxODhcMVwxMzBcMVx1MDE4YVwxXHVmZmZmIisKKyAgICAgICAgIlw1XDEzMFwxXHVmZmZmXDJcMTMwXDFcdWZmZmZcMVwxMzBcMVx1ZmZmZlwyXDEzMFwxXHVmZmZmXDFcdTAxOTUiKworICAgICAgICAiXDFcMTMwXDFcdWZmZmZcMVx1MDE5N1wyXDEzMFwxXHVmZmZmXDFcMTMwXDFcdWZmZmZcMVx1MDE5Ylw3XDEzMCIrCisgICAgICAgICJcMVx1MDFhM1wxXDEzMFwxXHVmZmZmXDFcMTMwXDFcdWZmZmZcM1wxMzBcMVx1ZmZmZlw0XDEzMFwxXHUwMWFkIisKKyAgICAgICAgIlwxXHUwMWFlXDFcdTAxYWZcMVx1ZmZmZlwzXDEzMFwxXHUwMWIzXDFcdWZmZmZcMlwxMzBcMVx1MDFiNlwxXDEzMCIrCisgICAgICAgICJcM1x1ZmZmZlwxXHUwMWI4XDFcMTMwXDFcdTAxYmFcMVx1ZmZmZlwyXDEzMFwxXHVmZmZmXDFcdTAxYmRcMVx1ZmZmZiIrCisgICAgICAgICJcMVwxMzBcMVx1ZmZmZlwxXHUwMWJmXDFcMTMwXDFcdWZmZmZcMVx1MDFjMVwxXHVmZmZmXDFcMTMwXDFcdWZmZmYiKworICAgICAgICAiXDFcdTAxYzNcMVx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMV9lb2ZTID0KKyAgICAgICAgIlx1MDFjNFx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMV9taW5TID0KKyAgICAgICAgIlwxXDBcMVw3NVwxXDE3NFwxXDQ2XDFcNTNcMVw1NVwyXDUyXDNcNzVcMVw3NlwyXDU2XDFcMTQxXDFcMTU0IisKKyAgICAgICAgIlwxXDE0MVwxXDE0M1wxXDE0MVwxXDE1N1wxXDE0MVwyXHVmZmZmXDFcMTYzXDFcMTQzXDFcMTQxXDJcMTYyXDEiKworICAgICAgICAiXDE0MVwyXDE0NVwxXDE2MFwxMFx1ZmZmZlwxXDcyXDFcMTUwXDFcMTQ1XDJcNjBcMVw0NFw1XHVmZmZmXDFcNzUiKworICAgICAgICAiXDI2XHVmZmZmXDFcNzVcNVx1ZmZmZlwxXDc0XDRcdWZmZmZcMVwxNTRcMVwxNjJcMVwxNDVcMVx1ZmZmZlwxIisKKyAgICAgICAgIlwxNjRcMVwxNjNcMVwxNDFcMVwxNjBcMVwxNjNcMVwxNTRcMVwxNDFcMVwxNTFcMVwxNTZcMVwxNjBcMVwxNTciKworICAgICAgICAiXDFcMTYzXDFcNDRcMVwxMDNcMVwxNTRcMVwxNjJcMVwxNTZcMVwxNjJcMVwxNDNcMVwxNjJcMVwxNTdcMlx1ZmZmZiIrCisgICAgICAgICJcMVwxNDVcMVwxNDNcMVw0NFwxXDE1N1wxXDE0MlwxXDE2MFwxXDE2MlwxXDE2NVwxXDE0N1wxXDE1MVwxXDE0MSIrCisgICAgICAgICJcMVwxNjNcMVwxNjBcMVwxNDFcMVwxNDZcMVw0NFwxXDE1NVwxMlx1ZmZmZlwxXDE1MVwxXDE2N1wxXDE1NFwxIisKKyAgICAgICAgIlx1ZmZmZlwxXDYwXDEyXHVmZmZmXDJcNDRcMVwxNjRcMVwxNjdcMlwxNDVcMVwxNjRcMVwxNDVcMVwxNTBcMSIrCisgICAgICAgICJcMTQ1XDFcMTQzXDFcMTY0XDFcMTQzXDFcMTU3XDFcMTU2XDFcMTY0XDFcdWZmZmZcMVwxNTRcMVwxNjNcMVw0NCIrCisgICAgICAgICJcMVwxNDFcMVwxNTFcMVwxNTNcMVwxNjRcMVwxNjNcMVwxNDNcMVwxNjJcMVwxNDVcMVx1ZmZmZlwxXDE1NFwxIisKKyAgICAgICAgIlwxNTdcMVwxNTRcMVwxNDVcMVwxNTdcMVw0NFwyXDE0NVwxXDE0MVwxXDE0NFwxXDE2MlwxXDE0NVwxXDE0MyIrCisgICAgICAgICJcMVwxNTdcMVwxNjVcMVwxNTRcMVwxNDFcMVwxNDNcMVx1ZmZmZlwxXDE1NlwxXDE1NFwxXDQ0XDFcMTU0XDIiKworICAgICAgICAiXHVmZmZmXDFcMTUxXDFcNDRcMVwxNTZcMVw0NFwxXDE1MVwxXDE2MlwxXDEwM1wxXDE0M1wxXDE0NVwxXDE0MyIrCisgICAgICAgICJcMVwxNTBcMVwxNjJcMVwxMjVcMVwxNDFcMVwxNTdcMVwxNDVcMVx1ZmZmZlwxXDE1NFwxXDE3MlwxXDE0MVwxIisKKyAgICAgICAgIlw0NFwxXDE2MFwxXDE0NVwxXDE2NFwxXDE2M1wxXDE0MlwxXDE1NFwxXDE0NVwxXDE1N1wxXDE2N1wxXHVmZmZmIisKKyAgICAgICAgIlwxXDQ0XDJcMTU2XDFcNDRcMVwxNjRcMVw0NFwxXDE1MFwyXDE2MlwxXDE1N1wxXDE2NVwxXDE2MlwxXDQ0XDEiKworICAgICAgICAiXDE0NVwxXHVmZmZmXDFcNDRcMVwxNDNcMVx1ZmZmZlwxXDE0NFwxXHVmZmZmXDFcMTQzXDFcNDRcMVwxNTdcMSIrCisgICAgICAgICJcMTY0XDFcMTI2XDFcMTUwXDFcMTYyXDFcMTY0XDFcMTIyXDFcMTU2XDFcMTYzXDFcNDRcMVwxNTRcMVwxNTciKworICAgICAgICAiXDFcMTQ3XDFcMTY0XDFcdWZmZmZcMVwxNDVcMVwxNjNcMVwxNDFcMVwxNjNcMVwxNDFcMVwxNTdcMVw0NFwxIisKKyAgICAgICAgIlwxNDZcMVw0NFwxXHVmZmZmXDFcMTY0XDFcMTUxXDFcdWZmZmZcMVw0NFwxXHVmZmZmXDFcNDRcMVwxNjRcMSIrCisgICAgICAgICJcMTU2XDFcMTQ3XDFcMTU0XDFcMTUxXDFcdWZmZmZcMVw0NFwxXHVmZmZmXDFcMTQxXDFcMTYzXDFcMTUxXDEiKworICAgICAgICAiXDQ0XDFcdWZmZmZcMVwxNTZcMVw0NFwxXDE1N1wxXDQ0XDFcMTU3XDFcNDRcMVwxMTFcMVwxNDNcMVwxNDFcMSIrCisgICAgICAgICJcdWZmZmZcMVwxNzFcMVwxNTZcMVwxNDVcMVwxNDFcMVwxNDNcMlwxNjNcMVwxNTFcMVwxNjJcMVwxNDdcMVx1ZmZmZiIrCisgICAgICAgICJcMVw0NFwxXHVmZmZmXDFcMTQxXDFcMTQ3XDJcdWZmZmZcM1w0NFwxXDE2NFwxXDE0MlwxXHVmZmZmXDFcMTU0IisKKyAgICAgICAgIlwxXDQ0XDFcMTU3XDFcdWZmZmZcMVwxNjRcMVwxNDRcMVx1ZmZmZlwxXDE1NFwxXHVmZmZmXDFcMTU2XDFcdWZmZmYiKworICAgICAgICAiXDFcNDRcMVwxNDVcMVwxNDJcMVw0NFwxXDE2NFwxXDQ0XDFcMTQzXDFcMTY0XDFcNDRcMVwxNTNcMVwxNDJcMSIrCisgICAgICAgICJcNDRcMVwxNzFcMVx1ZmZmZlwxXDE2NFwxXDE2MlwzXHVmZmZmXDFcNDRcMVwxNDVcMVw0NFwxXHVmZmZmXDEiKworICAgICAgICAiXDE1NlwxXDE0MVwxXDEwNVwxXDE2NVwxXDE1MVwxXHVmZmZmXDFcMTU3XDFcMTU0XDFcdWZmZmZcMVwxNDFcMSIrCisgICAgICAgICJcdWZmZmZcMVwxNTNcMVwxNTFcMVx1ZmZmZlwxXDQ0XDFcMTUxXDFcdWZmZmZcMVw0NFwxXDE1MVwxXDE0MVwxIisKKyAgICAgICAgIlx1ZmZmZlwxXDE0NFwxXHVmZmZmXDFcNDRcMVwxNTFcMVwxNTRcMVwxNTVcMVwxNzJcMVwxNDZcMVwxNDVcMSIrCisgICAgICAgICJcMTU0XDFcNDRcMVwxNjZcMVx1ZmZmZlwxXDE1NFwxXHVmZmZmXDFcMTU3XDFcMTU1XDFcNDBcMVx1ZmZmZlwxIisKKyAgICAgICAgIlwxNTZcM1wxNDVcM1w0NFwxXHVmZmZmXDFcMTQ1XDFcMTUxXDFcMTU2XDFcNDRcMVx1ZmZmZlwxXDE0NVwxXDE1NSIrCisgICAgICAgICJcMVw0NFwxXDE0NFwzXHVmZmZmXDFcNDRcMVwxNjRcMVw0NFwxXHVmZmZmXDFcMTYyXDFcMTQ1XDFcdWZmZmYiKworICAgICAgICAiXDFcNDRcMVx1ZmZmZlwxXDE3MVwxXHVmZmZmXDFcNDRcMVwxNTZcMVx1ZmZmZlwxXDQ0XDFcdWZmZmZcMVwxNjQiKworICAgICAgICAiXDFcdWZmZmZcMVw0NFwxXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIxX21heFMgPQorICAgICAgICAiXDFcdWZmZmZcMVw3NlwxXDE3NFwxXDQ2XDFcNzVcMVw3Nlw1XDc1XDFcNzZcMVw1NlwxXDcyXDFcMTUxXDEiKworICAgICAgICAiXDE3MFwxXDE3MVwxXDE2M1wyXDE1N1wxXDE2MlwyXHVmZmZmXDJcMTYzXDFcMTcxXDJcMTYyXDFcMTUwXDFcMTQ1IisKKyAgICAgICAgIlwxXDE1N1wxXDE2MFwxMFx1ZmZmZlwxXDcyXDFcMTUwXDFcMTY1XDFcMTcwXDFcMTU0XDFcMTcyXDVcdWZmZmYiKworICAgICAgICAiXDFcNzVcMjZcdWZmZmZcMVw3NVw1XHVmZmZmXDFcNzRcNFx1ZmZmZlwyXDE2MlwxXDE0NVwxXHVmZmZmXDFcMTY0IisKKyAgICAgICAgIlwxXDE2M1wxXDE0MVwxXDE2MFwxXDE2M1wxXDE1NFwxXDE0MVwxXDE1MVwxXDE1NlwxXDE2MFwxXDE1N1wxXDE2MyIrCisgICAgICAgICJcMVwxNzJcMVwxMDNcMVwxNTRcMVwxNjJcMVwxNTZcM1wxNjJcMVwxNTdcMlx1ZmZmZlwxXDE0NVwxXDE0M1wxIisKKyAgICAgICAgIlwxNzJcMVwxNjBcMVwxNDJcMVwxNjBcMVwxNjJcMVwxNzFcMlwxNTFcMVwxNDFcMlwxNjRcMVwxNDFcMVwxNjMiKworICAgICAgICAiXDFcMTcyXDFcMTU1XDEyXHVmZmZmXDFcMTUxXDFcMTY3XDFcMTU0XDFcdWZmZmZcMVwxNTRcMTJcdWZmZmZcMiIrCisgICAgICAgICJcMTcyXDFcMTY0XDFcMTY3XDJcMTQ1XDFcMTY0XDFcMTQ1XDFcMTUwXDFcMTQ1XDFcMTQzXDFcMTY0XDFcMTQzIisKKyAgICAgICAgIlwxXDE1N1wxXDE1NlwxXDE2NFwxXHVmZmZmXDFcMTU0XDFcMTYzXDFcMTcyXDFcMTQxXDFcMTUxXDFcMTUzXDEiKworICAgICAgICAiXDE2NFwxXDE2M1wxXDE0M1wxXDE2MlwxXDE0NVwxXHVmZmZmXDFcMTU0XDFcMTU3XDFcMTU0XDFcMTQ1XDFcMTU3IisKKyAgICAgICAgIlwxXDE3MlwyXDE0NVwxXDE0MVwxXDE0NFwxXDE2MlwxXDE0NVwxXDE0M1wxXDE1N1wxXDE2NVwxXDE1NFwxXDE0MSIrCisgICAgICAgICJcMVwxNDNcMVx1ZmZmZlwxXDE1NlwxXDE1NFwxXDE3MlwxXDE1NFwyXHVmZmZmXDFcMTUxXDFcMTcyXDFcMTU2IisKKyAgICAgICAgIlwxXDE3MlwxXDE1MVwxXDE2MlwxXDEwM1wxXDE0M1wxXDE0NVwxXDE0M1wxXDE1MFwxXDE2MlwxXDEyNVwxXDE0MSIrCisgICAgICAgICJcMVwxNTdcMVwxNDVcMVx1ZmZmZlwxXDE1NFwxXDE3MlwxXDE0MVwxXDE3MlwxXDE2MFwxXDE0NVwxXDE2NFwxIisKKyAgICAgICAgIlwxNjNcMVwxNDJcMVwxNTRcMVwxNDVcMVwxNTdcMVwxNjdcMVx1ZmZmZlwxXDE3MlwyXDE1NlwxXDE3MlwxXDE2NCIrCisgICAgICAgICJcMVwxNzJcMVwxNTBcMlwxNjJcMVwxNTdcMVwxNjVcMVwxNjJcMVwxNzJcMVwxNDVcMVx1ZmZmZlwxXDE3MlwxIisKKyAgICAgICAgIlwxNDNcMVx1ZmZmZlwxXDE2M1wxXHVmZmZmXDFcMTQzXDFcMTcyXDFcMTU3XDFcMTY0XDFcMTI2XDFcMTUwXDEiKworICAgICAgICAiXDE2MlwxXDE2NFwxXDEyMlwxXDE1NlwxXDE2M1wxXDE3MlwxXDE1NFwxXDE1N1wxXDE0N1wxXDE2NFwxXHVmZmZmIisKKyAgICAgICAgIlwxXDE0NVwxXDE2M1wxXDE0MVwxXDE2M1wxXDE0MVwxXDE1N1wxXDE3MlwxXDE0NlwxXDE3MlwxXHVmZmZmXDEiKworICAgICAgICAiXDE2NFwxXDE1MVwxXHVmZmZmXDFcMTcyXDFcdWZmZmZcMVwxNzJcMVwxNjRcMVwxNTZcMVwxNDdcMVwxNTRcMSIrCisgICAgICAgICJcMTUxXDFcdWZmZmZcMVwxNzJcMVx1ZmZmZlwxXDE0MVwxXDE2M1wxXDE1MVwxXDE3MlwxXHVmZmZmXDFcMTU2IisKKyAgICAgICAgIlwxXDE3MlwxXDE1N1wxXDE3MlwxXDE1N1wxXDE3MlwxXDExMVwxXDE0M1wxXDE0MVwxXHVmZmZmXDFcMTcxXDEiKworICAgICAgICAiXDE1NlwxXDE0NVwxXDE0MVwxXDE0M1wyXDE2M1wxXDE1MVwxXDE2MlwxXDE0N1wxXHVmZmZmXDFcMTcyXDFcdWZmZmYiKworICAgICAgICAiXDFcMTQxXDFcMTQ3XDJcdWZmZmZcM1wxNzJcMVwxNjRcMVwxNDJcMVx1ZmZmZlwxXDE1NFwxXDE3MlwxXDE1NyIrCisgICAgICAgICJcMVx1ZmZmZlwxXDE2NFwxXDE0NFwxXHVmZmZmXDFcMTU0XDFcdWZmZmZcMVwxNTZcMVx1ZmZmZlwxXDE3MlwxIisKKyAgICAgICAgIlwxNDVcMVwxNDJcMVwxNzJcMVwxNjRcMVwxNzJcMVwxNDNcMVwxNjRcMVwxNzJcMVwxNTNcMVwxNDJcMVwxNzIiKworICAgICAgICAiXDFcMTcxXDFcdWZmZmZcMVwxNjRcMVwxNjJcM1x1ZmZmZlwxXDE3MlwxXDE0NVwxXDE3MlwxXHVmZmZmXDFcMTU2IisKKyAgICAgICAgIlwxXDE0MVwxXDEwNVwxXDE2NVwxXDE1MVwxXHVmZmZmXDFcMTU3XDFcMTU0XDFcdWZmZmZcMVwxNDFcMVx1ZmZmZiIrCisgICAgICAgICJcMVwxNTNcMVwxNTFcMVx1ZmZmZlwxXDE3MlwxXDE1MVwxXHVmZmZmXDFcMTcyXDFcMTUxXDFcMTQxXDFcdWZmZmYiKworICAgICAgICAiXDFcMTQ0XDFcdWZmZmZcMVwxNzJcMVwxNTFcMVwxNTRcMVwxNTVcMVwxNzJcMVwxNDZcMVwxNDVcMVwxNTRcMSIrCisgICAgICAgICJcMTcyXDFcMTY2XDFcdWZmZmZcMVwxNTRcMVx1ZmZmZlwxXDE1N1wxXDE1NVwxXDQwXDFcdWZmZmZcMVwxNTYiKworICAgICAgICAiXDNcMTQ1XDNcMTcyXDFcdWZmZmZcMVwxNDVcMVwxNTFcMVwxNTZcMVwxNzJcMVx1ZmZmZlwxXDE0NVwxXDE1NSIrCisgICAgICAgICJcMVwxNzJcMVwxNDRcM1x1ZmZmZlwxXDE3MlwxXDE2NFwxXDE3MlwxXHVmZmZmXDFcMTYyXDFcMTQ1XDFcdWZmZmYiKworICAgICAgICAiXDFcMTcyXDFcdWZmZmZcMVwxNzFcMVx1ZmZmZlwxXDE3MlwxXDE1NlwxXHVmZmZmXDFcMTcyXDFcdWZmZmZcMSIrCisgICAgICAgICJcMTY0XDFcdWZmZmZcMVwxNzJcMVx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMV9hY2NlcHRTID0KKyAgICAgICAgIlwyNVx1ZmZmZlwxXDUyXDFcNTNcMTFcdWZmZmZcMVwxMDJcMVwxMDNcMVwxMDRcMVwxMDVcMVwxMDZcMVwxMDciKworICAgICAgICAiXDFcMTEwXDFcMTEzXDZcdWZmZmZcMVwxNTJcMlwxNTNcMVwxNTZcMVwxNTdcMVx1ZmZmZlwxXDIzXDFcMVwxIisKKyAgICAgICAgIlwyXDFcMTQ0XDFcM1wxXDEzN1wxXDRcMVwzNVwxXDI2XDFcNVwxXDIwXDFcMzZcMVwyN1wxXDZcMVwzMVwxXDMwIisKKyAgICAgICAgIlwxXDdcMVwxNTRcMVwxNTVcMVwzMlwxXDEwXDFcMzNcMVx1ZmZmZlwxXDM0XDFcMTVcMVwxNlwxXDI0XDFcMTciKworICAgICAgICAiXDFcdWZmZmZcMVwzN1wxXDI1XDFcMTQzXDFcMTM2XDNcdWZmZmZcMVwxNTJcMjVcdWZmZmZcMVw1MlwxXDUzIisKKyAgICAgICAgIlwyMVx1ZmZmZlwxXDEwMlwxXDEwM1wxXDEwNFwxXDEwNVwxXDEwNlwxXDEwN1wxXDExMFwxXDExM1wxXDE0MiIrCisgICAgICAgICJcMVwxMTdcM1x1ZmZmZlwxXDE0N1wxXHVmZmZmXDFcMTUwXDFcMTUxXDFcMTUzXDFcMTU2XDFcMTNcMVwxMVwxIisKKyAgICAgICAgIlwxNFwxXDEyXDFcMjFcMVwyMlwyMFx1ZmZmZlwxXDExNFwxM1x1ZmZmZlwxXDExMlwyMlx1ZmZmZlwxXDEyNCIrCisgICAgICAgICJcNFx1ZmZmZlwxXDQwXDFcMTQ1XDIwXHVmZmZmXDFcMTIyXDE1XHVmZmZmXDFcMTMyXDE2XHVmZmZmXDFcMTI1IisKKyAgICAgICAgIlwyXHVmZmZmXDFcNzBcMVx1ZmZmZlwxXDExNVwyMFx1ZmZmZlwxXDY3XDExXHVmZmZmXDFcMTQ2XDJcdWZmZmYiKworICAgICAgICAiXDFcNzNcMVx1ZmZmZlwxXDEyMVw2XHVmZmZmXDFcMTAxXDFcdWZmZmZcMVwxMjZcNFx1ZmZmZlwxXDQ1XDExIisKKyAgICAgICAgIlx1ZmZmZlwxXDQ2XDEyXHVmZmZmXDFcNzJcMVx1ZmZmZlwxXDEzMFwyXHVmZmZmXDFcNzRcMVwxMzVcNVx1ZmZmZiIrCisgICAgICAgICJcMVwxMjNcM1x1ZmZmZlwxXDQyXDJcdWZmZmZcMVw3MVwxXHVmZmZmXDFcMTE2XDFcdWZmZmZcMVw0M1wxNVx1ZmZmZiIrCisgICAgICAgICJcMVwxMjdcMlx1ZmZmZlwxXDc1XDFcMTMxXDFcMTAwXDNcdWZmZmZcMVw0MVw1XHVmZmZmXDFcNTdcMlx1ZmZmZiIrCisgICAgICAgICJcMVwxMzNcMVx1ZmZmZlwxXDUxXDJcdWZmZmZcMVw1NVwyXHVmZmZmXDFcNjFcM1x1ZmZmZlwxXDEyMFwxXHVmZmZmIisKKyAgICAgICAgIlwxXDUwXDEyXHVmZmZmXDFcNTZcMVx1ZmZmZlwxXDc3XDNcdWZmZmZcMVw0NFw3XHVmZmZmXDFcNjZcNFx1ZmZmZiIrCisgICAgICAgICJcMVwxNDBcNFx1ZmZmZlwxXDExMVwxXDE0MVwxXDQ3XDNcdWZmZmZcMVw3NlwyXHVmZmZmXDFcNjVcMVx1ZmZmZiIrCisgICAgICAgICJcMVw1NFwxXHVmZmZmXDFcNjNcMlx1ZmZmZlwxXDEzNFwxXHVmZmZmXDFcNjJcMVx1ZmZmZlwxXDYwXDFcdWZmZmYiKworICAgICAgICAiXDFcNjQiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjFfc3BlY2lhbFMgPQorICAgICAgICAiXDFcMFx1MDFjM1x1ZmZmZn0+IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gREZBMjFfdHJhbnNpdGlvblMgPSB7CisgICAgICAgICAgICAiXDExXDYyXDJcNjFcMlw2MlwxXDYxXDIyXDYyXDFcNjFcMVwxMVwxXDU3XDFcNDVcMVw1NlwxXDEwXDEiKworICAgICAgICAgICAgIlwzXDFcNjBcMVw0MVwxXDQyXDFcNlwxXDRcMVw0M1wxXDVcMVwxNFwxXDdcMVw1M1wxMVw1NFwxXDUwIisKKyAgICAgICAgICAgICJcMVw0N1wxXDEzXDFcMVwxXDEyXDFcMTVcMVw0MFwzMlw1NlwxXDQ2XDFcNjJcMVw0NFwxXDU1XDFcNTYiKworICAgICAgICAgICAgIlwxXDYyXDFcMzBcMVwzN1wxXDM0XDFcMzZcMVwxN1wxXDIyXDFcMzNcMVwyM1wxXDIxXDRcNTZcMVw1MiIrCisgICAgICAgICAgICAiXDFcMzJcMVwyNFwxXDU2XDFcMzVcMVwyMFwxXDMxXDFcMjdcMVwxNlwxXDUxXDNcNTZcMVwyNVwxXDIiKworICAgICAgICAgICAgIlwxXDI2XHVmZjgyXDYyIiwKKyAgICAgICAgICAgICJcMVw2M1wxXDY0IiwKKyAgICAgICAgICAgICJcMVw2NiIsCisgICAgICAgICAgICAiXDFcNzAiLAorICAgICAgICAgICAgIlwxXDczXDIxXHVmZmZmXDFcNzIiLAorICAgICAgICAgICAgIlwxXDc3XDE3XHVmZmZmXDFcNzVcMVw3NiIsCisgICAgICAgICAgICAiXDFcMTAyXDIyXHVmZmZmXDFcMTAxIiwKKyAgICAgICAgICAgICJcMVwxMDVcNFx1ZmZmZlwxXDEwNlwxNVx1ZmZmZlwxXDEwNCIsCisgICAgICAgICAgICAiXDFcMTEwIiwKKyAgICAgICAgICAgICJcMVwxMTIiLAorICAgICAgICAgICAgIlwxXDExNCIsCisgICAgICAgICAgICAiXDFcMTE2IiwKKyAgICAgICAgICAgICJcMVwxMjAiLAorICAgICAgICAgICAgIlwxXDEyM1wxM1x1ZmZmZlwxXDEyMiIsCisgICAgICAgICAgICAiXDFcMTI1XDNcdWZmZmZcMVwxMjZcM1x1ZmZmZlwxXDEyNyIsCisgICAgICAgICAgICAiXDFcMTMyXDEzXHVmZmZmXDFcMTMxIiwKKyAgICAgICAgICAgICJcMVwxMzVcM1x1ZmZmZlwxXDEzNlwxMlx1ZmZmZlwxXDEzN1wzXHVmZmZmXDFcMTMzXDFcMTM0XDEiKworICAgICAgICAgICAgIlx1ZmZmZlwxXDE0MFwxXHVmZmZmXDFcMTQxIiwKKyAgICAgICAgICAgICJcMVwxNDNcMlx1ZmZmZlwxXDE0NVw2XHVmZmZmXDFcMTQyXDFcMTQ0XDRcdWZmZmZcMVwxNDYiLAorICAgICAgICAgICAgIlwxXDE0N1w3XHVmZmZmXDFcMTUxXDVcdWZmZmZcMVwxNTAiLAorICAgICAgICAgICAgIlwxXDE1MiIsCisgICAgICAgICAgICAiXDFcMTUzXDNcdWZmZmZcMVwxNTRcMTRcdWZmZmZcMVwxNTUiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxNjAiLAorICAgICAgICAgICAgIlwxXDE2MVwxN1x1ZmZmZlwxXDE2MiIsCisgICAgICAgICAgICAiXDFcMTY0XDZcdWZmZmZcMVwxNjZcNlx1ZmZmZlwxXDE2M1wyXHVmZmZmXDFcMTY3XDZcdWZmZmZcMSIrCisgICAgICAgICAgICAiXDE2NSIsCisgICAgICAgICAgICAiXDFcMTcwIiwKKyAgICAgICAgICAgICJcMVwxNzEiLAorICAgICAgICAgICAgIlwxXDE3M1w2XHVmZmZmXDFcMTcyIiwKKyAgICAgICAgICAgICJcMVwxNzQiLAorICAgICAgICAgICAgIlwxXDE3NlwzXHVmZmZmXDFcMTc1XDVcdWZmZmZcMVwxNzciLAorICAgICAgICAgICAgIlwxXHUwMDgwIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAwODkiLAorICAgICAgICAgICAgIlwxXHUwMDhiIiwKKyAgICAgICAgICAgICJcMVx1MDA4Y1wxN1x1ZmZmZlwxXHUwMDhkIiwKKyAgICAgICAgICAgICJcMTJcdTAwOGZcMTBcdWZmZmZcMVx1MDA5MVwxXHVmZmZmXDNcdTAwOTFcNVx1ZmZmZlwxXHUwMDkxIisKKyAgICAgICAgICAgICJcMTNcdWZmZmZcMVx1MDA4ZVw2XHVmZmZmXDFcdTAwOGZcMlx1ZmZmZlwxXHUwMDkxXDFcdWZmZmZcMyIrCisgICAgICAgICAgICAiXHUwMDkxXDVcdWZmZmZcMVx1MDA5MVwxM1x1ZmZmZlwxXHUwMDhlIiwKKyAgICAgICAgICAgICJcMTJcdTAwOGZcMTBcdWZmZmZcMVx1MDA5MVwxXHVmZmZmXDNcdTAwOTFcNVx1ZmZmZlwxXHUwMDkxIisKKyAgICAgICAgICAgICJcMjJcdWZmZmZcMVx1MDA4ZlwyXHVmZmZmXDFcdTAwOTFcMVx1ZmZmZlwzXHUwMDkxXDVcdWZmZmZcMSIrCisgICAgICAgICAgICAiXHUwMDkxIiwKKyAgICAgICAgICAgICJcMVwxMzBcMzRcdWZmZmZcMzJcMTMwXDRcdWZmZmZcMVwxMzBcMVx1ZmZmZlwzMlwxMzAiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDA5NCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDA5NiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMDk4IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMDlhXDVcdWZmZmZcMVx1MDA5YiIsCisgICAgICAgICAgICAiXDFcdTAwOWMiLAorICAgICAgICAgICAgIlwxXHUwMDlkIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMDllIiwKKyAgICAgICAgICAgICJcMVx1MDA5ZiIsCisgICAgICAgICAgICAiXDFcdTAwYTAiLAorICAgICAgICAgICAgIlwxXHUwMGExIiwKKyAgICAgICAgICAgICJcMVx1MDBhMiIsCisgICAgICAgICAgICAiXDFcdTAwYTMiLAorICAgICAgICAgICAgIlwxXHUwMGE0IiwKKyAgICAgICAgICAgICJcMVx1MDBhNSIsCisgICAgICAgICAgICAiXDFcdTAwYTYiLAorICAgICAgICAgICAgIlwxXHUwMGE3IiwKKyAgICAgICAgICAgICJcMVx1MDBhOCIsCisgICAgICAgICAgICAiXDFcdTAwYTkiLAorICAgICAgICAgICAgIlwxXDEzMFwxM1x1ZmZmZlwxMlwxMzBcN1x1ZmZmZlwzMlwxMzBcNFx1ZmZmZlwxXDEzMFwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMwIiwKKyAgICAgICAgICAgICJcMVx1MDBhYiIsCisgICAgICAgICAgICAiXDFcdTAwYWMiLAorICAgICAgICAgICAgIlwxXHUwMGFkIiwKKyAgICAgICAgICAgICJcMVx1MDBhZSIsCisgICAgICAgICAgICAiXDFcdTAwYWYiLAorICAgICAgICAgICAgIlwxXHUwMGIwXDE2XHVmZmZmXDFcdTAwYjEiLAorICAgICAgICAgICAgIlwxXHUwMGIyIiwKKyAgICAgICAgICAgICJcMVx1MDBiMyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMGI0IiwKKyAgICAgICAgICAgICJcMVx1MDBiNSIsCisgICAgICAgICAgICAiXDFcMTMwXDEzXHVmZmZmXDEyXDEzMFw3XHVmZmZmXDMyXDEzMFw0XHVmZmZmXDFcMTMwXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzAiLAorICAgICAgICAgICAgIlwxXHUwMGI3XDFcdTAwYjgiLAorICAgICAgICAgICAgIlwxXHUwMGI5IiwKKyAgICAgICAgICAgICJcMVx1MDBiYSIsCisgICAgICAgICAgICAiXDFcdTAwYmIiLAorICAgICAgICAgICAgIlwxXHUwMGJkXDNcdWZmZmZcMVx1MDBiYyIsCisgICAgICAgICAgICAiXDFcdTAwYmZcMVx1ZmZmZlwxXHUwMGJlIiwKKyAgICAgICAgICAgICJcMVx1MDBjMCIsCisgICAgICAgICAgICAiXDFcdTAwYzEiLAorICAgICAgICAgICAgIlwxXHUwMGMyXDFcdTAwYzMiLAorICAgICAgICAgICAgIlwxXHUwMGM0XDNcdWZmZmZcMVx1MDBjNSIsCisgICAgICAgICAgICAiXDFcdTAwYzYiLAorICAgICAgICAgICAgIlwxXHUwMGM3XDE0XHVmZmZmXDFcdTAwYzgiLAorICAgICAgICAgICAgIlwxXDEzMFwxM1x1ZmZmZlwxMlwxMzBcN1x1ZmZmZlwzMlwxMzBcNFx1ZmZmZlwxXDEzMFwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMwIiwKKyAgICAgICAgICAgICJcMVx1MDBjYSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDBjYiIsCisgICAgICAgICAgICAiXDFcdTAwY2MiLAorICAgICAgICAgICAgIlwxXHUwMGNkIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxMlx1MDA4ZlwxMFx1ZmZmZlwxXHUwMDkxXDFcdWZmZmZcM1x1MDA5MVw1XHVmZmZmXDFcdTAwOTEiKworICAgICAgICAgICAgIlwyMlx1ZmZmZlwxXHUwMDhmXDJcdWZmZmZcMVx1MDA5MVwxXHVmZmZmXDNcdTAwOTFcNVx1ZmZmZlwxIisKKyAgICAgICAgICAgICJcdTAwOTEiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTMwXDEzXHVmZmZmXDEyXDEzMFw3XHVmZmZmXDMyXDEzMFw0XHVmZmZmXDFcMTMwXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzAiLAorICAgICAgICAgICAgIlwxXDEzMFwxM1x1ZmZmZlwxMlwxMzBcN1x1ZmZmZlwzMlwxMzBcNFx1ZmZmZlwxXDEzMFwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMwIiwKKyAgICAgICAgICAgICJcMVx1MDBkMCIsCisgICAgICAgICAgICAiXDFcdTAwZDEiLAorICAgICAgICAgICAgIlwxXHUwMGQyIiwKKyAgICAgICAgICAgICJcMVx1MDBkMyIsCisgICAgICAgICAgICAiXDFcdTAwZDQiLAorICAgICAgICAgICAgIlwxXHUwMGQ1IiwKKyAgICAgICAgICAgICJcMVx1MDBkNiIsCisgICAgICAgICAgICAiXDFcdTAwZDciLAorICAgICAgICAgICAgIlwxXHUwMGQ4IiwKKyAgICAgICAgICAgICJcMVx1MDBkOSIsCisgICAgICAgICAgICAiXDFcdTAwZGEiLAorICAgICAgICAgICAgIlwxXHUwMGRiIiwKKyAgICAgICAgICAgICJcMVx1MDBkYyIsCisgICAgICAgICAgICAiXDFcdTAwZGQiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAwZGUiLAorICAgICAgICAgICAgIlwxXHUwMGRmIiwKKyAgICAgICAgICAgICJcMVwxMzBcMTNcdWZmZmZcMTJcMTMwXDdcdWZmZmZcMzJcMTMwXDRcdWZmZmZcMVwxMzBcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMCIsCisgICAgICAgICAgICAiXDFcdTAwZTEiLAorICAgICAgICAgICAgIlwxXHUwMGUyIiwKKyAgICAgICAgICAgICJcMVx1MDBlMyIsCisgICAgICAgICAgICAiXDFcdTAwZTQiLAorICAgICAgICAgICAgIlwxXHUwMGU1IiwKKyAgICAgICAgICAgICJcMVx1MDBlNiIsCisgICAgICAgICAgICAiXDFcdTAwZTciLAorICAgICAgICAgICAgIlwxXHUwMGU4IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMGU5IiwKKyAgICAgICAgICAgICJcMVx1MDBlYSIsCisgICAgICAgICAgICAiXDFcdTAwZWIiLAorICAgICAgICAgICAgIlwxXHUwMGVjIiwKKyAgICAgICAgICAgICJcMVx1MDBlZCIsCisgICAgICAgICAgICAiXDFcMTMwXDEzXHVmZmZmXDEyXDEzMFw3XHVmZmZmXDMyXDEzMFw0XHVmZmZmXDFcMTMwXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzAiLAorICAgICAgICAgICAgIlwxXHUwMGVmIiwKKyAgICAgICAgICAgICJcMVx1MDBmMCIsCisgICAgICAgICAgICAiXDFcdTAwZjEiLAorICAgICAgICAgICAgIlwxXHUwMGYyIiwKKyAgICAgICAgICAgICJcMVx1MDBmMyIsCisgICAgICAgICAgICAiXDFcdTAwZjQiLAorICAgICAgICAgICAgIlwxXHUwMGY1IiwKKyAgICAgICAgICAgICJcMVx1MDBmNiIsCisgICAgICAgICAgICAiXDFcdTAwZjciLAorICAgICAgICAgICAgIlwxXHUwMGY4IiwKKyAgICAgICAgICAgICJcMVx1MDBmOSIsCisgICAgICAgICAgICAiXDFcdTAwZmEiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAwZmIiLAorICAgICAgICAgICAgIlwxXHUwMGZjIiwKKyAgICAgICAgICAgICJcMVwxMzBcMTNcdWZmZmZcMTJcMTMwXDdcdWZmZmZcMzJcMTMwXDRcdWZmZmZcMVwxMzBcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMCIsCisgICAgICAgICAgICAiXDFcdTAwZmUiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDBmZiIsCisgICAgICAgICAgICAiXDFcMTMwXDEzXHVmZmZmXDEyXDEzMFw3XHVmZmZmXDMyXDEzMFw0XHVmZmZmXDFcMTMwXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzAiLAorICAgICAgICAgICAgIlwxXHUwMTAxIiwKKyAgICAgICAgICAgICJcMVwxMzBcMTNcdWZmZmZcMTJcMTMwXDdcdWZmZmZcMzJcMTMwXDRcdWZmZmZcMVwxMzBcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMCIsCisgICAgICAgICAgICAiXDFcdTAxMDMiLAorICAgICAgICAgICAgIlwxXHUwMTA0IiwKKyAgICAgICAgICAgICJcMVx1MDEwNSIsCisgICAgICAgICAgICAiXDFcdTAxMDYiLAorICAgICAgICAgICAgIlwxXHUwMTA3IiwKKyAgICAgICAgICAgICJcMVx1MDEwOCIsCisgICAgICAgICAgICAiXDFcdTAxMDkiLAorICAgICAgICAgICAgIlwxXHUwMTBhIiwKKyAgICAgICAgICAgICJcMVx1MDEwYiIsCisgICAgICAgICAgICAiXDFcdTAxMGMiLAorICAgICAgICAgICAgIlwxXHUwMTBkIiwKKyAgICAgICAgICAgICJcMVx1MDEwZSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDEwZiIsCisgICAgICAgICAgICAiXDFcdTAxMTAiLAorICAgICAgICAgICAgIlwxXHUwMTExIiwKKyAgICAgICAgICAgICJcMVwxMzBcMTNcdWZmZmZcMTJcMTMwXDdcdWZmZmZcMjJcMTMwXDFcdTAxMTJcN1wxMzBcNFx1ZmZmZiIrCisgICAgICAgICAgICAiXDFcMTMwXDFcdWZmZmZcMzJcMTMwIiwKKyAgICAgICAgICAgICJcMVx1MDExNCIsCisgICAgICAgICAgICAiXDFcdTAxMTUiLAorICAgICAgICAgICAgIlwxXHUwMTE2IiwKKyAgICAgICAgICAgICJcMVx1MDExNyIsCisgICAgICAgICAgICAiXDFcdTAxMTgiLAorICAgICAgICAgICAgIlwxXHUwMTE5IiwKKyAgICAgICAgICAgICJcMVx1MDExYSIsCisgICAgICAgICAgICAiXDFcdTAxMWIiLAorICAgICAgICAgICAgIlwxXHUwMTFjIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDEzMFwxM1x1ZmZmZlwxMlwxMzBcN1x1ZmZmZlwzMlwxMzBcNFx1ZmZmZlwxXDEzMFwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMwIiwKKyAgICAgICAgICAgICJcMVx1MDExZSIsCisgICAgICAgICAgICAiXDFcdTAxMWYiLAorICAgICAgICAgICAgIlwxXDEzMFwxM1x1ZmZmZlwxMlwxMzBcN1x1ZmZmZlwzMlwxMzBcNFx1ZmZmZlwxXDEzMFwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMwIiwKKyAgICAgICAgICAgICJcMVx1MDEyMSIsCisgICAgICAgICAgICAiXDFcMTMwXDEzXHVmZmZmXDEyXDEzMFw3XHVmZmZmXDMyXDEzMFw0XHVmZmZmXDFcMTMwXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzAiLAorICAgICAgICAgICAgIlwxXHUwMTIzIiwKKyAgICAgICAgICAgICJcMVx1MDEyNCIsCisgICAgICAgICAgICAiXDFcdTAxMjUiLAorICAgICAgICAgICAgIlwxXHUwMTI2IiwKKyAgICAgICAgICAgICJcMVx1MDEyNyIsCisgICAgICAgICAgICAiXDFcdTAxMjgiLAorICAgICAgICAgICAgIlwxXDEzMFwxM1x1ZmZmZlwxMlwxMzBcN1x1ZmZmZlwzMlwxMzBcNFx1ZmZmZlwxXDEzMFwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMwIiwKKyAgICAgICAgICAgICJcMVx1MDEyYSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMzBcMTNcdWZmZmZcMTJcMTMwXDdcdWZmZmZcMzJcMTMwXDRcdWZmZmZcMVwxMzBcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMCIsCisgICAgICAgICAgICAiXDFcdTAxMmMiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxMmRcMTZcdWZmZmZcMVx1MDEyZSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDEyZiIsCisgICAgICAgICAgICAiXDFcMTMwXDEzXHVmZmZmXDEyXDEzMFw3XHVmZmZmXDMyXDEzMFw0XHVmZmZmXDFcMTMwXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzAiLAorICAgICAgICAgICAgIlwxXHUwMTMxIiwKKyAgICAgICAgICAgICJcMVx1MDEzMiIsCisgICAgICAgICAgICAiXDFcdTAxMzMiLAorICAgICAgICAgICAgIlwxXHUwMTM0IiwKKyAgICAgICAgICAgICJcMVx1MDEzNSIsCisgICAgICAgICAgICAiXDFcdTAxMzYiLAorICAgICAgICAgICAgIlwxXHUwMTM3IiwKKyAgICAgICAgICAgICJcMVx1MDEzOCIsCisgICAgICAgICAgICAiXDFcdTAxMzkiLAorICAgICAgICAgICAgIlwxXDEzMFwxM1x1ZmZmZlwxMlwxMzBcN1x1ZmZmZlwzMlwxMzBcNFx1ZmZmZlwxXDEzMFwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMwIiwKKyAgICAgICAgICAgICJcMVx1MDEzYiIsCisgICAgICAgICAgICAiXDFcdTAxM2MiLAorICAgICAgICAgICAgIlwxXHUwMTNkIiwKKyAgICAgICAgICAgICJcMVx1MDEzZSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDEzZiIsCisgICAgICAgICAgICAiXDFcdTAxNDAiLAorICAgICAgICAgICAgIlwxXHUwMTQxIiwKKyAgICAgICAgICAgICJcMVx1MDE0MiIsCisgICAgICAgICAgICAiXDFcdTAxNDMiLAorICAgICAgICAgICAgIlwxXHUwMTQ0IiwKKyAgICAgICAgICAgICJcMVwxMzBcMTNcdWZmZmZcMTJcMTMwXDdcdWZmZmZcMzJcMTMwXDRcdWZmZmZcMVwxMzBcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMCIsCisgICAgICAgICAgICAiXDFcdTAxNDYiLAorICAgICAgICAgICAgIlwxXDEzMFwxM1x1ZmZmZlwxMlwxMzBcN1x1ZmZmZlwzMlwxMzBcNFx1ZmZmZlwxXDEzMFwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMwIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMTQ4IiwKKyAgICAgICAgICAgICJcMVx1MDE0OSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMzBcMTNcdWZmZmZcMTJcMTMwXDdcdWZmZmZcMzJcMTMwXDRcdWZmZmZcMVwxMzBcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMzBcMTNcdWZmZmZcMTJcMTMwXDdcdWZmZmZcMzJcMTMwXDRcdWZmZmZcMVwxMzBcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMCIsCisgICAgICAgICAgICAiXDFcdTAxNGMiLAorICAgICAgICAgICAgIlwxXHUwMTRkIiwKKyAgICAgICAgICAgICJcMVx1MDE0ZSIsCisgICAgICAgICAgICAiXDFcdTAxNGYiLAorICAgICAgICAgICAgIlwxXHUwMTUwIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDEzMFwxM1x1ZmZmZlwxMlwxMzBcN1x1ZmZmZlwzMlwxMzBcNFx1ZmZmZlwxXDEzMFwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMwIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMTUyIiwKKyAgICAgICAgICAgICJcMVx1MDE1MyIsCisgICAgICAgICAgICAiXDFcdTAxNTQiLAorICAgICAgICAgICAgIlwxXDEzMFwxM1x1ZmZmZlwxMlwxMzBcN1x1ZmZmZlwzMlwxMzBcNFx1ZmZmZlwxXDEzMFwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMwIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMTU2IiwKKyAgICAgICAgICAgICJcMVwxMzBcMTNcdWZmZmZcMTJcMTMwXDdcdWZmZmZcMzJcMTMwXDRcdWZmZmZcMVwxMzBcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDRcMTMwXDFcdTAxNTdcMjVcMTMwIiwKKyAgICAgICAgICAgICJcMVx1MDE1OSIsCisgICAgICAgICAgICAiXDFcMTMwXDEzXHVmZmZmXDEyXDEzMFw3XHVmZmZmXDMyXDEzMFw0XHVmZmZmXDFcMTMwXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzAiLAorICAgICAgICAgICAgIlwxXHUwMTViIiwKKyAgICAgICAgICAgICJcMVwxMzBcMTNcdWZmZmZcMTJcMTMwXDdcdWZmZmZcMzJcMTMwXDRcdWZmZmZcMVwxMzBcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMCIsCisgICAgICAgICAgICAiXDFcdTAxNWQiLAorICAgICAgICAgICAgIlwxXHUwMTVlIiwKKyAgICAgICAgICAgICJcMVx1MDE1ZiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDE2MCIsCisgICAgICAgICAgICAiXDFcdTAxNjEiLAorICAgICAgICAgICAgIlwxXHUwMTYyIiwKKyAgICAgICAgICAgICJcMVx1MDE2MyIsCisgICAgICAgICAgICAiXDFcdTAxNjQiLAorICAgICAgICAgICAgIlwxXHUwMTY1IiwKKyAgICAgICAgICAgICJcMVx1MDE2NiIsCisgICAgICAgICAgICAiXDFcdTAxNjciLAorICAgICAgICAgICAgIlwxXHUwMTY4IiwKKyAgICAgICAgICAgICJcMVx1MDE2OSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMzBcMTNcdWZmZmZcMTJcMTMwXDdcdWZmZmZcMzJcMTMwXDRcdWZmZmZcMVwxMzBcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDE2YiIsCisgICAgICAgICAgICAiXDFcdTAxNmMiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMzBcMTNcdWZmZmZcMTJcMTMwXDdcdWZmZmZcMzJcMTMwXDRcdWZmZmZcMVwxMzBcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMCIsCisgICAgICAgICAgICAiXDFcMTMwXDEzXHVmZmZmXDEyXDEzMFw3XHVmZmZmXDMyXDEzMFw0XHVmZmZmXDFcMTMwXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzAiLAorICAgICAgICAgICAgIlwxXDEzMFwxM1x1ZmZmZlwxMlwxMzBcN1x1ZmZmZlwzMlwxMzBcNFx1ZmZmZlwxXDEzMFwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMwIiwKKyAgICAgICAgICAgICJcMVx1MDE3MCIsCisgICAgICAgICAgICAiXDFcdTAxNzEiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxNzIiLAorICAgICAgICAgICAgIlwxXDEzMFwxM1x1ZmZmZlwxMlwxMzBcN1x1ZmZmZlwzMlwxMzBcNFx1ZmZmZlwxXDEzMFwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMwIiwKKyAgICAgICAgICAgICJcMVx1MDE3NCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDE3NSIsCisgICAgICAgICAgICAiXDFcdTAxNzYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxNzciLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxNzgiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTMwXDEzXHVmZmZmXDEyXDEzMFw3XHVmZmZmXDMyXDEzMFw0XHVmZmZmXDFcMTMwXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzAiLAorICAgICAgICAgICAgIlwxXHUwMTdhIiwKKyAgICAgICAgICAgICJcMVx1MDE3YiIsCisgICAgICAgICAgICAiXDFcMTMwXDEzXHVmZmZmXDEyXDEzMFw3XHVmZmZmXDMyXDEzMFw0XHVmZmZmXDFcMTMwXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzAiLAorICAgICAgICAgICAgIlwxXHUwMTdkIiwKKyAgICAgICAgICAgICJcMVwxMzBcMTNcdWZmZmZcMTJcMTMwXDdcdWZmZmZcMzJcMTMwXDRcdWZmZmZcMVwxMzBcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMCIsCisgICAgICAgICAgICAiXDFcdTAxN2YiLAorICAgICAgICAgICAgIlwxXHUwMTgwIiwKKyAgICAgICAgICAgICJcMVwxMzBcMTNcdWZmZmZcMTJcMTMwXDdcdWZmZmZcMzJcMTMwXDRcdWZmZmZcMVwxMzBcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMCIsCisgICAgICAgICAgICAiXDFcdTAxODIiLAorICAgICAgICAgICAgIlwxXHUwMTgzIiwKKyAgICAgICAgICAgICJcMVwxMzBcMTNcdWZmZmZcMTJcMTMwXDdcdWZmZmZcMzJcMTMwXDRcdWZmZmZcMVwxMzBcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMCIsCisgICAgICAgICAgICAiXDFcdTAxODUiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxODYiLAorICAgICAgICAgICAgIlwxXHUwMTg3IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMzBcMTNcdWZmZmZcMTJcMTMwXDdcdWZmZmZcMzJcMTMwXDRcdWZmZmZcMVwxMzBcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMCIsCisgICAgICAgICAgICAiXDFcdTAxODkiLAorICAgICAgICAgICAgIlwxXDEzMFwxM1x1ZmZmZlwxMlwxMzBcN1x1ZmZmZlwzMlwxMzBcNFx1ZmZmZlwxXDEzMFwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMwIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMThiIiwKKyAgICAgICAgICAgICJcMVx1MDE4YyIsCisgICAgICAgICAgICAiXDFcdTAxOGQiLAorICAgICAgICAgICAgIlwxXHUwMThlIiwKKyAgICAgICAgICAgICJcMVx1MDE4ZiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDE5MCIsCisgICAgICAgICAgICAiXDFcdTAxOTEiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxOTIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxOTMiLAorICAgICAgICAgICAgIlwxXHUwMTk0IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDEzMFwxM1x1ZmZmZlwxMlwxMzBcN1x1ZmZmZlwzMlwxMzBcNFx1ZmZmZlwxXDEzMFwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMwIiwKKyAgICAgICAgICAgICJcMVx1MDE5NiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMzBcMTNcdWZmZmZcMTJcMTMwXDdcdWZmZmZcMzJcMTMwXDRcdWZmZmZcMVwxMzBcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMCIsCisgICAgICAgICAgICAiXDFcdTAxOTgiLAorICAgICAgICAgICAgIlwxXHUwMTk5IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMTlhIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDEzMFwxM1x1ZmZmZlwxMlwxMzBcN1x1ZmZmZlwzMlwxMzBcNFx1ZmZmZlwxXDEzMFwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMwIiwKKyAgICAgICAgICAgICJcMVx1MDE5YyIsCisgICAgICAgICAgICAiXDFcdTAxOWQiLAorICAgICAgICAgICAgIlwxXHUwMTllIiwKKyAgICAgICAgICAgICJcMVx1MDE5ZiIsCisgICAgICAgICAgICAiXDFcdTAxYTAiLAorICAgICAgICAgICAgIlwxXHUwMWExIiwKKyAgICAgICAgICAgICJcMVx1MDFhMiIsCisgICAgICAgICAgICAiXDFcMTMwXDEzXHVmZmZmXDEyXDEzMFw3XHVmZmZmXDMyXDEzMFw0XHVmZmZmXDFcMTMwXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzAiLAorICAgICAgICAgICAgIlwxXHUwMWE0IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMWE1IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMWE2IiwKKyAgICAgICAgICAgICJcMVx1MDFhNyIsCisgICAgICAgICAgICAiXDFcdTAxYTgiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxYTkiLAorICAgICAgICAgICAgIlwxXHUwMWFhIiwKKyAgICAgICAgICAgICJcMVx1MDFhYiIsCisgICAgICAgICAgICAiXDFcdTAxYWMiLAorICAgICAgICAgICAgIlwxXDEzMFwxM1x1ZmZmZlwxMlwxMzBcN1x1ZmZmZlwzMlwxMzBcNFx1ZmZmZlwxXDEzMFwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMwIiwKKyAgICAgICAgICAgICJcMVwxMzBcMTNcdWZmZmZcMTJcMTMwXDdcdWZmZmZcMzJcMTMwXDRcdWZmZmZcMVwxMzBcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMCIsCisgICAgICAgICAgICAiXDFcMTMwXDEzXHVmZmZmXDEyXDEzMFw3XHVmZmZmXDMyXDEzMFw0XHVmZmZmXDFcMTMwXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzAiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxYjAiLAorICAgICAgICAgICAgIlwxXHUwMWIxIiwKKyAgICAgICAgICAgICJcMVx1MDFiMiIsCisgICAgICAgICAgICAiXDFcMTMwXDEzXHVmZmZmXDEyXDEzMFw3XHVmZmZmXDMyXDEzMFw0XHVmZmZmXDFcMTMwXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzAiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxYjQiLAorICAgICAgICAgICAgIlwxXHUwMWI1IiwKKyAgICAgICAgICAgICJcMVwxMzBcMTNcdWZmZmZcMTJcMTMwXDdcdWZmZmZcMzJcMTMwXDRcdWZmZmZcMVwxMzBcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMCIsCisgICAgICAgICAgICAiXDFcdTAxYjciLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDEzMFwxM1x1ZmZmZlwxMlwxMzBcN1x1ZmZmZlwzMlwxMzBcNFx1ZmZmZlwxXDEzMFwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMwIiwKKyAgICAgICAgICAgICJcMVx1MDFiOSIsCisgICAgICAgICAgICAiXDFcMTMwXDEzXHVmZmZmXDEyXDEzMFw3XHVmZmZmXDMyXDEzMFw0XHVmZmZmXDFcMTMwXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzAiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxYmIiLAorICAgICAgICAgICAgIlwxXHUwMWJjIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDEzMFwxM1x1ZmZmZlwxMlwxMzBcN1x1ZmZmZlwzMlwxMzBcNFx1ZmZmZlwxXDEzMFwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMwIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMWJlIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDEzMFwxM1x1ZmZmZlwxMlwxMzBcN1x1ZmZmZlwzMlwxMzBcNFx1ZmZmZlwxXDEzMFwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMwIiwKKyAgICAgICAgICAgICJcMVx1MDFjMCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMzBcMTNcdWZmZmZcMTJcMTMwXDdcdWZmZmZcMzJcMTMwXDRcdWZmZmZcMVwxMzBcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDFjMiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMzBcMTNcdWZmZmZcMTJcMTMwXDdcdWZmZmZcMzJcMTMwXDRcdWZmZmZcMVwxMzBcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMCIsCisgICAgICAgICAgICAiIgorICAgIH07CisKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyMV9lb3QgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyMV9lb3RTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyMV9lb2YgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyMV9lb2ZTKTsKKyAgICBzdGF0aWMgZmluYWwgY2hhcltdIERGQTIxX21pbiA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTIxX21pblMpOworICAgIHN0YXRpYyBmaW5hbCBjaGFyW10gREZBMjFfbWF4ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmdUb1Vuc2lnbmVkQ2hhcnMoREZBMjFfbWF4Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMjFfYWNjZXB0ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMjFfYWNjZXB0Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMjFfc3BlY2lhbCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIxX3NwZWNpYWxTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXVtdIERGQTIxX3RyYW5zaXRpb247CisKKyAgICBzdGF0aWMgeworICAgICAgICBpbnQgbnVtU3RhdGVzID0gREZBMjFfdHJhbnNpdGlvblMubGVuZ3RoOworICAgICAgICBERkEyMV90cmFuc2l0aW9uID0gbmV3IHNob3J0W251bVN0YXRlc11bXTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPG51bVN0YXRlczsgaSsrKSB7CisgICAgICAgICAgICBERkEyMV90cmFuc2l0aW9uW2ldID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMjFfdHJhbnNpdGlvblNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgREZBMjEgZXh0ZW5kcyBERkEgeworCisgICAgICAgIHB1YmxpYyBERkEyMShCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CisgICAgICAgICAgICB0aGlzLnJlY29nbml6ZXIgPSByZWNvZ25pemVyOworICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDIxOworICAgICAgICAgICAgdGhpcy5lb3QgPSBERkEyMV9lb3Q7CisgICAgICAgICAgICB0aGlzLmVvZiA9IERGQTIxX2VvZjsKKyAgICAgICAgICAgIHRoaXMubWluID0gREZBMjFfbWluOworICAgICAgICAgICAgdGhpcy5tYXggPSBERkEyMV9tYXg7CisgICAgICAgICAgICB0aGlzLmFjY2VwdCA9IERGQTIxX2FjY2VwdDsKKyAgICAgICAgICAgIHRoaXMuc3BlY2lhbCA9IERGQTIxX3NwZWNpYWw7CisgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBERkEyMV90cmFuc2l0aW9uOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gIjE6MTogVG9rZW5zIDogKCBUX18xMyB8IFRfXzE0IHwgVF9fMTUgfCBUX18xNiB8IFRfXzE3IHwgVF9fMTggfCBUX18xOSB8IFRfXzIwIHwgVF9fMjEgfCBUX18yMiB8IFRfXzIzIHwgVF9fMjQgfCBUX18yNSB8IFRfXzI2IHwgVF9fMjcgfCBUX18yOCB8IFRfXzI5IHwgVF9fMzAgfCBUX18zMSB8IFRfXzMyIHwgVF9fMzMgfCBUX18zNCB8IFRfXzM1IHwgVF9fMzYgfCBUX18zNyB8IFRfXzM4IHwgVF9fMzkgfCBUX180MCB8IFRfXzQxIHwgVF9fNDIgfCBUX180MyB8IFRfXzQ0IHwgVF9fNDUgfCBUX180NiB8IFRfXzQ3IHwgVF9fNDggfCBUX180OSB8IFRfXzUwIHwgVF9fNTEgfCBUX181MiB8IFRfXzUzIHwgVF9fNTQgfCBUX181NSB8IFRfXzU2IHwgVF9fNTcgfCBUX181OCB8IFRfXzU5IHwgVF9fNjAgfCBUX182MSB8IFRfXzYyIHwgVF9fNjMgfCBUX182NCB8IFRfXzY1IHwgVF9fNjYgfCBUX182NyB8IFRfXzY4IHwgVF9fNjkgfCBUX183MCB8IFRfXzcxIHwgVF9fNzIgfCBUX183MyB8IFRfXzc0IHwgVF9fNzUgfCBUX183NiB8IFRfXzc3IHwgVF9fNzggfCBUX183OSB8IFRfXzgwIHwgVF9fODEgfCBUX184MiB8IFRfXzgzIHwgVF9fODQgfCBUX184NSB8IFRfXzg2IHwgVF9fODcgfCBUX184OCB8IFRfXzg5IHwgVF9fOTAgfCBUX185MSB8IFRfXzkyIHwgVF9fOTMgfCBUX185NCB8IFRfXzk1IHwgVF9fOTYgfCBUX185NyB8IFRfXzk4IHwgVF9fOTkgfCBUX18xMDAgfCBUX18xMDEgfCBUX18xMDIgfCBUX18xMDMgfCBUX18xMDQgfCBUX18xMDUgfCBUX18xMDYgfCBUX18xMDcgfCBUX18xMDggfCBUX18xMDkgfCBUX18xMTAgfCBUX18xMTEgfCBUX18xMTIgfCBUX18xMTMgfCBUX18xMTQgfCBSVUxFX0hFWCB8IFJVTEVfSU5UIHwgUlVMRV9ERUNJTUFMIHwgUlVMRV9JRCB8IFJVTEVfU1RSSU5HIHwgUlVMRV9NTF9DT01NRU5UIHwgUlVMRV9TTF9DT01NRU5UIHwgUlVMRV9XUyB8IFJVTEVfQU5ZX09USEVSICk7IjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBJbnRTdHJlYW0gaW5wdXQgPSBfaW5wdXQ7CisgICAgICAgIAlpbnQgX3MgPSBzOworICAgICAgICAgICAgc3dpdGNoICggcyApIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwIDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEyMV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBMjFfMD09Jz0nKSApIHtzID0gMTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nfCcpICkge3MgPSAyO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PScmJykgKSB7cyA9IDM7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JysnKSApIHtzID0gNDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nLScpICkge3MgPSA1O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PScqJykgKSB7cyA9IDY7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09Jy8nKSApIHtzID0gNzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nJScpICkge3MgPSA4O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSchJykgKSB7cyA9IDk7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09Jz4nKSApIHtzID0gMTA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JzwnKSApIHtzID0gMTE7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09Jy4nKSApIHtzID0gMTI7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09Jz8nKSApIHtzID0gMTM7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J3YnKSApIHtzID0gMTQ7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2UnKSApIHtzID0gMTU7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J3MnKSApIHtzID0gMTY7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2knKSApIHtzID0gMTc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2YnKSApIHtzID0gMTg7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2gnKSApIHtzID0gMTk7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J3AnKSApIHtzID0gMjA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J3snKSApIHtzID0gMjE7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J30nKSApIHtzID0gMjI7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J3UnKSApIHtzID0gMjM7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2EnKSApIHtzID0gMjQ7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J3QnKSApIHtzID0gMjU7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J28nKSApIHtzID0gMjY7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2cnKSApIHtzID0gMjc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2MnKSApIHtzID0gMjg7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J3InKSApIHtzID0gMjk7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2QnKSApIHtzID0gMzA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2InKSApIHtzID0gMzE7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J0AnKSApIHtzID0gMzI7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JygnKSApIHtzID0gMzM7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JyknKSApIHtzID0gMzQ7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JywnKSApIHtzID0gMzU7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J10nKSApIHtzID0gMzY7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JyMnKSApIHtzID0gMzc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J1snKSApIHtzID0gMzg7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JzsnKSApIHtzID0gMzk7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JzonKSApIHtzID0gNDA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J3cnKSApIHtzID0gNDE7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J24nKSApIHtzID0gNDI7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JzAnKSApIHtzID0gNDM7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKChMQTIxXzA+PScxJyAmJiBMQTIxXzA8PSc5JykpICkge3MgPSA0NDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nXicpICkge3MgPSA0NTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nJCd8fChMQTIxXzA+PSdBJyAmJiBMQTIxXzA8PSdaJyl8fExBMjFfMD09J18nfHwoTEEyMV8wPj0naicgJiYgTEEyMV8wPD0nbScpfHxMQTIxXzA9PSdxJ3x8KExBMjFfMD49J3gnICYmIExBMjFfMDw9J3onKSkgKSB7cyA9IDQ2O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdcIicpICkge3MgPSA0Nzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nXCcnKSApIHtzID0gNDg7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKChMQTIxXzA+PSdcdCcgJiYgTEEyMV8wPD0nXG4nKXx8TEEyMV8wPT0nXHInfHxMQTIxXzA9PScgJykgKSB7cyA9IDQ5O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoTEEyMV8wPj0nXHUwMDAwJyAmJiBMQTIxXzA8PSdcYicpfHwoTEEyMV8wPj0nXHUwMDBCJyAmJiBMQTIxXzA8PSdcZicpfHwoTEEyMV8wPj0nXHUwMDBFJyAmJiBMQTIxXzA8PSdcdTAwMUYnKXx8TEEyMV8wPT0nXFwnfHxMQTIxXzA9PSdgJ3x8KExBMjFfMD49J34nICYmIExBMjFfMDw9J1x1RkZGRicpKSApIHtzID0gNTA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDIxLCBfcywgaW5wdXQpOworICAgICAgICAgICAgZXJyb3IobnZhZSk7CisgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICB9CisgICAgfQorIAorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2xQYXJzZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbFBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMmJmZGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2xQYXJzZXIuamF2YQpAQCAtMCwwICsxLDEwMDE0IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuY29udGVudGFzc2lzdC5hbnRsci5pbnRlcm5hbDsgCisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLio7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmltcGwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLlh0ZXh0VG9rZW5TdHJlYW07CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLlh0ZXh0VG9rZW5TdHJlYW0uSGlkZGVuVG9rZW5zOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LmFudGxyLmludGVybmFsLkFic3RyYWN0SW50ZXJuYWxDb250ZW50QXNzaXN0UGFyc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LmFudGxyLmludGVybmFsLkRGQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnNlcnZpY2VzLlBlcnNwZWN0aXZlRHNsR3JhbW1hckFjY2VzczsKKworCisKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS4qOworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBJbnRlcm5hbFBlcnNwZWN0aXZlRHNsUGFyc2VyIGV4dGVuZHMgQWJzdHJhY3RJbnRlcm5hbENvbnRlbnRBc3Npc3RQYXJzZXIgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gdG9rZW5OYW1lcyA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICI8aW52YWxpZD4iLCAiPEVPUj4iLCAiPERPV04+IiwgIjxVUD4iLCAiUlVMRV9JRCIsICJSVUxFX1NUUklORyIsICJSVUxFX0hFWCIsICJSVUxFX0lOVCIsICJSVUxFX0RFQ0lNQUwiLCAiUlVMRV9NTF9DT01NRU5UIiwgIlJVTEVfU0xfQ09NTUVOVCIsICJSVUxFX1dTIiwgIlJVTEVfQU5ZX09USEVSIiwgIic9JyIsICInfHwnIiwgIicmJiciLCAiJys9JyIsICInLT0nIiwgIicqPSciLCAiJy89JyIsICInJT0nIiwgIic9PSciLCAiJyE9JyIsICInPT09JyIsICInIT09JyIsICInPj0nIiwgIic+JyIsICInPCciLCAiJy0+JyIsICInLi48JyIsICInLi4nIiwgIic9PiciLCAiJzw+JyIsICInPzonIiwgIicrJyIsICInLSciLCAiJyonIiwgIicqKiciLCAiJy8nIiwgIiclJyIsICInISciLCAiJysrJyIsICInLS0nIiwgIicuJyIsICIndmFsJyIsICInZXh0ZW5kcyciLCAiJ3N0YXRpYyciLCAiJ2ltcG9ydCciLCAiJ2V4dGVuc2lvbiciLCAiJ3N1cGVyJyIsICInZmFsc2UnIiwgIidob3Jpem9udGFsJyIsICIndmVydGljYWwnIiwgIidwYWNrYWdlJyIsICIneyciLCAiJ30nIiwgIidwZXJzcGVjdGl2ZSciLCAiJ3Byb2Nlc3MnIiwgIid1c2VydGFzayciLCAiJ2ljb25VUkknIiwgIidhY2Nlc3NpYmlsaXR5JyIsICIndG9vbGJhciciLCAiJ3Nhc2hDb250YWluZXInIiwgIidvcmllbnRhdGlvbiciLCAiJ3NlbGVjdGVkRWxlbWVudCciLCAiJ3NwYWNlVm9sdW1lJyIsICIncGFydFN0YWNrJyIsICIncGFydCciLCAiJ3ZpZXcnIiwgIidzZWxlY3QnIiwgIid0YWJsZSciLCAiJ2dyaWQnIiwgIidjaGFydCciLCAiJ3JlcG9ydCciLCAiJ29yZ2FuaWdyYW0nIiwgIid0b3BvbG9neSciLCAiJ2RpYWxvZyciLCAiJ2JwbW4nIiwgIidAJyIsICInKCciLCAiJyknIiwgIicsJyIsICInXSciLCAiJyMnIiwgIidbJyIsICInaW5zdGFuY2VvZiciLCAiJ2FzJyIsICInOyciLCAiJ2lmJyIsICInZWxzZSciLCAiJ3N3aXRjaCciLCAiJzonIiwgIidkZWZhdWx0JyIsICInY2FzZSciLCAiJ2ZvciciLCAiJ3doaWxlJyIsICInZG8nIiwgIiduZXcnIiwgIidudWxsJyIsICIndHlwZW9mJyIsICIndGhyb3cnIiwgIidyZXR1cm4nIiwgIid0cnknIiwgIidmaW5hbGx5JyIsICInc3luY2hyb25pemVkJyIsICInY2F0Y2gnIiwgIic/JyIsICInJiciLCAiJ2Rlc2NyaWJlZCBieSciLCAiJ2lzQ2xvc2FibGUnIiwgIic6OiciLCAiJz8uJyIsICInfCciLCAiJ3ZhciciLCAiJ3RydWUnIgorICAgIH07CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9IRVg9NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181MD01MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181OT01OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181NT01NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181Nj01NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181Nz01NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181OD01ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181MT01MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181Mj01MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181Mz01MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181ND01NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182MD02MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182MT02MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX0lEPTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9JTlQ9NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182Nj02NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX01MX0NPTU1FTlQ9OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182Nz02NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182OD02ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182OT02OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182Mj02MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182Mz02MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182ND02NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182NT02NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zNz0zNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zOD0zODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zOT0zOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zMz0zMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zND0zNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zNT0zNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zNj0zNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zMD0zMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zMT0zMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zMj0zMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180OD00ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180OT00OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180ND00NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180NT00NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180Nj00NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180Nz00NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180MD00MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180MT00MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180Mj00MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180Mz00MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185MT05MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDA9MTAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzkyPTkyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzkzPTkzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwMj0xMDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTQ9OTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTAxPTEwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185MD05MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xOT0xOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNT0xNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNj0xNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNz0xNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xOD0xODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185OT05OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMz0xMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xND0xNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185NT05NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185Nj05NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185Nz05NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185OD05ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX0RFQ0lNQUw9ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNj0yNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNz0yNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yOD0yODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yOT0yOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMj0yMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMz0yMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yND0yNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNT0yNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMD0yMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMT0yMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183MD03MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183MT03MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183Mj03MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX1NUUklORz01OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfU0xfQ09NTUVOVD0xMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183Nz03NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183OD03ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183OT03OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183Mz03MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFT0Y9LTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzQ9NzQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTE0PTExNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183NT03NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183Nj03NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184MD04MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMTE9MTExOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzgxPTgxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExMD0xMTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODI9ODI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTEzPTExMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184Mz04MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMTI9MTEyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfV1M9MTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9BTllfT1RIRVI9MTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODg9ODg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTA4PTEwODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184OT04OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDc9MTA3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwOT0xMDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODQ9ODQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTA0PTEwNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184NT04NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDM9MTAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzg2PTg2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwNj0xMDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODc9ODc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTA1PTEwNTsKKworICAgIC8vIGRlbGVnYXRlcworICAgIC8vIGRlbGVnYXRvcnMKKworCisgICAgICAgIHB1YmxpYyBJbnRlcm5hbFBlcnNwZWN0aXZlRHNsUGFyc2VyKFRva2VuU3RyZWFtIGlucHV0KSB7CisgICAgICAgICAgICB0aGlzKGlucHV0LCBuZXcgUmVjb2duaXplclNoYXJlZFN0YXRlKCkpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBJbnRlcm5hbFBlcnNwZWN0aXZlRHNsUGFyc2VyKFRva2VuU3RyZWFtIGlucHV0LCBSZWNvZ25pemVyU2hhcmVkU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyKGlucHV0LCBzdGF0ZSk7CisgICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgCisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VG9rZW5OYW1lcygpIHsgcmV0dXJuIEludGVybmFsUGVyc3BlY3RpdmVEc2xQYXJzZXIudG9rZW5OYW1lczsgfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0R3JhbW1hckZpbGVOYW1lKCkgeyByZXR1cm4gIi4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nIjsgfQorCisKKyAgICAgCisgICAgIAlwcml2YXRlIFBlcnNwZWN0aXZlRHNsR3JhbW1hckFjY2VzcyBncmFtbWFyQWNjZXNzOworICAgICAJCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEdyYW1tYXJBY2Nlc3MoUGVyc3BlY3RpdmVEc2xHcmFtbWFyQWNjZXNzIGdyYW1tYXJBY2Nlc3MpIHsKKyAgICAgICAgCXRoaXMuZ3JhbW1hckFjY2VzcyA9IGdyYW1tYXJBY2Nlc3M7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgR3JhbW1hciBnZXRHcmFtbWFyKCkgeworICAgICAgICAJcmV0dXJuIGdyYW1tYXJBY2Nlc3MuZ2V0R3JhbW1hcigpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZUZvclRva2VuTmFtZShTdHJpbmcgdG9rZW5OYW1lKSB7CisgICAgICAgIAlyZXR1cm4gdG9rZW5OYW1lOworICAgICAgICB9CisKKworCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVBlcnNwZWN0aXZlTW9kZWwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjE6MTogZW50cnlSdWxlUGVyc3BlY3RpdmVNb2RlbCA6IHJ1bGVQZXJzcGVjdGl2ZU1vZGVsIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlUGVyc3BlY3RpdmVNb2RlbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo2MjoxOiAoIHJ1bGVQZXJzcGVjdGl2ZU1vZGVsIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo2MzoxOiBydWxlUGVyc3BlY3RpdmVNb2RlbCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVNb2RlbFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVBlcnNwZWN0aXZlTW9kZWxfaW5fZW50cnlSdWxlUGVyc3BlY3RpdmVNb2RlbDY3KTsKKyAgICAgICAgICAgIHJ1bGVQZXJzcGVjdGl2ZU1vZGVsKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVNb2RlbFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlUGVyc3BlY3RpdmVNb2RlbDc0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVQZXJzcGVjdGl2ZU1vZGVsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVQZXJzcGVjdGl2ZU1vZGVsIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjcwOjE6IHJ1bGVQZXJzcGVjdGl2ZU1vZGVsIDogKCAoIHJ1bGVfX1BlcnNwZWN0aXZlTW9kZWxfX1BhY2thZ2VzQXNzaWdubWVudCApKiApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlUGVyc3BlY3RpdmVNb2RlbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo3NDoyOiAoICggKCBydWxlX19QZXJzcGVjdGl2ZU1vZGVsX19QYWNrYWdlc0Fzc2lnbm1lbnQgKSogKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo3NToxOiAoICggcnVsZV9fUGVyc3BlY3RpdmVNb2RlbF9fUGFja2FnZXNBc3NpZ25tZW50ICkqICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjc1OjE6ICggKCBydWxlX19QZXJzcGVjdGl2ZU1vZGVsX19QYWNrYWdlc0Fzc2lnbm1lbnQgKSogKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NzY6MTogKCBydWxlX19QZXJzcGVjdGl2ZU1vZGVsX19QYWNrYWdlc0Fzc2lnbm1lbnQgKSoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVNb2RlbEFjY2VzcygpLmdldFBhY2thZ2VzQXNzaWdubWVudCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo3NzoxOiAoIHJ1bGVfX1BlcnNwZWN0aXZlTW9kZWxfX1BhY2thZ2VzQXNzaWdubWVudCApKgorICAgICAgICAgICAgbG9vcDE6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDE9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgIGlmICggKExBMV8wPT01MykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDE9MTsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MSkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjc3OjI6IHJ1bGVfX1BlcnNwZWN0aXZlTW9kZWxfX1BhY2thZ2VzQXNzaWdubWVudAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1BlcnNwZWN0aXZlTW9kZWxfX1BhY2thZ2VzQXNzaWdubWVudF9pbl9ydWxlUGVyc3BlY3RpdmVNb2RlbDEwMCk7CisgICAgICAgICAgICAJICAgIHJ1bGVfX1BlcnNwZWN0aXZlTW9kZWxfX1BhY2thZ2VzQXNzaWdubWVudCgpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVNb2RlbEFjY2VzcygpLmdldFBhY2thZ2VzQXNzaWdubWVudCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVBlcnNwZWN0aXZlTW9kZWwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlUGVyc3BlY3RpdmVQYWNrYWdlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjg5OjE6IGVudHJ5UnVsZVBlcnNwZWN0aXZlUGFja2FnZSA6IHJ1bGVQZXJzcGVjdGl2ZVBhY2thZ2UgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVQZXJzcGVjdGl2ZVBhY2thZ2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6OTA6MTogKCBydWxlUGVyc3BlY3RpdmVQYWNrYWdlIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo5MToxOiBydWxlUGVyc3BlY3RpdmVQYWNrYWdlIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhY2thZ2VSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVQZXJzcGVjdGl2ZVBhY2thZ2VfaW5fZW50cnlSdWxlUGVyc3BlY3RpdmVQYWNrYWdlMTI4KTsKKyAgICAgICAgICAgIHJ1bGVQZXJzcGVjdGl2ZVBhY2thZ2UoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhY2thZ2VSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVBlcnNwZWN0aXZlUGFja2FnZTEzNSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlUGVyc3BlY3RpdmVQYWNrYWdlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVQZXJzcGVjdGl2ZVBhY2thZ2UiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6OTg6MTogcnVsZVBlcnNwZWN0aXZlUGFja2FnZSA6ICggKCBydWxlX19QZXJzcGVjdGl2ZVBhY2thZ2VfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVBlcnNwZWN0aXZlUGFja2FnZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDI6MjogKCAoICggcnVsZV9fUGVyc3BlY3RpdmVQYWNrYWdlX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTAzOjE6ICggKCBydWxlX19QZXJzcGVjdGl2ZVBhY2thZ2VfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTAzOjE6ICggKCBydWxlX19QZXJzcGVjdGl2ZVBhY2thZ2VfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTA0OjE6ICggcnVsZV9fUGVyc3BlY3RpdmVQYWNrYWdlX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFja2FnZUFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwNToxOiAoIHJ1bGVfX1BlcnNwZWN0aXZlUGFja2FnZV9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTA1OjI6IHJ1bGVfX1BlcnNwZWN0aXZlUGFja2FnZV9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1BlcnNwZWN0aXZlUGFja2FnZV9fR3JvdXBfXzBfaW5fcnVsZVBlcnNwZWN0aXZlUGFja2FnZTE2MSk7CisgICAgICAgICAgICBydWxlX19QZXJzcGVjdGl2ZVBhY2thZ2VfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFja2FnZUFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlUGVyc3BlY3RpdmVQYWNrYWdlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVBlcnNwZWN0aXZlSW1wb3J0IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjExNzoxOiBlbnRyeVJ1bGVQZXJzcGVjdGl2ZUltcG9ydCA6IHJ1bGVQZXJzcGVjdGl2ZUltcG9ydCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVBlcnNwZWN0aXZlSW1wb3J0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjExODoxOiAoIHJ1bGVQZXJzcGVjdGl2ZUltcG9ydCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTE5OjE6IHJ1bGVQZXJzcGVjdGl2ZUltcG9ydCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVJbXBvcnRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVQZXJzcGVjdGl2ZUltcG9ydF9pbl9lbnRyeVJ1bGVQZXJzcGVjdGl2ZUltcG9ydDE4OCk7CisgICAgICAgICAgICBydWxlUGVyc3BlY3RpdmVJbXBvcnQoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUltcG9ydFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlUGVyc3BlY3RpdmVJbXBvcnQxOTUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVBlcnNwZWN0aXZlSW1wb3J0IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVQZXJzcGVjdGl2ZUltcG9ydCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMjY6MTogcnVsZVBlcnNwZWN0aXZlSW1wb3J0IDogKCAoIHJ1bGVfX1BlcnNwZWN0aXZlSW1wb3J0X19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVQZXJzcGVjdGl2ZUltcG9ydCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMzA6MjogKCAoICggcnVsZV9fUGVyc3BlY3RpdmVJbXBvcnRfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMzE6MTogKCAoIHJ1bGVfX1BlcnNwZWN0aXZlSW1wb3J0X19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEzMToxOiAoICggcnVsZV9fUGVyc3BlY3RpdmVJbXBvcnRfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTMyOjE6ICggcnVsZV9fUGVyc3BlY3RpdmVJbXBvcnRfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVJbXBvcnRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMzM6MTogKCBydWxlX19QZXJzcGVjdGl2ZUltcG9ydF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTMzOjI6IHJ1bGVfX1BlcnNwZWN0aXZlSW1wb3J0X19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fUGVyc3BlY3RpdmVJbXBvcnRfX0dyb3VwX18wX2luX3J1bGVQZXJzcGVjdGl2ZUltcG9ydDIyMSk7CisgICAgICAgICAgICBydWxlX19QZXJzcGVjdGl2ZUltcG9ydF9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVJbXBvcnRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVBlcnNwZWN0aXZlSW1wb3J0IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVBlcnNwZWN0aXZlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE0NToxOiBlbnRyeVJ1bGVQZXJzcGVjdGl2ZSA6IHJ1bGVQZXJzcGVjdGl2ZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVBlcnNwZWN0aXZlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE0NjoxOiAoIHJ1bGVQZXJzcGVjdGl2ZSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTQ3OjE6IHJ1bGVQZXJzcGVjdGl2ZSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVQZXJzcGVjdGl2ZV9pbl9lbnRyeVJ1bGVQZXJzcGVjdGl2ZTI0OCk7CisgICAgICAgICAgICBydWxlUGVyc3BlY3RpdmUoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlUGVyc3BlY3RpdmUyNTUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVBlcnNwZWN0aXZlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVQZXJzcGVjdGl2ZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNTQ6MTogcnVsZVBlcnNwZWN0aXZlIDogKCAoIHJ1bGVfX1BlcnNwZWN0aXZlX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVQZXJzcGVjdGl2ZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNTg6MjogKCAoICggcnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNTk6MTogKCAoIHJ1bGVfX1BlcnNwZWN0aXZlX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE1OToxOiAoICggcnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTYwOjE6ICggcnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNjE6MTogKCBydWxlX19QZXJzcGVjdGl2ZV9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTYxOjI6IHJ1bGVfX1BlcnNwZWN0aXZlX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fUGVyc3BlY3RpdmVfX0dyb3VwX18wX2luX3J1bGVQZXJzcGVjdGl2ZTI4MSk7CisgICAgICAgICAgICBydWxlX19QZXJzcGVjdGl2ZV9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVBlcnNwZWN0aXZlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVBlcnNwZWN0aXZlRWxlbWVudCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNzM6MTogZW50cnlSdWxlUGVyc3BlY3RpdmVFbGVtZW50IDogcnVsZVBlcnNwZWN0aXZlRWxlbWVudCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVBlcnNwZWN0aXZlRWxlbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNzQ6MTogKCBydWxlUGVyc3BlY3RpdmVFbGVtZW50IEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNzU6MTogcnVsZVBlcnNwZWN0aXZlRWxlbWVudCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVFbGVtZW50UnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUGVyc3BlY3RpdmVFbGVtZW50X2luX2VudHJ5UnVsZVBlcnNwZWN0aXZlRWxlbWVudDMwOCk7CisgICAgICAgICAgICBydWxlUGVyc3BlY3RpdmVFbGVtZW50KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVFbGVtZW50UnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVQZXJzcGVjdGl2ZUVsZW1lbnQzMTUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVBlcnNwZWN0aXZlRWxlbWVudCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlUGVyc3BlY3RpdmVFbGVtZW50IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE4MjoxOiBydWxlUGVyc3BlY3RpdmVFbGVtZW50IDogKCAoIHJ1bGVfX1BlcnNwZWN0aXZlRWxlbWVudF9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVBlcnNwZWN0aXZlRWxlbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxODY6MjogKCAoICggcnVsZV9fUGVyc3BlY3RpdmVFbGVtZW50X19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE4NzoxOiAoICggcnVsZV9fUGVyc3BlY3RpdmVFbGVtZW50X19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxODc6MTogKCAoIHJ1bGVfX1BlcnNwZWN0aXZlRWxlbWVudF9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTg4OjE6ICggcnVsZV9fUGVyc3BlY3RpdmVFbGVtZW50X19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUVsZW1lbnRBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTg5OjE6ICggcnVsZV9fUGVyc3BlY3RpdmVFbGVtZW50X19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTg5OjI6IHJ1bGVfX1BlcnNwZWN0aXZlRWxlbWVudF9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19QZXJzcGVjdGl2ZUVsZW1lbnRfX0FsdGVybmF0aXZlc19pbl9ydWxlUGVyc3BlY3RpdmVFbGVtZW50MzQxKTsKKyAgICAgICAgICAgIHJ1bGVfX1BlcnNwZWN0aXZlRWxlbWVudF9fQWx0ZXJuYXRpdmVzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlRWxlbWVudEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVBlcnNwZWN0aXZlRWxlbWVudCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjAxOjE6IGVudHJ5UnVsZVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lciA6IHJ1bGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjAyOjE6ICggcnVsZVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lciBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjAzOjE6IHJ1bGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lclJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lcl9pbl9lbnRyeVJ1bGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIzNjgpOworICAgICAgICAgICAgcnVsZVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lcigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lclJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyMzc1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lciIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMTA6MTogcnVsZVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lciA6ICggKCBydWxlX19QZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMTQ6MjogKCAoICggcnVsZV9fUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjE1OjE6ICggKCBydWxlX19QZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjE1OjE6ICggKCBydWxlX19QZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjE2OjE6ICggcnVsZV9fUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIxNzoxOiAoIHJ1bGVfX1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lcl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjE3OjI6IHJ1bGVfX1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lcl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lcl9fR3JvdXBfXzBfaW5fcnVsZVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lcjQwMSk7CisgICAgICAgICAgICBydWxlX19QZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVBlcnNwZWN0aXZlUGFydFN0YWNrIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIyOToxOiBlbnRyeVJ1bGVQZXJzcGVjdGl2ZVBhcnRTdGFjayA6IHJ1bGVQZXJzcGVjdGl2ZVBhcnRTdGFjayBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVBlcnNwZWN0aXZlUGFydFN0YWNrKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIzMDoxOiAoIHJ1bGVQZXJzcGVjdGl2ZVBhcnRTdGFjayBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjMxOjE6IHJ1bGVQZXJzcGVjdGl2ZVBhcnRTdGFjayBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVQZXJzcGVjdGl2ZVBhcnRTdGFja19pbl9lbnRyeVJ1bGVQZXJzcGVjdGl2ZVBhcnRTdGFjazQyOCk7CisgICAgICAgICAgICBydWxlUGVyc3BlY3RpdmVQYXJ0U3RhY2soKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja1J1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlUGVyc3BlY3RpdmVQYXJ0U3RhY2s0MzUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVBlcnNwZWN0aXZlUGFydFN0YWNrIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVQZXJzcGVjdGl2ZVBhcnRTdGFjayIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMzg6MTogcnVsZVBlcnNwZWN0aXZlUGFydFN0YWNrIDogKCAoIHJ1bGVfX1BlcnNwZWN0aXZlUGFydFN0YWNrX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVQZXJzcGVjdGl2ZVBhcnRTdGFjaygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNDI6MjogKCAoICggcnVsZV9fUGVyc3BlY3RpdmVQYXJ0U3RhY2tfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNDM6MTogKCAoIHJ1bGVfX1BlcnNwZWN0aXZlUGFydFN0YWNrX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI0MzoxOiAoICggcnVsZV9fUGVyc3BlY3RpdmVQYXJ0U3RhY2tfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjQ0OjE6ICggcnVsZV9fUGVyc3BlY3RpdmVQYXJ0U3RhY2tfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNDU6MTogKCBydWxlX19QZXJzcGVjdGl2ZVBhcnRTdGFja19fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjQ1OjI6IHJ1bGVfX1BlcnNwZWN0aXZlUGFydFN0YWNrX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fUGVyc3BlY3RpdmVQYXJ0U3RhY2tfX0dyb3VwX18wX2luX3J1bGVQZXJzcGVjdGl2ZVBhcnRTdGFjazQ2MSk7CisgICAgICAgICAgICBydWxlX19QZXJzcGVjdGl2ZVBhcnRTdGFja19fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVBlcnNwZWN0aXZlUGFydFN0YWNrIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVBlcnNwZWN0aXZlUGFydCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNTc6MTogZW50cnlSdWxlUGVyc3BlY3RpdmVQYXJ0IDogcnVsZVBlcnNwZWN0aXZlUGFydCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVBlcnNwZWN0aXZlUGFydCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNTg6MTogKCBydWxlUGVyc3BlY3RpdmVQYXJ0IEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNTk6MTogcnVsZVBlcnNwZWN0aXZlUGFydCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0UnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUGVyc3BlY3RpdmVQYXJ0X2luX2VudHJ5UnVsZVBlcnNwZWN0aXZlUGFydDQ4OCk7CisgICAgICAgICAgICBydWxlUGVyc3BlY3RpdmVQYXJ0KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0UnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVQZXJzcGVjdGl2ZVBhcnQ0OTUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVBlcnNwZWN0aXZlUGFydCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlUGVyc3BlY3RpdmVQYXJ0IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2NjoxOiBydWxlUGVyc3BlY3RpdmVQYXJ0IDogKCAoIHJ1bGVfX1BlcnNwZWN0aXZlUGFydF9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlUGVyc3BlY3RpdmVQYXJ0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI3MDoyOiAoICggKCBydWxlX19QZXJzcGVjdGl2ZVBhcnRfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNzE6MTogKCAoIHJ1bGVfX1BlcnNwZWN0aXZlUGFydF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNzE6MTogKCAoIHJ1bGVfX1BlcnNwZWN0aXZlUGFydF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNzI6MTogKCBydWxlX19QZXJzcGVjdGl2ZVBhcnRfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjczOjE6ICggcnVsZV9fUGVyc3BlY3RpdmVQYXJ0X19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNzM6MjogcnVsZV9fUGVyc3BlY3RpdmVQYXJ0X19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fUGVyc3BlY3RpdmVQYXJ0X19Hcm91cF9fMF9pbl9ydWxlUGVyc3BlY3RpdmVQYXJ0NTIxKTsKKyAgICAgICAgICAgIHJ1bGVfX1BlcnNwZWN0aXZlUGFydF9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVQZXJzcGVjdGl2ZVBhcnQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlUGVyc3BlY3RpdmVWaWV3IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI4NToxOiBlbnRyeVJ1bGVQZXJzcGVjdGl2ZVZpZXcgOiBydWxlUGVyc3BlY3RpdmVWaWV3IEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlUGVyc3BlY3RpdmVWaWV3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI4NjoxOiAoIHJ1bGVQZXJzcGVjdGl2ZVZpZXcgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI4NzoxOiBydWxlUGVyc3BlY3RpdmVWaWV3IEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVZpZXdSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVQZXJzcGVjdGl2ZVZpZXdfaW5fZW50cnlSdWxlUGVyc3BlY3RpdmVWaWV3NTQ4KTsKKyAgICAgICAgICAgIHJ1bGVQZXJzcGVjdGl2ZVZpZXcoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVZpZXdSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVBlcnNwZWN0aXZlVmlldzU1NSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlUGVyc3BlY3RpdmVWaWV3IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVQZXJzcGVjdGl2ZVZpZXciCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjk0OjE6IHJ1bGVQZXJzcGVjdGl2ZVZpZXcgOiAoICggcnVsZV9fUGVyc3BlY3RpdmVWaWV3X19BbHRlcm5hdGl2ZXMgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlUGVyc3BlY3RpdmVWaWV3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI5ODoyOiAoICggKCBydWxlX19QZXJzcGVjdGl2ZVZpZXdfX0FsdGVybmF0aXZlcyApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjk5OjE6ICggKCBydWxlX19QZXJzcGVjdGl2ZVZpZXdfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI5OToxOiAoICggcnVsZV9fUGVyc3BlY3RpdmVWaWV3X19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMDA6MTogKCBydWxlX19QZXJzcGVjdGl2ZVZpZXdfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVmlld0FjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMDE6MTogKCBydWxlX19QZXJzcGVjdGl2ZVZpZXdfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMDE6MjogcnVsZV9fUGVyc3BlY3RpdmVWaWV3X19BbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1BlcnNwZWN0aXZlVmlld19fQWx0ZXJuYXRpdmVzX2luX3J1bGVQZXJzcGVjdGl2ZVZpZXc1ODEpOworICAgICAgICAgICAgcnVsZV9fUGVyc3BlY3RpdmVWaWV3X19BbHRlcm5hdGl2ZXMoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVWaWV3QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlUGVyc3BlY3RpdmVWaWV3IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVBlcnNwZWN0aXZlU2VsZWN0aW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMxMzoxOiBlbnRyeVJ1bGVQZXJzcGVjdGl2ZVNlbGVjdGlvbiA6IHJ1bGVQZXJzcGVjdGl2ZVNlbGVjdGlvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVBlcnNwZWN0aXZlU2VsZWN0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMxNDoxOiAoIHJ1bGVQZXJzcGVjdGl2ZVNlbGVjdGlvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzE1OjE6IHJ1bGVQZXJzcGVjdGl2ZVNlbGVjdGlvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTZWxlY3Rpb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVQZXJzcGVjdGl2ZVNlbGVjdGlvbl9pbl9lbnRyeVJ1bGVQZXJzcGVjdGl2ZVNlbGVjdGlvbjYwOCk7CisgICAgICAgICAgICBydWxlUGVyc3BlY3RpdmVTZWxlY3Rpb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNlbGVjdGlvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlUGVyc3BlY3RpdmVTZWxlY3Rpb242MTUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVBlcnNwZWN0aXZlU2VsZWN0aW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVQZXJzcGVjdGl2ZVNlbGVjdGlvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMjI6MTogcnVsZVBlcnNwZWN0aXZlU2VsZWN0aW9uIDogKCAoIHJ1bGVfX1BlcnNwZWN0aXZlU2VsZWN0aW9uX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVQZXJzcGVjdGl2ZVNlbGVjdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMjY6MjogKCAoICggcnVsZV9fUGVyc3BlY3RpdmVTZWxlY3Rpb25fX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMjc6MTogKCAoIHJ1bGVfX1BlcnNwZWN0aXZlU2VsZWN0aW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMyNzoxOiAoICggcnVsZV9fUGVyc3BlY3RpdmVTZWxlY3Rpb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzI4OjE6ICggcnVsZV9fUGVyc3BlY3RpdmVTZWxlY3Rpb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTZWxlY3Rpb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMjk6MTogKCBydWxlX19QZXJzcGVjdGl2ZVNlbGVjdGlvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzI5OjI6IHJ1bGVfX1BlcnNwZWN0aXZlU2VsZWN0aW9uX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fUGVyc3BlY3RpdmVTZWxlY3Rpb25fX0dyb3VwX18wX2luX3J1bGVQZXJzcGVjdGl2ZVNlbGVjdGlvbjY0MSk7CisgICAgICAgICAgICBydWxlX19QZXJzcGVjdGl2ZVNlbGVjdGlvbl9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTZWxlY3Rpb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVBlcnNwZWN0aXZlU2VsZWN0aW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVBlcnNwZWN0aXZlVGFibGUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzQxOjE6IGVudHJ5UnVsZVBlcnNwZWN0aXZlVGFibGUgOiBydWxlUGVyc3BlY3RpdmVUYWJsZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVBlcnNwZWN0aXZlVGFibGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzQyOjE6ICggcnVsZVBlcnNwZWN0aXZlVGFibGUgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjM0MzoxOiBydWxlUGVyc3BlY3RpdmVUYWJsZSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVUYWJsZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVBlcnNwZWN0aXZlVGFibGVfaW5fZW50cnlSdWxlUGVyc3BlY3RpdmVUYWJsZTY2OCk7CisgICAgICAgICAgICBydWxlUGVyc3BlY3RpdmVUYWJsZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVGFibGVSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVBlcnNwZWN0aXZlVGFibGU2NzUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVBlcnNwZWN0aXZlVGFibGUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVBlcnNwZWN0aXZlVGFibGUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzUwOjE6IHJ1bGVQZXJzcGVjdGl2ZVRhYmxlIDogKCAoIHJ1bGVfX1BlcnNwZWN0aXZlVGFibGVfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVBlcnNwZWN0aXZlVGFibGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzU0OjI6ICggKCAoIHJ1bGVfX1BlcnNwZWN0aXZlVGFibGVfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozNTU6MTogKCAoIHJ1bGVfX1BlcnNwZWN0aXZlVGFibGVfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzU1OjE6ICggKCBydWxlX19QZXJzcGVjdGl2ZVRhYmxlX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjM1NjoxOiAoIHJ1bGVfX1BlcnNwZWN0aXZlVGFibGVfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVUYWJsZUFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjM1NzoxOiAoIHJ1bGVfX1BlcnNwZWN0aXZlVGFibGVfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjM1NzoyOiBydWxlX19QZXJzcGVjdGl2ZVRhYmxlX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fUGVyc3BlY3RpdmVUYWJsZV9fR3JvdXBfXzBfaW5fcnVsZVBlcnNwZWN0aXZlVGFibGU3MDEpOworICAgICAgICAgICAgcnVsZV9fUGVyc3BlY3RpdmVUYWJsZV9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVUYWJsZUFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlUGVyc3BlY3RpdmVUYWJsZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVQZXJzcGVjdGl2ZUdyaWQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzY5OjE6IGVudHJ5UnVsZVBlcnNwZWN0aXZlR3JpZCA6IHJ1bGVQZXJzcGVjdGl2ZUdyaWQgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVQZXJzcGVjdGl2ZUdyaWQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzcwOjE6ICggcnVsZVBlcnNwZWN0aXZlR3JpZCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzcxOjE6IHJ1bGVQZXJzcGVjdGl2ZUdyaWQgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlR3JpZFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVBlcnNwZWN0aXZlR3JpZF9pbl9lbnRyeVJ1bGVQZXJzcGVjdGl2ZUdyaWQ3MjgpOworICAgICAgICAgICAgcnVsZVBlcnNwZWN0aXZlR3JpZCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlR3JpZFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlUGVyc3BlY3RpdmVHcmlkNzM1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVQZXJzcGVjdGl2ZUdyaWQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVBlcnNwZWN0aXZlR3JpZCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozNzg6MTogcnVsZVBlcnNwZWN0aXZlR3JpZCA6ICggKCBydWxlX19QZXJzcGVjdGl2ZUdyaWRfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVBlcnNwZWN0aXZlR3JpZCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozODI6MjogKCAoICggcnVsZV9fUGVyc3BlY3RpdmVHcmlkX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzgzOjE6ICggKCBydWxlX19QZXJzcGVjdGl2ZUdyaWRfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzgzOjE6ICggKCBydWxlX19QZXJzcGVjdGl2ZUdyaWRfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mzg0OjE6ICggcnVsZV9fUGVyc3BlY3RpdmVHcmlkX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlR3JpZEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjM4NToxOiAoIHJ1bGVfX1BlcnNwZWN0aXZlR3JpZF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mzg1OjI6IHJ1bGVfX1BlcnNwZWN0aXZlR3JpZF9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1BlcnNwZWN0aXZlR3JpZF9fR3JvdXBfXzBfaW5fcnVsZVBlcnNwZWN0aXZlR3JpZDc2MSk7CisgICAgICAgICAgICBydWxlX19QZXJzcGVjdGl2ZUdyaWRfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlR3JpZEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlUGVyc3BlY3RpdmVHcmlkIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVBlcnNwZWN0aXZlQ2hhcnQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mzk3OjE6IGVudHJ5UnVsZVBlcnNwZWN0aXZlQ2hhcnQgOiBydWxlUGVyc3BlY3RpdmVDaGFydCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVBlcnNwZWN0aXZlQ2hhcnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mzk4OjE6ICggcnVsZVBlcnNwZWN0aXZlQ2hhcnQgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjM5OToxOiBydWxlUGVyc3BlY3RpdmVDaGFydCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVDaGFydFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVBlcnNwZWN0aXZlQ2hhcnRfaW5fZW50cnlSdWxlUGVyc3BlY3RpdmVDaGFydDc4OCk7CisgICAgICAgICAgICBydWxlUGVyc3BlY3RpdmVDaGFydCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQ2hhcnRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVBlcnNwZWN0aXZlQ2hhcnQ3OTUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVBlcnNwZWN0aXZlQ2hhcnQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVBlcnNwZWN0aXZlQ2hhcnQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NDA2OjE6IHJ1bGVQZXJzcGVjdGl2ZUNoYXJ0IDogKCAoIHJ1bGVfX1BlcnNwZWN0aXZlQ2hhcnRfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVBlcnNwZWN0aXZlQ2hhcnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NDEwOjI6ICggKCAoIHJ1bGVfX1BlcnNwZWN0aXZlQ2hhcnRfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo0MTE6MTogKCAoIHJ1bGVfX1BlcnNwZWN0aXZlQ2hhcnRfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NDExOjE6ICggKCBydWxlX19QZXJzcGVjdGl2ZUNoYXJ0X19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQxMjoxOiAoIHJ1bGVfX1BlcnNwZWN0aXZlQ2hhcnRfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVDaGFydEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQxMzoxOiAoIHJ1bGVfX1BlcnNwZWN0aXZlQ2hhcnRfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQxMzoyOiBydWxlX19QZXJzcGVjdGl2ZUNoYXJ0X19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fUGVyc3BlY3RpdmVDaGFydF9fR3JvdXBfXzBfaW5fcnVsZVBlcnNwZWN0aXZlQ2hhcnQ4MjEpOworICAgICAgICAgICAgcnVsZV9fUGVyc3BlY3RpdmVDaGFydF9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVDaGFydEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlUGVyc3BlY3RpdmVDaGFydCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVQZXJzcGVjdGl2ZVJlcG9ydCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo0MjU6MTogZW50cnlSdWxlUGVyc3BlY3RpdmVSZXBvcnQgOiBydWxlUGVyc3BlY3RpdmVSZXBvcnQgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVQZXJzcGVjdGl2ZVJlcG9ydCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo0MjY6MTogKCBydWxlUGVyc3BlY3RpdmVSZXBvcnQgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQyNzoxOiBydWxlUGVyc3BlY3RpdmVSZXBvcnQgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUmVwb3J0UnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUGVyc3BlY3RpdmVSZXBvcnRfaW5fZW50cnlSdWxlUGVyc3BlY3RpdmVSZXBvcnQ4NDgpOworICAgICAgICAgICAgcnVsZVBlcnNwZWN0aXZlUmVwb3J0KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVSZXBvcnRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVBlcnNwZWN0aXZlUmVwb3J0ODU1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVQZXJzcGVjdGl2ZVJlcG9ydCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlUGVyc3BlY3RpdmVSZXBvcnQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NDM0OjE6IHJ1bGVQZXJzcGVjdGl2ZVJlcG9ydCA6ICggKCBydWxlX19QZXJzcGVjdGl2ZVJlcG9ydF9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlUGVyc3BlY3RpdmVSZXBvcnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NDM4OjI6ICggKCAoIHJ1bGVfX1BlcnNwZWN0aXZlUmVwb3J0X19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NDM5OjE6ICggKCBydWxlX19QZXJzcGVjdGl2ZVJlcG9ydF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo0Mzk6MTogKCAoIHJ1bGVfX1BlcnNwZWN0aXZlUmVwb3J0X19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQ0MDoxOiAoIHJ1bGVfX1BlcnNwZWN0aXZlUmVwb3J0X19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUmVwb3J0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NDQxOjE6ICggcnVsZV9fUGVyc3BlY3RpdmVSZXBvcnRfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQ0MToyOiBydWxlX19QZXJzcGVjdGl2ZVJlcG9ydF9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1BlcnNwZWN0aXZlUmVwb3J0X19Hcm91cF9fMF9pbl9ydWxlUGVyc3BlY3RpdmVSZXBvcnQ4ODEpOworICAgICAgICAgICAgcnVsZV9fUGVyc3BlY3RpdmVSZXBvcnRfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUmVwb3J0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVQZXJzcGVjdGl2ZVJlcG9ydCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo0NTM6MTogZW50cnlSdWxlUGVyc3BlY3RpdmVPcmdhbml6YXRpb24gOiBydWxlUGVyc3BlY3RpdmVPcmdhbml6YXRpb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo0NTQ6MTogKCBydWxlUGVyc3BlY3RpdmVPcmdhbml6YXRpb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQ1NToxOiBydWxlUGVyc3BlY3RpdmVPcmdhbml6YXRpb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlT3JnYW5pemF0aW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUGVyc3BlY3RpdmVPcmdhbml6YXRpb25faW5fZW50cnlSdWxlUGVyc3BlY3RpdmVPcmdhbml6YXRpb245MDgpOworICAgICAgICAgICAgcnVsZVBlcnNwZWN0aXZlT3JnYW5pemF0aW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVPcmdhbml6YXRpb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVBlcnNwZWN0aXZlT3JnYW5pemF0aW9uOTE1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlUGVyc3BlY3RpdmVPcmdhbml6YXRpb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NDYyOjE6IHJ1bGVQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbiA6ICggKCBydWxlX19QZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbl9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlUGVyc3BlY3RpdmVPcmdhbml6YXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NDY2OjI6ICggKCAoIHJ1bGVfX1BlcnNwZWN0aXZlT3JnYW5pemF0aW9uX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NDY3OjE6ICggKCBydWxlX19QZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo0Njc6MTogKCAoIHJ1bGVfX1BlcnNwZWN0aXZlT3JnYW5pemF0aW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQ2ODoxOiAoIHJ1bGVfX1BlcnNwZWN0aXZlT3JnYW5pemF0aW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlT3JnYW5pemF0aW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NDY5OjE6ICggcnVsZV9fUGVyc3BlY3RpdmVPcmdhbml6YXRpb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQ2OToyOiBydWxlX19QZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1BlcnNwZWN0aXZlT3JnYW5pemF0aW9uX19Hcm91cF9fMF9pbl9ydWxlUGVyc3BlY3RpdmVPcmdhbml6YXRpb245NDEpOworICAgICAgICAgICAgcnVsZV9fUGVyc3BlY3RpdmVPcmdhbml6YXRpb25fX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlT3JnYW5pemF0aW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVQZXJzcGVjdGl2ZVRvcG9sb2d5IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQ4MToxOiBlbnRyeVJ1bGVQZXJzcGVjdGl2ZVRvcG9sb2d5IDogcnVsZVBlcnNwZWN0aXZlVG9wb2xvZ3kgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVQZXJzcGVjdGl2ZVRvcG9sb2d5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQ4MjoxOiAoIHJ1bGVQZXJzcGVjdGl2ZVRvcG9sb2d5IEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo0ODM6MTogcnVsZVBlcnNwZWN0aXZlVG9wb2xvZ3kgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVG9wb2xvZ3lSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVQZXJzcGVjdGl2ZVRvcG9sb2d5X2luX2VudHJ5UnVsZVBlcnNwZWN0aXZlVG9wb2xvZ3k5NjgpOworICAgICAgICAgICAgcnVsZVBlcnNwZWN0aXZlVG9wb2xvZ3koKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVRvcG9sb2d5UnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVQZXJzcGVjdGl2ZVRvcG9sb2d5OTc1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVQZXJzcGVjdGl2ZVRvcG9sb2d5IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVQZXJzcGVjdGl2ZVRvcG9sb2d5IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQ5MDoxOiBydWxlUGVyc3BlY3RpdmVUb3BvbG9neSA6ICggKCBydWxlX19QZXJzcGVjdGl2ZVRvcG9sb2d5X19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVQZXJzcGVjdGl2ZVRvcG9sb2d5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQ5NDoyOiAoICggKCBydWxlX19QZXJzcGVjdGl2ZVRvcG9sb2d5X19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NDk1OjE6ICggKCBydWxlX19QZXJzcGVjdGl2ZVRvcG9sb2d5X19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQ5NToxOiAoICggcnVsZV9fUGVyc3BlY3RpdmVUb3BvbG9neV9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo0OTY6MTogKCBydWxlX19QZXJzcGVjdGl2ZVRvcG9sb2d5X19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVG9wb2xvZ3lBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo0OTc6MTogKCBydWxlX19QZXJzcGVjdGl2ZVRvcG9sb2d5X19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo0OTc6MjogcnVsZV9fUGVyc3BlY3RpdmVUb3BvbG9neV9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1BlcnNwZWN0aXZlVG9wb2xvZ3lfX0dyb3VwX18wX2luX3J1bGVQZXJzcGVjdGl2ZVRvcG9sb2d5MTAwMSk7CisgICAgICAgICAgICBydWxlX19QZXJzcGVjdGl2ZVRvcG9sb2d5X19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVRvcG9sb2d5QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVQZXJzcGVjdGl2ZVRvcG9sb2d5IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVBlcnNwZWN0aXZlRGlhbG9nIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjUwOToxOiBlbnRyeVJ1bGVQZXJzcGVjdGl2ZURpYWxvZyA6IHJ1bGVQZXJzcGVjdGl2ZURpYWxvZyBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVBlcnNwZWN0aXZlRGlhbG9nKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjUxMDoxOiAoIHJ1bGVQZXJzcGVjdGl2ZURpYWxvZyBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTExOjE6IHJ1bGVQZXJzcGVjdGl2ZURpYWxvZyBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVEaWFsb2dSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVQZXJzcGVjdGl2ZURpYWxvZ19pbl9lbnRyeVJ1bGVQZXJzcGVjdGl2ZURpYWxvZzEwMjgpOworICAgICAgICAgICAgcnVsZVBlcnNwZWN0aXZlRGlhbG9nKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVEaWFsb2dSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVBlcnNwZWN0aXZlRGlhbG9nMTAzNSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlUGVyc3BlY3RpdmVEaWFsb2ciCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVBlcnNwZWN0aXZlRGlhbG9nIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjUxODoxOiBydWxlUGVyc3BlY3RpdmVEaWFsb2cgOiAoICggcnVsZV9fUGVyc3BlY3RpdmVEaWFsb2dfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVBlcnNwZWN0aXZlRGlhbG9nKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjUyMjoyOiAoICggKCBydWxlX19QZXJzcGVjdGl2ZURpYWxvZ19fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjUyMzoxOiAoICggcnVsZV9fUGVyc3BlY3RpdmVEaWFsb2dfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTIzOjE6ICggKCBydWxlX19QZXJzcGVjdGl2ZURpYWxvZ19fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo1MjQ6MTogKCBydWxlX19QZXJzcGVjdGl2ZURpYWxvZ19fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZURpYWxvZ0FjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjUyNToxOiAoIHJ1bGVfX1BlcnNwZWN0aXZlRGlhbG9nX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo1MjU6MjogcnVsZV9fUGVyc3BlY3RpdmVEaWFsb2dfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19QZXJzcGVjdGl2ZURpYWxvZ19fR3JvdXBfXzBfaW5fcnVsZVBlcnNwZWN0aXZlRGlhbG9nMTA2MSk7CisgICAgICAgICAgICBydWxlX19QZXJzcGVjdGl2ZURpYWxvZ19fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVEaWFsb2dBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVBlcnNwZWN0aXZlRGlhbG9nIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVBlcnNwZWN0aXZlQlBNTiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo1Mzc6MTogZW50cnlSdWxlUGVyc3BlY3RpdmVCUE1OIDogcnVsZVBlcnNwZWN0aXZlQlBNTiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVBlcnNwZWN0aXZlQlBNTigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo1Mzg6MTogKCBydWxlUGVyc3BlY3RpdmVCUE1OIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo1Mzk6MTogcnVsZVBlcnNwZWN0aXZlQlBNTiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVCUE1OUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUGVyc3BlY3RpdmVCUE1OX2luX2VudHJ5UnVsZVBlcnNwZWN0aXZlQlBNTjEwODgpOworICAgICAgICAgICAgcnVsZVBlcnNwZWN0aXZlQlBNTigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQlBNTlJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlUGVyc3BlY3RpdmVCUE1OMTA5NSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlUGVyc3BlY3RpdmVCUE1OIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVQZXJzcGVjdGl2ZUJQTU4iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTQ2OjE6IHJ1bGVQZXJzcGVjdGl2ZUJQTU4gOiAoICggcnVsZV9fUGVyc3BlY3RpdmVCUE1OX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVQZXJzcGVjdGl2ZUJQTU4oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTUwOjI6ICggKCAoIHJ1bGVfX1BlcnNwZWN0aXZlQlBNTl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjU1MToxOiAoICggcnVsZV9fUGVyc3BlY3RpdmVCUE1OX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjU1MToxOiAoICggcnVsZV9fUGVyc3BlY3RpdmVCUE1OX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjU1MjoxOiAoIHJ1bGVfX1BlcnNwZWN0aXZlQlBNTl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUJQTU5BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo1NTM6MTogKCBydWxlX19QZXJzcGVjdGl2ZUJQTU5fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjU1MzoyOiBydWxlX19QZXJzcGVjdGl2ZUJQTU5fX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19QZXJzcGVjdGl2ZUJQTU5fX0dyb3VwX18wX2luX3J1bGVQZXJzcGVjdGl2ZUJQTU4xMTIxKTsKKyAgICAgICAgICAgIHJ1bGVfX1BlcnNwZWN0aXZlQlBNTl9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVCUE1OQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVQZXJzcGVjdGl2ZUJQTU4iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlUGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjU2NToxOiBlbnRyeVJ1bGVQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQgOiBydWxlUGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlUGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjU2NjoxOiAoIHJ1bGVQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjU2NzoxOiBydWxlUGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfaW5fZW50cnlSdWxlUGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkMTE0OCk7CisgICAgICAgICAgICBydWxlUGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQxMTU1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo1NzQ6MTogcnVsZVBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCA6ICggKCBydWxlX19QZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo1Nzg6MjogKCAoICggcnVsZV9fUGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTc5OjE6ICggKCBydWxlX19QZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTc5OjE6ICggKCBydWxlX19QZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTgwOjE6ICggcnVsZV9fUGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjU4MToxOiAoIHJ1bGVfX1BlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTgxOjI6IHJ1bGVfX1BlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1BlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9fR3JvdXBfXzBfaW5fcnVsZVBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZDExODEpOworICAgICAgICAgICAgcnVsZV9fUGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVRdWFsaWZpZWROYW1lIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjU5MzoxOiBlbnRyeVJ1bGVRdWFsaWZpZWROYW1lIDogcnVsZVF1YWxpZmllZE5hbWUgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVRdWFsaWZpZWROYW1lKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjU5NDoxOiAoIHJ1bGVRdWFsaWZpZWROYW1lIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo1OTU6MTogcnVsZVF1YWxpZmllZE5hbWUgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVRdWFsaWZpZWROYW1lX2luX2VudHJ5UnVsZVF1YWxpZmllZE5hbWUxMjA4KTsKKyAgICAgICAgICAgIHJ1bGVRdWFsaWZpZWROYW1lKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlUXVhbGlmaWVkTmFtZTEyMTUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVF1YWxpZmllZE5hbWUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVF1YWxpZmllZE5hbWUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjAyOjE6IHJ1bGVRdWFsaWZpZWROYW1lIDogKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVF1YWxpZmllZE5hbWUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjA2OjI6ICggKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo2MDc6MTogKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjA3OjE6ICggKCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjYwODoxOiAoIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjYwOToxOiAoIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjYwOToyOiBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzBfaW5fcnVsZVF1YWxpZmllZE5hbWUxMjQxKTsKKyAgICAgICAgICAgIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVF1YWxpZmllZE5hbWUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlVmFsaWRJRCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo2MjE6MTogZW50cnlSdWxlVmFsaWRJRCA6IHJ1bGVWYWxpZElEIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlVmFsaWRJRCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo2MjI6MTogKCBydWxlVmFsaWRJRCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjIzOjE6IHJ1bGVWYWxpZElEIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRWYWxpZElEUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlVmFsaWRJRF9pbl9lbnRyeVJ1bGVWYWxpZElEMTI2OCk7CisgICAgICAgICAgICBydWxlVmFsaWRJRCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFZhbGlkSURSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVZhbGlkSUQxMjc1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVWYWxpZElEIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVWYWxpZElEIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjYzMDoxOiBydWxlVmFsaWRJRCA6ICggUlVMRV9JRCApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlVmFsaWRJRCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo2MzQ6MjogKCAoIFJVTEVfSUQgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo2MzU6MTogKCBSVUxFX0lEICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjYzNToxOiAoIFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjM2OjE6IFJVTEVfSUQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VmFsaWRJREFjY2VzcygpLmdldElEVGVybWluYWxSdWxlQ2FsbCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxSVUxFX0lELEZPTExPV19SVUxFX0lEX2luX3J1bGVWYWxpZElEMTMwMSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VmFsaWRJREFjY2VzcygpLmdldElEVGVybWluYWxSdWxlQ2FsbCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVZhbGlkSUQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlVFJBTlNMQVRBQkxFSUQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjQ5OjE6IGVudHJ5UnVsZVRSQU5TTEFUQUJMRUlEIDogcnVsZVRSQU5TTEFUQUJMRUlEIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlVFJBTlNMQVRBQkxFSUQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjUwOjE6ICggcnVsZVRSQU5TTEFUQUJMRUlEIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo2NTE6MTogcnVsZVRSQU5TTEFUQUJMRUlEIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUUkFOU0xBVEFCTEVJRFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVRSQU5TTEFUQUJMRUlEX2luX2VudHJ5UnVsZVRSQU5TTEFUQUJMRUlEMTMyNyk7CisgICAgICAgICAgICBydWxlVFJBTlNMQVRBQkxFSUQoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUUkFOU0xBVEFCTEVJRFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlVFJBTlNMQVRBQkxFSUQxMzM0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVUUkFOU0xBVEFCTEVJRCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlVFJBTlNMQVRBQkxFSUQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjU4OjE6IHJ1bGVUUkFOU0xBVEFCTEVJRCA6ICggUlVMRV9JRCApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlVFJBTlNMQVRBQkxFSUQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjYyOjI6ICggKCBSVUxFX0lEICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjYzOjE6ICggUlVMRV9JRCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo2NjM6MTogKCBSVUxFX0lEICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjY2NDoxOiBSVUxFX0lECisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFRSQU5TTEFUQUJMRUlEQWNjZXNzKCkuZ2V0SURUZXJtaW5hbFJ1bGVDYWxsKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XX1JVTEVfSURfaW5fcnVsZVRSQU5TTEFUQUJMRUlEMTM2MCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VFJBTlNMQVRBQkxFSURBY2Nlc3MoKS5nZXRJRFRlcm1pbmFsUnVsZUNhbGwoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVUUkFOU0xBVEFCTEVJRCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVUUkFOU0xBVEFCTEVTVFJJTkciCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Njc3OjE6IGVudHJ5UnVsZVRSQU5TTEFUQUJMRVNUUklORyA6IHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Njc4OjE6ICggcnVsZVRSQU5TTEFUQUJMRVNUUklORyBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Njc5OjE6IHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFRSQU5TTEFUQUJMRVNUUklOR1J1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVRSQU5TTEFUQUJMRVNUUklOR19pbl9lbnRyeVJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcxMzg2KTsKKyAgICAgICAgICAgIHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUUkFOU0xBVEFCTEVTVFJJTkdSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVRSQU5TTEFUQUJMRVNUUklORzEzOTMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVRSQU5TTEFUQUJMRVNUUklORyIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlVFJBTlNMQVRBQkxFU1RSSU5HIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjY4NjoxOiBydWxlVFJBTlNMQVRBQkxFU1RSSU5HIDogKCBSVUxFX1NUUklORyApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlVFJBTlNMQVRBQkxFU1RSSU5HKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjY5MDoyOiAoICggUlVMRV9TVFJJTkcgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo2OTE6MTogKCBSVUxFX1NUUklORyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo2OTE6MTogKCBSVUxFX1NUUklORyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo2OTI6MTogUlVMRV9TVFJJTkcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VFJBTlNMQVRBQkxFU1RSSU5HQWNjZXNzKCkuZ2V0U1RSSU5HVGVybWluYWxSdWxlQ2FsbCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxSVUxFX1NUUklORyxGT0xMT1dfUlVMRV9TVFJJTkdfaW5fcnVsZVRSQU5TTEFUQUJMRVNUUklORzE0MTkpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFRSQU5TTEFUQUJMRVNUUklOR0FjY2VzcygpLmdldFNUUklOR1Rlcm1pbmFsUnVsZUNhbGwoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVUUkFOU0xBVEFCTEVTVFJJTkciCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEFubm90YXRpb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NzA1OjE6IGVudHJ5UnVsZVhBbm5vdGF0aW9uIDogcnVsZVhBbm5vdGF0aW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWEFubm90YXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NzA2OjE6ICggcnVsZVhBbm5vdGF0aW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo3MDc6MTogcnVsZVhBbm5vdGF0aW9uIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBbm5vdGF0aW9uX2luX2VudHJ5UnVsZVhBbm5vdGF0aW9uMTQ0NSk7CisgICAgICAgICAgICBydWxlWEFubm90YXRpb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWEFubm90YXRpb24xNDUyKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYQW5ub3RhdGlvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWEFubm90YXRpb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NzE0OjE6IHJ1bGVYQW5ub3RhdGlvbiA6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWEFubm90YXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NzE4OjI6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NzE5OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo3MTk6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjcyMDoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NzIxOjE6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjcyMToyOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMF9pbl9ydWxlWEFubm90YXRpb24xNDc4KTsKKyAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWEFubm90YXRpb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjczMzoxOiBlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgOiBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjczNDoxOiAoIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjczNToxOiBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfaW5fZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyMTUwNSk7CisgICAgICAgICAgICBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIxNTEyKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo3NDI6MTogcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciA6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo3NDY6MjogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NzQ3OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NzQ3OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NzQ4OjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjc0OToxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NzQ5OjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzBfaW5fcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcjE1MzgpOworICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjc2MToxOiBlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0IDogcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjc2MjoxOiAoIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0IEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo3NjM6MTogcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X2luX2VudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QxNTY1KTsKKyAgICAgICAgICAgIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdDE1NzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NzcwOjE6IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0IDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0FsdGVybmF0aXZlcyApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjc3NDoyOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjc3NToxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Nzc1OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo3NzY6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjc3NzoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo3Nzc6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19BbHRlcm5hdGl2ZXNfaW5fcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QxNTk4KTsKKyAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0FsdGVybmF0aXZlcygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo3ODk6MTogZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUgOiBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo3OTA6MTogKCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjc5MToxOiBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVfaW5fZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUxNjI1KTsKKyAgICAgICAgICAgIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZTE2MzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo3OTg6MTogcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19BbHRlcm5hdGl2ZXMgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODAyOjI6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgwMzoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgwMzoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgwNDoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4MDU6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgwNToyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fQWx0ZXJuYXRpdmVzX2luX3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZTE2NTgpOworICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0FsdGVybmF0aXZlcygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgxNzoxOiBlbnRyeVJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiA6IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgxODoxOiAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODE5OjE6IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl9pbl9lbnRyeVJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbjE2ODUpOworICAgICAgICAgICAgcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uMTY5Mik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWEFubm90YXRpb25PckV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgyNjoxOiBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gOiAoICggcnVsZV9fWEFubm90YXRpb25PckV4cHJlc3Npb25fX0FsdGVybmF0aXZlcyApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4MzA6MjogKCAoICggcnVsZV9fWEFubm90YXRpb25PckV4cHJlc3Npb25fX0FsdGVybmF0aXZlcyApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODMxOjE6ICggKCBydWxlX19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODMxOjE6ICggKCBydWxlX19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODMyOjE6ICggcnVsZV9fWEFubm90YXRpb25PckV4cHJlc3Npb25fX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgzMzoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODMzOjI6IHJ1bGVfX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfaW5fcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uMTcxOCk7CisgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODQ1OjE6IGVudHJ5UnVsZVhFeHByZXNzaW9uIDogcnVsZVhFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODQ2OjE6ICggcnVsZVhFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4NDc6MTogcnVsZVhFeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhFeHByZXNzaW9uX2luX2VudHJ5UnVsZVhFeHByZXNzaW9uMTc0NSk7CisgICAgICAgICAgICBydWxlWEV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWEV4cHJlc3Npb24xNzUyKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWEV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODU0OjE6IHJ1bGVYRXhwcmVzc2lvbiA6ICggcnVsZVhBc3NpZ25tZW50ICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4NTg6MjogKCAoIHJ1bGVYQXNzaWdubWVudCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjg1OToxOiAoIHJ1bGVYQXNzaWdubWVudCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4NTk6MTogKCBydWxlWEFzc2lnbm1lbnQgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODYwOjE6IHJ1bGVYQXNzaWdubWVudAorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbkFjY2VzcygpLmdldFhBc3NpZ25tZW50UGFyc2VyUnVsZUNhbGwoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBc3NpZ25tZW50X2luX3J1bGVYRXhwcmVzc2lvbjE3NzgpOworICAgICAgICAgICAgcnVsZVhBc3NpZ25tZW50KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQXNzaWdubWVudFBhcnNlclJ1bGVDYWxsKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWEV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEFzc2lnbm1lbnQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODczOjE6IGVudHJ5UnVsZVhBc3NpZ25tZW50IDogcnVsZVhBc3NpZ25tZW50IEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWEFzc2lnbm1lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODc0OjE6ICggcnVsZVhBc3NpZ25tZW50IEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4NzU6MTogcnVsZVhBc3NpZ25tZW50IEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBc3NpZ25tZW50X2luX2VudHJ5UnVsZVhBc3NpZ25tZW50MTgwNCk7CisgICAgICAgICAgICBydWxlWEFzc2lnbm1lbnQoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWEFzc2lnbm1lbnQxODExKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYQXNzaWdubWVudCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWEFzc2lnbm1lbnQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODgyOjE6IHJ1bGVYQXNzaWdubWVudCA6ICggKCBydWxlX19YQXNzaWdubWVudF9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhBc3NpZ25tZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjg4NjoyOiAoICggKCBydWxlX19YQXNzaWdubWVudF9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4ODc6MTogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4ODc6MTogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4ODg6MTogKCBydWxlX19YQXNzaWdubWVudF9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODg5OjE6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4ODk6MjogcnVsZV9fWEFzc2lnbm1lbnRfX0FsdGVybmF0aXZlcworICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWEFzc2lnbm1lbnRfX0FsdGVybmF0aXZlc19pbl9ydWxlWEFzc2lnbm1lbnQxODM3KTsKKyAgICAgICAgICAgIHJ1bGVfX1hBc3NpZ25tZW50X19BbHRlcm5hdGl2ZXMoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYQXNzaWdubWVudCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVPcFNpbmdsZUFzc2lnbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo5MDE6MTogZW50cnlSdWxlT3BTaW5nbGVBc3NpZ24gOiBydWxlT3BTaW5nbGVBc3NpZ24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVPcFNpbmdsZUFzc2lnbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo5MDI6MTogKCBydWxlT3BTaW5nbGVBc3NpZ24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjkwMzoxOiBydWxlT3BTaW5nbGVBc3NpZ24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wU2luZ2xlQXNzaWduUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlT3BTaW5nbGVBc3NpZ25faW5fZW50cnlSdWxlT3BTaW5nbGVBc3NpZ24xODY0KTsKKyAgICAgICAgICAgIHJ1bGVPcFNpbmdsZUFzc2lnbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wU2luZ2xlQXNzaWduUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVPcFNpbmdsZUFzc2lnbjE4NzEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZU9wU2luZ2xlQXNzaWduIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcFNpbmdsZUFzc2lnbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo5MTA6MTogcnVsZU9wU2luZ2xlQXNzaWduIDogKCAnPScgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZU9wU2luZ2xlQXNzaWduKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjkxNDoyOiAoICggJz0nICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6OTE1OjE6ICggJz0nICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjkxNToxOiAoICc9JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo5MTY6MTogJz0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wU2luZ2xlQXNzaWduQWNjZXNzKCkuZ2V0RXF1YWxzU2lnbktleXdvcmQoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTMsRk9MTE9XXzEzX2luX3J1bGVPcFNpbmdsZUFzc2lnbjE4OTgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wU2luZ2xlQXNzaWduQWNjZXNzKCkuZ2V0RXF1YWxzU2lnbktleXdvcmQoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVPcFNpbmdsZUFzc2lnbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVPcE11bHRpQXNzaWduIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjkzMToxOiBlbnRyeVJ1bGVPcE11bHRpQXNzaWduIDogcnVsZU9wTXVsdGlBc3NpZ24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVPcE11bHRpQXNzaWduKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjkzMjoxOiAoIHJ1bGVPcE11bHRpQXNzaWduIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo5MzM6MTogcnVsZU9wTXVsdGlBc3NpZ24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVPcE11bHRpQXNzaWduX2luX2VudHJ5UnVsZU9wTXVsdGlBc3NpZ24xOTI2KTsKKyAgICAgICAgICAgIHJ1bGVPcE11bHRpQXNzaWduKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlT3BNdWx0aUFzc2lnbjE5MzMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZU9wTXVsdGlBc3NpZ24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZU9wTXVsdGlBc3NpZ24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6OTQwOjE6IHJ1bGVPcE11bHRpQXNzaWduIDogKCAoIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0FsdGVybmF0aXZlcyApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVPcE11bHRpQXNzaWduKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjk0NDoyOiAoICggKCBydWxlX19PcE11bHRpQXNzaWduX19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjk0NToxOiAoICggcnVsZV9fT3BNdWx0aUFzc2lnbl9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6OTQ1OjE6ICggKCBydWxlX19PcE11bHRpQXNzaWduX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo5NDY6MTogKCBydWxlX19PcE11bHRpQXNzaWduX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjk0NzoxOiAoIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo5NDc6MjogcnVsZV9fT3BNdWx0aUFzc2lnbl9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19PcE11bHRpQXNzaWduX19BbHRlcm5hdGl2ZXNfaW5fcnVsZU9wTXVsdGlBc3NpZ24xOTU5KTsKKyAgICAgICAgICAgIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0FsdGVybmF0aXZlcygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlT3BNdWx0aUFzc2lnbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYT3JFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjk1OToxOiBlbnRyeVJ1bGVYT3JFeHByZXNzaW9uIDogcnVsZVhPckV4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYT3JFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjk2MDoxOiAoIHJ1bGVYT3JFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo5NjE6MTogcnVsZVhPckV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYT3JFeHByZXNzaW9uX2luX2VudHJ5UnVsZVhPckV4cHJlc3Npb24xOTg2KTsKKyAgICAgICAgICAgIHJ1bGVYT3JFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWE9yRXhwcmVzc2lvbjE5OTMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhPckV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhPckV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6OTY4OjE6IHJ1bGVYT3JFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhPckV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6OTcyOjI6ICggKCAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo5NzM6MTogKCAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6OTczOjE6ICggKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjk3NDoxOiAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjk3NToxOiAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjk3NToyOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzBfaW5fcnVsZVhPckV4cHJlc3Npb24yMDE5KTsKKyAgICAgICAgICAgIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhPckV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlT3BPciIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo5ODc6MTogZW50cnlSdWxlT3BPciA6IHJ1bGVPcE9yIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlT3BPcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo5ODg6MTogKCBydWxlT3BPciBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6OTg5OjE6IHJ1bGVPcE9yIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE9yUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlT3BPcl9pbl9lbnRyeVJ1bGVPcE9yMjA0Nik7CisgICAgICAgICAgICBydWxlT3BPcigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wT3JSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZU9wT3IyMDUzKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVPcE9yIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcE9yIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjk5NjoxOiBydWxlT3BPciA6ICggJ3x8JyApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlT3BPcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDAwOjI6ICggKCAnfHwnICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTAwMToxOiAoICd8fCcgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTAwMToxOiAoICd8fCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTAwMjoxOiAnfHwnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3JBY2Nlc3MoKS5nZXRWZXJ0aWNhbExpbmVWZXJ0aWNhbExpbmVLZXl3b3JkKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDE0LEZPTExPV18xNF9pbl9ydWxlT3BPcjIwODApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wT3JBY2Nlc3MoKS5nZXRWZXJ0aWNhbExpbmVWZXJ0aWNhbExpbmVLZXl3b3JkKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlT3BPciIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQW5kRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDE3OjE6IGVudHJ5UnVsZVhBbmRFeHByZXNzaW9uIDogcnVsZVhBbmRFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWEFuZEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTAxODoxOiAoIHJ1bGVYQW5kRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTAxOToxOiBydWxlWEFuZEV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFuZEV4cHJlc3Npb25faW5fZW50cnlSdWxlWEFuZEV4cHJlc3Npb24yMTA4KTsKKyAgICAgICAgICAgIHJ1bGVYQW5kRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYQW5kRXhwcmVzc2lvbjIxMTUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhBbmRFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQW5kRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDI2OjE6IHJ1bGVYQW5kRXhwcmVzc2lvbiA6ICggKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWEFuZEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTAzMDoyOiAoICggKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwMzE6MTogKCAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwMzE6MTogKCAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwMzI6MTogKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwMzM6MTogKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTAzMzoyOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMF9pbl9ydWxlWEFuZEV4cHJlc3Npb24yMTQxKTsKKyAgICAgICAgICAgIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWEFuZEV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlT3BBbmQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTA0NToxOiBlbnRyeVJ1bGVPcEFuZCA6IHJ1bGVPcEFuZCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZU9wQW5kKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwNDY6MTogKCBydWxlT3BBbmQgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwNDc6MTogcnVsZU9wQW5kIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcEFuZFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZU9wQW5kX2luX2VudHJ5UnVsZU9wQW5kMjE2OCk7CisgICAgICAgICAgICBydWxlT3BBbmQoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcEFuZFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlT3BBbmQyMTc1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVPcEFuZCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlT3BBbmQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTA1NDoxOiBydWxlT3BBbmQgOiAoICcmJicgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZU9wQW5kKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwNTg6MjogKCAoICcmJicgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDU5OjE6ICggJyYmJyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDU5OjE6ICggJyYmJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDYwOjE6ICcmJicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBbmRBY2Nlc3MoKS5nZXRBbXBlcnNhbmRBbXBlcnNhbmRLZXl3b3JkKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDE1LEZPTExPV18xNV9pbl9ydWxlT3BBbmQyMjAyKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcEFuZEFjY2VzcygpLmdldEFtcGVyc2FuZEFtcGVyc2FuZEtleXdvcmQoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVPcEFuZCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwNzU6MTogZW50cnlSdWxlWEVxdWFsaXR5RXhwcmVzc2lvbiA6IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWEVxdWFsaXR5RXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDc2OjE6ICggcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwNzc6MTogcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYRXF1YWxpdHlFeHByZXNzaW9uX2luX2VudHJ5UnVsZVhFcXVhbGl0eUV4cHJlc3Npb24yMjMwKTsKKyAgICAgICAgICAgIHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWEVxdWFsaXR5RXhwcmVzc2lvbjIyMzcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhFcXVhbGl0eUV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhFcXVhbGl0eUV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTA4NDoxOiBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiA6ICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwODg6MjogKCAoICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwODk6MTogKCAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTA4OToxOiAoICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDkwOjE6ICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTA5MToxOiAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwOTE6MjogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18wX2luX3J1bGVYRXF1YWxpdHlFeHByZXNzaW9uMjI2Myk7CisgICAgICAgICAgICBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZU9wRXF1YWxpdHkiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTEwMzoxOiBlbnRyeVJ1bGVPcEVxdWFsaXR5IDogcnVsZU9wRXF1YWxpdHkgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVPcEVxdWFsaXR5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjExMDQ6MTogKCBydWxlT3BFcXVhbGl0eSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTEwNToxOiBydWxlT3BFcXVhbGl0eSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BFcXVhbGl0eVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZU9wRXF1YWxpdHlfaW5fZW50cnlSdWxlT3BFcXVhbGl0eTIyOTApOworICAgICAgICAgICAgcnVsZU9wRXF1YWxpdHkoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5UnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVPcEVxdWFsaXR5MjI5Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlT3BFcXVhbGl0eSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlT3BFcXVhbGl0eSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMTEyOjE6IHJ1bGVPcEVxdWFsaXR5IDogKCAoIHJ1bGVfX09wRXF1YWxpdHlfX0FsdGVybmF0aXZlcyApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVPcEVxdWFsaXR5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjExMTY6MjogKCAoICggcnVsZV9fT3BFcXVhbGl0eV9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMTE3OjE6ICggKCBydWxlX19PcEVxdWFsaXR5X19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMTE3OjE6ICggKCBydWxlX19PcEVxdWFsaXR5X19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMTE4OjE6ICggcnVsZV9fT3BFcXVhbGl0eV9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BFcXVhbGl0eUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMTE5OjE6ICggcnVsZV9fT3BFcXVhbGl0eV9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjExMTk6MjogcnVsZV9fT3BFcXVhbGl0eV9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19PcEVxdWFsaXR5X19BbHRlcm5hdGl2ZXNfaW5fcnVsZU9wRXF1YWxpdHkyMzIzKTsKKyAgICAgICAgICAgIHJ1bGVfX09wRXF1YWxpdHlfX0FsdGVybmF0aXZlcygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlT3BFcXVhbGl0eSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTEzMToxOiBlbnRyeVJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gOiBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjExMzI6MTogKCBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMTMzOjE6IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbl9pbl9lbnRyeVJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24yMzUwKTsKKyAgICAgICAgICAgIHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbjIzNTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjExNDA6MTogcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiA6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMTQ0OjI6ICggKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjExNDU6MTogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMTQ1OjE6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTE0NjoxOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMTQ3OjE6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMTQ3OjI6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzBfaW5fcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbjIzODMpOworICAgICAgICAgICAgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVPcENvbXBhcmUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTE1OToxOiBlbnRyeVJ1bGVPcENvbXBhcmUgOiBydWxlT3BDb21wYXJlIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlT3BDb21wYXJlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjExNjA6MTogKCBydWxlT3BDb21wYXJlIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMTYxOjE6IHJ1bGVPcENvbXBhcmUgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZU9wQ29tcGFyZV9pbl9lbnRyeVJ1bGVPcENvbXBhcmUyNDEwKTsKKyAgICAgICAgICAgIHJ1bGVPcENvbXBhcmUoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZU9wQ29tcGFyZTI0MTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZU9wQ29tcGFyZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlT3BDb21wYXJlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjExNjg6MTogcnVsZU9wQ29tcGFyZSA6ICggKCBydWxlX19PcENvbXBhcmVfX0FsdGVybmF0aXZlcyApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVPcENvbXBhcmUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTE3MjoyOiAoICggKCBydWxlX19PcENvbXBhcmVfX0FsdGVybmF0aXZlcyApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTE3MzoxOiAoICggcnVsZV9fT3BDb21wYXJlX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMTczOjE6ICggKCBydWxlX19PcENvbXBhcmVfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjExNzQ6MTogKCBydWxlX19PcENvbXBhcmVfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMTc1OjE6ICggcnVsZV9fT3BDb21wYXJlX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTE3NToyOiBydWxlX19PcENvbXBhcmVfX0FsdGVybmF0aXZlcworICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fT3BDb21wYXJlX19BbHRlcm5hdGl2ZXNfaW5fcnVsZU9wQ29tcGFyZTI0NDMpOworICAgICAgICAgICAgcnVsZV9fT3BDb21wYXJlX19BbHRlcm5hdGl2ZXMoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlT3BDb21wYXJlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMTg3OjE6IGVudHJ5UnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiA6IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTE4ODoxOiAoIHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjExODk6MTogcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX2luX2VudHJ5UnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbjI0NzApOworICAgICAgICAgICAgcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uMjQ3Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTE5NjoxOiBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEyMDA6MjogKCAoICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTIwMToxOiAoICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEyMDE6MTogKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMjAyOjE6ICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEyMDM6MTogKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEyMDM6MjogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMF9pbl9ydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uMjUwMyk7CisgICAgICAgICAgICBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZU9wT3RoZXIiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTIxNToxOiBlbnRyeVJ1bGVPcE90aGVyIDogcnVsZU9wT3RoZXIgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVPcE90aGVyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEyMTY6MTogKCBydWxlT3BPdGhlciBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTIxNzoxOiBydWxlT3BPdGhlciBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlclJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZU9wT3RoZXJfaW5fZW50cnlSdWxlT3BPdGhlcjI1MzApOworICAgICAgICAgICAgcnVsZU9wT3RoZXIoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVPcE90aGVyMjUzNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlT3BPdGhlciIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlT3BPdGhlciIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMjI0OjE6IHJ1bGVPcE90aGVyIDogKCAoIHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlcyApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVPcE90aGVyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEyMjg6MjogKCAoICggcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMjI5OjE6ICggKCBydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMjI5OjE6ICggKCBydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMjMwOjE6ICggcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMjMxOjE6ICggcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEyMzE6MjogcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXNfaW5fcnVsZU9wT3RoZXIyNTYzKTsKKyAgICAgICAgICAgIHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlcygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlT3BPdGhlciIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEyNDM6MTogZW50cnlSdWxlWEFkZGl0aXZlRXhwcmVzc2lvbiA6IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWEFkZGl0aXZlRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMjQ0OjE6ICggcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEyNDU6MTogcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQWRkaXRpdmVFeHByZXNzaW9uX2luX2VudHJ5UnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24yNTkwKTsKKyAgICAgICAgICAgIHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWEFkZGl0aXZlRXhwcmVzc2lvbjI1OTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTI1MjoxOiBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiA6ICggKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEyNTY6MjogKCAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEyNTc6MTogKCAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTI1NzoxOiAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMjU4OjE6ICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTI1OToxOiAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEyNTk6MjogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wX2luX3J1bGVYQWRkaXRpdmVFeHByZXNzaW9uMjYyMyk7CisgICAgICAgICAgICBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZU9wQWRkIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEyNzE6MTogZW50cnlSdWxlT3BBZGQgOiBydWxlT3BBZGQgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVPcEFkZCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMjcyOjE6ICggcnVsZU9wQWRkIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMjczOjE6IHJ1bGVPcEFkZCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBZGRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVPcEFkZF9pbl9lbnRyeVJ1bGVPcEFkZDI2NTApOworICAgICAgICAgICAgcnVsZU9wQWRkKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBZGRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZU9wQWRkMjY1Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlT3BBZGQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZU9wQWRkIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEyODA6MTogcnVsZU9wQWRkIDogKCAoIHJ1bGVfX09wQWRkX19BbHRlcm5hdGl2ZXMgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlT3BBZGQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTI4NDoyOiAoICggKCBydWxlX19PcEFkZF9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMjg1OjE6ICggKCBydWxlX19PcEFkZF9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTI4NToxOiAoICggcnVsZV9fT3BBZGRfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEyODY6MTogKCBydWxlX19PcEFkZF9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBZGRBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTI4NzoxOiAoIHJ1bGVfX09wQWRkX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTI4NzoyOiBydWxlX19PcEFkZF9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19PcEFkZF9fQWx0ZXJuYXRpdmVzX2luX3J1bGVPcEFkZDI2ODMpOworICAgICAgICAgICAgcnVsZV9fT3BBZGRfX0FsdGVybmF0aXZlcygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcEFkZEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZU9wQWRkIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTI5OToxOiBlbnRyeVJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIDogcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEzMDA6MTogKCBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTMwMToxOiBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25faW5fZW50cnlSdWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbjI3MTApOworICAgICAgICAgICAgcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uMjcxNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMzA4OjE6IHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTMxMjoyOiAoICggKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTMxMzoxOiAoICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMzEzOjE6ICggKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEzMTQ6MTogKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMzE1OjE6ICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTMxNToyOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzBfaW5fcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24yNzQzKTsKKyAgICAgICAgICAgIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlT3BNdWx0aSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMzI3OjE6IGVudHJ5UnVsZU9wTXVsdGkgOiBydWxlT3BNdWx0aSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZU9wTXVsdGkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTMyODoxOiAoIHJ1bGVPcE11bHRpIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMzI5OjE6IHJ1bGVPcE11bHRpIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlT3BNdWx0aV9pbl9lbnRyeVJ1bGVPcE11bHRpMjc3MCk7CisgICAgICAgICAgICBydWxlT3BNdWx0aSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZU9wTXVsdGkyNzc3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVPcE11bHRpIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcE11bHRpIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEzMzY6MTogcnVsZU9wTXVsdGkgOiAoICggcnVsZV9fT3BNdWx0aV9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZU9wTXVsdGkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTM0MDoyOiAoICggKCBydWxlX19PcE11bHRpX19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEzNDE6MTogKCAoIHJ1bGVfX09wTXVsdGlfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEzNDE6MTogKCAoIHJ1bGVfX09wTXVsdGlfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEzNDI6MTogKCBydWxlX19PcE11bHRpX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEzNDM6MTogKCBydWxlX19PcE11bHRpX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTM0MzoyOiBydWxlX19PcE11bHRpX19BbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX09wTXVsdGlfX0FsdGVybmF0aXZlc19pbl9ydWxlT3BNdWx0aTI4MDMpOworICAgICAgICAgICAgcnVsZV9fT3BNdWx0aV9fQWx0ZXJuYXRpdmVzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVPcE11bHRpIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhVbmFyeU9wZXJhdGlvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMzU1OjE6IGVudHJ5UnVsZVhVbmFyeU9wZXJhdGlvbiA6IHJ1bGVYVW5hcnlPcGVyYXRpb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYVW5hcnlPcGVyYXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTM1NjoxOiAoIHJ1bGVYVW5hcnlPcGVyYXRpb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEzNTc6MTogcnVsZVhVbmFyeU9wZXJhdGlvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWFVuYXJ5T3BlcmF0aW9uX2luX2VudHJ5UnVsZVhVbmFyeU9wZXJhdGlvbjI4MzApOworICAgICAgICAgICAgcnVsZVhVbmFyeU9wZXJhdGlvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWFVuYXJ5T3BlcmF0aW9uMjgzNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWFVuYXJ5T3BlcmF0aW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYVW5hcnlPcGVyYXRpb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTM2NDoxOiBydWxlWFVuYXJ5T3BlcmF0aW9uIDogKCAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhVbmFyeU9wZXJhdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMzY4OjI6ICggKCAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMzY5OjE6ICggKCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEzNjk6MTogKCAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTM3MDoxOiAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEzNzE6MTogKCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMzcxOjI6IHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YVW5hcnlPcGVyYXRpb25fX0FsdGVybmF0aXZlc19pbl9ydWxlWFVuYXJ5T3BlcmF0aW9uMjg2Myk7CisgICAgICAgICAgICBydWxlX19YVW5hcnlPcGVyYXRpb25fX0FsdGVybmF0aXZlcygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYVW5hcnlPcGVyYXRpb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlT3BVbmFyeSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMzgzOjE6IGVudHJ5UnVsZU9wVW5hcnkgOiBydWxlT3BVbmFyeSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZU9wVW5hcnkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTM4NDoxOiAoIHJ1bGVPcFVuYXJ5IEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMzg1OjE6IHJ1bGVPcFVuYXJ5IEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcFVuYXJ5UnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlT3BVbmFyeV9pbl9lbnRyeVJ1bGVPcFVuYXJ5Mjg5MCk7CisgICAgICAgICAgICBydWxlT3BVbmFyeSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wVW5hcnlSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZU9wVW5hcnkyODk3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVPcFVuYXJ5IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcFVuYXJ5IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEzOTI6MTogcnVsZU9wVW5hcnkgOiAoICggcnVsZV9fT3BVbmFyeV9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZU9wVW5hcnkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTM5NjoyOiAoICggKCBydWxlX19PcFVuYXJ5X19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEzOTc6MTogKCAoIHJ1bGVfX09wVW5hcnlfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEzOTc6MTogKCAoIHJ1bGVfX09wVW5hcnlfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEzOTg6MTogKCBydWxlX19PcFVuYXJ5X19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcFVuYXJ5QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEzOTk6MTogKCBydWxlX19PcFVuYXJ5X19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTM5OToyOiBydWxlX19PcFVuYXJ5X19BbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX09wVW5hcnlfX0FsdGVybmF0aXZlc19pbl9ydWxlT3BVbmFyeTI5MjMpOworICAgICAgICAgICAgcnVsZV9fT3BVbmFyeV9fQWx0ZXJuYXRpdmVzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wVW5hcnlBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVPcFVuYXJ5IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhDYXN0ZWRFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE0MTE6MTogZW50cnlSdWxlWENhc3RlZEV4cHJlc3Npb24gOiBydWxlWENhc3RlZEV4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYQ2FzdGVkRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNDEyOjE6ICggcnVsZVhDYXN0ZWRFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNDEzOjE6IHJ1bGVYQ2FzdGVkRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQ2FzdGVkRXhwcmVzc2lvbl9pbl9lbnRyeVJ1bGVYQ2FzdGVkRXhwcmVzc2lvbjI5NTApOworICAgICAgICAgICAgcnVsZVhDYXN0ZWRFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhDYXN0ZWRFeHByZXNzaW9uMjk1Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWENhc3RlZEV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhDYXN0ZWRFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE0MjA6MTogcnVsZVhDYXN0ZWRFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYQ2FzdGVkRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNDI0OjI6ICggKCAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTQyNToxOiAoICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTQyNToxOiAoICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTQyNjoxOiAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTQyNzoxOiAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNDI3OjI6IHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18wX2luX3J1bGVYQ2FzdGVkRXhwcmVzc2lvbjI5ODMpOworICAgICAgICAgICAgcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYQ2FzdGVkRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYUG9zdGZpeE9wZXJhdGlvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNDM5OjE6IGVudHJ5UnVsZVhQb3N0Zml4T3BlcmF0aW9uIDogcnVsZVhQb3N0Zml4T3BlcmF0aW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWFBvc3RmaXhPcGVyYXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTQ0MDoxOiAoIHJ1bGVYUG9zdGZpeE9wZXJhdGlvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTQ0MToxOiBydWxlWFBvc3RmaXhPcGVyYXRpb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWFBvc3RmaXhPcGVyYXRpb25faW5fZW50cnlSdWxlWFBvc3RmaXhPcGVyYXRpb24zMDEwKTsKKyAgICAgICAgICAgIHJ1bGVYUG9zdGZpeE9wZXJhdGlvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYUG9zdGZpeE9wZXJhdGlvbjMwMTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhQb3N0Zml4T3BlcmF0aW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYUG9zdGZpeE9wZXJhdGlvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNDQ4OjE6IHJ1bGVYUG9zdGZpeE9wZXJhdGlvbiA6ICggKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWFBvc3RmaXhPcGVyYXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTQ1MjoyOiAoICggKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE0NTM6MTogKCAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE0NTM6MTogKCAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE0NTQ6MTogKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE0NTU6MTogKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTQ1NToyOiBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMF9pbl9ydWxlWFBvc3RmaXhPcGVyYXRpb24zMDQzKTsKKyAgICAgICAgICAgIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWFBvc3RmaXhPcGVyYXRpb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlT3BQb3N0Zml4IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE0Njc6MTogZW50cnlSdWxlT3BQb3N0Zml4IDogcnVsZU9wUG9zdGZpeCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZU9wUG9zdGZpeCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNDY4OjE6ICggcnVsZU9wUG9zdGZpeCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTQ2OToxOiBydWxlT3BQb3N0Zml4IEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcFBvc3RmaXhSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVPcFBvc3RmaXhfaW5fZW50cnlSdWxlT3BQb3N0Zml4MzA3MCk7CisgICAgICAgICAgICBydWxlT3BQb3N0Zml4KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BQb3N0Zml4UnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVPcFBvc3RmaXgzMDc3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVPcFBvc3RmaXgiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZU9wUG9zdGZpeCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNDc2OjE6IHJ1bGVPcFBvc3RmaXggOiAoICggcnVsZV9fT3BQb3N0Zml4X19BbHRlcm5hdGl2ZXMgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlT3BQb3N0Zml4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE0ODA6MjogKCAoICggcnVsZV9fT3BQb3N0Zml4X19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE0ODE6MTogKCAoIHJ1bGVfX09wUG9zdGZpeF9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTQ4MToxOiAoICggcnVsZV9fT3BQb3N0Zml4X19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNDgyOjE6ICggcnVsZV9fT3BQb3N0Zml4X19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcFBvc3RmaXhBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTQ4MzoxOiAoIHJ1bGVfX09wUG9zdGZpeF9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE0ODM6MjogcnVsZV9fT3BQb3N0Zml4X19BbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX09wUG9zdGZpeF9fQWx0ZXJuYXRpdmVzX2luX3J1bGVPcFBvc3RmaXgzMTAzKTsKKyAgICAgICAgICAgIHJ1bGVfX09wUG9zdGZpeF9fQWx0ZXJuYXRpdmVzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wUG9zdGZpeEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZU9wUG9zdGZpeCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTQ5NToxOiBlbnRyeVJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwgOiBydWxlWE1lbWJlckZlYXR1cmVDYWxsIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWE1lbWJlckZlYXR1cmVDYWxsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE0OTY6MTogKCBydWxlWE1lbWJlckZlYXR1cmVDYWxsIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNDk3OjE6IHJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhNZW1iZXJGZWF0dXJlQ2FsbF9pbl9lbnRyeVJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwzMTMwKTsKKyAgICAgICAgICAgIHJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhNZW1iZXJGZWF0dXJlQ2FsbDMxMzcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhNZW1iZXJGZWF0dXJlQ2FsbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWE1lbWJlckZlYXR1cmVDYWxsIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE1MDQ6MTogcnVsZVhNZW1iZXJGZWF0dXJlQ2FsbCA6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhNZW1iZXJGZWF0dXJlQ2FsbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNTA4OjI6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE1MDk6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNTA5OjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTUxMDoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNTExOjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNTExOjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzBfaW5fcnVsZVhNZW1iZXJGZWF0dXJlQ2FsbDMxNjMpOworICAgICAgICAgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhNZW1iZXJGZWF0dXJlQ2FsbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYUHJpbWFyeUV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTUyMzoxOiBlbnRyeVJ1bGVYUHJpbWFyeUV4cHJlc3Npb24gOiBydWxlWFByaW1hcnlFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWFByaW1hcnlFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE1MjQ6MTogKCBydWxlWFByaW1hcnlFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNTI1OjE6IHJ1bGVYUHJpbWFyeUV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhQcmltYXJ5RXhwcmVzc2lvbl9pbl9lbnRyeVJ1bGVYUHJpbWFyeUV4cHJlc3Npb24zMTkwKTsKKyAgICAgICAgICAgIHJ1bGVYUHJpbWFyeUV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhQcmltYXJ5RXhwcmVzc2lvbjMxOTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhQcmltYXJ5RXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWFByaW1hcnlFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE1MzI6MTogcnVsZVhQcmltYXJ5RXhwcmVzc2lvbiA6ICggKCBydWxlX19YUHJpbWFyeUV4cHJlc3Npb25fX0FsdGVybmF0aXZlcyApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYUHJpbWFyeUV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTUzNjoyOiAoICggKCBydWxlX19YUHJpbWFyeUV4cHJlc3Npb25fX0FsdGVybmF0aXZlcyApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTUzNzoxOiAoICggcnVsZV9fWFByaW1hcnlFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNTM3OjE6ICggKCBydWxlX19YUHJpbWFyeUV4cHJlc3Npb25fX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE1Mzg6MTogKCBydWxlX19YUHJpbWFyeUV4cHJlc3Npb25fX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNTM5OjE6ICggcnVsZV9fWFByaW1hcnlFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTUzOToyOiBydWxlX19YUHJpbWFyeUV4cHJlc3Npb25fX0FsdGVybmF0aXZlcworICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWFByaW1hcnlFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfaW5fcnVsZVhQcmltYXJ5RXhwcmVzc2lvbjMyMjMpOworICAgICAgICAgICAgcnVsZV9fWFByaW1hcnlFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWFByaW1hcnlFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhMaXRlcmFsIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE1NTE6MTogZW50cnlSdWxlWExpdGVyYWwgOiBydWxlWExpdGVyYWwgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYTGl0ZXJhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNTUyOjE6ICggcnVsZVhMaXRlcmFsIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNTUzOjE6IHJ1bGVYTGl0ZXJhbCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYTGl0ZXJhbF9pbl9lbnRyeVJ1bGVYTGl0ZXJhbDMyNTApOworICAgICAgICAgICAgcnVsZVhMaXRlcmFsKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhMaXRlcmFsMzI1Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWExpdGVyYWwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhMaXRlcmFsIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE1NjA6MTogcnVsZVhMaXRlcmFsIDogKCAoIHJ1bGVfX1hMaXRlcmFsX19BbHRlcm5hdGl2ZXMgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWExpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTU2NDoyOiAoICggKCBydWxlX19YTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNTY1OjE6ICggKCBydWxlX19YTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTU2NToxOiAoICggcnVsZV9fWExpdGVyYWxfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE1NjY6MTogKCBydWxlX19YTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTU2NzoxOiAoIHJ1bGVfX1hMaXRlcmFsX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTU2NzoyOiBydWxlX19YTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzX2luX3J1bGVYTGl0ZXJhbDMyODMpOworICAgICAgICAgICAgcnVsZV9fWExpdGVyYWxfX0FsdGVybmF0aXZlcygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhMaXRlcmFsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhDb2xsZWN0aW9uTGl0ZXJhbCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNTc5OjE6IGVudHJ5UnVsZVhDb2xsZWN0aW9uTGl0ZXJhbCA6IHJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTU4MDoxOiAoIHJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE1ODE6MTogcnVsZVhDb2xsZWN0aW9uTGl0ZXJhbCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbGxlY3Rpb25MaXRlcmFsUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWENvbGxlY3Rpb25MaXRlcmFsX2luX2VudHJ5UnVsZVhDb2xsZWN0aW9uTGl0ZXJhbDMzMTApOworICAgICAgICAgICAgcnVsZVhDb2xsZWN0aW9uTGl0ZXJhbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDb2xsZWN0aW9uTGl0ZXJhbFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWENvbGxlY3Rpb25MaXRlcmFsMzMxNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWENvbGxlY3Rpb25MaXRlcmFsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTU4ODoxOiBydWxlWENvbGxlY3Rpb25MaXRlcmFsIDogKCAoIHJ1bGVfX1hDb2xsZWN0aW9uTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhDb2xsZWN0aW9uTGl0ZXJhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNTkyOjI6ICggKCAoIHJ1bGVfX1hDb2xsZWN0aW9uTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNTkzOjE6ICggKCBydWxlX19YQ29sbGVjdGlvbkxpdGVyYWxfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE1OTM6MTogKCAoIHJ1bGVfX1hDb2xsZWN0aW9uTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTU5NDoxOiAoIHJ1bGVfX1hDb2xsZWN0aW9uTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbGxlY3Rpb25MaXRlcmFsQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE1OTU6MTogKCBydWxlX19YQ29sbGVjdGlvbkxpdGVyYWxfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNTk1OjI6IHJ1bGVfX1hDb2xsZWN0aW9uTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YQ29sbGVjdGlvbkxpdGVyYWxfX0FsdGVybmF0aXZlc19pbl9ydWxlWENvbGxlY3Rpb25MaXRlcmFsMzM0Myk7CisgICAgICAgICAgICBydWxlX19YQ29sbGVjdGlvbkxpdGVyYWxfX0FsdGVybmF0aXZlcygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ29sbGVjdGlvbkxpdGVyYWxBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWFNldExpdGVyYWwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTYwNzoxOiBlbnRyeVJ1bGVYU2V0TGl0ZXJhbCA6IHJ1bGVYU2V0TGl0ZXJhbCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhTZXRMaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE2MDg6MTogKCBydWxlWFNldExpdGVyYWwgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE2MDk6MTogcnVsZVhTZXRMaXRlcmFsIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhTZXRMaXRlcmFsX2luX2VudHJ5UnVsZVhTZXRMaXRlcmFsMzM3MCk7CisgICAgICAgICAgICBydWxlWFNldExpdGVyYWwoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWFNldExpdGVyYWwzMzc3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYU2V0TGl0ZXJhbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWFNldExpdGVyYWwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTYxNjoxOiBydWxlWFNldExpdGVyYWwgOiAoICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhTZXRMaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE2MjA6MjogKCAoICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNjIxOjE6ICggKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNjIxOjE6ICggKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNjIyOjE6ICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNjIzOjE6ICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE2MjM6MjogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzBfaW5fcnVsZVhTZXRMaXRlcmFsMzQwMyk7CisgICAgICAgICAgICBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhTZXRMaXRlcmFsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhMaXN0TGl0ZXJhbCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNjM1OjE6IGVudHJ5UnVsZVhMaXN0TGl0ZXJhbCA6IHJ1bGVYTGlzdExpdGVyYWwgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYTGlzdExpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTYzNjoxOiAoIHJ1bGVYTGlzdExpdGVyYWwgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE2Mzc6MTogcnVsZVhMaXN0TGl0ZXJhbCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWExpc3RMaXRlcmFsX2luX2VudHJ5UnVsZVhMaXN0TGl0ZXJhbDM0MzApOworICAgICAgICAgICAgcnVsZVhMaXN0TGl0ZXJhbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWExpc3RMaXRlcmFsMzQzNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWExpc3RMaXRlcmFsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYTGlzdExpdGVyYWwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTY0NDoxOiBydWxlWExpc3RMaXRlcmFsIDogKCAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWExpc3RMaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE2NDg6MjogKCAoICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTY0OToxOiAoICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE2NDk6MTogKCAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNjUwOjE6ICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE2NTE6MTogKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE2NTE6MjogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMF9pbl9ydWxlWExpc3RMaXRlcmFsMzQ2Myk7CisgICAgICAgICAgICBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWExpc3RMaXRlcmFsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhDbG9zdXJlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE2NjM6MTogZW50cnlSdWxlWENsb3N1cmUgOiBydWxlWENsb3N1cmUgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYQ2xvc3VyZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNjY0OjE6ICggcnVsZVhDbG9zdXJlIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNjY1OjE6IHJ1bGVYQ2xvc3VyZSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQ2xvc3VyZV9pbl9lbnRyeVJ1bGVYQ2xvc3VyZTM0OTApOworICAgICAgICAgICAgcnVsZVhDbG9zdXJlKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhDbG9zdXJlMzQ5Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWENsb3N1cmUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhDbG9zdXJlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE2NzI6MTogcnVsZVhDbG9zdXJlIDogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYQ2xvc3VyZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNjc2OjI6ICggKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTY3NzoxOiAoICggcnVsZV9fWENsb3N1cmVfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTY3NzoxOiAoICggcnVsZV9fWENsb3N1cmVfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTY3ODoxOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTY3OToxOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNjc5OjI6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWENsb3N1cmVfX0dyb3VwX18wX2luX3J1bGVYQ2xvc3VyZTM1MjMpOworICAgICAgICAgICAgcnVsZV9fWENsb3N1cmVfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYQ2xvc3VyZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNjkxOjE6IGVudHJ5UnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlIDogcnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWEV4cHJlc3Npb25JbkNsb3N1cmUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTY5MjoxOiAoIHJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTY5MzoxOiBydWxlWEV4cHJlc3Npb25JbkNsb3N1cmUgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uSW5DbG9zdXJlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEV4cHJlc3Npb25JbkNsb3N1cmVfaW5fZW50cnlSdWxlWEV4cHJlc3Npb25JbkNsb3N1cmUzNTUwKTsKKyAgICAgICAgICAgIHJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uSW5DbG9zdXJlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZTM1NTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNzAwOjE6IHJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSA6ICggKCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWEV4cHJlc3Npb25JbkNsb3N1cmUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTcwNDoyOiAoICggKCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE3MDU6MTogKCAoIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE3MDU6MTogKCAoIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE3MDY6MTogKCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbkluQ2xvc3VyZUFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE3MDc6MTogKCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTcwNzoyOiBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMF9pbl9ydWxlWEV4cHJlc3Npb25JbkNsb3N1cmUzNTgzKTsKKyAgICAgICAgICAgIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbkluQ2xvc3VyZUFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWEV4cHJlc3Npb25JbkNsb3N1cmUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWFNob3J0Q2xvc3VyZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNzE5OjE6IGVudHJ5UnVsZVhTaG9ydENsb3N1cmUgOiBydWxlWFNob3J0Q2xvc3VyZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhTaG9ydENsb3N1cmUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTcyMDoxOiAoIHJ1bGVYU2hvcnRDbG9zdXJlIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNzIxOjE6IHJ1bGVYU2hvcnRDbG9zdXJlIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWFNob3J0Q2xvc3VyZV9pbl9lbnRyeVJ1bGVYU2hvcnRDbG9zdXJlMzYxMCk7CisgICAgICAgICAgICBydWxlWFNob3J0Q2xvc3VyZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhTaG9ydENsb3N1cmUzNjE3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYU2hvcnRDbG9zdXJlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYU2hvcnRDbG9zdXJlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE3Mjg6MTogcnVsZVhTaG9ydENsb3N1cmUgOiAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWFNob3J0Q2xvc3VyZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNzMyOjI6ICggKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNzMzOjE6ICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE3MzM6MTogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTczNDoxOiAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE3MzU6MTogKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNzM1OjI6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF9fMF9pbl9ydWxlWFNob3J0Q2xvc3VyZTM2NDMpOworICAgICAgICAgICAgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWFNob3J0Q2xvc3VyZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTc0NzoxOiBlbnRyeVJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24gOiBydWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE3NDg6MTogKCBydWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNzQ5OjE6IHJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9pbl9lbnRyeVJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24zNjcwKTsKKyAgICAgICAgICAgIHJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbjM2NzcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE3NTY6MTogcnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiA6ICggKCBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNzYwOjI6ICggKCAoIHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE3NjE6MTogKCAoIHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNzYxOjE6ICggKCBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTc2MjoxOiAoIHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNzYzOjE6ICggcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNzYzOjI6IHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzBfaW5fcnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbjM3MDMpOworICAgICAgICAgICAgcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYSWZFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE3NzU6MTogZW50cnlSdWxlWElmRXhwcmVzc2lvbiA6IHJ1bGVYSWZFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWElmRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNzc2OjE6ICggcnVsZVhJZkV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE3Nzc6MTogcnVsZVhJZkV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYSWZFeHByZXNzaW9uX2luX2VudHJ5UnVsZVhJZkV4cHJlc3Npb24zNzMwKTsKKyAgICAgICAgICAgIHJ1bGVYSWZFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WElmRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWElmRXhwcmVzc2lvbjM3MzcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhJZkV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhJZkV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTc4NDoxOiBydWxlWElmRXhwcmVzc2lvbiA6ICggKCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYSWZFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE3ODg6MjogKCAoICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE3ODk6MTogKCAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTc4OToxOiAoICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNzkwOjE6ICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTc5MToxOiAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE3OTE6MjogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18wX2luX3J1bGVYSWZFeHByZXNzaW9uMzc2Myk7CisgICAgICAgICAgICBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYSWZFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhTd2l0Y2hFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE4MDM6MTogZW50cnlSdWxlWFN3aXRjaEV4cHJlc3Npb24gOiBydWxlWFN3aXRjaEV4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYU3dpdGNoRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxODA0OjE6ICggcnVsZVhTd2l0Y2hFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxODA1OjE6IHJ1bGVYU3dpdGNoRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYU3dpdGNoRXhwcmVzc2lvbl9pbl9lbnRyeVJ1bGVYU3dpdGNoRXhwcmVzc2lvbjM3OTApOworICAgICAgICAgICAgcnVsZVhTd2l0Y2hFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhTd2l0Y2hFeHByZXNzaW9uMzc5Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWFN3aXRjaEV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhTd2l0Y2hFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE4MTI6MTogcnVsZVhTd2l0Y2hFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYU3dpdGNoRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxODE2OjI6ICggKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTgxNzoxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTgxNzoxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTgxODoxOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTgxOToxOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxODE5OjI6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18wX2luX3J1bGVYU3dpdGNoRXhwcmVzc2lvbjM4MjMpOworICAgICAgICAgICAgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYU3dpdGNoRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQ2FzZVBhcnQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTgzMToxOiBlbnRyeVJ1bGVYQ2FzZVBhcnQgOiBydWxlWENhc2VQYXJ0IEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWENhc2VQYXJ0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE4MzI6MTogKCBydWxlWENhc2VQYXJ0IEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxODMzOjE6IHJ1bGVYQ2FzZVBhcnQgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhDYXNlUGFydF9pbl9lbnRyeVJ1bGVYQ2FzZVBhcnQzODUwKTsKKyAgICAgICAgICAgIHJ1bGVYQ2FzZVBhcnQoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhDYXNlUGFydDM4NTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhDYXNlUGFydCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWENhc2VQYXJ0IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE4NDA6MTogcnVsZVhDYXNlUGFydCA6ICggKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhDYXNlUGFydCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxODQ0OjI6ICggKCAoIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE4NDU6MTogKCAoIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxODQ1OjE6ICggKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTg0NjoxOiAoIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxODQ3OjE6ICggcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxODQ3OjI6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzBfaW5fcnVsZVhDYXNlUGFydDM4ODMpOworICAgICAgICAgICAgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhDYXNlUGFydCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYRm9yTG9vcEV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTg1OToxOiBlbnRyeVJ1bGVYRm9yTG9vcEV4cHJlc3Npb24gOiBydWxlWEZvckxvb3BFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWEZvckxvb3BFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE4NjA6MTogKCBydWxlWEZvckxvb3BFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxODYxOjE6IHJ1bGVYRm9yTG9vcEV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhGb3JMb29wRXhwcmVzc2lvbl9pbl9lbnRyeVJ1bGVYRm9yTG9vcEV4cHJlc3Npb24zOTEwKTsKKyAgICAgICAgICAgIHJ1bGVYRm9yTG9vcEV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhGb3JMb29wRXhwcmVzc2lvbjM5MTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhGb3JMb29wRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWEZvckxvb3BFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE4Njg6MTogcnVsZVhGb3JMb29wRXhwcmVzc2lvbiA6ICggKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhGb3JMb29wRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxODcyOjI6ICggKCAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE4NzM6MTogKCAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxODczOjE6ICggKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTg3NDoxOiAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxODc1OjE6ICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxODc1OjI6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzBfaW5fcnVsZVhGb3JMb29wRXhwcmVzc2lvbjM5NDMpOworICAgICAgICAgICAgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhGb3JMb29wRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxODg3OjE6IGVudHJ5UnVsZVhCYXNpY0Zvckxvb3BFeHByZXNzaW9uIDogcnVsZVhCYXNpY0Zvckxvb3BFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTg4ODoxOiAoIHJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTg4OToxOiBydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25faW5fZW50cnlSdWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24zOTcwKTsKKyAgICAgICAgICAgIHJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbjM5NzcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhCYXNpY0Zvckxvb3BFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxODk2OjE6IHJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbiA6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTkwMDoyOiAoICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE5MDE6MTogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE5MDE6MTogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE5MDI6MTogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE5MDM6MTogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTkwMzoyOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMF9pbl9ydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb240MDAzKTsKKyAgICAgICAgICAgIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWFdoaWxlRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOTE1OjE6IGVudHJ5UnVsZVhXaGlsZUV4cHJlc3Npb24gOiBydWxlWFdoaWxlRXhwcmVzc2lvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhXaGlsZUV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTkxNjoxOiAoIHJ1bGVYV2hpbGVFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOTE3OjE6IHJ1bGVYV2hpbGVFeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYV2hpbGVFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWFdoaWxlRXhwcmVzc2lvbl9pbl9lbnRyeVJ1bGVYV2hpbGVFeHByZXNzaW9uNDAzMCk7CisgICAgICAgICAgICBydWxlWFdoaWxlRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhXaGlsZUV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhXaGlsZUV4cHJlc3Npb240MDM3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYV2hpbGVFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYV2hpbGVFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE5MjQ6MTogcnVsZVhXaGlsZUV4cHJlc3Npb24gOiAoICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWFdoaWxlRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOTI4OjI6ICggKCAoIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOTI5OjE6ICggKCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE5Mjk6MTogKCAoIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTkzMDoxOiAoIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFdoaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE5MzE6MTogKCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOTMxOjI6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMF9pbl9ydWxlWFdoaWxlRXhwcmVzc2lvbjQwNjMpOworICAgICAgICAgICAgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFdoaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWFdoaWxlRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYRG9XaGlsZUV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTk0MzoxOiBlbnRyeVJ1bGVYRG9XaGlsZUV4cHJlc3Npb24gOiBydWxlWERvV2hpbGVFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWERvV2hpbGVFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE5NDQ6MTogKCBydWxlWERvV2hpbGVFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOTQ1OjE6IHJ1bGVYRG9XaGlsZUV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhEb1doaWxlRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhEb1doaWxlRXhwcmVzc2lvbl9pbl9lbnRyeVJ1bGVYRG9XaGlsZUV4cHJlc3Npb240MDkwKTsKKyAgICAgICAgICAgIHJ1bGVYRG9XaGlsZUV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhEb1doaWxlRXhwcmVzc2lvbjQwOTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhEb1doaWxlRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWERvV2hpbGVFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE5NTI6MTogcnVsZVhEb1doaWxlRXhwcmVzc2lvbiA6ICggKCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhEb1doaWxlRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOTU2OjI6ICggKCAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE5NTc6MTogKCAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOTU3OjE6ICggKCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTk1ODoxOiAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOTU5OjE6ICggcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOTU5OjI6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzBfaW5fcnVsZVhEb1doaWxlRXhwcmVzc2lvbjQxMjMpOworICAgICAgICAgICAgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhEb1doaWxlRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQmxvY2tFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE5NzE6MTogZW50cnlSdWxlWEJsb2NrRXhwcmVzc2lvbiA6IHJ1bGVYQmxvY2tFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWEJsb2NrRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOTcyOjE6ICggcnVsZVhCbG9ja0V4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE5NzM6MTogcnVsZVhCbG9ja0V4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCbG9ja0V4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQmxvY2tFeHByZXNzaW9uX2luX2VudHJ5UnVsZVhCbG9ja0V4cHJlc3Npb240MTUwKTsKKyAgICAgICAgICAgIHJ1bGVYQmxvY2tFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEJsb2NrRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWEJsb2NrRXhwcmVzc2lvbjQxNTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhCbG9ja0V4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhCbG9ja0V4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTk4MDoxOiBydWxlWEJsb2NrRXhwcmVzc2lvbiA6ICggKCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYQmxvY2tFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE5ODQ6MjogKCAoICggcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE5ODU6MTogKCAoIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTk4NToxOiAoICggcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOTg2OjE6ICggcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQmxvY2tFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTk4NzoxOiAoIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE5ODc6MjogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18wX2luX3J1bGVYQmxvY2tFeHByZXNzaW9uNDE4Myk7CisgICAgICAgICAgICBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQmxvY2tFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYQmxvY2tFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOTk5OjE6IGVudHJ5UnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiA6IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjAwMDoxOiAoIHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIwMDE6MTogcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uX2luX2VudHJ5UnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbjQyMTApOworICAgICAgICAgICAgcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uNDIxNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjAwODoxOiBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uIDogKCAoIHJ1bGVfX1hFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMDEyOjI6ICggKCAoIHJ1bGVfX1hFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMDEzOjE6ICggKCBydWxlX19YRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIwMTM6MTogKCAoIHJ1bGVfX1hFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjAxNDoxOiAoIHJ1bGVfX1hFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIwMTU6MTogKCBydWxlX19YRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMDE1OjI6IHJ1bGVfX1hFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc19pbl9ydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uNDI0Myk7CisgICAgICAgICAgICBydWxlX19YRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlcygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWFZhcmlhYmxlRGVjbGFyYXRpb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjAyNzoxOiBlbnRyeVJ1bGVYVmFyaWFibGVEZWNsYXJhdGlvbiA6IHJ1bGVYVmFyaWFibGVEZWNsYXJhdGlvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIwMjg6MTogKCBydWxlWFZhcmlhYmxlRGVjbGFyYXRpb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIwMjk6MTogcnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uX2luX2VudHJ5UnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uNDI3MCk7CisgICAgICAgICAgICBydWxlWFZhcmlhYmxlRGVjbGFyYXRpb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWFZhcmlhYmxlRGVjbGFyYXRpb240Mjc3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYVmFyaWFibGVEZWNsYXJhdGlvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWFZhcmlhYmxlRGVjbGFyYXRpb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjAzNjoxOiBydWxlWFZhcmlhYmxlRGVjbGFyYXRpb24gOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIwNDA6MjogKCAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMDQxOjE6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMDQxOjE6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMDQyOjE6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMDQzOjE6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIwNDM6MjogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzBfaW5fcnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uNDMwMyk7CisgICAgICAgICAgICBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUp2bUZvcm1hbFBhcmFtZXRlciIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMDU1OjE6IGVudHJ5UnVsZUp2bUZvcm1hbFBhcmFtZXRlciA6IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjA1NjoxOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIwNTc6MTogcnVsZUp2bUZvcm1hbFBhcmFtZXRlciBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtRm9ybWFsUGFyYW1ldGVyUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlSnZtRm9ybWFsUGFyYW1ldGVyX2luX2VudHJ5UnVsZUp2bUZvcm1hbFBhcmFtZXRlcjQzMzApOworICAgICAgICAgICAgcnVsZUp2bUZvcm1hbFBhcmFtZXRlcigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bUZvcm1hbFBhcmFtZXRlclJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlSnZtRm9ybWFsUGFyYW1ldGVyNDMzNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlSnZtRm9ybWFsUGFyYW1ldGVyIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjA2NDoxOiBydWxlSnZtRm9ybWFsUGFyYW1ldGVyIDogKCAoIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIwNjg6MjogKCAoICggcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjA2OToxOiAoICggcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIwNjk6MTogKCAoIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMDcwOjE6ICggcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bUZvcm1hbFBhcmFtZXRlckFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIwNzE6MTogKCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIwNzE6MjogcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMF9pbl9ydWxlSnZtRm9ybWFsUGFyYW1ldGVyNDM2Myk7CisgICAgICAgICAgICBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bUZvcm1hbFBhcmFtZXRlckFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlSnZtRm9ybWFsUGFyYW1ldGVyIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjA4MzoxOiBlbnRyeVJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyIDogcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIwODQ6MTogKCBydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlciBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjA4NToxOiBydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlciBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RnVsbEp2bUZvcm1hbFBhcmFtZXRlclJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfaW5fZW50cnlSdWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlcjQzOTApOworICAgICAgICAgICAgcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRGdWxsSnZtRm9ybWFsUGFyYW1ldGVyUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyNDM5Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlciIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlciIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMDkyOjE6IHJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyIDogKCAoIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjA5NjoyOiAoICggKCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjA5NzoxOiAoICggcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMDk3OjE6ICggKCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIwOTg6MTogKCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMDk5OjE6ICggcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjA5OToyOiBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzBfaW5fcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXI0NDIzKTsKKyAgICAgICAgICAgIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEZlYXR1cmVDYWxsIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIxMTE6MTogZW50cnlSdWxlWEZlYXR1cmVDYWxsIDogcnVsZVhGZWF0dXJlQ2FsbCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhGZWF0dXJlQ2FsbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMTEyOjE6ICggcnVsZVhGZWF0dXJlQ2FsbCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjExMzoxOiBydWxlWEZlYXR1cmVDYWxsIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYRmVhdHVyZUNhbGxfaW5fZW50cnlSdWxlWEZlYXR1cmVDYWxsNDQ1MCk7CisgICAgICAgICAgICBydWxlWEZlYXR1cmVDYWxsKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYRmVhdHVyZUNhbGw0NDU3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYRmVhdHVyZUNhbGwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhGZWF0dXJlQ2FsbCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMTIwOjE6IHJ1bGVYRmVhdHVyZUNhbGwgOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYRmVhdHVyZUNhbGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjEyNDoyOiAoICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMTI1OjE6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjEyNToxOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIxMjY6MTogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjEyNzoxOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjEyNzoyOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18wX2luX3J1bGVYRmVhdHVyZUNhbGw0NDgzKTsKKyAgICAgICAgICAgIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYRmVhdHVyZUNhbGwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlRmVhdHVyZUNhbGxJRCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMTM5OjE6IGVudHJ5UnVsZUZlYXR1cmVDYWxsSUQgOiBydWxlRmVhdHVyZUNhbGxJRCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZUZlYXR1cmVDYWxsSUQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjE0MDoxOiAoIHJ1bGVGZWF0dXJlQ2FsbElEIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMTQxOjE6IHJ1bGVGZWF0dXJlQ2FsbElEIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGZWF0dXJlQ2FsbElEUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlRmVhdHVyZUNhbGxJRF9pbl9lbnRyeVJ1bGVGZWF0dXJlQ2FsbElENDUxMCk7CisgICAgICAgICAgICBydWxlRmVhdHVyZUNhbGxJRCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEZlYXR1cmVDYWxsSURSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZUZlYXR1cmVDYWxsSUQ0NTE3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVGZWF0dXJlQ2FsbElEIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVGZWF0dXJlQ2FsbElEIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIxNDg6MTogcnVsZUZlYXR1cmVDYWxsSUQgOiAoICggcnVsZV9fRmVhdHVyZUNhbGxJRF9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZUZlYXR1cmVDYWxsSUQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjE1MjoyOiAoICggKCBydWxlX19GZWF0dXJlQ2FsbElEX19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIxNTM6MTogKCAoIHJ1bGVfX0ZlYXR1cmVDYWxsSURfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIxNTM6MTogKCAoIHJ1bGVfX0ZlYXR1cmVDYWxsSURfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIxNTQ6MTogKCBydWxlX19GZWF0dXJlQ2FsbElEX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGZWF0dXJlQ2FsbElEQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIxNTU6MTogKCBydWxlX19GZWF0dXJlQ2FsbElEX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjE1NToyOiBydWxlX19GZWF0dXJlQ2FsbElEX19BbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX0ZlYXR1cmVDYWxsSURfX0FsdGVybmF0aXZlc19pbl9ydWxlRmVhdHVyZUNhbGxJRDQ1NDMpOworICAgICAgICAgICAgcnVsZV9fRmVhdHVyZUNhbGxJRF9fQWx0ZXJuYXRpdmVzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEZlYXR1cmVDYWxsSURBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVGZWF0dXJlQ2FsbElEIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUlkT3JTdXBlciIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMTY3OjE6IGVudHJ5UnVsZUlkT3JTdXBlciA6IHJ1bGVJZE9yU3VwZXIgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVJZE9yU3VwZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjE2ODoxOiAoIHJ1bGVJZE9yU3VwZXIgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIxNjk6MTogcnVsZUlkT3JTdXBlciBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SWRPclN1cGVyUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlSWRPclN1cGVyX2luX2VudHJ5UnVsZUlkT3JTdXBlcjQ1NzApOworICAgICAgICAgICAgcnVsZUlkT3JTdXBlcigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldElkT3JTdXBlclJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlSWRPclN1cGVyNDU3Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlSWRPclN1cGVyIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVJZE9yU3VwZXIiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjE3NjoxOiBydWxlSWRPclN1cGVyIDogKCAoIHJ1bGVfX0lkT3JTdXBlcl9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZUlkT3JTdXBlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMTgwOjI6ICggKCAoIHJ1bGVfX0lkT3JTdXBlcl9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMTgxOjE6ICggKCBydWxlX19JZE9yU3VwZXJfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIxODE6MTogKCAoIHJ1bGVfX0lkT3JTdXBlcl9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjE4MjoxOiAoIHJ1bGVfX0lkT3JTdXBlcl9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SWRPclN1cGVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIxODM6MTogKCBydWxlX19JZE9yU3VwZXJfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMTgzOjI6IHJ1bGVfX0lkT3JTdXBlcl9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19JZE9yU3VwZXJfX0FsdGVybmF0aXZlc19pbl9ydWxlSWRPclN1cGVyNDYwMyk7CisgICAgICAgICAgICBydWxlX19JZE9yU3VwZXJfX0FsdGVybmF0aXZlcygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRJZE9yU3VwZXJBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVJZE9yU3VwZXIiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWENvbnN0cnVjdG9yQ2FsbCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMTk1OjE6IGVudHJ5UnVsZVhDb25zdHJ1Y3RvckNhbGwgOiBydWxlWENvbnN0cnVjdG9yQ2FsbCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhDb25zdHJ1Y3RvckNhbGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjE5NjoxOiAoIHJ1bGVYQ29uc3RydWN0b3JDYWxsIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMTk3OjE6IHJ1bGVYQ29uc3RydWN0b3JDYWxsIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWENvbnN0cnVjdG9yQ2FsbF9pbl9lbnRyeVJ1bGVYQ29uc3RydWN0b3JDYWxsNDYzMCk7CisgICAgICAgICAgICBydWxlWENvbnN0cnVjdG9yQ2FsbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhDb25zdHJ1Y3RvckNhbGw0NjM3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYQ29uc3RydWN0b3JDYWxsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQ29uc3RydWN0b3JDYWxsIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIyMDQ6MTogcnVsZVhDb25zdHJ1Y3RvckNhbGwgOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWENvbnN0cnVjdG9yQ2FsbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMjA4OjI6ICggKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMjA5OjE6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIyMDk6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjIxMDoxOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIyMTE6MTogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMjExOjI6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMF9pbl9ydWxlWENvbnN0cnVjdG9yQ2FsbDQ2NjMpOworICAgICAgICAgICAgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWENvbnN0cnVjdG9yQ2FsbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQm9vbGVhbkxpdGVyYWwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjIyMzoxOiBlbnRyeVJ1bGVYQm9vbGVhbkxpdGVyYWwgOiBydWxlWEJvb2xlYW5MaXRlcmFsIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWEJvb2xlYW5MaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIyMjQ6MTogKCBydWxlWEJvb2xlYW5MaXRlcmFsIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMjI1OjE6IHJ1bGVYQm9vbGVhbkxpdGVyYWwgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCb29sZWFuTGl0ZXJhbFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhCb29sZWFuTGl0ZXJhbF9pbl9lbnRyeVJ1bGVYQm9vbGVhbkxpdGVyYWw0NjkwKTsKKyAgICAgICAgICAgIHJ1bGVYQm9vbGVhbkxpdGVyYWwoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQm9vbGVhbkxpdGVyYWxSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhCb29sZWFuTGl0ZXJhbDQ2OTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhCb29sZWFuTGl0ZXJhbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWEJvb2xlYW5MaXRlcmFsIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIyMzI6MTogcnVsZVhCb29sZWFuTGl0ZXJhbCA6ICggKCBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhCb29sZWFuTGl0ZXJhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMjM2OjI6ICggKCAoIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIyMzc6MTogKCAoIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMjM3OjE6ICggKCBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjIzODoxOiAoIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQm9vbGVhbkxpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMjM5OjE6ICggcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMjM5OjI6IHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzBfaW5fcnVsZVhCb29sZWFuTGl0ZXJhbDQ3MjMpOworICAgICAgICAgICAgcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQm9vbGVhbkxpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhCb29sZWFuTGl0ZXJhbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYTnVsbExpdGVyYWwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjI1MToxOiBlbnRyeVJ1bGVYTnVsbExpdGVyYWwgOiBydWxlWE51bGxMaXRlcmFsIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWE51bGxMaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIyNTI6MTogKCBydWxlWE51bGxMaXRlcmFsIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMjUzOjE6IHJ1bGVYTnVsbExpdGVyYWwgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhOdWxsTGl0ZXJhbFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhOdWxsTGl0ZXJhbF9pbl9lbnRyeVJ1bGVYTnVsbExpdGVyYWw0NzUwKTsKKyAgICAgICAgICAgIHJ1bGVYTnVsbExpdGVyYWwoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTnVsbExpdGVyYWxSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhOdWxsTGl0ZXJhbDQ3NTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhOdWxsTGl0ZXJhbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWE51bGxMaXRlcmFsIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIyNjA6MTogcnVsZVhOdWxsTGl0ZXJhbCA6ICggKCBydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhOdWxsTGl0ZXJhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMjY0OjI6ICggKCAoIHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIyNjU6MTogKCAoIHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMjY1OjE6ICggKCBydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjI2NjoxOiAoIHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTnVsbExpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMjY3OjE6ICggcnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMjY3OjI6IHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzBfaW5fcnVsZVhOdWxsTGl0ZXJhbDQ3ODMpOworICAgICAgICAgICAgcnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTnVsbExpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhOdWxsTGl0ZXJhbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYTnVtYmVyTGl0ZXJhbCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMjc5OjE6IGVudHJ5UnVsZVhOdW1iZXJMaXRlcmFsIDogcnVsZVhOdW1iZXJMaXRlcmFsIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWE51bWJlckxpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjI4MDoxOiAoIHJ1bGVYTnVtYmVyTGl0ZXJhbCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjI4MToxOiBydWxlWE51bWJlckxpdGVyYWwgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhOdW1iZXJMaXRlcmFsUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWE51bWJlckxpdGVyYWxfaW5fZW50cnlSdWxlWE51bWJlckxpdGVyYWw0ODEwKTsKKyAgICAgICAgICAgIHJ1bGVYTnVtYmVyTGl0ZXJhbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhOdW1iZXJMaXRlcmFsUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYTnVtYmVyTGl0ZXJhbDQ4MTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhOdW1iZXJMaXRlcmFsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYTnVtYmVyTGl0ZXJhbCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMjg4OjE6IHJ1bGVYTnVtYmVyTGl0ZXJhbCA6ICggKCBydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWE51bWJlckxpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjI5MjoyOiAoICggKCBydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIyOTM6MTogKCAoIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIyOTM6MTogKCAoIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIyOTQ6MTogKCBydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTnVtYmVyTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIyOTU6MTogKCBydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjI5NToyOiBydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMF9pbl9ydWxlWE51bWJlckxpdGVyYWw0ODQzKTsKKyAgICAgICAgICAgIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTnVtYmVyTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWE51bWJlckxpdGVyYWwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWFN0cmluZ0xpdGVyYWwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjMwNzoxOiBlbnRyeVJ1bGVYU3RyaW5nTGl0ZXJhbCA6IHJ1bGVYU3RyaW5nTGl0ZXJhbCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhTdHJpbmdMaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIzMDg6MTogKCBydWxlWFN0cmluZ0xpdGVyYWwgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIzMDk6MTogcnVsZVhTdHJpbmdMaXRlcmFsIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3RyaW5nTGl0ZXJhbFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhTdHJpbmdMaXRlcmFsX2luX2VudHJ5UnVsZVhTdHJpbmdMaXRlcmFsNDg3MCk7CisgICAgICAgICAgICBydWxlWFN0cmluZ0xpdGVyYWwoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYU3RyaW5nTGl0ZXJhbFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWFN0cmluZ0xpdGVyYWw0ODc3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYU3RyaW5nTGl0ZXJhbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWFN0cmluZ0xpdGVyYWwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjMxNjoxOiBydWxlWFN0cmluZ0xpdGVyYWwgOiAoICggcnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhTdHJpbmdMaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIzMjA6MjogKCAoICggcnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMzIxOjE6ICggKCBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMzIxOjE6ICggKCBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMzIyOjE6ICggcnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN0cmluZ0xpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMzIzOjE6ICggcnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIzMjM6MjogcnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzBfaW5fcnVsZVhTdHJpbmdMaXRlcmFsNDkwMyk7CisgICAgICAgICAgICBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFN0cmluZ0xpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhTdHJpbmdMaXRlcmFsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhUeXBlTGl0ZXJhbCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMzM1OjE6IGVudHJ5UnVsZVhUeXBlTGl0ZXJhbCA6IHJ1bGVYVHlwZUxpdGVyYWwgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYVHlwZUxpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjMzNjoxOiAoIHJ1bGVYVHlwZUxpdGVyYWwgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIzMzc6MTogcnVsZVhUeXBlTGl0ZXJhbCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWFR5cGVMaXRlcmFsX2luX2VudHJ5UnVsZVhUeXBlTGl0ZXJhbDQ5MzApOworICAgICAgICAgICAgcnVsZVhUeXBlTGl0ZXJhbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhUeXBlTGl0ZXJhbFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWFR5cGVMaXRlcmFsNDkzNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWFR5cGVMaXRlcmFsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYVHlwZUxpdGVyYWwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjM0NDoxOiBydWxlWFR5cGVMaXRlcmFsIDogKCAoIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWFR5cGVMaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIzNDg6MjogKCAoICggcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjM0OToxOiAoICggcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIzNDk6MTogKCAoIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMzUwOjE6ICggcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhUeXBlTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIzNTE6MTogKCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIzNTE6MjogcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMF9pbl9ydWxlWFR5cGVMaXRlcmFsNDk2Myk7CisgICAgICAgICAgICBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhUeXBlTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWFR5cGVMaXRlcmFsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhUaHJvd0V4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjM2MzoxOiBlbnRyeVJ1bGVYVGhyb3dFeHByZXNzaW9uIDogcnVsZVhUaHJvd0V4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYVGhyb3dFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIzNjQ6MTogKCBydWxlWFRocm93RXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjM2NToxOiBydWxlWFRocm93RXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFRocm93RXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhUaHJvd0V4cHJlc3Npb25faW5fZW50cnlSdWxlWFRocm93RXhwcmVzc2lvbjQ5OTApOworICAgICAgICAgICAgcnVsZVhUaHJvd0V4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVGhyb3dFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYVGhyb3dFeHByZXNzaW9uNDk5Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWFRocm93RXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWFRocm93RXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMzcyOjE6IHJ1bGVYVGhyb3dFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhUaHJvd0V4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjM3NjoyOiAoICggKCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjM3NzoxOiAoICggcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMzc3OjE6ICggKCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIzNzg6MTogKCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhUaHJvd0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMzc5OjE6ICggcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjM3OToyOiBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzBfaW5fcnVsZVhUaHJvd0V4cHJlc3Npb241MDIzKTsKKyAgICAgICAgICAgIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhUaHJvd0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhUaHJvd0V4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWFJldHVybkV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjM5MToxOiBlbnRyeVJ1bGVYUmV0dXJuRXhwcmVzc2lvbiA6IHJ1bGVYUmV0dXJuRXhwcmVzc2lvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhSZXR1cm5FeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIzOTI6MTogKCBydWxlWFJldHVybkV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIzOTM6MTogcnVsZVhSZXR1cm5FeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUmV0dXJuRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhSZXR1cm5FeHByZXNzaW9uX2luX2VudHJ5UnVsZVhSZXR1cm5FeHByZXNzaW9uNTA1MCk7CisgICAgICAgICAgICBydWxlWFJldHVybkV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUmV0dXJuRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWFJldHVybkV4cHJlc3Npb241MDU3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYUmV0dXJuRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWFJldHVybkV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjQwMDoxOiBydWxlWFJldHVybkV4cHJlc3Npb24gOiAoICggcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhSZXR1cm5FeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI0MDQ6MjogKCAoICggcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNDA1OjE6ICggKCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNDA1OjE6ICggKCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNDA2OjE6ICggcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJldHVybkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNDA3OjE6ICggcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI0MDc6MjogcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzBfaW5fcnVsZVhSZXR1cm5FeHByZXNzaW9uNTA4Myk7CisgICAgICAgICAgICBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFJldHVybkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhSZXR1cm5FeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI0MTk6MTogZW50cnlSdWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24gOiBydWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNDIwOjE6ICggcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNDIxOjE6IHJ1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9pbl9lbnRyeVJ1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbjUxMTApOworICAgICAgICAgICAgcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uNTExNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI0Mjg6MTogcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNDMyOjI6ICggKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjQzMzoxOiAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjQzMzoxOiAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjQzNDoxOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjQzNToxOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNDM1OjI6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18wX2luX3J1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbjUxNDMpOworICAgICAgICAgICAgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNDQ3OjE6IGVudHJ5UnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uIDogcnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjQ0ODoxOiAoIHJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjQ0OToxOiBydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb25faW5fZW50cnlSdWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb241MTcwKTsKKyAgICAgICAgICAgIHJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbjUxNzcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNDU2OjE6IHJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbiA6ICggKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjQ2MDoyOiAoICggKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI0NjE6MTogKCAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI0NjE6MTogKCAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI0NjI6MTogKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI0NjM6MTogKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjQ2MzoyOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMF9pbl9ydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb241MjAzKTsKKyAgICAgICAgICAgIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWENhdGNoQ2xhdXNlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI0NzU6MTogZW50cnlSdWxlWENhdGNoQ2xhdXNlIDogcnVsZVhDYXRjaENsYXVzZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhDYXRjaENsYXVzZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNDc2OjE6ICggcnVsZVhDYXRjaENsYXVzZSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjQ3NzoxOiBydWxlWENhdGNoQ2xhdXNlIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2F0Y2hDbGF1c2VSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQ2F0Y2hDbGF1c2VfaW5fZW50cnlSdWxlWENhdGNoQ2xhdXNlNTIzMCk7CisgICAgICAgICAgICBydWxlWENhdGNoQ2xhdXNlKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENhdGNoQ2xhdXNlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYQ2F0Y2hDbGF1c2U1MjM3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYQ2F0Y2hDbGF1c2UiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhDYXRjaENsYXVzZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNDg0OjE6IHJ1bGVYQ2F0Y2hDbGF1c2UgOiAoICggcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYQ2F0Y2hDbGF1c2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjQ4ODoyOiAoICggKCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNDg5OjE6ICggKCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjQ4OToxOiAoICggcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI0OTA6MTogKCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhdGNoQ2xhdXNlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjQ5MToxOiAoIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjQ5MToyOiBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18wX2luX3J1bGVYQ2F0Y2hDbGF1c2U1MjYzKTsKKyAgICAgICAgICAgIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENhdGNoQ2xhdXNlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYQ2F0Y2hDbGF1c2UiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlTnVtYmVyIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI1MDM6MTogZW50cnlSdWxlTnVtYmVyIDogcnVsZU51bWJlciBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZU51bWJlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCUhpZGRlblRva2VucyBteUhpZGRlblRva2VuU3RhdGUgPSAoKFh0ZXh0VG9rZW5TdHJlYW0paW5wdXQpLnNldEhpZGRlblRva2VucygpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNTA3OjE6ICggcnVsZU51bWJlciBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjUwODoxOiBydWxlTnVtYmVyIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVOdW1iZXJfaW5fZW50cnlSdWxlTnVtYmVyNTI5NSk7CisgICAgICAgICAgICBydWxlTnVtYmVyKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVOdW1iZXI1MzAyKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCW15SGlkZGVuVG9rZW5TdGF0ZS5yZXN0b3JlKCk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVOdW1iZXIiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZU51bWJlciIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNTE4OjE6IHJ1bGVOdW1iZXIgOiAoICggcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXMgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlTnVtYmVyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCUhpZGRlblRva2VucyBteUhpZGRlblRva2VuU3RhdGUgPSAoKFh0ZXh0VG9rZW5TdHJlYW0paW5wdXQpLnNldEhpZGRlblRva2VucygpOworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI1MjM6MjogKCAoICggcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI1MjQ6MTogKCAoIHJ1bGVfX051bWJlcl9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjUyNDoxOiAoICggcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNTI1OjE6ICggcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjUyNjoxOiAoIHJ1bGVfX051bWJlcl9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI1MjY6MjogcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX051bWJlcl9fQWx0ZXJuYXRpdmVzX2luX3J1bGVOdW1iZXI1MzMyKTsKKyAgICAgICAgICAgIHJ1bGVfX051bWJlcl9fQWx0ZXJuYXRpdmVzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworICAgICAgICAgICAgCW15SGlkZGVuVG9rZW5TdGF0ZS5yZXN0b3JlKCk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlTnVtYmVyIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUp2bVR5cGVSZWZlcmVuY2UiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjU0MToxOiBlbnRyeVJ1bGVKdm1UeXBlUmVmZXJlbmNlIDogcnVsZUp2bVR5cGVSZWZlcmVuY2UgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVKdm1UeXBlUmVmZXJlbmNlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI1NDI6MTogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjU0MzoxOiBydWxlSnZtVHlwZVJlZmVyZW5jZSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUp2bVR5cGVSZWZlcmVuY2VfaW5fZW50cnlSdWxlSnZtVHlwZVJlZmVyZW5jZTUzNjEpOworICAgICAgICAgICAgcnVsZUp2bVR5cGVSZWZlcmVuY2UoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUmVmZXJlbmNlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVKdm1UeXBlUmVmZXJlbmNlNTM2OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlSnZtVHlwZVJlZmVyZW5jZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlSnZtVHlwZVJlZmVyZW5jZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNTUwOjE6IHJ1bGVKdm1UeXBlUmVmZXJlbmNlIDogKCAoIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlcyApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVKdm1UeXBlUmVmZXJlbmNlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI1NTQ6MjogKCAoICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNTU1OjE6ICggKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNTU1OjE6ICggKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNTU2OjE6ICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNTU3OjE6ICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI1NTc6MjogcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXNfaW5fcnVsZUp2bVR5cGVSZWZlcmVuY2U1Mzk0KTsKKyAgICAgICAgICAgIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlcygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlSnZtVHlwZVJlZmVyZW5jZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVBcnJheUJyYWNrZXRzIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI1Njk6MTogZW50cnlSdWxlQXJyYXlCcmFja2V0cyA6IHJ1bGVBcnJheUJyYWNrZXRzIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlQXJyYXlCcmFja2V0cygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNTcwOjE6ICggcnVsZUFycmF5QnJhY2tldHMgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI1NzE6MTogcnVsZUFycmF5QnJhY2tldHMgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEFycmF5QnJhY2tldHNSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVBcnJheUJyYWNrZXRzX2luX2VudHJ5UnVsZUFycmF5QnJhY2tldHM1NDIxKTsKKyAgICAgICAgICAgIHJ1bGVBcnJheUJyYWNrZXRzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0QXJyYXlCcmFja2V0c1J1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlQXJyYXlCcmFja2V0czU0MjgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZUFycmF5QnJhY2tldHMiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUFycmF5QnJhY2tldHMiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjU3ODoxOiBydWxlQXJyYXlCcmFja2V0cyA6ICggKCBydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVBcnJheUJyYWNrZXRzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI1ODI6MjogKCAoICggcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI1ODM6MTogKCAoIHJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjU4MzoxOiAoICggcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNTg0OjE6ICggcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRBcnJheUJyYWNrZXRzQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjU4NToxOiAoIHJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI1ODU6MjogcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18wX2luX3J1bGVBcnJheUJyYWNrZXRzNTQ1NCk7CisgICAgICAgICAgICBydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRBcnJheUJyYWNrZXRzQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVBcnJheUJyYWNrZXRzIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhGdW5jdGlvblR5cGVSZWYiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjU5NzoxOiBlbnRyeVJ1bGVYRnVuY3Rpb25UeXBlUmVmIDogcnVsZVhGdW5jdGlvblR5cGVSZWYgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYRnVuY3Rpb25UeXBlUmVmKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI1OTg6MTogKCBydWxlWEZ1bmN0aW9uVHlwZVJlZiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjU5OToxOiBydWxlWEZ1bmN0aW9uVHlwZVJlZiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZlJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhGdW5jdGlvblR5cGVSZWZfaW5fZW50cnlSdWxlWEZ1bmN0aW9uVHlwZVJlZjU0ODEpOworICAgICAgICAgICAgcnVsZVhGdW5jdGlvblR5cGVSZWYoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYRnVuY3Rpb25UeXBlUmVmNTQ4OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWEZ1bmN0aW9uVHlwZVJlZiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWEZ1bmN0aW9uVHlwZVJlZiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjA2OjE6IHJ1bGVYRnVuY3Rpb25UeXBlUmVmIDogKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhGdW5jdGlvblR5cGVSZWYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjYxMDoyOiAoICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjYxMToxOiAoICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjExOjE6ICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2MTI6MTogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjEzOjE6ICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjYxMzoyOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzBfaW5fcnVsZVhGdW5jdGlvblR5cGVSZWY1NTE0KTsKKyAgICAgICAgICAgIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhGdW5jdGlvblR5cGVSZWYiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjYyNToxOiBlbnRyeVJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSA6IHJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2MjY6MTogKCBydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2Mjc6MTogcnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX2luX2VudHJ5UnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlNTU0MSk7CisgICAgICAgICAgICBydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2U1NTQ4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjYzNDoxOiBydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UgOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2Mzg6MjogKCAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjM5OjE6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjM5OjE6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjQwOjE6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjQxOjE6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2NDE6MjogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzBfaW5fcnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlNTU3NCk7CisgICAgICAgICAgICBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjUzOjE6IGVudHJ5UnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSA6IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjY1NDoxOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2NTU6MTogcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlX2luX2VudHJ5UnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZTU2MDEpOworICAgICAgICAgICAgcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlNTYwOCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjY2MjoxOiBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlIDogKCAoIHJ1bGVfX0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjY2OjI6ICggKCAoIHJ1bGVfX0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjY3OjE6ICggKCBydWxlX19Kdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2Njc6MTogKCAoIHJ1bGVfX0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjY2ODoxOiAoIHJ1bGVfX0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2Njk6MTogKCBydWxlX19Kdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjY5OjI6IHJ1bGVfX0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19Kdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlc19pbl9ydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlNTYzNCk7CisgICAgICAgICAgICBydWxlX19Kdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlcygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2ODE6MTogZW50cnlSdWxlSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlIDogcnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjgyOjE6ICggcnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjY4MzoxOiBydWxlSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfaW5fZW50cnlSdWxlSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlNTY2MSk7CisgICAgICAgICAgICBydWxlSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2U1NjY4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjkwOjE6IHJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UgOiAoICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjY5NDoyOiAoICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjk1OjE6ICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjY5NToxOiAoICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2OTY6MTogKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjY5NzoxOiAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjY5NzoyOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wX2luX3J1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2U1Njk0KTsKKyAgICAgICAgICAgIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlSnZtVXBwZXJCb3VuZCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNzA5OjE6IGVudHJ5UnVsZUp2bVVwcGVyQm91bmQgOiBydWxlSnZtVXBwZXJCb3VuZCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZUp2bVVwcGVyQm91bmQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjcxMDoxOiAoIHJ1bGVKdm1VcHBlckJvdW5kIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNzExOjE6IHJ1bGVKdm1VcHBlckJvdW5kIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlSnZtVXBwZXJCb3VuZF9pbl9lbnRyeVJ1bGVKdm1VcHBlckJvdW5kNTcyMSk7CisgICAgICAgICAgICBydWxlSnZtVXBwZXJCb3VuZCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZUp2bVVwcGVyQm91bmQ1NzI4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVKdm1VcHBlckJvdW5kIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVKdm1VcHBlckJvdW5kIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI3MTg6MTogcnVsZUp2bVVwcGVyQm91bmQgOiAoICggcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlSnZtVXBwZXJCb3VuZCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNzIyOjI6ICggKCAoIHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNzIzOjE6ICggKCBydWxlX19Kdm1VcHBlckJvdW5kX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI3MjM6MTogKCAoIHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjcyNDoxOiAoIHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI3MjU6MTogKCBydWxlX19Kdm1VcHBlckJvdW5kX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNzI1OjI6IHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19Kdm1VcHBlckJvdW5kX19Hcm91cF9fMF9pbl9ydWxlSnZtVXBwZXJCb3VuZDU3NTQpOworICAgICAgICAgICAgcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlSnZtVXBwZXJCb3VuZCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVKdm1VcHBlckJvdW5kQW5kZWQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjczNzoxOiBlbnRyeVJ1bGVKdm1VcHBlckJvdW5kQW5kZWQgOiBydWxlSnZtVXBwZXJCb3VuZEFuZGVkIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlSnZtVXBwZXJCb3VuZEFuZGVkKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI3Mzg6MTogKCBydWxlSnZtVXBwZXJCb3VuZEFuZGVkIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNzM5OjE6IHJ1bGVKdm1VcHBlckJvdW5kQW5kZWQgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRBbmRlZFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUp2bVVwcGVyQm91bmRBbmRlZF9pbl9lbnRyeVJ1bGVKdm1VcHBlckJvdW5kQW5kZWQ1NzgxKTsKKyAgICAgICAgICAgIHJ1bGVKdm1VcHBlckJvdW5kQW5kZWQoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kQW5kZWRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZUp2bVVwcGVyQm91bmRBbmRlZDU3ODgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZUp2bVVwcGVyQm91bmRBbmRlZCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlSnZtVXBwZXJCb3VuZEFuZGVkIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI3NDY6MTogcnVsZUp2bVVwcGVyQm91bmRBbmRlZCA6ICggKCBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZUp2bVVwcGVyQm91bmRBbmRlZCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNzUwOjI6ICggKCAoIHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI3NTE6MTogKCAoIHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNzUxOjE6ICggKCBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjc1MjoxOiAoIHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kQW5kZWRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNzUzOjE6ICggcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNzUzOjI6IHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzBfaW5fcnVsZUp2bVVwcGVyQm91bmRBbmRlZDU4MTQpOworICAgICAgICAgICAgcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kQW5kZWRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUp2bVVwcGVyQm91bmRBbmRlZCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVKdm1Mb3dlckJvdW5kIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI3NjU6MTogZW50cnlSdWxlSnZtTG93ZXJCb3VuZCA6IHJ1bGVKdm1Mb3dlckJvdW5kIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlSnZtTG93ZXJCb3VuZCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNzY2OjE6ICggcnVsZUp2bUxvd2VyQm91bmQgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI3Njc6MTogcnVsZUp2bUxvd2VyQm91bmQgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVKdm1Mb3dlckJvdW5kX2luX2VudHJ5UnVsZUp2bUxvd2VyQm91bmQ1ODQxKTsKKyAgICAgICAgICAgIHJ1bGVKdm1Mb3dlckJvdW5kKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlSnZtTG93ZXJCb3VuZDU4NDgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZUp2bUxvd2VyQm91bmQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUp2bUxvd2VyQm91bmQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjc3NDoxOiBydWxlSnZtTG93ZXJCb3VuZCA6ICggKCBydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVKdm1Mb3dlckJvdW5kKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI3Nzg6MjogKCAoICggcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI3Nzk6MTogKCAoIHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjc3OToxOiAoICggcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNzgwOjE6ICggcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Mb3dlckJvdW5kQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjc4MToxOiAoIHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI3ODE6MjogcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18wX2luX3J1bGVKdm1Mb3dlckJvdW5kNTg3NCk7CisgICAgICAgICAgICBydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Mb3dlckJvdW5kQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVKdm1Mb3dlckJvdW5kIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUp2bUxvd2VyQm91bmRBbmRlZCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNzkzOjE6IGVudHJ5UnVsZUp2bUxvd2VyQm91bmRBbmRlZCA6IHJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjc5NDoxOiAoIHJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI3OTU6MTogcnVsZUp2bUxvd2VyQm91bmRBbmRlZCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFuZGVkUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlSnZtTG93ZXJCb3VuZEFuZGVkX2luX2VudHJ5UnVsZUp2bUxvd2VyQm91bmRBbmRlZDU5MDEpOworICAgICAgICAgICAgcnVsZUp2bUxvd2VyQm91bmRBbmRlZCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRBbmRlZFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlSnZtTG93ZXJCb3VuZEFuZGVkNTkwOCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlSnZtTG93ZXJCb3VuZEFuZGVkIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjgwMjoxOiBydWxlSnZtTG93ZXJCb3VuZEFuZGVkIDogKCAoIHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlSnZtTG93ZXJCb3VuZEFuZGVkKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI4MDY6MjogKCAoICggcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjgwNzoxOiAoICggcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI4MDc6MTogKCAoIHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyODA4OjE6ICggcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRBbmRlZEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI4MDk6MTogKCBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI4MDk6MjogcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMF9pbl9ydWxlSnZtTG93ZXJCb3VuZEFuZGVkNTkzNCk7CisgICAgICAgICAgICBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRBbmRlZEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlSnZtTG93ZXJCb3VuZEFuZGVkIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjgyMzoxOiBlbnRyeVJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkIDogcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI4MjQ6MTogKCBydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjgyNToxOiBydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfaW5fZW50cnlSdWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZDU5NjMpOworICAgICAgICAgICAgcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkNTk3MCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyODMyOjE6IHJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkIDogKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjgzNjoyOiAoICggKCBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjgzNzoxOiAoICggcnVsZV9fUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyODM3OjE6ICggKCBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI4Mzg6MTogKCBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyODM5OjE6ICggcnVsZV9fUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjgzOToyOiBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZF9fR3JvdXBfXzBfaW5fcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQ1OTk2KTsKKyAgICAgICAgICAgIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEltcG9ydERlY2xhcmF0aW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI4NTM6MTogZW50cnlSdWxlWEltcG9ydERlY2xhcmF0aW9uIDogcnVsZVhJbXBvcnREZWNsYXJhdGlvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhJbXBvcnREZWNsYXJhdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyODU0OjE6ICggcnVsZVhJbXBvcnREZWNsYXJhdGlvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjg1NToxOiBydWxlWEltcG9ydERlY2xhcmF0aW9uIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYSW1wb3J0RGVjbGFyYXRpb25faW5fZW50cnlSdWxlWEltcG9ydERlY2xhcmF0aW9uNjAyNSk7CisgICAgICAgICAgICBydWxlWEltcG9ydERlY2xhcmF0aW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYSW1wb3J0RGVjbGFyYXRpb242MDMyKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYSW1wb3J0RGVjbGFyYXRpb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhJbXBvcnREZWNsYXJhdGlvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyODYyOjE6IHJ1bGVYSW1wb3J0RGVjbGFyYXRpb24gOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYSW1wb3J0RGVjbGFyYXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjg2NjoyOiAoICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyODY3OjE6ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjg2NzoxOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI4Njg6MTogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjg2OToxOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjg2OToyOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18wX2luX3J1bGVYSW1wb3J0RGVjbGFyYXRpb242MDU4KTsKKyAgICAgICAgICAgIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYSW1wb3J0RGVjbGFyYXRpb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI4ODE6MTogZW50cnlSdWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0IDogcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyODgyOjE6ICggcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjg4MzoxOiBydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0IEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfaW5fZW50cnlSdWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0NjA4NSk7CisgICAgICAgICAgICBydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0UnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQ2MDkyKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyODkwOjE6IHJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQgOiAoICggKCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wICkgKSAoICggcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMCApKiApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjg5NDoyOiAoICggKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAgKSApICggKCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wICkqICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyODk1OjE6ICggKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAgKSApICggKCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wICkqICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjg5NToxOiAoICggKCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wICkgKSAoICggcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMCApKiApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI4OTY6MTogKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAgKSApICggKCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wICkqICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI4OTY6MTogKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyODk3OjE6ICggcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI4OTg6MTogKCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI4OTg6MjogcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMF9pbl9ydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0NjEyMCk7CisgICAgICAgICAgICBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyOTAxOjE6ICggKCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wICkqICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI5MDI6MTogKCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wICkqCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI5MDM6MTogKCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wICkqCisgICAgICAgICAgICBsb29wMjoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0Mj0yOworICAgICAgICAgICAgICAgIGludCBMQTJfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEEyXzA9PVJVTEVfSUQpICkgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEEyXzIgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTJfMj09NDMpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0Mj0xOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQyKSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjkwMzoyOiBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMF9pbl9ydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0NjEzMik7CisgICAgICAgICAgICAJICAgIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBicmVhayBsb29wMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlU2FzaE9yaWVudGF0aW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI5MTc6MTogcnVsZVNhc2hPcmllbnRhdGlvbiA6ICggKCBydWxlX19TYXNoT3JpZW50YXRpb25fX0FsdGVybmF0aXZlcyApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVTYXNoT3JpZW50YXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjkyMToxOiAoICggKCBydWxlX19TYXNoT3JpZW50YXRpb25fX0FsdGVybmF0aXZlcyApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjkyMjoxOiAoICggcnVsZV9fU2FzaE9yaWVudGF0aW9uX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyOTIyOjE6ICggKCBydWxlX19TYXNoT3JpZW50YXRpb25fX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI5MjM6MTogKCBydWxlX19TYXNoT3JpZW50YXRpb25fX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFNhc2hPcmllbnRhdGlvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyOTI0OjE6ICggcnVsZV9fU2FzaE9yaWVudGF0aW9uX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjkyNDoyOiBydWxlX19TYXNoT3JpZW50YXRpb25fX0FsdGVybmF0aXZlcworICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fU2FzaE9yaWVudGF0aW9uX19BbHRlcm5hdGl2ZXNfaW5fcnVsZVNhc2hPcmllbnRhdGlvbjYxNzIpOworICAgICAgICAgICAgcnVsZV9fU2FzaE9yaWVudGF0aW9uX19BbHRlcm5hdGl2ZXMoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0U2FzaE9yaWVudGF0aW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlU2FzaE9yaWVudGF0aW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1BlcnNwZWN0aXZlRWxlbWVudF9fQWx0ZXJuYXRpdmVzIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI5MzU6MTogcnVsZV9fUGVyc3BlY3RpdmVFbGVtZW50X19BbHRlcm5hdGl2ZXMgOiAoICggcnVsZVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lciApIHwgKCBydWxlUGVyc3BlY3RpdmVQYXJ0U3RhY2sgKSB8ICggcnVsZVBlcnNwZWN0aXZlUGFydCApICk7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fUGVyc3BlY3RpdmVFbGVtZW50X19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjkzOToxOiAoICggcnVsZVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lciApIHwgKCBydWxlUGVyc3BlY3RpdmVQYXJ0U3RhY2sgKSB8ICggcnVsZVBlcnNwZWN0aXZlUGFydCApICkKKyAgICAgICAgICAgIGludCBhbHQzPTM7CisgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKKyAgICAgICAgICAgIGNhc2UgNjI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDM9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY2OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQzPTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2NzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0Mz0zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQorICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDMsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MykgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI5NDA6MTogKCBydWxlUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyOTQwOjE6ICggcnVsZVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lciApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI5NDE6MTogcnVsZVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lcgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUVsZW1lbnRBY2Nlc3MoKS5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJQYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX2luX3J1bGVfX1BlcnNwZWN0aXZlRWxlbWVudF9fQWx0ZXJuYXRpdmVzNjIwNyk7CisgICAgICAgICAgICAgICAgICAgIHJ1bGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlRWxlbWVudEFjY2VzcygpLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lclBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyOTQ2OjY6ICggcnVsZVBlcnNwZWN0aXZlUGFydFN0YWNrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyOTQ2OjY6ICggcnVsZVBlcnNwZWN0aXZlUGFydFN0YWNrICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjk0NzoxOiBydWxlUGVyc3BlY3RpdmVQYXJ0U3RhY2sKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVFbGVtZW50QWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tQYXJzZXJSdWxlQ2FsbF8xKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUGVyc3BlY3RpdmVQYXJ0U3RhY2tfaW5fcnVsZV9fUGVyc3BlY3RpdmVFbGVtZW50X19BbHRlcm5hdGl2ZXM2MjI0KTsKKyAgICAgICAgICAgICAgICAgICAgcnVsZVBlcnNwZWN0aXZlUGFydFN0YWNrKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUVsZW1lbnRBY2Nlc3MoKS5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja1BhcnNlclJ1bGVDYWxsXzEoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDMgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyOTUyOjY6ICggcnVsZVBlcnNwZWN0aXZlUGFydCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjk1Mjo2OiAoIHJ1bGVQZXJzcGVjdGl2ZVBhcnQgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyOTUzOjE6IHJ1bGVQZXJzcGVjdGl2ZVBhcnQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVFbGVtZW50QWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVQYXJ0UGFyc2VyUnVsZUNhbGxfMigpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVBlcnNwZWN0aXZlUGFydF9pbl9ydWxlX19QZXJzcGVjdGl2ZUVsZW1lbnRfX0FsdGVybmF0aXZlczYyNDEpOworICAgICAgICAgICAgICAgICAgICBydWxlUGVyc3BlY3RpdmVQYXJ0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUVsZW1lbnRBY2Nlc3MoKS5nZXRQZXJzcGVjdGl2ZVBhcnRQYXJzZXJSdWxlQ2FsbF8yKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fUGVyc3BlY3RpdmVFbGVtZW50X19BbHRlcm5hdGl2ZXMiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fUGVyc3BlY3RpdmVWaWV3X19BbHRlcm5hdGl2ZXMiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjk2MzoxOiBydWxlX19QZXJzcGVjdGl2ZVZpZXdfX0FsdGVybmF0aXZlcyA6ICggKCBydWxlUGVyc3BlY3RpdmVTZWxlY3Rpb24gKSB8ICggcnVsZVBlcnNwZWN0aXZlVGFibGUgKSB8ICggcnVsZVBlcnNwZWN0aXZlQ2hhcnQgKSB8ICggcnVsZVBlcnNwZWN0aXZlUmVwb3J0ICkgfCAoIHJ1bGVQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbiApIHwgKCBydWxlUGVyc3BlY3RpdmVUb3BvbG9neSApIHwgKCBydWxlUGVyc3BlY3RpdmVEaWFsb2cgKSB8ICggcnVsZVBlcnNwZWN0aXZlQlBNTiApIHwgKCBydWxlUGVyc3BlY3RpdmVHcmlkICkgKTsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19QZXJzcGVjdGl2ZVZpZXdfX0FsdGVybmF0aXZlcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyOTY3OjE6ICggKCBydWxlUGVyc3BlY3RpdmVTZWxlY3Rpb24gKSB8ICggcnVsZVBlcnNwZWN0aXZlVGFibGUgKSB8ICggcnVsZVBlcnNwZWN0aXZlQ2hhcnQgKSB8ICggcnVsZVBlcnNwZWN0aXZlUmVwb3J0ICkgfCAoIHJ1bGVQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbiApIHwgKCBydWxlUGVyc3BlY3RpdmVUb3BvbG9neSApIHwgKCBydWxlUGVyc3BlY3RpdmVEaWFsb2cgKSB8ICggcnVsZVBlcnNwZWN0aXZlQlBNTiApIHwgKCBydWxlUGVyc3BlY3RpdmVHcmlkICkgKQorICAgICAgICAgICAgaW50IGFsdDQ9OTsKKyAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgY2FzZSA2OToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0ND0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzA6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDQ9MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDcyOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ0PTM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3MzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0ND00OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDQ9NTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc1OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ0PTY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3NjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0ND03OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDQ9ODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDcxOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ0PTk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CisgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNCwgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQ0KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjk2ODoxOiAoIHJ1bGVQZXJzcGVjdGl2ZVNlbGVjdGlvbiApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjk2ODoxOiAoIHJ1bGVQZXJzcGVjdGl2ZVNlbGVjdGlvbiApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI5Njk6MTogcnVsZVBlcnNwZWN0aXZlU2VsZWN0aW9uCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVmlld0FjY2VzcygpLmdldFBlcnNwZWN0aXZlU2VsZWN0aW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVBlcnNwZWN0aXZlU2VsZWN0aW9uX2luX3J1bGVfX1BlcnNwZWN0aXZlVmlld19fQWx0ZXJuYXRpdmVzNjI3Myk7CisgICAgICAgICAgICAgICAgICAgIHJ1bGVQZXJzcGVjdGl2ZVNlbGVjdGlvbigpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVWaWV3QWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVTZWxlY3Rpb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjk3NDo2OiAoIHJ1bGVQZXJzcGVjdGl2ZVRhYmxlICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyOTc0OjY6ICggcnVsZVBlcnNwZWN0aXZlVGFibGUgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyOTc1OjE6IHJ1bGVQZXJzcGVjdGl2ZVRhYmxlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVmlld0FjY2VzcygpLmdldFBlcnNwZWN0aXZlVGFibGVQYXJzZXJSdWxlQ2FsbF8xKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUGVyc3BlY3RpdmVUYWJsZV9pbl9ydWxlX19QZXJzcGVjdGl2ZVZpZXdfX0FsdGVybmF0aXZlczYyOTApOworICAgICAgICAgICAgICAgICAgICBydWxlUGVyc3BlY3RpdmVUYWJsZSgpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVWaWV3QWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVUYWJsZVBhcnNlclJ1bGVDYWxsXzEoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDMgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyOTgwOjY6ICggcnVsZVBlcnNwZWN0aXZlQ2hhcnQgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI5ODA6NjogKCBydWxlUGVyc3BlY3RpdmVDaGFydCApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI5ODE6MTogcnVsZVBlcnNwZWN0aXZlQ2hhcnQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVWaWV3QWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVDaGFydFBhcnNlclJ1bGVDYWxsXzIoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVQZXJzcGVjdGl2ZUNoYXJ0X2luX3J1bGVfX1BlcnNwZWN0aXZlVmlld19fQWx0ZXJuYXRpdmVzNjMwNyk7CisgICAgICAgICAgICAgICAgICAgIHJ1bGVQZXJzcGVjdGl2ZUNoYXJ0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVZpZXdBY2Nlc3MoKS5nZXRQZXJzcGVjdGl2ZUNoYXJ0UGFyc2VyUnVsZUNhbGxfMigpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNCA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI5ODY6NjogKCBydWxlUGVyc3BlY3RpdmVSZXBvcnQgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI5ODY6NjogKCBydWxlUGVyc3BlY3RpdmVSZXBvcnQgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyOTg3OjE6IHJ1bGVQZXJzcGVjdGl2ZVJlcG9ydAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVZpZXdBY2Nlc3MoKS5nZXRQZXJzcGVjdGl2ZVJlcG9ydFBhcnNlclJ1bGVDYWxsXzMoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVQZXJzcGVjdGl2ZVJlcG9ydF9pbl9ydWxlX19QZXJzcGVjdGl2ZVZpZXdfX0FsdGVybmF0aXZlczYzMjQpOworICAgICAgICAgICAgICAgICAgICBydWxlUGVyc3BlY3RpdmVSZXBvcnQoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVmlld0FjY2VzcygpLmdldFBlcnNwZWN0aXZlUmVwb3J0UGFyc2VyUnVsZUNhbGxfMygpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI5OTI6NjogKCBydWxlUGVyc3BlY3RpdmVPcmdhbml6YXRpb24gKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI5OTI6NjogKCBydWxlUGVyc3BlY3RpdmVPcmdhbml6YXRpb24gKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyOTkzOjE6IHJ1bGVQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVZpZXdBY2Nlc3MoKS5nZXRQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvblBhcnNlclJ1bGVDYWxsXzQoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbl9pbl9ydWxlX19QZXJzcGVjdGl2ZVZpZXdfX0FsdGVybmF0aXZlczYzNDEpOworICAgICAgICAgICAgICAgICAgICBydWxlUGVyc3BlY3RpdmVPcmdhbml6YXRpb24oKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVmlld0FjY2VzcygpLmdldFBlcnNwZWN0aXZlT3JnYW5pemF0aW9uUGFyc2VyUnVsZUNhbGxfNCgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI5OTg6NjogKCBydWxlUGVyc3BlY3RpdmVUb3BvbG9neSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjk5ODo2OiAoIHJ1bGVQZXJzcGVjdGl2ZVRvcG9sb2d5ICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjk5OToxOiBydWxlUGVyc3BlY3RpdmVUb3BvbG9neQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVZpZXdBY2Nlc3MoKS5nZXRQZXJzcGVjdGl2ZVRvcG9sb2d5UGFyc2VyUnVsZUNhbGxfNSgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVBlcnNwZWN0aXZlVG9wb2xvZ3lfaW5fcnVsZV9fUGVyc3BlY3RpdmVWaWV3X19BbHRlcm5hdGl2ZXM2MzU4KTsKKyAgICAgICAgICAgICAgICAgICAgcnVsZVBlcnNwZWN0aXZlVG9wb2xvZ3koKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVmlld0FjY2VzcygpLmdldFBlcnNwZWN0aXZlVG9wb2xvZ3lQYXJzZXJSdWxlQ2FsbF81KCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA3IDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzAwNDo2OiAoIHJ1bGVQZXJzcGVjdGl2ZURpYWxvZyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzAwNDo2OiAoIHJ1bGVQZXJzcGVjdGl2ZURpYWxvZyApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMwMDU6MTogcnVsZVBlcnNwZWN0aXZlRGlhbG9nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVmlld0FjY2VzcygpLmdldFBlcnNwZWN0aXZlRGlhbG9nUGFyc2VyUnVsZUNhbGxfNigpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVBlcnNwZWN0aXZlRGlhbG9nX2luX3J1bGVfX1BlcnNwZWN0aXZlVmlld19fQWx0ZXJuYXRpdmVzNjM3NSk7CisgICAgICAgICAgICAgICAgICAgIHJ1bGVQZXJzcGVjdGl2ZURpYWxvZygpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVWaWV3QWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVEaWFsb2dQYXJzZXJSdWxlQ2FsbF82KCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA4IDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzAxMDo2OiAoIHJ1bGVQZXJzcGVjdGl2ZUJQTU4gKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMwMTA6NjogKCBydWxlUGVyc3BlY3RpdmVCUE1OICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzAxMToxOiBydWxlUGVyc3BlY3RpdmVCUE1OCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVmlld0FjY2VzcygpLmdldFBlcnNwZWN0aXZlQlBNTlBhcnNlclJ1bGVDYWxsXzcoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVQZXJzcGVjdGl2ZUJQTU5faW5fcnVsZV9fUGVyc3BlY3RpdmVWaWV3X19BbHRlcm5hdGl2ZXM2MzkyKTsKKyAgICAgICAgICAgICAgICAgICAgcnVsZVBlcnNwZWN0aXZlQlBNTigpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVWaWV3QWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVCUE1OUGFyc2VyUnVsZUNhbGxfNygpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgOSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMwMTY6NjogKCBydWxlUGVyc3BlY3RpdmVHcmlkICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMDE2OjY6ICggcnVsZVBlcnNwZWN0aXZlR3JpZCApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMwMTc6MTogcnVsZVBlcnNwZWN0aXZlR3JpZAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVZpZXdBY2Nlc3MoKS5nZXRQZXJzcGVjdGl2ZUdyaWRQYXJzZXJSdWxlQ2FsbF84KCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUGVyc3BlY3RpdmVHcmlkX2luX3J1bGVfX1BlcnNwZWN0aXZlVmlld19fQWx0ZXJuYXRpdmVzNjQwOSk7CisgICAgICAgICAgICAgICAgICAgIHJ1bGVQZXJzcGVjdGl2ZUdyaWQoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVmlld0FjY2VzcygpLmdldFBlcnNwZWN0aXZlR3JpZFBhcnNlclJ1bGVDYWxsXzgoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19QZXJzcGVjdGl2ZVZpZXdfX0FsdGVybmF0aXZlcyIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbl9fQWx0ZXJuYXRpdmVzXzNfMSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMDI3OjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19BbHRlcm5hdGl2ZXNfM18xIDogKCAoICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wICkgKSB8ICggKCBydWxlX19YQW5ub3RhdGlvbl9fVmFsdWVBc3NpZ25tZW50XzNfMV8xICkgKSApOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uX19BbHRlcm5hdGl2ZXNfM18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMwMzE6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wICkgKSB8ICggKCBydWxlX19YQW5ub3RhdGlvbl9fVmFsdWVBc3NpZ25tZW50XzNfMV8xICkgKSApCisgICAgICAgICAgICBpbnQgYWx0NT0yOworICAgICAgICAgICAgYWx0NSA9IGRmYTUucHJlZGljdChpbnB1dCk7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMDMyOjE6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzAgKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzAzMjoxOiAoICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wICkgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMDMzOjE6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRHcm91cF8zXzFfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzAzNDoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMwMzQ6MjogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wX2luX3J1bGVfX1hBbm5vdGF0aW9uX19BbHRlcm5hdGl2ZXNfM18xNjQ0MSk7CisgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMCgpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRHcm91cF8zXzFfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMwMzg6NjogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19WYWx1ZUFzc2lnbm1lbnRfM18xXzEgKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzAzODo2OiAoICggcnVsZV9fWEFubm90YXRpb25fX1ZhbHVlQXNzaWdubWVudF8zXzFfMSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzAzOToxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uX19WYWx1ZUFzc2lnbm1lbnRfM18xXzEgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldFZhbHVlQXNzaWdubWVudF8zXzFfMSgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzA0MDoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uX19WYWx1ZUFzc2lnbm1lbnRfM18xXzEgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMDQwOjI6IHJ1bGVfX1hBbm5vdGF0aW9uX19WYWx1ZUFzc2lnbm1lbnRfM18xXzEKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YQW5ub3RhdGlvbl9fVmFsdWVBc3NpZ25tZW50XzNfMV8xX2luX3J1bGVfX1hBbm5vdGF0aW9uX19BbHRlcm5hdGl2ZXNfM18xNjQ1OSk7CisgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uX19WYWx1ZUFzc2lnbm1lbnRfM18xXzEoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0VmFsdWVBc3NpZ25tZW50XzNfMV8xKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fWEFubm90YXRpb25fX0FsdGVybmF0aXZlc18zXzEiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fQWx0ZXJuYXRpdmVzIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMwNDk6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fQWx0ZXJuYXRpdmVzIDogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMCApICkgfCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMCApICkgKTsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzA1MzoxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18wICkgKSB8ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18wICkgKSApCisgICAgICAgICAgICBpbnQgYWx0Nj0yOworICAgICAgICAgICAgYWx0NiA9IGRmYTYucHJlZGljdChpbnB1dCk7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDYpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMDU0OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18wICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMwNTQ6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMwNTU6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18wICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEdyb3VwXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMwNTY6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzA1NjoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18wCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMF9pbl9ydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19BbHRlcm5hdGl2ZXM2NDkyKTsKKyAgICAgICAgICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMCgpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEdyb3VwXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMDYwOjY6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18wICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMwNjA6NjogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMwNjE6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18wICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEdyb3VwXzEoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMwNjI6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzA2MjoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18wCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMF9pbl9ydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19BbHRlcm5hdGl2ZXM2NTEwKTsKKyAgICAgICAgICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMCgpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEdyb3VwXzEoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19BbHRlcm5hdGl2ZXMiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0FsdGVybmF0aXZlcyIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMDcxOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19BbHRlcm5hdGl2ZXMgOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMCApICkgfCAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICk7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0FsdGVybmF0aXZlcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMDc1OjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18wICkgKSB8ICggcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgaW50IGFsdDc9MjsKKyAgICAgICAgICAgIGFsdDcgPSBkZmE3LnByZWRpY3QoaW5wdXQpOworICAgICAgICAgICAgc3dpdGNoIChhbHQ3KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzA3NjoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzAgKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzA3NjoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMwNzc6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0R3JvdXBfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzA3ODoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzA3ODoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18wX2luX3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19BbHRlcm5hdGl2ZXM2NTQzKTsKKyAgICAgICAgICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzAoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0R3JvdXBfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMwODI6NjogKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMwODI6NjogKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMDgzOjE6IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMSgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uX2luX3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19BbHRlcm5hdGl2ZXM2NTYxKTsKKyAgICAgICAgICAgICAgICAgICAgcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMSgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19BbHRlcm5hdGl2ZXMiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25PckV4cHJlc3Npb25fX0FsdGVybmF0aXZlcyIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMDkzOjE6IHJ1bGVfX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMgOiAoICggcnVsZVhBbm5vdGF0aW9uICkgfCAoIHJ1bGVYRXhwcmVzc2lvbiApICk7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25PckV4cHJlc3Npb25fX0FsdGVybmF0aXZlcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMDk3OjE6ICggKCBydWxlWEFubm90YXRpb24gKSB8ICggcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgaW50IGFsdDg9MjsKKyAgICAgICAgICAgIGludCBMQThfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQThfMD09NzgpICkgeworICAgICAgICAgICAgICAgIGFsdDg9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBOF8wPj1SVUxFX0lEICYmIExBOF8wPD1SVUxFX0RFQ0lNQUwpfHxMQThfMD09Mjd8fChMQThfMD49MzQgJiYgTEE4XzA8PTM1KXx8TEE4XzA9PTQwfHwoTEE4XzA+PTQ1ICYmIExBOF8wPD01MCl8fExBOF8wPT01NHx8TEE4XzA9PTc5fHwoTEE4XzA+PTgzICYmIExBOF8wPD04NCl8fExBOF8wPT04OHx8TEE4XzA9PTkwfHwoTEE4XzA+PTk0ICYmIExBOF8wPD0xMDIpfHxMQThfMD09MTA0fHxMQThfMD09MTE0KSApIHsKKyAgICAgICAgICAgICAgICBhbHQ4PTI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CisgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgOCwgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0OCkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMwOTg6MTogKCBydWxlWEFubm90YXRpb24gKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMwOTg6MTogKCBydWxlWEFubm90YXRpb24gKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMDk5OjE6IHJ1bGVYQW5ub3RhdGlvbgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhBbm5vdGF0aW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBbm5vdGF0aW9uX2luX3J1bGVfX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXM2NTkzKTsKKyAgICAgICAgICAgICAgICAgICAgcnVsZVhBbm5vdGF0aW9uKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhBbm5vdGF0aW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMxMDQ6NjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMxMDQ6NjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMTA1OjE6IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMSgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhFeHByZXNzaW9uX2luX3J1bGVfX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXM2NjEwKTsKKyAgICAgICAgICAgICAgICAgICAgcnVsZVhFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMSgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFzc2lnbm1lbnRfX0FsdGVybmF0aXZlcyIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMTE1OjE6IHJ1bGVfX1hBc3NpZ25tZW50X19BbHRlcm5hdGl2ZXMgOiAoICggKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMCApICkgfCAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzAgKSApICk7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFzc2lnbm1lbnRfX0FsdGVybmF0aXZlcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMTE5OjE6ICggKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18wICkgKSB8ICggKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMCApICkgKQorICAgICAgICAgICAgaW50IGFsdDk9MjsKKyAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgY2FzZSBSVUxFX0lEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgTEE5XzEgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgIGlmICggKExBOV8xPT0xMykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDk9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTlfMT09RU9GfHwoTEE5XzE+PVJVTEVfSUQgJiYgTEE5XzE8PVJVTEVfREVDSU1BTCl8fChMQTlfMT49MTQgJiYgTEE5XzE8PTUwKXx8KExBOV8xPj01NCAmJiBMQTlfMTw9NTUpfHwoTEE5XzE+PTc5ICYmIExBOV8xPD0xMDUpfHwoTEE5XzE+PTExMCAmJiBMQTlfMTw9MTExKXx8KExBOV8xPj0xMTMgJiYgTEE5XzE8PTExNCkpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQ5PTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CisgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA5LCAxLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0NToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IExBOV8yID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTlfMj09RU9GfHwoTEE5XzI+PVJVTEVfSUQgJiYgTEE5XzI8PVJVTEVfREVDSU1BTCl8fChMQTlfMj49MTQgJiYgTEE5XzI8PTUwKXx8KExBOV8yPj01NCAmJiBMQTlfMjw9NTUpfHwoTEE5XzI+PTc5ICYmIExBOV8yPD0xMDUpfHwoTEE5XzI+PTExMCAmJiBMQTlfMjw9MTExKXx8KExBOV8yPj0xMTMgJiYgTEE5XzI8PTExNCkpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQ5PTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE5XzI9PTEzKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0OT0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQorICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgOSwgMiwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDY6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBMQTlfMyA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEE5XzM9PUVPRnx8KExBOV8zPj1SVUxFX0lEICYmIExBOV8zPD1SVUxFX0RFQ0lNQUwpfHwoTEE5XzM+PTE0ICYmIExBOV8zPD01MCl8fChMQTlfMz49NTQgJiYgTEE5XzM8PTU1KXx8KExBOV8zPj03OSAmJiBMQTlfMzw9MTA1KXx8KExBOV8zPj0xMTAgJiYgTEE5XzM8PTExMSl8fChMQTlfMz49MTEzICYmIExBOV8zPD0xMTQpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0OT0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBOV8zPT0xMykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDk9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gO30KKyAgICAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDksIDMsIGlucHV0KTsKKworICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ3OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgTEE5XzQgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgIGlmICggKExBOV80PT0xMykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDk9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTlfND09RU9GfHwoTEE5XzQ+PVJVTEVfSUQgJiYgTEE5XzQ8PVJVTEVfREVDSU1BTCl8fChMQTlfND49MTQgJiYgTEE5XzQ8PTUwKXx8KExBOV80Pj01NCAmJiBMQTlfNDw9NTUpfHwoTEE5XzQ+PTc5ICYmIExBOV80PD0xMDUpfHwoTEE5XzQ+PTExMCAmJiBMQTlfNDw9MTExKXx8KExBOV80Pj0xMTMgJiYgTEE5XzQ8PTExNCkpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQ5PTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CisgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA5LCA0LCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0ODoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IExBOV81ID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTlfNT09RU9GfHwoTEE5XzU+PVJVTEVfSUQgJiYgTEE5XzU8PVJVTEVfREVDSU1BTCl8fChMQTlfNT49MTQgJiYgTEE5XzU8PTUwKXx8KExBOV81Pj01NCAmJiBMQTlfNTw9NTUpfHwoTEE5XzU+PTc5ICYmIExBOV81PD0xMDUpfHwoTEE5XzU+PTExMCAmJiBMQTlfNTw9MTExKXx8KExBOV81Pj0xMTMgJiYgTEE5XzU8PTExNCkpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQ5PTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE5XzU9PTEzKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0OT0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQorICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgOSwgNSwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUlVMRV9TVFJJTkc6CisgICAgICAgICAgICBjYXNlIFJVTEVfSEVYOgorICAgICAgICAgICAgY2FzZSBSVUxFX0lOVDoKKyAgICAgICAgICAgIGNhc2UgUlVMRV9ERUNJTUFMOgorICAgICAgICAgICAgY2FzZSAyNzoKKyAgICAgICAgICAgIGNhc2UgMzQ6CisgICAgICAgICAgICBjYXNlIDM1OgorICAgICAgICAgICAgY2FzZSA0MDoKKyAgICAgICAgICAgIGNhc2UgNDk6CisgICAgICAgICAgICBjYXNlIDUwOgorICAgICAgICAgICAgY2FzZSA1NDoKKyAgICAgICAgICAgIGNhc2UgNzk6CisgICAgICAgICAgICBjYXNlIDgzOgorICAgICAgICAgICAgY2FzZSA4NDoKKyAgICAgICAgICAgIGNhc2UgODg6CisgICAgICAgICAgICBjYXNlIDkwOgorICAgICAgICAgICAgY2FzZSA5NDoKKyAgICAgICAgICAgIGNhc2UgOTU6CisgICAgICAgICAgICBjYXNlIDk2OgorICAgICAgICAgICAgY2FzZSA5NzoKKyAgICAgICAgICAgIGNhc2UgOTg6CisgICAgICAgICAgICBjYXNlIDk5OgorICAgICAgICAgICAgY2FzZSAxMDA6CisgICAgICAgICAgICBjYXNlIDEwMToKKyAgICAgICAgICAgIGNhc2UgMTAyOgorICAgICAgICAgICAgY2FzZSAxMDQ6CisgICAgICAgICAgICBjYXNlIDExNDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0OT0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQorICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDksIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0OSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMxMjA6MTogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18wICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMxMjA6MTogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18wICkgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMTIxOjE6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEdyb3VwXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMxMjI6MTogKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMxMjI6MjogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzAKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMF9pbl9ydWxlX19YQXNzaWdubWVudF9fQWx0ZXJuYXRpdmVzNjY0Mik7CisgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18wKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEdyb3VwXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMTI2OjY6ICggKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMTI2OjY6ICggKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzEyNzoxOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18wICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRHcm91cF8xKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMTI4OjE6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzAgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMTI4OjI6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18wCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzBfaW5fcnVsZV9fWEFzc2lnbm1lbnRfX0FsdGVybmF0aXZlczY2NjApOworICAgICAgICAgICAgICAgICAgICBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMCgpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRHcm91cF8xKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fWEFzc2lnbm1lbnRfX0FsdGVybmF0aXZlcyIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19PcE11bHRpQXNzaWduX19BbHRlcm5hdGl2ZXMiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzEzNzoxOiBydWxlX19PcE11bHRpQXNzaWduX19BbHRlcm5hdGl2ZXMgOiAoICggJys9JyApIHwgKCAnLT0nICkgfCAoICcqPScgKSB8ICggJy89JyApIHwgKCAnJT0nICkgfCAoICggcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMCApICkgfCAoICggcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMCApICkgKTsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19PcE11bHRpQXNzaWduX19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzE0MToxOiAoICggJys9JyApIHwgKCAnLT0nICkgfCAoICcqPScgKSB8ICggJy89JyApIHwgKCAnJT0nICkgfCAoICggcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMCApICkgfCAoICggcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMCApICkgKQorICAgICAgICAgICAgaW50IGFsdDEwPTc7CisgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKKyAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDEwPTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0MTA9MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQxMD0zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDEwPTQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0MTA9NTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI3OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQxMD02OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjY6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDEwPTc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CisgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMTAsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTApIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMTQyOjE6ICggJys9JyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzE0MjoxOiAoICcrPScgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMTQzOjE6ICcrPScKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldFBsdXNTaWduRXF1YWxzU2lnbktleXdvcmRfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTYsRk9MTE9XXzE2X2luX3J1bGVfX09wTXVsdGlBc3NpZ25fX0FsdGVybmF0aXZlczY2OTQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0UGx1c1NpZ25FcXVhbHNTaWduS2V5d29yZF8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzE1MDo2OiAoICctPScgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMxNTA6NjogKCAnLT0nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzE1MToxOiAnLT0nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRIeXBoZW5NaW51c0VxdWFsc1NpZ25LZXl3b3JkXzEoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LDE3LEZPTExPV18xN19pbl9ydWxlX19PcE11bHRpQXNzaWduX19BbHRlcm5hdGl2ZXM2NzE0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEh5cGhlbk1pbnVzRXF1YWxzU2lnbktleXdvcmRfMSgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMyA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMxNTg6NjogKCAnKj0nICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMTU4OjY6ICggJyo9JyApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMxNTk6MTogJyo9JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0QXN0ZXJpc2tFcXVhbHNTaWduS2V5d29yZF8yKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtYXRjaChpbnB1dCwxOCxGT0xMT1dfMThfaW5fcnVsZV9fT3BNdWx0aUFzc2lnbl9fQWx0ZXJuYXRpdmVzNjczNCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRBc3Rlcmlza0VxdWFsc1NpZ25LZXl3b3JkXzIoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMTY2OjY6ICggJy89JyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzE2Njo2OiAoICcvPScgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMTY3OjE6ICcvPScKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldFNvbGlkdXNFcXVhbHNTaWduS2V5d29yZF8zKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtYXRjaChpbnB1dCwxOSxGT0xMT1dfMTlfaW5fcnVsZV9fT3BNdWx0aUFzc2lnbl9fQWx0ZXJuYXRpdmVzNjc1NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRTb2xpZHVzRXF1YWxzU2lnbktleXdvcmRfMygpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMxNzQ6NjogKCAnJT0nICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMTc0OjY6ICggJyU9JyApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMxNzU6MTogJyU9JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0UGVyY2VudFNpZ25FcXVhbHNTaWduS2V5d29yZF80KCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtYXRjaChpbnB1dCwyMCxGT0xMT1dfMjBfaW5fcnVsZV9fT3BNdWx0aUFzc2lnbl9fQWx0ZXJuYXRpdmVzNjc3NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRQZXJjZW50U2lnbkVxdWFsc1NpZ25LZXl3b3JkXzQoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDYgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMTgyOjY6ICggKCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18wICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMxODI6NjogKCAoIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMxODM6MTogKCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18wICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEdyb3VwXzUoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMxODQ6MTogKCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzE4NDoyOiBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18wCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMF9pbl9ydWxlX19PcE11bHRpQXNzaWduX19BbHRlcm5hdGl2ZXM2NzkzKTsKKyAgICAgICAgICAgICAgICAgICAgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMCgpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEdyb3VwXzUoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDcgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMTg4OjY6ICggKCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18wICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMxODg6NjogKCAoIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMxODk6MTogKCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18wICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEdyb3VwXzYoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMxOTA6MTogKCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzE5MDoyOiBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18wCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMF9pbl9ydWxlX19PcE11bHRpQXNzaWduX19BbHRlcm5hdGl2ZXM2ODExKTsKKyAgICAgICAgICAgICAgICAgICAgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMCgpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEdyb3VwXzYoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2ludGVybmFsL1BlcnNwZWN0aXZlRHNsQWN0aXZhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9pbnRlcm5hbC9QZXJzcGVjdGl2ZURzbEFjdGl2YXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYTVlYjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9pbnRlcm5hbC9QZXJzcGVjdGl2ZURzbEFjdGl2YXRvci5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLnNoYXJlZC5TaGFyZWRTdGF0ZU1vZHVsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51dGlsLk1vZHVsZXMyOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0Lkd1aWNlOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdG9yOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0Lk1vZHVsZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQuIEN1c3RvbWl6YXRpb25zIHNob3VsZCBvbmx5IGhhcHBlbiBpbiBhIG5ld2x5CisgKiBpbnRyb2R1Y2VkIHN1YmNsYXNzLiAKKyAqLworcHVibGljIGNsYXNzIFBlcnNwZWN0aXZlRHNsQWN0aXZhdG9yIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7CisJCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JHX0VDTElQU0VfT1NCUF9YVEVYVF9QRVJTUEVDVElWRV9QRVJTUEVDVElWRURTTCA9ICJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsIjsKKwkKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihQZXJzcGVjdGl2ZURzbEFjdGl2YXRvci5jbGFzcyk7CisJCisJcHJpdmF0ZSBzdGF0aWMgUGVyc3BlY3RpdmVEc2xBY3RpdmF0b3IgSU5TVEFOQ0U7CisJCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBJbmplY3Rvcj4gaW5qZWN0b3JzID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKE1hcHMuPFN0cmluZywgSW5qZWN0b3I+IG5ld0hhc2hNYXBXaXRoRXhwZWN0ZWRTaXplKDEpKTsKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zdGFydChjb250ZXh0KTsKKwkJSU5TVEFOQ0UgPSB0aGlzOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWluamVjdG9ycy5jbGVhcigpOworCQlJTlNUQU5DRSA9IG51bGw7CisJCXN1cGVyLnN0b3AoY29udGV4dCk7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgUGVyc3BlY3RpdmVEc2xBY3RpdmF0b3IgZ2V0SW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJcHVibGljIEluamVjdG9yIGdldEluamVjdG9yKFN0cmluZyBsYW5ndWFnZSkgeworCQlzeW5jaHJvbml6ZWQgKGluamVjdG9ycykgeworCQkJSW5qZWN0b3IgaW5qZWN0b3IgPSBpbmplY3RvcnMuZ2V0KGxhbmd1YWdlKTsKKwkJCWlmIChpbmplY3RvciA9PSBudWxsKSB7CisJCQkJaW5qZWN0b3JzLnB1dChsYW5ndWFnZSwgaW5qZWN0b3IgPSBjcmVhdGVJbmplY3RvcihsYW5ndWFnZSkpOworCQkJfQorCQkJcmV0dXJuIGluamVjdG9yOworCQl9CisJfQorCQorCXByb3RlY3RlZCBJbmplY3RvciBjcmVhdGVJbmplY3RvcihTdHJpbmcgbGFuZ3VhZ2UpIHsKKwkJdHJ5IHsKKwkJCU1vZHVsZSBydW50aW1lTW9kdWxlID0gZ2V0UnVudGltZU1vZHVsZShsYW5ndWFnZSk7CisJCQlNb2R1bGUgc2hhcmVkU3RhdGVNb2R1bGUgPSBnZXRTaGFyZWRTdGF0ZU1vZHVsZSgpOworCQkJTW9kdWxlIHVpTW9kdWxlID0gZ2V0VWlNb2R1bGUobGFuZ3VhZ2UpOworCQkJTW9kdWxlIG1lcmdlZE1vZHVsZSA9IE1vZHVsZXMyLm1peGluKHJ1bnRpbWVNb2R1bGUsIHNoYXJlZFN0YXRlTW9kdWxlLCB1aU1vZHVsZSk7CisJCQlyZXR1cm4gR3VpY2UuY3JlYXRlSW5qZWN0b3IobWVyZ2VkTW9kdWxlKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWxvZ2dlci5lcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSBpbmplY3RvciBmb3IgIiArIGxhbmd1YWdlKTsKKwkJCWxvZ2dlci5lcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRmFpbGVkIHRvIGNyZWF0ZSBpbmplY3RvciBmb3IgIiArIGxhbmd1YWdlLCBlKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCBNb2R1bGUgZ2V0UnVudGltZU1vZHVsZShTdHJpbmcgZ3JhbW1hcikgeworCQlpZiAoT1JHX0VDTElQU0VfT1NCUF9YVEVYVF9QRVJTUEVDVElWRV9QRVJTUEVDVElWRURTTC5lcXVhbHMoZ3JhbW1hcikpIHsKKwkJCXJldHVybiBuZXcgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbFJ1bnRpbWVNb2R1bGUoKTsKKwkJfQorCQkKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihncmFtbWFyKTsKKwl9CisJCisJcHJvdGVjdGVkIE1vZHVsZSBnZXRVaU1vZHVsZShTdHJpbmcgZ3JhbW1hcikgeworCQlpZiAoT1JHX0VDTElQU0VfT1NCUF9YVEVYVF9QRVJTUEVDVElWRV9QRVJTUEVDVElWRURTTC5lcXVhbHMoZ3JhbW1hcikpIHsKKwkJCXJldHVybiBuZXcgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5QZXJzcGVjdGl2ZURzbFVpTW9kdWxlKHRoaXMpOworCQl9CisJCQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGdyYW1tYXIpOworCX0KKwkKKwlwcm90ZWN0ZWQgTW9kdWxlIGdldFNoYXJlZFN0YXRlTW9kdWxlKCkgeworCQlyZXR1cm4gbmV3IFNoYXJlZFN0YXRlTW9kdWxlKCk7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9QZXJzcGVjdGl2ZURTTERvY3VtZW50YXRpb25UcmFuc2xhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL1BlcnNwZWN0aXZlRFNMRG9jdW1lbnRhdGlvblRyYW5zbGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDVlN2FlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9QZXJzcGVjdGl2ZURTTERvY3VtZW50YXRpb25UcmFuc2xhdG9yLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLworIHBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aTsKKworaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAudXRpbHMuY29uc3RhbnRzLkdlbmVyYXRvckNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJhc2ljLnVpLkJhc2ljRFNMRG9jdW1lbnRhdGlvblRyYW5zbGF0b3I7CisKK3B1YmxpYyBjbGFzcyBQZXJzcGVjdGl2ZURTTERvY3VtZW50YXRpb25UcmFuc2xhdG9yIGV4dGVuZHMgQmFzaWNEU0xEb2N1bWVudGF0aW9uVHJhbnNsYXRvciB7CisJIAorICAgIHByaXZhdGUgc3RhdGljIFBlcnNwZWN0aXZlRFNMRG9jdW1lbnRhdGlvblRyYW5zbGF0b3IgSU5TVEFOQ0UgPSBuZXcgUGVyc3BlY3RpdmVEU0xEb2N1bWVudGF0aW9uVHJhbnNsYXRvcigpOworCisgICAgcHVibGljIHN0YXRpYyBCYXNpY0RTTERvY3VtZW50YXRpb25UcmFuc2xhdG9yIGluc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gSU5TVEFOQ0U7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKKyAgICAgICAgcmV0dXJuIGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoR2VuZXJhdG9yQ29uc3RhbnRzLkkxOE5fUkVTT1VSQ0VfRlVMTF9CVU5ETEVfTkFNRSwgZ2V0TG9jYWxlKCksIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9QZXJzcGVjdGl2ZURzbEVPYmplY3RIb3Zlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9QZXJzcGVjdGl2ZURzbEVPYmplY3RIb3Zlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YWI3MDUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL1BlcnNwZWN0aXZlRHNsRU9iamVjdEhvdmVyLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvbnRyaWJ1dG9yczogICAKKyAqIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpOworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmhvdmVyLklFT2JqZWN0SG92ZXJQcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYmFzaWMudWkuQmFzaWNEU0xFT2JqZWN0SG92ZXI7CisKKworCitwdWJsaWMgY2xhc3MgUGVyc3BlY3RpdmVEc2xFT2JqZWN0SG92ZXIgZXh0ZW5kcyBCYXNpY0RTTEVPYmplY3RIb3ZlciB7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSUVPYmplY3RIb3ZlclByb3ZpZGVyIGdldEhvdmVyUHJvdmlkZXIoKSB7CisJCXJldHVybiBQZXJzcGVjdGl2ZURzbEVPYmplY3RIb3ZlclByb3ZpZGVyLmluc3RhbmNlKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9QZXJzcGVjdGl2ZURzbEVPYmplY3RIb3ZlckRvY3VtZW50YXRpb25Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9QZXJzcGVjdGl2ZURzbEVPYmplY3RIb3ZlckRvY3VtZW50YXRpb25Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MjlhZmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL1BlcnNwZWN0aXZlRHNsRU9iamVjdEhvdmVyRG9jdW1lbnRhdGlvblByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvbnRyaWJ1dG9yczogICAKKyAqIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5iYXNpYy51aS5CYXNpY0RTTERvY3VtZW50YXRpb25UcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYmFzaWMudWkuQmFzaWNEU0xFT2JqZWN0SG92ZXJEb2N1bWVudGF0aW9uUHJvdmlkZXI7CisKK3B1YmxpYyBjbGFzcyBQZXJzcGVjdGl2ZURzbEVPYmplY3RIb3ZlckRvY3VtZW50YXRpb25Qcm92aWRlciBleHRlbmRzIEJhc2ljRFNMRU9iamVjdEhvdmVyRG9jdW1lbnRhdGlvblByb3ZpZGVyIHsKKwkKKyAgICBwcml2YXRlIHN0YXRpYyBQZXJzcGVjdGl2ZURzbEVPYmplY3RIb3ZlckRvY3VtZW50YXRpb25Qcm92aWRlciBJTlNUQU5DRTsKKworICAgIHB1YmxpYyBzdGF0aWMgUGVyc3BlY3RpdmVEc2xFT2JqZWN0SG92ZXJEb2N1bWVudGF0aW9uUHJvdmlkZXIgaW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBJTlNUQU5DRTsKKyAgICB9CisKKyAgICBwdWJsaWMgUGVyc3BlY3RpdmVEc2xFT2JqZWN0SG92ZXJEb2N1bWVudGF0aW9uUHJvdmlkZXIoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIElOU1RBTkNFID0gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQmFzaWNEU0xEb2N1bWVudGF0aW9uVHJhbnNsYXRvciBnZXRUcmFuc2xhdG9yKCkgeworICAgICAgICByZXR1cm4gUGVyc3BlY3RpdmVEU0xEb2N1bWVudGF0aW9uVHJhbnNsYXRvci5pbnN0YW5jZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvUGVyc3BlY3RpdmVEc2xFT2JqZWN0SG92ZXJQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9QZXJzcGVjdGl2ZURzbEVPYmplY3RIb3ZlclByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZlMjRmMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvUGVyc3BlY3RpdmVEc2xFT2JqZWN0SG92ZXJQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb250cmlidXRvcnM6ICAgCisgKiBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5ob3Zlci5odG1sLklFT2JqZWN0SG92ZXJEb2N1bWVudGF0aW9uUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJhc2ljLnVpLkJhc2ljRFNMRU9iamVjdEhvdmVyUHJvdmlkZXI7CisKKworCitwdWJsaWMgY2xhc3MgUGVyc3BlY3RpdmVEc2xFT2JqZWN0SG92ZXJQcm92aWRlciBleHRlbmRzIEJhc2ljRFNMRU9iamVjdEhvdmVyUHJvdmlkZXIgeworCisJcHJpdmF0ZSBzdGF0aWMgUGVyc3BlY3RpdmVEc2xFT2JqZWN0SG92ZXJQcm92aWRlciBJTlNUQU5DRTsKKwkKKwlwdWJsaWMgc3RhdGljIFBlcnNwZWN0aXZlRHNsRU9iamVjdEhvdmVyUHJvdmlkZXIgaW5zdGFuY2UoKSB7CisgICAgICAgcmV0dXJuIElOU1RBTkNFOworICAgIH0KKworICAgIHB1YmxpYyBQZXJzcGVjdGl2ZURzbEVPYmplY3RIb3ZlclByb3ZpZGVyKCkgeworICAgICAgICBzdXBlcigpOworICAgICAgICBJTlNUQU5DRSA9IHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElFT2JqZWN0SG92ZXJEb2N1bWVudGF0aW9uUHJvdmlkZXIgZ2V0RG9jdW1lbnRhdGlvbkhvdmVyUHJvdmlkZXIoKSB7CisgICAgICAgIHJldHVybiBQZXJzcGVjdGl2ZURzbEVPYmplY3RIb3ZlckRvY3VtZW50YXRpb25Qcm92aWRlci5pbnN0YW5jZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvUGVyc3BlY3RpdmVEc2xVaU1vZHVsZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9QZXJzcGVjdGl2ZURzbFVpTW9kdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhlM2FlNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvUGVyc3BlY3RpdmVEc2xVaU1vZHVsZS5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KKyBwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuaG92ZXIuSUVPYmplY3RIb3ZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuaG92ZXIuSUVPYmplY3RIb3ZlclByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5ob3Zlci5odG1sLklFT2JqZWN0SG92ZXJEb2N1bWVudGF0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJhc2ljLnVpLkJhc2ljRFNMVWlNb2R1bGVIZWxwZXI7CisKKy8qKgorICogVXNlIHRoaXMgY2xhc3MgdG8gcmVnaXN0ZXIgY29tcG9uZW50cyB0byBiZSB1c2VkIHdpdGhpbiB0aGUgSURFLgorICovCitwdWJsaWMgY2xhc3MgUGVyc3BlY3RpdmVEc2xVaU1vZHVsZSBleHRlbmRzCisJCW9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuQWJzdHJhY3RQZXJzcGVjdGl2ZURzbFVpTW9kdWxlIHsKKwkKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUGVyc3BlY3RpdmVEc2xVaU1vZHVsZS5jbGFzcyk7CisJCisJcHVibGljIFBlcnNwZWN0aXZlRHNsVWlNb2R1bGUoQWJzdHJhY3RVSVBsdWdpbiBwbHVnaW4pIHsKKwkJc3VwZXIocGx1Z2luKTsKKwkgICAgQmFzaWNEU0xVaU1vZHVsZUhlbHBlci51bml0VGVzdFRlbXBsYXRlcyhwbHVnaW4sIExPR0dFUik7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBJRU9iamVjdEhvdmVyPiBiaW5kSUVPYmplY3RIb3ZlcigpIHsKKwkJcmV0dXJuIFBlcnNwZWN0aXZlRHNsRU9iamVjdEhvdmVyLmNsYXNzOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgSUVPYmplY3RIb3ZlclByb3ZpZGVyPiBiaW5kSUVPYmplY3RIb3ZlclByb3ZpZGVyKCkgeworCQlyZXR1cm4gUGVyc3BlY3RpdmVEc2xFT2JqZWN0SG92ZXJQcm92aWRlci5jbGFzczsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIElFT2JqZWN0SG92ZXJEb2N1bWVudGF0aW9uUHJvdmlkZXI+IGJpbmRJRU9iamVjdEhvdmVyRG9jdW1lbnRhdGlvblByb3ZpZGVyKCkgeworCQlyZXR1cm4gUGVyc3BlY3RpdmVEc2xFT2JqZWN0SG92ZXJEb2N1bWVudGF0aW9uUHJvdmlkZXIuY2xhc3M7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyPiBiaW5kSUxhYmVsUHJvdmlkZXIoKSB7CisvLwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmxhYmVsaW5nLlhiYXNlTGFiZWxQcm92aWRlci5jbGFzczsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkubGFiZWxpbmcuUGVyc3BlY3RpdmVEc2xMYWJlbFByb3ZpZGVyLmNsYXNzOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9QZXJzcGVjdGl2ZURzbFByb3Bvc2FsSGVscGVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvUGVyc3BlY3RpdmVEc2xQcm9wb3NhbEhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZjk2YTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvUGVyc3BlY3RpdmVEc2xQcm9wb3NhbEhlbHBlci5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KKyBwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuY29udGVudGFzc2lzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LkNvbmZpZ3VyYWJsZUNvbXBsZXRpb25Qcm9wb3NhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3I7CisKK3B1YmxpYyBjbGFzcyBQZXJzcGVjdGl2ZURzbFByb3Bvc2FsSGVscGVyIHsKKworCXB1YmxpYyBzdGF0aWMgdm9pZCBhcHBseShJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IsIENvbmZpZ3VyYWJsZUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCkgeworCQlhY2NlcHRvci5hY2NlcHQocHJvcG9zYWwpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9QZXJzcGVjdGl2ZURzbFByb3Bvc2FsUHJvdmlkZXIueHRlbmQgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvUGVyc3BlY3RpdmVEc2xQcm9wb3NhbFByb3ZpZGVyLnh0ZW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YTg5NTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvUGVyc3BlY3RpdmVEc2xQcm9wb3NhbFByb3ZpZGVyLnh0ZW5kCkBAIC0wLDAgKzEsMTk1IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICogCisgKiAgVGhpcyBjb3B5cmlnaHQgbm90aWNlIHNob3dzIHVwIGluIHRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlCisgKgorICovCisgCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuY29udGVudGFzc2lzdAorCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0CitpbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIuaW1wbC5Qcm9jZXNzSW1wbAoraW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLmltcGwuVXNlclRhc2tJbXBsCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0eWxlZFN0cmluZworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZm9yay5taWhhbGlzLm9wYWwud2lkZ2V0cy5JbWFnZVNlbGVjdG9yRGlhbG9nCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5iYXNpYy51aS5jb250ZW50YXNzaXN0LkJhc2ljRFNMUHJvcG9zYWxQcm92aWRlckhlbHBlcgoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYXJ0CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVBhcnRTdGFjaworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuUGVyc3BlY3RpdmVEU0xEb2N1bWVudGF0aW9uVHJhbnNsYXRvcgoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dAoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuQXNzaWdubWVudAoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LktleXdvcmQKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5SdWxlQ2FsbAoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi51aS5jb250ZW50YXNzaXN0LlRlcm1pbmFsc1Byb3Bvc2FsUHJvdmlkZXIKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5Db25maWd1cmFibGVDb21wbGV0aW9uUHJvcG9zYWwKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0Q29udGV4dAoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvcgoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LlJlcGxhY2VtZW50VGV4dEFwcGxpZXIKKworY2xhc3MgSWNvbk5hbWVUZXh0QXBwbGllciBleHRlbmRzIFJlcGxhY2VtZW50VGV4dEFwcGxpZXIgeworCXZhciBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0CisJdmFyIFN0cmluZ1tdIGV4dGVuc2lvbnMKKworCWRlZiBzZXRDb250ZXh0KENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQpIHsKKwkJdGhpcy5jb250ZXh0ID0gY29udGV4dAorCX0KKworCWRlZiBzZXRFeHRlbnNpb25zKFN0cmluZ1tdIGZpbGVFeHRlbnNpb25zKSB7CisJCWV4dGVuc2lvbnMgPSBmaWxlRXh0ZW5zaW9ucworCX0KKworCS8vIHRoaXMgd2lsbCBpbmplY3QgYSBmaWxlIGRpYWxvZyB3aGVuIHNlbGVjdGluZyB0aGUgZmlsZSBwaWNrZXIgcHJvcG9zYWwgCisJb3ZlcnJpZGUgZ2V0QWN0dWFsUmVwbGFjZW1lbnRTdHJpbmcoQ29uZmlndXJhYmxlQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsKSB7CisJCXZhciBkaXNwbGF5ID0gY29udGV4dC5nZXRWaWV3ZXIoKS5nZXRUZXh0V2lkZ2V0KCkuZ2V0RGlzcGxheSgpOworCQl2YXIgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7CisJCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKKwkJdmFyIGltYWdlU2VsZWN0b3JEaWFsb2cgPSBuZXcgSW1hZ2VTZWxlY3RvckRpYWxvZyhzaGVsbCwgMTYpOworCQlpbWFnZVNlbGVjdG9yRGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMoZXh0ZW5zaW9ucykKKwkJdmFyIGltYWdlRmlsZU5hbWUgPSBpbWFnZVNlbGVjdG9yRGlhbG9nLm9wZW4odHJ1ZSk7CisJCXJldHVybiAiXCIiLmNvbmNhdChpbWFnZUZpbGVOYW1lKS5jb25jYXQoIlwiIik7CisJfQorCit9CisKK2NsYXNzIFBlcnNwZWN0aXZlRHNsUHJvcG9zYWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0UGVyc3BlY3RpdmVEc2xQcm9wb3NhbFByb3ZpZGVyIHsKKworCUBJbmplY3QgVGVybWluYWxzUHJvcG9zYWxQcm92aWRlciBwcm92aWRlcgorCUBJbmplY3QgQmFzaWNEU0xQcm9wb3NhbFByb3ZpZGVySGVscGVyIHByb3ZpZGVySGVscGVyCisKKwlkZWYgU3R5bGVkU3RyaW5nIGdldFByb3Bvc2FsU3RyaW5nKFByb2Nlc3NJbXBsIHByb2Nlc3MsIFVzZXJUYXNrSW1wbCB1c2VyVGFzaykgeworCQlyZXR1cm4gbmV3IFN0eWxlZFN0cmluZygnJyfCq3VzZXJUYXNrLm5hbWXCuyBpbiBwcm9jZXNzIMKrcHJvY2Vzcy5pZMK7JycnKQorCX0KKworCS8qKgorCSAqIFRoaXMgb3ZlcnJpZGUgd2lsbCBlbmFibGUgMSBsZW5ndGggbm9uIGxldHRlciBjaGFyYWN0ZXJzIGFzIGtleXdvcmQuCisJICovCisJb3ZlcnJpZGUgcHJvdGVjdGVkIGJvb2xlYW4gaXNLZXl3b3JkV29ydGh5VG9Qcm9wb3NlKEtleXdvcmQga2V5d29yZCkgeworCQlyZXR1cm4gdHJ1ZQorCX0KKworCWRlZiBpY29uUGlja2VyUHJvcG9zYWwoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LAorCQlJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IsIFN0cmluZyBmaWxlRXh0ZW5zaW9ucykgeworCQl2YXIgZmlsZU5hbWUgPSBjcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoIlNlbGVjdCBpY29uLi4uIiwgY29udGV4dCkgYXMgQ29uZmlndXJhYmxlQ29tcGxldGlvblByb3Bvc2FsCisJCWlmIChmaWxlTmFtZSAhPSBudWxsKSB7CisJCQl2YXIgYXBwbGllciA9IG5ldyBJY29uTmFtZVRleHRBcHBsaWVyKCkKKwkJCWFwcGxpZXIuc2V0RXh0ZW5zaW9ucyhmaWxlRXh0ZW5zaW9ucy5zcGxpdCgiLCIpKQorCQkJYXBwbGllci5zZXRDb250ZXh0KGNvbnRleHQpCisJCQlmaWxlTmFtZS5zZXRUZXh0QXBwbGllciA9IGFwcGxpZXIKKwkJfQorCQlhY2NlcHRvci5hY2NlcHQoZmlsZU5hbWUpCisJfQorCisJb3ZlcnJpZGUgY29tcGxldGVQZXJzcGVjdGl2ZV9JY29uVVJJKAorCQlFT2JqZWN0IG1vZGVsLAorCQlBc3NpZ25tZW50IGFzc2lnbm1lbnQsCisJCUNvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsCisJCUlDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcgorCSkgeworCQlpY29uUGlja2VyUHJvcG9zYWwobW9kZWwsIGFzc2lnbm1lbnQsIGNvbnRleHQsIGFjY2VwdG9yLCAiLnBuZyIpCisJfQorCisJb3ZlcnJpZGUgY29tcGxldGVQZXJzcGVjdGl2ZVBhcnRfSWNvblVSSShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsCisJCUlDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlpY29uUGlja2VyUHJvcG9zYWwobW9kZWwsIGFzc2lnbm1lbnQsIGNvbnRleHQsIGFjY2VwdG9yLCAiLnBuZyIpCisJfQorCisJb3ZlcnJpZGUgY29tcGxldGVfVmFsaWRJRChFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwKKwkJSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlX0lEKG1vZGVsLCBydWxlQ2FsbCwgY29udGV4dCwgYWNjZXB0b3IpCisJfQorCisJb3ZlcnJpZGUgY29tcGxldGVfVFJBTlNMQVRBQkxFSUQoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsCisJCUlDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZV9JRChtb2RlbCwgcnVsZUNhbGwsIGNvbnRleHQsIGFjY2VwdG9yKQorCX0KKworCW92ZXJyaWRlIHByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRQcm9wb3NhbChTdHJpbmcgcHJvcG9zYWwsIFN0cmluZyBwcmVmaXgsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQpIHsKKwkJdmFyIHJlc3VsdCA9IHN1cGVyLmlzVmFsaWRQcm9wb3NhbChwcm9wb3NhbCwgcHJlZml4LCBjb250ZXh0KQorCQlpZiAoY29udGV4dC5nZXRDdXJyZW50TW9kZWwoKSBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlUGFydFN0YWNrKSB7CisJCQlpZiAoInBhcnRTdGFjayIuZXF1YWxzKHByb3Bvc2FsKSB8fCAic2FzaENvbnRhaW5lciIuZXF1YWxzKHByb3Bvc2FsKSkgeworCQkJCXJldHVybiBmYWxzZQorCQkJfQorCQkJcmV0dXJuIHRydWUKKwkJfQorCQlpZiAoY29udGV4dC5nZXRDdXJyZW50TW9kZWwoKSBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlUGFydCkgeworCQkJaWYgKCJwYXJ0Ii5lcXVhbHMocHJvcG9zYWwpIHx8ICJwYXJ0U3RhY2siLmVxdWFscyhwcm9wb3NhbCkgfHwgInNhc2hDb250YWluZXIiLmVxdWFscyhwcm9wb3NhbCkpIHsKKwkJCQlyZXR1cm4gZmFsc2UKKwkJCX0KKwkJCXJldHVybiB0cnVlCisJCX0KKwkJcmV0dXJuIHJlc3VsdAorCX0KKworCW92ZXJyaWRlIHByb3RlY3RlZCBTdHlsZWRTdHJpbmcgZ2V0S2V5d29yZERpc3BsYXlTdHJpbmcoS2V5d29yZCBrZXl3b3JkKSB7CisJCXJldHVybiBCYXNpY0RTTFByb3Bvc2FsUHJvdmlkZXJIZWxwZXIuZ2V0S2V5d29yZERpc3BsYXlTdHJpbmcoa2V5d29yZCwKKwkJCVBlcnNwZWN0aXZlRFNMRG9jdW1lbnRhdGlvblRyYW5zbGF0b3IuaW5zdGFuY2UoKSk7CisJfQorCisJb3ZlcnJpZGUgcHVibGljIHZvaWQgY29tcGxldGVfUXVhbGlmaWVkTmFtZShFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwKKwkJSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCXByb3ZpZGVySGVscGVyLmNvbXBsZXRlX1BhY2thZ2VOYW1lKG1vZGVsLCBydWxlQ2FsbCwgY29udGV4dCwgYWNjZXB0b3IsIHRoaXMpCisJfQorCisJb3ZlcnJpZGUgcHVibGljIHZvaWQgY29tcGxldGVfUGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLAorCQlDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJcHJvdmlkZXJIZWxwZXIuY29tcGxldGVfUGFja2FnZU5hbWUobW9kZWwsIHJ1bGVDYWxsLCBjb250ZXh0LCBhY2NlcHRvciwgdGhpcykKKwl9CisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZGVsZWdhdGVzIHRvIFRlcm1pbmFsc1Byb3Bvc2FsUHJvdmlkZXIgLS0tLS0tLS0tLS0tLS0tLS0KKwlvdmVycmlkZSBjb21wbGV0ZV9JRChFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwKKwkJSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCXByb3ZpZGVyLmNvbXBsZXRlX0lEKG1vZGVsLCBydWxlQ2FsbCwgY29udGV4dCwgYWNjZXB0b3IpCisJfQorCisJb3ZlcnJpZGUgY29tcGxldGVfVFJBTlNMQVRBQkxFU1RSSU5HKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LAorCQlJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJcHJvdmlkZXIuY29tcGxldGVfU1RSSU5HKG1vZGVsLCBydWxlQ2FsbCwgY29udGV4dCwgYWNjZXB0b3IpCisJfQorCisJb3ZlcnJpZGUgcHVibGljIHZvaWQgY29tcGxldGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfQ29udGFpbmVyRGF0YShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsCisJCUNvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlwcm92aWRlci5jb21wbGV0ZV9TVFJJTkcobW9kZWwsIChhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkgYXMgUnVsZUNhbGwpLCBjb250ZXh0LCBhY2NlcHRvcikKKwl9CisKKwlvdmVycmlkZSBwdWJsaWMgdm9pZCBjb21wbGV0ZVBlcnNwZWN0aXZlUGFydF9Db250YWluZXJEYXRhKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwKKwkJQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCXByb3ZpZGVyLmNvbXBsZXRlX1NUUklORyhtb2RlbCwgKGFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSBhcyBSdWxlQ2FsbCksIGNvbnRleHQsIGFjY2VwdG9yKQorCX0KKworCW92ZXJyaWRlIHB1YmxpYyB2b2lkIGNvbXBsZXRlUGVyc3BlY3RpdmVQYXJ0U3RhY2tfQ29udGFpbmVyRGF0YShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsCisJCUNvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlwcm92aWRlci5jb21wbGV0ZV9TVFJJTkcobW9kZWwsIChhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkgYXMgUnVsZUNhbGwpLCBjb250ZXh0LCBhY2NlcHRvcikKKwl9CisKKwlvdmVycmlkZSBwdWJsaWMgdm9pZCBjb21wbGV0ZVBlcnNwZWN0aXZlX0FjY2Vzc2liaWxpdHlQaHJhc2UoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LAorCQlDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJcHJvdmlkZXIuY29tcGxldGVfU1RSSU5HKG1vZGVsLCAoYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpIGFzIFJ1bGVDYWxsKSwgY29udGV4dCwgYWNjZXB0b3IpCisJfQorCisJb3ZlcnJpZGUgcHVibGljIHZvaWQgY29tcGxldGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfQWNjZXNzaWJpbGl0eVBocmFzZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsCisJCUNvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlwcm92aWRlci5jb21wbGV0ZV9TVFJJTkcobW9kZWwsIChhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkgYXMgUnVsZUNhbGwpLCBjb250ZXh0LCBhY2NlcHRvcikKKwl9CisKKwlvdmVycmlkZSBwdWJsaWMgdm9pZCBjb21wbGV0ZVBlcnNwZWN0aXZlUGFydF9BY2Nlc3NpYmlsaXR5UGhyYXNlKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwKKwkJQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCXByb3ZpZGVyLmNvbXBsZXRlX1NUUklORyhtb2RlbCwgKGFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSBhcyBSdWxlQ2FsbCksIGNvbnRleHQsIGFjY2VwdG9yKQorCX0KKworCW92ZXJyaWRlIHB1YmxpYyB2b2lkIGNvbXBsZXRlUGVyc3BlY3RpdmVQYXJ0U3RhY2tfQWNjZXNzaWJpbGl0eVBocmFzZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsCisJCUNvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlwcm92aWRlci5jb21wbGV0ZV9TVFJJTkcobW9kZWwsIChhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkgYXMgUnVsZUNhbGwpLCBjb250ZXh0LCBhY2NlcHRvcikKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnZlcnRlci9FNFBlcnNwZWN0aXZlVG9EU0xDb252ZXJ0ZXIueHRlbmQgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnZlcnRlci9FNFBlcnNwZWN0aXZlVG9EU0xDb252ZXJ0ZXIueHRlbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI5NDk4MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udmVydGVyL0U0UGVyc3BlY3RpdmVUb0RTTENvbnZlcnRlci54dGVuZApAQCAtMCwwICsxLDI4NCBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqIAorICogIFRoaXMgY29weXJpZ2h0IG5vdGljZSBzaG93cyB1cCBpbiB0aGUgZ2VuZXJhdGVkIEphdmEgY29kZQorICoKKyAqLworIAorcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLmNvbnZlcnRlcgorCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0CitpbXBvcnQgamF2YS51dGlsLk1hcAoraW1wb3J0IGphdmEudXRpbC5TZXQKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NVUlFbGVtZW50CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYWR2YW5jZWQuTVBlcnNwZWN0aXZlCitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVBhcnQKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NUGFydFNhc2hDb250YWluZXIKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NUGFydFNhc2hDb250YWluZXJFbGVtZW50CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVBhcnRTdGFjaworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1TdGFja0VsZW1lbnQKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdAoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmNvbW1vbi50eXBlcy5PU0JQVHlwZXNGYWN0b3J5CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydAoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xQYWNrYWdlCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kaWFsb2dkc2wuRGlhbG9nCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kaWFsb2dkc2wuRGlhbG9nRFNMUGFja2FnZQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmUKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlQ2hhcnQKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRGlhbG9nCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbEZhY3RvcnkKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRWxlbWVudAoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVNb2RlbAoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYXJ0CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVJlcG9ydAoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVUYWJsZQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuU2FzaE9yaWVudGF0aW9uCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQudGFibGUuVGFibGUKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnRhYmxlLlRhYmxlRFNMUGFja2FnZQoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lm5hbWluZy5RdWFsaWZpZWROYW1lCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuSVJlc291cmNlRGVzY3JpcHRpb25zCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUdyaWQKKworLyoqCisgKiBUaGlzIGNsYXNzIGNvbnZlcnRzIGEgZ2l2ZW4gRTQtUGVyc3BlY3RpdmUgdG8gYW4gT1NCUCBwZXJzcGVjdGl2ZSBtb2RlbCBvciBkc2wgdGV4dC4KKyAqLworY2xhc3MgRTRQZXJzcGVjdGl2ZVRvRFNMQ29udmVydGVyIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPU0JQX05TX1VSSSA9ICJvc2JwLU5TLVVyaSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9TQlBfRlFOID0gIm9zYnAtbW9kZWwtZnFuIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1NCUF9GTEFWT1IgPSAib3NicC1OUy1VcmktZmxhdm9yIjsKKworCUBJbmplY3QKKwlwcml2YXRlIElSZXNvdXJjZURlc2NyaXB0aW9ucyBkZXNjcmlwdGlvbnMKKworCXByaXZhdGUgUGVyc3BlY3RpdmVEc2xGYWN0b3J5IHBGYWN0b3J5ID0gUGVyc3BlY3RpdmVEc2xGYWN0b3J5LmVJTlNUQU5DRQorCisJcHJpdmF0ZSBTZXQ8U3RyaW5nPiBpbXBvcnRzID0gbmV3SGFzaFNldCgpCisKKwlwcml2YXRlIE1hcDxNVUlFbGVtZW50LCBFT2JqZWN0PiBlbGVtZW50cyA9IG5ld0hhc2hNYXAoKQorCisJcHJpdmF0ZSBpbnQgY291bnRlcjsKKworCWRlZiBQZXJzcGVjdGl2ZU1vZGVsIHRvTW9kZWwoTVBlcnNwZWN0aXZlIG1QZXJzcGVjdGl2ZSkgeworCQljb3VudGVyID0gMDsKKwkJaW1wb3J0cy5jbGVhcgorCisJCXZhbCBvTW9kZWwgPSBwRmFjdG9yeS5jcmVhdGVQZXJzcGVjdGl2ZU1vZGVsCisJCXZhbCBvUGtnID0gcEZhY3RvcnkuY3JlYXRlUGVyc3BlY3RpdmVQYWNrYWdlCisJCW9Qa2cubmFtZSA9ICJ0by5iZS5kZWZpbmVkIgorCQlvTW9kZWwucGFja2FnZXMgKz0gb1BrZworCisJCXZhbCBwZXJzcGVjdGl2ZSA9IG1QZXJzcGVjdGl2ZS5jb252ZXJ0UGVyc3BlY3RpdmUKKwkJb1BrZy5wZXJzcGVjdGl2ZXMgKz0gcGVyc3BlY3RpdmUKKworCQlpbXBvcnRzLmZvckVhY2ggWworCQkJdmFsIGltcCA9IE9TQlBUeXBlc0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxJbXBvcnQKKwkJCWltcC5pbXBvcnRlZE5hbWVzcGFjZSA9IGl0ICsgIi4qIgorCQkJb1BrZy5pbXBvcnRzICs9IGltcAorCQldCisKKwkJcmV0dXJuIG9Nb2RlbAorCX0KKworCWRlZiBQZXJzcGVjdGl2ZSBjb252ZXJ0UGVyc3BlY3RpdmUoTVBlcnNwZWN0aXZlIG1QZXJzcGVjdGl2ZSkgeworCisJCXZhbCBQZXJzcGVjdGl2ZSBvUGVyc3BlY3RpdmUgPSBwRmFjdG9yeS5jcmVhdGVQZXJzcGVjdGl2ZQorCQltUGVyc3BlY3RpdmUucmVnaXN0ZXIob1BlcnNwZWN0aXZlKQorCQlvUGVyc3BlY3RpdmUuYWNjZXNzaWJpbGl0eVBocmFzZSA9IG1QZXJzcGVjdGl2ZS5hY2Nlc3NpYmlsaXR5UGhyYXNlCisJCW9QZXJzcGVjdGl2ZS5pY29uVVJJID0gbVBlcnNwZWN0aXZlLmljb25VUkkKKwkJb1BlcnNwZWN0aXZlLm5hbWUgPSBtUGVyc3BlY3RpdmUubGFiZWwKKworCQltUGVyc3BlY3RpdmUuY2hpbGRyZW4uZm9yRWFjaCBbCisJCQl2YWwgcmVzdWx0ID0gaXQuY29udmVydAorCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJb1BlcnNwZWN0aXZlLmVsZW1lbnRzICs9IHJlc3VsdAorCQkJfQorCQldCisKKwkJcmV0dXJuIG9QZXJzcGVjdGl2ZQorCX0KKworCWRlZiBkaXNwYXRjaCBQZXJzcGVjdGl2ZUVsZW1lbnQgY29udmVydChNUGFydFNhc2hDb250YWluZXJFbGVtZW50IGVsZW1lbnQpIHsKKwkJcmV0dXJuIG51bGwKKwl9CisKKwlkZWYgZGlzcGF0Y2ggUGVyc3BlY3RpdmVFbGVtZW50IGNvbnZlcnQoTVN0YWNrRWxlbWVudCBlbGVtZW50KSB7CisJCXJldHVybiBudWxsCisJfQorCisJZGVmIGRpc3BhdGNoIFBlcnNwZWN0aXZlRWxlbWVudCBjb252ZXJ0KE1QYXJ0U2FzaENvbnRhaW5lciBtRWxlbWVudCkgeworCQl2YWwgb0VsZW1lbnQgPSBwRmFjdG9yeS5jcmVhdGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIKKwkJbUVsZW1lbnQucmVnaXN0ZXIob0VsZW1lbnQpCisJCW9FbGVtZW50LmFjY2Vzc2liaWxpdHlQaHJhc2UgPSBtRWxlbWVudC5hY2Nlc3NpYmlsaXR5UGhyYXNlCisJCW9FbGVtZW50LmNvbnRhaW5lckRhdGEgPSBtRWxlbWVudC5jb250YWluZXJEYXRhCisJCW9FbGVtZW50LmVsZW1lbnRJZCA9IHRvSWQKKwkJb0VsZW1lbnQub3JpZW50YXRpb24gPSBtRWxlbWVudC5ob3Jpem9udGFsLnRvT3JpZW50YXRpb24KKworCQltRWxlbWVudC5jaGlsZHJlbi5mb3JFYWNoIFsKKwkJCXZhbCByZXN1bHQgPSBpdC5jb252ZXJ0CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlvRWxlbWVudC5lbGVtZW50cyArPSByZXN1bHQKKwkJCX0KKwkJXQorCisJCXJldHVybiBvRWxlbWVudAorCX0KKworCWRlZiBTdHJpbmcgdG9JZCgpICcnJ2XCq2NvdW50ZXIrK8K7JycnCisKKwlkZWYgZGlzcGF0Y2ggUGVyc3BlY3RpdmVFbGVtZW50IGNvbnZlcnQoTVBhcnRTdGFjayBtRWxlbWVudCkgeworCQl2YWwgb0VsZW1lbnQgPSBwRmFjdG9yeS5jcmVhdGVQZXJzcGVjdGl2ZVBhcnRTdGFjaworCQltRWxlbWVudC5yZWdpc3RlcihvRWxlbWVudCkKKwkJb0VsZW1lbnQuYWNjZXNzaWJpbGl0eVBocmFzZSA9IG1FbGVtZW50LmFjY2Vzc2liaWxpdHlQaHJhc2UKKwkJb0VsZW1lbnQuY29udGFpbmVyRGF0YSA9IG1FbGVtZW50LmNvbnRhaW5lckRhdGEKKwkJb0VsZW1lbnQuZWxlbWVudElkID0gdG9JZAorCisJCW1FbGVtZW50LmNoaWxkcmVuLmZvckVhY2ggWworCQkJdmFsIHJlc3VsdCA9IGl0LmNvbnZlcnQKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCW9FbGVtZW50LmVsZW1lbnRzICs9IHJlc3VsdAorCQkJfQorCQldCisKKwkJcmV0dXJuIG9FbGVtZW50CisJfQorCisJZGVmIGRpc3BhdGNoIFBlcnNwZWN0aXZlRWxlbWVudCBjb252ZXJ0KE1QYXJ0IG1FbGVtZW50KSB7CisJCXZhbCBTdHJpbmcgbnNVUkkgPSBtRWxlbWVudC5nZXRQZXJzaXN0ZWRTdGF0ZSgpLmdldChPU0JQX05TX1VSSSk7CisJCXZhbCBFUGFja2FnZSBlUGtnID0gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UobnNVUkkpCisJCWlmIChlUGtnID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsCisJCX0KKworCQl2YWwgb0VsZW1lbnQgPSBwRmFjdG9yeS5jcmVhdGVQZXJzcGVjdGl2ZVBhcnQKKwkJbUVsZW1lbnQucmVnaXN0ZXIob0VsZW1lbnQpCisJCW9FbGVtZW50LmFjY2Vzc2liaWxpdHlQaHJhc2UgPSBtRWxlbWVudC5hY2Nlc3NpYmlsaXR5UGhyYXNlCisJCW9FbGVtZW50LmNvbnRhaW5lckRhdGEgPSBtRWxlbWVudC5jb250YWluZXJEYXRhCisJCWlmKG1FbGVtZW50LmxhYmVsID09IG51bGwpIHsKKwkJCW9FbGVtZW50LmVsZW1lbnRJZCA9IHRvSWQKKwkJfWVsc2V7CisJCQlvRWxlbWVudC5lbGVtZW50SWQgPSBtRWxlbWVudC5sYWJlbC5yZXBsYWNlQWxsKCIgIiwgIiIpLnJlcGxhY2VBbGwoIihcXFcpIiAsIiIpCisJCX0KKwkJb0VsZW1lbnQuaWNvblVSSSA9IG1FbGVtZW50Lmljb25VUkkKKwkJb0VsZW1lbnQuZGVzY3JpcHRpb24gPSBmYWxzZQorCQlvRWxlbWVudC5pc0Nsb3NhYmxlID0gbUVsZW1lbnQuY2xvc2VhYmxlCisKKwkJZVBrZy5jb252ZXJ0VmlldyhtRWxlbWVudCwgb0VsZW1lbnQpCisKKwkJcmV0dXJuIG9FbGVtZW50CisJfQorCisJZGVmIGRpc3BhdGNoIHZvaWQgY29udmVydFZpZXcoRVBhY2thZ2UgZVBhY2thZ2UsIE1QYXJ0IG1QYXJ0LCBQZXJzcGVjdGl2ZVBhcnQgb1BhcnQpIHsKKwl9CisKKwlkZWYgZGlzcGF0Y2ggdm9pZCBjb252ZXJ0VmlldyhUYWJsZURTTFBhY2thZ2UgZVBhY2thZ2UsIE1QYXJ0IG1QYXJ0LCBQZXJzcGVjdGl2ZVBhcnQgb1BhcnQpIHsKKworCQl2YWwgU3RyaW5nIGZsYXZvciA9IG1QYXJ0LnBlcnNpc3RlZFN0YXRlLmdldChPU0JQX0ZMQVZPUik7CisJCWlmIChmbGF2b3IgIT0gbnVsbCAmJiBmbGF2b3IuZXF1YWxzKCJncmlkIikpIHsKKwkJCXZhbCBQZXJzcGVjdGl2ZUdyaWQgb1RhYmxlID0gcEZhY3RvcnkuY3JlYXRlUGVyc3BlY3RpdmVHcmlkCisJCQlvUGFydC52aWV3ID0gb1RhYmxlCisJCQl2YWwgU3RyaW5nIGZxbiA9IG1QYXJ0LnBlcnNpc3RlZFN0YXRlLmdldChPU0JQX0ZRTik7CisJCQlpZiAoZnFuLm51bGxPckVtcHR5KSB7CisJCQkJcmV0dXJuCisJCQl9CisJCQlpbXBvcnRzICs9IGZxbi5zdWJzdHJpbmcoMCwgZnFuLmxhc3RJbmRleE9mKCIuIikpCisKKwkJCXZhbCByZXN1bHQgPSBkZXNjcmlwdGlvbnMuZ2V0RXhwb3J0ZWRPYmplY3RzKFRhYmxlRFNMUGFja2FnZS5MaXRlcmFscy5UQUJMRSwKKwkJCQlRdWFsaWZpZWROYW1lLmNyZWF0ZShmcW4uc3BsaXQoIlxcLiIpKSwgZmFsc2UpCisJCQlpZiAocmVzdWx0Lml0ZXJhdG9yLmhhc05leHQpIHsKKwkJCQl2YWwgZU9iamVjdERlc2MgPSByZXN1bHQuaXRlcmF0b3IubmV4dAorCQkJCW9UYWJsZS5yZWYgPSBlT2JqZWN0RGVzYy5FT2JqZWN0T3JQcm94eSBhcyBUYWJsZQorCQkJfQorCQl9ZWxzZXsKKwkJCXZhbCBQZXJzcGVjdGl2ZVRhYmxlIG9UYWJsZSA9IHBGYWN0b3J5LmNyZWF0ZVBlcnNwZWN0aXZlVGFibGUKKwkJCW9QYXJ0LnZpZXcgPSBvVGFibGUKKwkJCXZhbCBTdHJpbmcgZnFuID0gbVBhcnQucGVyc2lzdGVkU3RhdGUuZ2V0KE9TQlBfRlFOKTsKKwkJCWlmIChmcW4ubnVsbE9yRW1wdHkpIHsKKwkJCQlyZXR1cm4KKwkJCX0KKwkJCWltcG9ydHMgKz0gZnFuLnN1YnN0cmluZygwLCBmcW4ubGFzdEluZGV4T2YoIi4iKSkKKworCQkJdmFsIHJlc3VsdCA9IGRlc2NyaXB0aW9ucy5nZXRFeHBvcnRlZE9iamVjdHMoVGFibGVEU0xQYWNrYWdlLkxpdGVyYWxzLlRBQkxFLAorCQkJCVF1YWxpZmllZE5hbWUuY3JlYXRlKGZxbi5zcGxpdCgiXFwuIikpLCBmYWxzZSkKKwkJCWlmIChyZXN1bHQuaXRlcmF0b3IuaGFzTmV4dCkgeworCQkJCXZhbCBlT2JqZWN0RGVzYyA9IHJlc3VsdC5pdGVyYXRvci5uZXh0CisJCQkJb1RhYmxlLnJlZiA9IGVPYmplY3REZXNjLkVPYmplY3RPclByb3h5IGFzIFRhYmxlCisJCQl9CisJCX0KKwl9CisKKwlkZWYgZGlzcGF0Y2ggdm9pZCBjb252ZXJ0VmlldyhDaGFydERTTFBhY2thZ2UgZVBhY2thZ2UsIE1QYXJ0IG1QYXJ0LCBQZXJzcGVjdGl2ZVBhcnQgb1BhcnQpIHsKKwkJdmFsIFBlcnNwZWN0aXZlQ2hhcnQgb0NoYXJ0ID0gcEZhY3RvcnkuY3JlYXRlUGVyc3BlY3RpdmVDaGFydAorCQlvUGFydC52aWV3ID0gb0NoYXJ0CisJCXZhbCBTdHJpbmcgZnFuID0gbVBhcnQucGVyc2lzdGVkU3RhdGUuZ2V0KEU0UGVyc3BlY3RpdmVUb0RTTENvbnZlcnRlci5PU0JQX0ZRTik7CisJCWlmIChmcW4ubnVsbE9yRW1wdHkpIHsKKwkJCXJldHVybgorCQl9CisJCWltcG9ydHMgKz0gZnFuLnN1YnN0cmluZygwLCBmcW4ubGFzdEluZGV4T2YoIi4iKSkKKworCQl2YWwgdG9rZW5zID0gZnFuLnNwbGl0KCJcXC4iKQorCQl2YWwgcmVzdWx0ID0gZGVzY3JpcHRpb25zLmdldEV4cG9ydGVkT2JqZWN0cyhDaGFydERTTFBhY2thZ2UuTGl0ZXJhbHMuQ0hBUlQsCisJCQlRdWFsaWZpZWROYW1lLmNyZWF0ZSh0b2tlbnMuZ2V0KHRva2Vucy5sZW5ndGggLSAxKSksIGZhbHNlKQorCQlpZiAocmVzdWx0Lml0ZXJhdG9yLmhhc05leHQpIHsKKwkJCXZhbCBlT2JqZWN0RGVzYyA9IHJlc3VsdC5pdGVyYXRvci5uZXh0CisJCQlvQ2hhcnQucmVmID0gZU9iamVjdERlc2MuRU9iamVjdE9yUHJveHkgYXMgQ2hhcnQKKwkJfQorCX0KKworCWRlZiBkaXNwYXRjaCB2b2lkIGNvbnZlcnRWaWV3KFJlcG9ydERTTFBhY2thZ2UgZVBhY2thZ2UsIE1QYXJ0IG1QYXJ0LCBQZXJzcGVjdGl2ZVBhcnQgb1BhcnQpIHsKKworCQl2YWwgUGVyc3BlY3RpdmVSZXBvcnQgb1JlcG9ydCA9IHBGYWN0b3J5LmNyZWF0ZVBlcnNwZWN0aXZlUmVwb3J0CisJCW9QYXJ0LnZpZXcgPSBvUmVwb3J0CisJCXZhbCBTdHJpbmcgZnFuID0gbVBhcnQucGVyc2lzdGVkU3RhdGUuZ2V0KEU0UGVyc3BlY3RpdmVUb0RTTENvbnZlcnRlci5PU0JQX0ZRTik7CisJCWlmIChmcW4ubnVsbE9yRW1wdHkpIHsKKwkJCXJldHVybgorCQl9CisJCWltcG9ydHMgKz0gZnFuLnN1YnN0cmluZygwLCBmcW4ubGFzdEluZGV4T2YoIi4iKSkKKworCQl2YWwgcmVzdWx0ID0gZGVzY3JpcHRpb25zLmdldEV4cG9ydGVkT2JqZWN0cyhSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlJFUE9SVCwKKwkJCVF1YWxpZmllZE5hbWUuY3JlYXRlKGZxbi5zcGxpdCgiXFwuIikpLCBmYWxzZSkKKwkJaWYgKHJlc3VsdC5pdGVyYXRvci5oYXNOZXh0KSB7CisJCQl2YWwgZU9iamVjdERlc2MgPSByZXN1bHQuaXRlcmF0b3IubmV4dAorCQkJb1JlcG9ydC5yZWYgPSBlT2JqZWN0RGVzYy5FT2JqZWN0T3JQcm94eSBhcyBSZXBvcnQKKwkJfQorCisJfQorCisJZGVmIGRpc3BhdGNoIHZvaWQgY29udmVydFZpZXcoRGlhbG9nRFNMUGFja2FnZSBlUGFja2FnZSwgTVBhcnQgbVBhcnQsIFBlcnNwZWN0aXZlUGFydCBvUGFydCkgeworCQl2YWwgUGVyc3BlY3RpdmVEaWFsb2cgb0RpYWxvZyA9IHBGYWN0b3J5LmNyZWF0ZVBlcnNwZWN0aXZlRGlhbG9nCisJCW9QYXJ0LnZpZXcgPSBvRGlhbG9nCisJCXZhbCBTdHJpbmcgZnFuID0gbVBhcnQucGVyc2lzdGVkU3RhdGUuZ2V0KEU0UGVyc3BlY3RpdmVUb0RTTENvbnZlcnRlci5PU0JQX0ZRTik7CisJCWlmIChmcW4ubnVsbE9yRW1wdHkpIHsKKwkJCXJldHVybgorCQl9CisJCWltcG9ydHMgKz0gZnFuLnN1YnN0cmluZygwLCBmcW4ubGFzdEluZGV4T2YoIi4iKSkKKworCQl2YWwgcmVzdWx0ID0gZGVzY3JpcHRpb25zLmdldEV4cG9ydGVkT2JqZWN0cyhEaWFsb2dEU0xQYWNrYWdlLkxpdGVyYWxzLkRJQUxPRywKKwkJCVF1YWxpZmllZE5hbWUuY3JlYXRlKGZxbi5zcGxpdCgiXFwuIikpLCBmYWxzZSkKKwkJaWYgKHJlc3VsdC5pdGVyYXRvci5oYXNOZXh0KSB7CisJCQl2YWwgZU9iamVjdERlc2MgPSByZXN1bHQuaXRlcmF0b3IubmV4dAorCQkJb0RpYWxvZy5yZWYgPSBlT2JqZWN0RGVzYy5FT2JqZWN0T3JQcm94eSBhcyBEaWFsb2cKKwkJfQorCX0KKworCWRlZiBTYXNoT3JpZW50YXRpb24gdG9PcmllbnRhdGlvbihib29sZWFuIGlzSG9yaXpvbnRhbCkgeworCQlpZihpc0hvcml6b250YWwpIHJldHVybiBTYXNoT3JpZW50YXRpb24uSE9SSVpPTlRBTCBlbHNlIFNhc2hPcmllbnRhdGlvbi5WRVJUSUNBTAorCX0KKworCWRlZiB2b2lkIHJlZ2lzdGVyKE1VSUVsZW1lbnQgbUVsZW1lbnQsIEVPYmplY3Qgb0VsZW1lbnQpIHsKKwkJZWxlbWVudHMucHV0KG1FbGVtZW50LCBvRWxlbWVudCkKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2hhbmRsZXIvQ29udmVydEU0UGVyc3BlY3RpdmVUb09TQlBIYW5kbGVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2hhbmRsZXIvQ29udmVydEU0UGVyc3BlY3RpdmVUb09TQlBIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJiZjliOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvaGFuZGxlci9Db252ZXJ0RTRQZXJzcGVjdGl2ZVRvT1NCUEhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDIwMSBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLworIHBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5oYW5kbGVyOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5hZHZhbmNlZC5NUGVyc3BlY3RpdmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXMuTEltcG9ydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLmNvbnZlcnRlci5FNFBlcnNwZWN0aXZlVG9EU0xDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRhdGFsb2NhdGlvbi5Mb2NhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5yZXNvdXJjZS5JUmVzb3VyY2VTZXRQcm92aWRlcjsKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworcHVibGljIGNsYXNzIENvbnZlcnRFNFBlcnNwZWN0aXZlVG9PU0JQSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTUEVDVElWRV9NT0RFTF9QQVRIID0gIm9yZy5maHNvbHV0aW9uLmVjbGlwc2UucGx1Z2lucy5jc3ZlZGl0LmN1c3RvbWVkaXRvci5wcmVmZXJlbmNlcy5wZXJzcGVjdGl2ZU1vZGVsUGF0aCI7CisKKwlASW5qZWN0CisJRTRQZXJzcGVjdGl2ZVRvRFNMQ29udmVydGVyIGNvbnZlcnRlcjsKKworCUBJbmplY3QKKwlJUmVzb3VyY2VTZXRQcm92aWRlciBwcm92aWRlcjsKKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbihldmVudCk7CisJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgeworCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3NlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOworCQkJT2JqZWN0IGVsZW1lbnQgPSBzc2VsLmdldEZpcnN0RWxlbWVudCgpOworCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRmlsZQorCQkJCQkmJiAoKElGaWxlKSBlbGVtZW50KS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKAorCQkJCQkJCSJtcGVyc3BlY3RpdmUiKSkgeworCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBuZXcgUnVubmFibGUoKSB7CisJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCXRyeSB7CisKKwkJCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBlbGVtZW50OworCQkJCQkJCVJlc291cmNlU2V0IHJzID0gcHJvdmlkZXIuZ2V0KGZpbGUuZ2V0UHJvamVjdCgpKTsKKworCQkJCQkJCS8vIHJlYWQgdGhlIHJlc291cmNlCisJCQkJCQkJLy8KKwkJCQkJCQlVUkkgaW5VUkkgPSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJCisJCQkJCQkJCQkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShmaWxlCisJCQkJCQkJCQkJCS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIGZhbHNlKTsKKwkJCQkJCQlSZXNvdXJjZSBpblJlc291cmNlID0gcnMuZ2V0UmVzb3VyY2UoaW5VUkksIHRydWUpOworCisJCQkJCQkJU3RyaW5nIG1vZGVsUGF0aCA9IFBsYXRmb3JtCisJCQkJCQkJCQkuZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCkKKwkJCQkJCQkJCS5nZXRTdHJpbmcoCisJCQkJCQkJCQkJCSJvcmcuZmhzb2x1dGlvbi5lY2xpcHNlLnBsdWdpbnMuY3N2ZWRpdCIsCisJCQkJCQkJCQkJCSJwZXJzcGVjdGl2ZU1vZGVsUGF0aCIsICIiLCBudWxsKTsKKworCQkJCQkJCVVSSSBvdXRVUkkgPSB0b1BsYXRmb3JtKG1vZGVsUGF0aCk7CisKKwkJCQkJCQlSZXNvdXJjZSBvdXRSZXNvdXJjZSA9IG51bGw7CisJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJb3V0UmVzb3VyY2UgPSBycy5nZXRSZXNvdXJjZShvdXRVUkksIHRydWUpOworCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJCW91dFJlc291cmNlID0gcnMuY3JlYXRlUmVzb3VyY2Uob3V0VVJJKTsKKwkJCQkJCQl9CisKKwkJCQkJCQlpZiAob3V0UmVzb3VyY2UgPT0gbnVsbCkgeworCQkJCQkJCQlyZXR1cm47CisJCQkJCQkJfQorCisJCQkJCQkJLy8gY29udmVydCB0aGUgbW9kZWwKKwkJCQkJCQkvLworCQkJCQkJCVBlcnNwZWN0aXZlTW9kZWwgbmV3UGVyc3BlY3RpdmVNb2RlbCA9IGNvbnZlcnRlcgorCQkJCQkJCQkJLnRvTW9kZWwoKE1QZXJzcGVjdGl2ZSkgaW5SZXNvdXJjZQorCQkJCQkJCQkJCQkuZ2V0Q29udGVudHMoKS5nZXQoMCkpOworCisJCQkJCQkJaWYgKG91dFJlc291cmNlLmlzTG9hZGVkKCkpIHsKKwkJCQkJCQkJUGVyc3BlY3RpdmVNb2RlbCBjdXJyZW50ID0gKFBlcnNwZWN0aXZlTW9kZWwpIG91dFJlc291cmNlCisJCQkJCQkJCQkJLmdldENvbnRlbnRzKCkuZ2V0KDApOworCQkJCQkJCQlQZXJzcGVjdGl2ZVBhY2thZ2UgY3VycmVudFBrZyA9IGN1cnJlbnQKKwkJCQkJCQkJCQkuZ2V0UGFja2FnZXMoKS5nZXQoMCk7CisKKwkJCQkJCQkJUGVyc3BlY3RpdmVQYWNrYWdlIG5ld1BrZyA9IG5ld1BlcnNwZWN0aXZlTW9kZWwKKwkJCQkJCQkJCQkuZ2V0UGFja2FnZXMoKS5nZXQoMCk7CisKKwkJCQkJCQkJLy8gY29weSB0aGUgbWlzc2luZyBwYWNrYWdlcworCQkJCQkJCQlmb3IgKExJbXBvcnQgY29udmVydGVkSW1wb3J0IDogbmV3UGtnCisJCQkJCQkJCQkJLmdldEltcG9ydHMoKSkgeworCQkJCQkJCQkJYm9vbGVhbiBjb250YWlucyA9IGZhbHNlOworCQkJCQkJCQkJZm9yIChMSW1wb3J0IGN1cnJlbnRJbXBvcnQgOiBuZXcgQXJyYXlMaXN0PD4oCisJCQkJCQkJCQkJCWN1cnJlbnRQa2cuZ2V0SW1wb3J0cygpKSkgeworCQkJCQkJCQkJCWlmIChjb252ZXJ0ZWRJbXBvcnQKKwkJCQkJCQkJCQkJCS5nZXRJbXBvcnRlZE5hbWVzcGFjZSgpCisJCQkJCQkJCQkJCQkuZXF1YWxzKGN1cnJlbnRJbXBvcnQKKwkJCQkJCQkJCQkJCQkJLmdldEltcG9ydGVkTmFtZXNwYWNlKCkpKSB7CisJCQkJCQkJCQkJCWNvbnRhaW5zID0gdHJ1ZTsKKwkJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCisJCQkJCQkJCQlpZiAoIWNvbnRhaW5zKSB7CisJCQkJCQkJCQkJY3VycmVudFBrZy5nZXRJbXBvcnRzKCkuYWRkKAorCQkJCQkJCQkJCQkJY29udmVydGVkSW1wb3J0KTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCisJCQkJCQkJCWZvciAoUGVyc3BlY3RpdmUgbmV3UGVyc3AgOiBuZXcgQXJyYXlMaXN0PD4oCisJCQkJCQkJCQkJbmV3UGtnLmdldFBlcnNwZWN0aXZlcygpKSkgeworCQkJCQkJCQkJYm9vbGVhbiByZXBsYWNlZCA9IGZhbHNlOworCQkJCQkJCQkJZm9yIChQZXJzcGVjdGl2ZSBjdXJyZW50UGVyc3BlY3RpdmUgOiBuZXcgQXJyYXlMaXN0PD4oCisJCQkJCQkJCQkJCWN1cnJlbnRQa2cuZ2V0UGVyc3BlY3RpdmVzKCkpKSB7CisJCQkJCQkJCQkJaWYgKG5ld1BlcnNwLmdldE5hbWUoKS5lcXVhbHMoCisJCQkJCQkJCQkJCQljdXJyZW50UGVyc3BlY3RpdmUuZ2V0TmFtZSgpKSkgeworCQkJCQkJCQkJCQljdXJyZW50UGtnLmdldFBlcnNwZWN0aXZlcygpCisJCQkJCQkJCQkJCQkJLnJlbW92ZShjdXJyZW50UGVyc3BlY3RpdmUpOworCQkJCQkJCQkJCQljdXJyZW50UGtnLmdldFBlcnNwZWN0aXZlcygpLmFkZCgKKwkJCQkJCQkJCQkJCQluZXdQZXJzcCk7CisJCQkJCQkJCQkJCXJlcGxhY2VkID0gdHJ1ZTsKKwkJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCisJCQkJCQkJCQlpZiAoIXJlcGxhY2VkKSB7CisJCQkJCQkJCQkJY3VycmVudFBrZy5nZXRQZXJzcGVjdGl2ZXMoKS5hZGQoCisJCQkJCQkJCQkJCQluZXdQZXJzcCk7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKworCQkJCQkJCQlvdXRSZXNvdXJjZS5zYXZlKG51bGwpOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCW91dFJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKAorCQkJCQkJCQkJCW5ld1BlcnNwZWN0aXZlTW9kZWwpOworCQkJCQkJCQlvdXRSZXNvdXJjZS5zYXZlKG51bGwpOworCQkJCQkJCX0KKworCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihEaXNwbGF5LmdldEN1cnJlbnQoKQorCQkJCQkJCQkJLmdldEFjdGl2ZVNoZWxsKCksCisJCQkJCQkJCQkiQ29udmVyc2lvbiB0byBwZXJzcGVjdGl2ZSIsIGUudG9TdHJpbmcoKSk7CisJCQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9KTsKKworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXByb3RlY3RlZCBVUkkgdG9QbGF0Zm9ybShTdHJpbmcgZmlsZVVSSVN0cmluZykgeworCQlVUkkgcGF0aCA9IFVSSS5jcmVhdGVGaWxlVVJJKGZpbGVVUklTdHJpbmcpOworCQkKKwkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7CisJCVN0cmluZyBtb2RlbEZpbGUgPSBudWxsOworCQkvLyBmaW5kIHRoZSBidW5kbGUgc2VnbWVudAorCQlmb3IgKElQcm9qZWN0IHByb2ogOiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpCisJCQkJLmdldFByb2plY3RzKCkpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0aC5zZWdtZW50Q291bnQoKTsgaSsrKSB7CisJCQkJaWYgKG1vZGVsRmlsZSAhPSBudWxsKSB7CisJCQkJCW1vZGVsRmlsZSArPSAiLyIgKyBwYXRoLnNlZ21lbnQoaSk7CisJCQkJfQorCQkJCWlmIChwcm9qLmdldE5hbWUoKS5lcXVhbHMocGF0aC5zZWdtZW50KGkpKSkgeworCQkJCQlwcm9qZWN0ID0gcHJvajsKKwkJCQkJbW9kZWxGaWxlID0gIiI7CisJCQkJfQorCQkJfQorCQkJaWYgKG1vZGVsRmlsZSAhPSBudWxsKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmV0dXJuIHByb2plY3QgIT0gbnVsbCA/IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKHByb2plY3QKKwkJCQkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpCisJCQkJKyBtb2RlbEZpbGUsIGZhbHNlKSA6IG51bGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9sYWJlbGluZy9QZXJzcGVjdGl2ZURzbERlc2NyaXB0aW9uTGFiZWxQcm92aWRlci54dGVuZCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvbGFiZWxpbmcvUGVyc3BlY3RpdmVEc2xEZXNjcmlwdGlvbkxhYmVsUHJvdmlkZXIueHRlbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQwYjI2ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvbGFiZWxpbmcvUGVyc3BlY3RpdmVEc2xEZXNjcmlwdGlvbkxhYmVsUHJvdmlkZXIueHRlbmQKQEAgLTAsMCArMSwzOCBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqIAorICogIFRoaXMgY29weXJpZ2h0IG5vdGljZSBzaG93cyB1cCBpbiB0aGUgZ2VuZXJhdGVkIEphdmEgY29kZQorICoKKyAqLworIAorcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLmxhYmVsaW5nCisKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLklFT2JqZWN0RGVzY3JpcHRpb24KKworLyoqCisgKiBQcm92aWRlcyBsYWJlbHMgZm9yIGEgSUVPYmplY3REZXNjcmlwdGlvbnMgYW5kIElSZXNvdXJjZURlc2NyaXB0aW9ucy4KKyAqIAorICogc2VlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvWHRleHQvZG9jdW1lbnRhdGlvbi5odG1sI2xhYmVsUHJvdmlkZXIKKyAqLworY2xhc3MgUGVyc3BlY3RpdmVEc2xEZXNjcmlwdGlvbkxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5sYWJlbGluZy5YYmFzZURlc2NyaXB0aW9uTGFiZWxQcm92aWRlciB7CisKKwkvLyBMYWJlbHMgYW5kIGljb25zIGNhbiBiZSBjb21wdXRlZCBsaWtlIHRoaXM6CisJCisvLwlvdmVycmlkZSB0ZXh0KElFT2JqZWN0RGVzY3JpcHRpb24gZWxlKSB7CisvLwkJZWxlLm5hbWUudG9TdHJpbmcKKy8vCX0KKy8vCSAKKy8vCW92ZXJyaWRlIGltYWdlKElFT2JqZWN0RGVzY3JpcHRpb24gZWxlKSB7CisvLwkJZWxlLkVDbGFzcy5uYW1lICsgJy5naWYnCisvLwl9CSAKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvbGFiZWxpbmcvUGVyc3BlY3RpdmVEc2xMYWJlbFByb3ZpZGVyLnh0ZW5kIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9sYWJlbGluZy9QZXJzcGVjdGl2ZURzbExhYmVsUHJvdmlkZXIueHRlbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE0MDhhZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvbGFiZWxpbmcvUGVyc3BlY3RpdmVEc2xMYWJlbFByb3ZpZGVyLnh0ZW5kCkBAIC0wLDAgKzEsOTIgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKiAKKyAqICBUaGlzIGNvcHlyaWdodCBub3RpY2Ugc2hvd3MgdXAgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAqCisgKi8KKyAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5sYWJlbGluZworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5iYXNpYy51aS5sYWJlbGluZy5CYXNpY0RTTExhYmVsUHJvdmlkZXIKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZU1vZGVsCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVBhY2thZ2UKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUGFydFN0YWNrCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVNhc2hDb250YWluZXIKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUGFydAoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVUYWJsZQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVHcmlkCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUNoYXJ0CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5zZXJ2aWNlcy5QZXJzcGVjdGl2ZURzbEdyYW1tYXJBY2Nlc3MuUGVyc3BlY3RpdmVHcmlkRWxlbWVudHMKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUmVwb3J0CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbgoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVUb3BvbG9neQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEaWFsb2cKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlQlBNTgoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVTZWxlY3Rpb24KKworLyoqCisgKiBQcm92aWRlcyBsYWJlbHMgZm9yIGEgRU9iamVjdHMuCisgKgorICogc2VlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvWHRleHQvZG9jdW1lbnRhdGlvbi5odG1sI2xhYmVsUHJvdmlkZXIKKyAqLworY2xhc3MgUGVyc3BlY3RpdmVEc2xMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQmFzaWNEU0xMYWJlbFByb3ZpZGVyIHsKKworCUBJbmplY3QKKwluZXcoQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGRlbGVnYXRlKSB7CisJCXN1cGVyKGRlbGVnYXRlKTsKKwl9CisKKwkvLyBMYWJlbHMgYW5kIGljb25zIGNhbiBiZSBjb21wdXRlZCBsaWtlIHRoaXM6CisKKwkgb3ZlcnJpZGUgdGV4dCAoIE9iamVjdCBvICkgeworCQlzd2l0Y2ggKG8pIHsKKwkJCVBlcnNwZWN0aXZlUGFja2FnZQkJCTogZ2VuZXJhdGVUZXh0KCBvLCAncGFja2FnZScgICAgICAsIG8ubmFtZSApCisJCQlQZXJzcGVjdGl2ZQkJCQkJOiBnZW5lcmF0ZVRleHQoIG8sICdwZXJzcGVjdGl2ZScgICwgby5uYW1lICkKKwkJCVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lcgk6IGdlbmVyYXRlVGV4dCggbywgJ3Nhc2hDb250YWluZXInLCBvLmVsZW1lbnRJZCApCisJCQlQZXJzcGVjdGl2ZVBhcnRTdGFjawkJOiBnZW5lcmF0ZVRleHQoIG8sICdwYXJ0U3RhY2snICAgICwgby5lbGVtZW50SWQgKQorCQkJUGVyc3BlY3RpdmVQYXJ0CQkJCTogZ2VuZXJhdGVUZXh0KCBvLCAncGFydCcgICAgICAgICAsIG8uZWxlbWVudElkICkKKwkJCVBlcnNwZWN0aXZlU2VsZWN0aW9uCQk6IGdlbmVyYXRlVGV4dCggbywgJ3NlbGVjdCcgICAgICAgLCBvLnJlZi5uYW1lICkKKwkJCVBlcnNwZWN0aXZlVGFibGUJCQk6IGdlbmVyYXRlVGV4dCggbywgJ3RhYmxlJyAgICAgICAgLCBvLnJlZi5uYW1lICkKKwkJCVBlcnNwZWN0aXZlR3JpZAkJCQk6IGdlbmVyYXRlVGV4dCggbywgJ2dyaWQnICAgICAgICAgLCBvLnJlZi5uYW1lICkKKwkJCVBlcnNwZWN0aXZlQ2hhcnQJCQk6IGdlbmVyYXRlVGV4dCggbywgJ2NoYXJ0JyAgICAgICAgLCBvLnJlZi5uYW1lICkKKwkJCVBlcnNwZWN0aXZlUmVwb3J0CQkJOiBnZW5lcmF0ZVRleHQoIG8sICdyZXBvcnQnICAgICAgICwgby5yZWYubmFtZSApCisJCQlQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbgkJOiBnZW5lcmF0ZVRleHQoIG8sICdvcmdhbmlncmFtJyAgICwgby5yZWYubmFtZSApCisJCQlQZXJzcGVjdGl2ZVRvcG9sb2d5CQkJOiBnZW5lcmF0ZVRleHQoIG8sICd0b3BvbG9neScgICAgICwgby5yZWYubmFtZSApCisJCQlQZXJzcGVjdGl2ZURpYWxvZwkJCTogZ2VuZXJhdGVUZXh0KCBvLCAnZGlhbG9nJyAgICAgICAsIG8ucmVmLm5hbWUgKQorCQkJUGVyc3BlY3RpdmVCUE1OCQkJCTogZ2VuZXJhdGVUZXh0KCBvLCAnYnBtbicgICAgICAgICApCisJCQlkZWZhdWx0CQkJCQkJOiBzdXBlci50ZXh0KCBvICkKKwkJfQorCX0KKworCW92ZXJyaWRlIGltYWdlICggT2JqZWN0IG8gKSB7CisJCXN3aXRjaCAobykgeworCQkJUGVyc3BlY3RpdmVNb2RlbAkJCTogZ2V0SW50ZXJuYWxJbWFnZSggJ21vZGVsLnBuZycgICAgICAgICAgICAsIGNsYXNzICkKKwkJCVBlcnNwZWN0aXZlUGFja2FnZQkJCTogZ2V0SW50ZXJuYWxJbWFnZSggJ3BhY2thZ2UuZ2lmJyAgICAgICAgICAsIGNsYXNzICkKKwkJCVBlcnNwZWN0aXZlCQkJCQk6IGdldEludGVybmFsSW1hZ2UoICdkc2xfcGVyc3BlY3RpdmUucG5nJyAgLCBjbGFzcyApCisvLwkJCVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lcgk6IGdldEludGVybmFsSW1hZ2UoICcucG5nJyAgICAgICAgICAgICAgICAgLCBjbGFzcyApCisvLwkJCVBlcnNwZWN0aXZlUGFydFN0YWNrCQk6IGdldEludGVybmFsSW1hZ2UoICcucG5nJyAgICAgICAgICAgICAgICAgLCBjbGFzcyApCisJCQlQZXJzcGVjdGl2ZVNlbGVjdGlvbgkJOiBnZXRJbnRlcm5hbEltYWdlKCAnZHNsX3NlbGVjdC5wbmcnICAgICAgICwgY2xhc3MgKQorCQkJUGVyc3BlY3RpdmVUYWJsZQkJCTogZ2V0SW50ZXJuYWxJbWFnZSggJ2RzbF90YWJsZS5wbmcnICAgICAgICAsIGNsYXNzICkKKwkJCVBlcnNwZWN0aXZlR3JpZAkJCQk6IGdldEludGVybmFsSW1hZ2UoICdDeEdyaWRTb3VyY2VJbnB1dC5wbmcnLCBjbGFzcyApCisJCQlQZXJzcGVjdGl2ZUNoYXJ0CQkJOiBnZXRJbnRlcm5hbEltYWdlKCAnZHNsX2NoYXJ0LnBuZycgICAgICAgICwgY2xhc3MgKQorCQkJUGVyc3BlY3RpdmVSZXBvcnQJCQk6IGdldEludGVybmFsSW1hZ2UoICdkc2xfcmVwb3J0LmdpZicgICAgICAgLCBjbGFzcyApCisJCQlQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbgkJOiBnZXRJbnRlcm5hbEltYWdlKCAnZHNsX29yZ2FuaWdyYW0ucG5nJyAgICwgY2xhc3MgKQorCQkJUGVyc3BlY3RpdmVUb3BvbG9neQkJCTogZ2V0SW50ZXJuYWxJbWFnZSggJ2RzbF90b3BvbG9neS5wbmcnICAgICAsIGNsYXNzICkKKwkJCVBlcnNwZWN0aXZlRGlhbG9nCQkJOiBnZXRJbnRlcm5hbEltYWdlKCAnZHNsX2RpYWxvZy5naWYnICAgICAgICwgY2xhc3MgKQorCQkJZGVmYXVsdAkJCQkJCTogc3VwZXIuaW1hZ2UoIG8gKQorCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9vdXRsaW5lL1BlcnNwZWN0aXZlRHNsT3V0bGluZVRyZWVQcm92aWRlci54dGVuZCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvb3V0bGluZS9QZXJzcGVjdGl2ZURzbE91dGxpbmVUcmVlUHJvdmlkZXIueHRlbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZjNjNmZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvb3V0bGluZS9QZXJzcGVjdGl2ZURzbE91dGxpbmVUcmVlUHJvdmlkZXIueHRlbmQKQEAgLTAsMCArMSwyNyBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqIAorICogIFRoaXMgY29weXJpZ2h0IG5vdGljZSBzaG93cyB1cCBpbiB0aGUgZ2VuZXJhdGVkIEphdmEgY29kZQorICoKKyAqLworIAorcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLm91dGxpbmUKKworLyoqCisgKiBDdXN0b21pemF0aW9uIG9mIHRoZSBkZWZhdWx0IG91dGxpbmUgc3RydWN0dXJlLgorICoKKyAqIHNlZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL1h0ZXh0L2RvY3VtZW50YXRpb24uaHRtbCNvdXRsaW5lCisgKi8KK2NsYXNzIFBlcnNwZWN0aXZlRHNsT3V0bGluZVRyZWVQcm92aWRlciBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5vdXRsaW5lLmltcGwuRGVmYXVsdE91dGxpbmVUcmVlUHJvdmlkZXIgeworCQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9xdWlja2ZpeC9QZXJzcGVjdGl2ZURzbFF1aWNrZml4UHJvdmlkZXIueHRlbmQgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL3F1aWNrZml4L1BlcnNwZWN0aXZlRHNsUXVpY2tmaXhQcm92aWRlci54dGVuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTM3NmMzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9xdWlja2ZpeC9QZXJzcGVjdGl2ZURzbFF1aWNrZml4UHJvdmlkZXIueHRlbmQKQEAgLTAsMCArMSw0MCBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqIAorICogIFRoaXMgY29weXJpZ2h0IG5vdGljZSBzaG93cyB1cCBpbiB0aGUgZ2VuZXJhdGVkIEphdmEgY29kZQorICoKKyAqLworIAorcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLnF1aWNrZml4CisKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5xdWlja2ZpeC5GaXgKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5xdWlja2ZpeC5Jc3N1ZVJlc29sdXRpb25BY2NlcHRvcgorLy9pbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudmFsaWRhdGlvbi5Jc3N1ZQorCisvKioKKyAqIEN1c3RvbSBxdWlja2ZpeGVzLgorICoKKyAqIHNlZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL1h0ZXh0L2RvY3VtZW50YXRpb24uaHRtbCNxdWlja2ZpeGVzCisgKi8KK2NsYXNzIFBlcnNwZWN0aXZlRHNsUXVpY2tmaXhQcm92aWRlciBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmFubm90YXRpb25zLnVpLnF1aWNrZml4LlhiYXNlV2l0aEFubm90YXRpb25zUXVpY2tmaXhQcm92aWRlciB7CisKKy8vCUBGaXgoTXlEc2xWYWxpZGF0b3I6OklOVkFMSURfTkFNRSkKKy8vCWRlZiBjYXBpdGFsaXplTmFtZShJc3N1ZSBpc3N1ZSwgSXNzdWVSZXNvbHV0aW9uQWNjZXB0b3IgYWNjZXB0b3IpIHsKKy8vCQlhY2NlcHRvci5hY2NlcHQoaXNzdWUsICdDYXBpdGFsaXplIG5hbWUnLCAnQ2FwaXRhbGl6ZSB0aGUgbmFtZS4nLCAndXBjYXNlLnBuZycpIFsKKy8vCQkJY29udGV4dCB8CisvLwkJCXZhbCB4dGV4dERvY3VtZW50ID0gY29udGV4dC54dGV4dERvY3VtZW50CisvLwkJCXZhbCBmaXJzdExldHRlciA9IHh0ZXh0RG9jdW1lbnQuZ2V0KGlzc3VlLm9mZnNldCwgMSkKKy8vCQkJeHRleHREb2N1bWVudC5yZXBsYWNlKGlzc3VlLm9mZnNldCwgMSwgZmlyc3RMZXR0ZXIudG9VcHBlckNhc2UpCisvLwkJXQorLy8JfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS90ZW1wbGF0ZXMvdGVtcGxhdGVzLnhtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvdGVtcGxhdGVzL3RlbXBsYXRlcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdhNzg4YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkvdGVtcGxhdGVzL3RlbXBsYXRlcy54bWwKQEAgLTAsMCArMSwyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz48dGVtcGxhdGVzPgorPC90ZW1wbGF0ZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb250ZW50YXNzaXN0L0ljb25OYW1lVGV4dEFwcGxpZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9JY29uTmFtZVRleHRBcHBsaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAzZTMwMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9JY29uTmFtZVRleHRBcHBsaWVyLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogIENvbnRyaWJ1dG9yczoKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICogCisgKiAgVGhpcyBjb3B5cmlnaHQgbm90aWNlIHNob3dzIHVwIGluIHRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5jb250ZW50YXNzaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmZvcmsubWloYWxpcy5vcGFsLndpZGdldHMuSW1hZ2VTZWxlY3RvckRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuQ29uZmlndXJhYmxlQ29tcGxldGlvblByb3Bvc2FsOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LlJlcGxhY2VtZW50VGV4dEFwcGxpZXI7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIEljb25OYW1lVGV4dEFwcGxpZXIgZXh0ZW5kcyBSZXBsYWNlbWVudFRleHRBcHBsaWVyIHsKKyAgcHJpdmF0ZSBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0OworICAKKyAgcHJpdmF0ZSBTdHJpbmdbXSBleHRlbnNpb25zOworICAKKyAgcHVibGljIENvbnRlbnRBc3Npc3RDb250ZXh0IHNldENvbnRleHQoZmluYWwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCkgeworICAgIHJldHVybiB0aGlzLmNvbnRleHQgPSBjb250ZXh0OworICB9CisgIAorICBwdWJsaWMgU3RyaW5nW10gc2V0RXh0ZW5zaW9ucyhmaW5hbCBTdHJpbmdbXSBmaWxlRXh0ZW5zaW9ucykgeworICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbnMgPSBmaWxlRXh0ZW5zaW9uczsKKyAgfQorICAKKyAgcHVibGljIFN0cmluZyBnZXRBY3R1YWxSZXBsYWNlbWVudFN0cmluZyhmaW5hbCBDb25maWd1cmFibGVDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwpIHsKKyAgICBJVGV4dFZpZXdlciBfdmlld2VyID0gdGhpcy5jb250ZXh0LmdldFZpZXdlcigpOworICAgIFN0eWxlZFRleHQgX3RleHRXaWRnZXQgPSBfdmlld2VyLmdldFRleHRXaWRnZXQoKTsKKyAgICBEaXNwbGF5IGRpc3BsYXkgPSBfdGV4dFdpZGdldC5nZXREaXNwbGF5KCk7CisgICAgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7CisgICAgRmlsbExheW91dCBfZmlsbExheW91dCA9IG5ldyBGaWxsTGF5b3V0KCk7CisgICAgc2hlbGwuc2V0TGF5b3V0KF9maWxsTGF5b3V0KTsKKyAgICBJbWFnZVNlbGVjdG9yRGlhbG9nIGltYWdlU2VsZWN0b3JEaWFsb2cgPSBuZXcgSW1hZ2VTZWxlY3RvckRpYWxvZyhzaGVsbCwgMTYpOworICAgIGltYWdlU2VsZWN0b3JEaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyh0aGlzLmV4dGVuc2lvbnMpOworICAgIFN0cmluZyBpbWFnZUZpbGVOYW1lID0gaW1hZ2VTZWxlY3RvckRpYWxvZy5vcGVuKHRydWUpOworICAgIFN0cmluZyBfY29uY2F0ID0gIlwiIi5jb25jYXQoaW1hZ2VGaWxlTmFtZSk7CisgICAgcmV0dXJuIF9jb25jYXQuY29uY2F0KCJcIiIpOworICB9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvUGVyc3BlY3RpdmVEc2xQcm9wb3NhbFByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2NvbnRlbnRhc3Npc3QvUGVyc3BlY3RpdmVEc2xQcm9wb3NhbFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEwY2ZkMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udGVudGFzc2lzdC9QZXJzcGVjdGl2ZURzbFByb3Bvc2FsUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE5MyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogIENvbnRyaWJ1dG9yczoKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICogCisgKiAgVGhpcyBjb3B5cmlnaHQgbm90aWNlIHNob3dzIHVwIGluIHRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5jb250ZW50YXNzaXN0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5pbXBsLlByb2Nlc3NJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLmltcGwuVXNlclRhc2tJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3R5bGVkU3RyaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYmFzaWMudWkuQmFzaWNEU0xEb2N1bWVudGF0aW9uVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJhc2ljLnVpLmNvbnRlbnRhc3Npc3QuQmFzaWNEU0xQcm9wb3NhbFByb3ZpZGVySGVscGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYXJ0U3RhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5QZXJzcGVjdGl2ZURTTERvY3VtZW50YXRpb25UcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkuY29udGVudGFzc2lzdC5BYnN0cmFjdFBlcnNwZWN0aXZlRHNsUHJvcG9zYWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLmNvbnRlbnRhc3Npc3QuSWNvbk5hbWVUZXh0QXBwbGllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZDIubGliLlN0cmluZ0NvbmNhdGVuYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuQWJzdHJhY3RFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LkFzc2lnbm1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuS2V5d29yZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5SdWxlQ2FsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udWkuY29udGVudGFzc2lzdC5UZXJtaW5hbHNQcm9wb3NhbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LkNvbmZpZ3VyYWJsZUNvbXBsZXRpb25Qcm9wb3NhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0Q29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3I7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIFBlcnNwZWN0aXZlRHNsUHJvcG9zYWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0UGVyc3BlY3RpdmVEc2xQcm9wb3NhbFByb3ZpZGVyIHsKKyAgQEluamVjdAorICBwcml2YXRlIFRlcm1pbmFsc1Byb3Bvc2FsUHJvdmlkZXIgcHJvdmlkZXI7CisgIAorICBASW5qZWN0CisgIHByaXZhdGUgQmFzaWNEU0xQcm9wb3NhbFByb3ZpZGVySGVscGVyIHByb3ZpZGVySGVscGVyOworICAKKyAgcHVibGljIFN0eWxlZFN0cmluZyBnZXRQcm9wb3NhbFN0cmluZyhmaW5hbCBQcm9jZXNzSW1wbCBwcm9jZXNzLCBmaW5hbCBVc2VyVGFza0ltcGwgdXNlclRhc2spIHsKKyAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICBTdHJpbmcgX25hbWUgPSB1c2VyVGFzay5nZXROYW1lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lLCAiIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIgaW4gcHJvY2VzcyAiKTsKKyAgICBTdHJpbmcgX2lkID0gcHJvY2Vzcy5nZXRJZCgpOworICAgIF9idWlsZGVyLmFwcGVuZChfaWQsICIiKTsKKyAgICByZXR1cm4gbmV3IFN0eWxlZFN0cmluZyhfYnVpbGRlci50b1N0cmluZygpKTsKKyAgfQorICAKKyAgLyoqCisgICAqIFRoaXMgb3ZlcnJpZGUgd2lsbCBlbmFibGUgMSBsZW5ndGggbm9uIGxldHRlciBjaGFyYWN0ZXJzIGFzIGtleXdvcmQuCisgICAqLworICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0tleXdvcmRXb3J0aHlUb1Byb3Bvc2UoZmluYWwgS2V5d29yZCBrZXl3b3JkKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGljb25QaWNrZXJQcm9wb3NhbChmaW5hbCBFT2JqZWN0IG1vZGVsLCBmaW5hbCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIGZpbmFsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIGZpbmFsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvciwgZmluYWwgU3RyaW5nIGZpbGVFeHRlbnNpb25zKSB7CisgICAgSUNvbXBsZXRpb25Qcm9wb3NhbCBfY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsID0gdGhpcy5jcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoIlNlbGVjdCBpY29uLi4uIiwgY29udGV4dCk7CisgICAgQ29uZmlndXJhYmxlQ29tcGxldGlvblByb3Bvc2FsIGZpbGVOYW1lID0gKChDb25maWd1cmFibGVDb21wbGV0aW9uUHJvcG9zYWwpIF9jcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwpOworICAgIGJvb2xlYW4gX25vdEVxdWFscyA9ICghT2JqZWN0cy5lcXVhbChmaWxlTmFtZSwgbnVsbCkpOworICAgIGlmIChfbm90RXF1YWxzKSB7CisgICAgICBJY29uTmFtZVRleHRBcHBsaWVyIGFwcGxpZXIgPSBuZXcgSWNvbk5hbWVUZXh0QXBwbGllcigpOworICAgICAgU3RyaW5nW10gX3NwbGl0ID0gZmlsZUV4dGVuc2lvbnMuc3BsaXQoIiwiKTsKKyAgICAgIGFwcGxpZXIuc2V0RXh0ZW5zaW9ucyhfc3BsaXQpOworICAgICAgYXBwbGllci5zZXRDb250ZXh0KGNvbnRleHQpOworICAgICAgZmlsZU5hbWUuc2V0VGV4dEFwcGxpZXIoYXBwbGllcik7CisgICAgfQorICAgIGFjY2VwdG9yLmFjY2VwdChmaWxlTmFtZSk7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGNvbXBsZXRlUGVyc3BlY3RpdmVfSWNvblVSSShmaW5hbCBFT2JqZWN0IG1vZGVsLCBmaW5hbCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIGZpbmFsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIGZpbmFsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworICAgIHRoaXMuaWNvblBpY2tlclByb3Bvc2FsKG1vZGVsLCBhc3NpZ25tZW50LCBjb250ZXh0LCBhY2NlcHRvciwgIi5wbmciKTsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgY29tcGxldGVQZXJzcGVjdGl2ZVBhcnRfSWNvblVSSShmaW5hbCBFT2JqZWN0IG1vZGVsLCBmaW5hbCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIGZpbmFsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIGZpbmFsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworICAgIHRoaXMuaWNvblBpY2tlclByb3Bvc2FsKG1vZGVsLCBhc3NpZ25tZW50LCBjb250ZXh0LCBhY2NlcHRvciwgIi5wbmciKTsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgY29tcGxldGVfVmFsaWRJRChmaW5hbCBFT2JqZWN0IG1vZGVsLCBmaW5hbCBSdWxlQ2FsbCBydWxlQ2FsbCwgZmluYWwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgZmluYWwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisgICAgdGhpcy5jb21wbGV0ZV9JRChtb2RlbCwgcnVsZUNhbGwsIGNvbnRleHQsIGFjY2VwdG9yKTsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgY29tcGxldGVfVFJBTlNMQVRBQkxFSUQoZmluYWwgRU9iamVjdCBtb2RlbCwgZmluYWwgUnVsZUNhbGwgcnVsZUNhbGwsIGZpbmFsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIGZpbmFsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworICAgIHRoaXMuY29tcGxldGVfSUQobW9kZWwsIHJ1bGVDYWxsLCBjb250ZXh0LCBhY2NlcHRvcik7CisgIH0KKyAgCisgIHByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRQcm9wb3NhbChmaW5hbCBTdHJpbmcgcHJvcG9zYWwsIGZpbmFsIFN0cmluZyBwcmVmaXgsIGZpbmFsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQpIHsKKyAgICBib29sZWFuIHJlc3VsdCA9IHN1cGVyLmlzVmFsaWRQcm9wb3NhbChwcm9wb3NhbCwgcHJlZml4LCBjb250ZXh0KTsKKyAgICBFT2JqZWN0IF9jdXJyZW50TW9kZWwgPSBjb250ZXh0LmdldEN1cnJlbnRNb2RlbCgpOworICAgIGlmICgoX2N1cnJlbnRNb2RlbCBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlUGFydFN0YWNrKSkgeworICAgICAgYm9vbGVhbiBfb3IgPSBmYWxzZTsKKyAgICAgIGJvb2xlYW4gX2VxdWFscyA9ICJwYXJ0U3RhY2siLmVxdWFscyhwcm9wb3NhbCk7CisgICAgICBpZiAoX2VxdWFscykgeworICAgICAgICBfb3IgPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYm9vbGVhbiBfZXF1YWxzXzEgPSAic2FzaENvbnRhaW5lciIuZXF1YWxzKHByb3Bvc2FsKTsKKyAgICAgICAgX29yID0gX2VxdWFsc18xOworICAgICAgfQorICAgICAgaWYgKF9vcikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgRU9iamVjdCBfY3VycmVudE1vZGVsXzEgPSBjb250ZXh0LmdldEN1cnJlbnRNb2RlbCgpOworICAgIGlmICgoX2N1cnJlbnRNb2RlbF8xIGluc3RhbmNlb2YgUGVyc3BlY3RpdmVQYXJ0KSkgeworICAgICAgYm9vbGVhbiBfb3JfMSA9IGZhbHNlOworICAgICAgYm9vbGVhbiBfb3JfMiA9IGZhbHNlOworICAgICAgYm9vbGVhbiBfZXF1YWxzXzIgPSAicGFydCIuZXF1YWxzKHByb3Bvc2FsKTsKKyAgICAgIGlmIChfZXF1YWxzXzIpIHsKKyAgICAgICAgX29yXzIgPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYm9vbGVhbiBfZXF1YWxzXzMgPSAicGFydFN0YWNrIi5lcXVhbHMocHJvcG9zYWwpOworICAgICAgICBfb3JfMiA9IF9lcXVhbHNfMzsKKyAgICAgIH0KKyAgICAgIGlmIChfb3JfMikgeworICAgICAgICBfb3JfMSA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBib29sZWFuIF9lcXVhbHNfNCA9ICJzYXNoQ29udGFpbmVyIi5lcXVhbHMocHJvcG9zYWwpOworICAgICAgICBfb3JfMSA9IF9lcXVhbHNfNDsKKyAgICAgIH0KKyAgICAgIGlmIChfb3JfMSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICAKKyAgcHJvdGVjdGVkIFN0eWxlZFN0cmluZyBnZXRLZXl3b3JkRGlzcGxheVN0cmluZyhmaW5hbCBLZXl3b3JkIGtleXdvcmQpIHsKKyAgICBCYXNpY0RTTERvY3VtZW50YXRpb25UcmFuc2xhdG9yIF9pbnN0YW5jZSA9IFBlcnNwZWN0aXZlRFNMRG9jdW1lbnRhdGlvblRyYW5zbGF0b3IuaW5zdGFuY2UoKTsKKyAgICByZXR1cm4gQmFzaWNEU0xQcm9wb3NhbFByb3ZpZGVySGVscGVyLmdldEtleXdvcmREaXNwbGF5U3RyaW5nKGtleXdvcmQsIF9pbnN0YW5jZSk7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGNvbXBsZXRlX1F1YWxpZmllZE5hbWUoZmluYWwgRU9iamVjdCBtb2RlbCwgZmluYWwgUnVsZUNhbGwgcnVsZUNhbGwsIGZpbmFsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIGZpbmFsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworICAgIHRoaXMucHJvdmlkZXJIZWxwZXIuY29tcGxldGVfUGFja2FnZU5hbWUobW9kZWwsIHJ1bGVDYWxsLCBjb250ZXh0LCBhY2NlcHRvciwgdGhpcyk7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGNvbXBsZXRlX1BlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZChmaW5hbCBFT2JqZWN0IG1vZGVsLCBmaW5hbCBSdWxlQ2FsbCBydWxlQ2FsbCwgZmluYWwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgZmluYWwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisgICAgdGhpcy5wcm92aWRlckhlbHBlci5jb21wbGV0ZV9QYWNrYWdlTmFtZShtb2RlbCwgcnVsZUNhbGwsIGNvbnRleHQsIGFjY2VwdG9yLCB0aGlzKTsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgY29tcGxldGVfSUQoZmluYWwgRU9iamVjdCBtb2RlbCwgZmluYWwgUnVsZUNhbGwgcnVsZUNhbGwsIGZpbmFsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIGZpbmFsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworICAgIHRoaXMucHJvdmlkZXIuY29tcGxldGVfSUQobW9kZWwsIHJ1bGVDYWxsLCBjb250ZXh0LCBhY2NlcHRvcik7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGNvbXBsZXRlX1RSQU5TTEFUQUJMRVNUUklORyhmaW5hbCBFT2JqZWN0IG1vZGVsLCBmaW5hbCBSdWxlQ2FsbCBydWxlQ2FsbCwgZmluYWwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgZmluYWwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisgICAgdGhpcy5wcm92aWRlci5jb21wbGV0ZV9TVFJJTkcobW9kZWwsIHJ1bGVDYWxsLCBjb250ZXh0LCBhY2NlcHRvcik7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGNvbXBsZXRlUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX0NvbnRhaW5lckRhdGEoZmluYWwgRU9iamVjdCBtb2RlbCwgZmluYWwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBmaW5hbCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBmaW5hbCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKyAgICBBYnN0cmFjdEVsZW1lbnQgX3Rlcm1pbmFsID0gYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpOworICAgIHRoaXMucHJvdmlkZXIuY29tcGxldGVfU1RSSU5HKG1vZGVsLCAoKFJ1bGVDYWxsKSBfdGVybWluYWwpLCBjb250ZXh0LCBhY2NlcHRvcik7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGNvbXBsZXRlUGVyc3BlY3RpdmVQYXJ0X0NvbnRhaW5lckRhdGEoZmluYWwgRU9iamVjdCBtb2RlbCwgZmluYWwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBmaW5hbCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBmaW5hbCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKyAgICBBYnN0cmFjdEVsZW1lbnQgX3Rlcm1pbmFsID0gYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpOworICAgIHRoaXMucHJvdmlkZXIuY29tcGxldGVfU1RSSU5HKG1vZGVsLCAoKFJ1bGVDYWxsKSBfdGVybWluYWwpLCBjb250ZXh0LCBhY2NlcHRvcik7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGNvbXBsZXRlUGVyc3BlY3RpdmVQYXJ0U3RhY2tfQ29udGFpbmVyRGF0YShmaW5hbCBFT2JqZWN0IG1vZGVsLCBmaW5hbCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIGZpbmFsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIGZpbmFsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworICAgIEFic3RyYWN0RWxlbWVudCBfdGVybWluYWwgPSBhc3NpZ25tZW50LmdldFRlcm1pbmFsKCk7CisgICAgdGhpcy5wcm92aWRlci5jb21wbGV0ZV9TVFJJTkcobW9kZWwsICgoUnVsZUNhbGwpIF90ZXJtaW5hbCksIGNvbnRleHQsIGFjY2VwdG9yKTsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgY29tcGxldGVQZXJzcGVjdGl2ZV9BY2Nlc3NpYmlsaXR5UGhyYXNlKGZpbmFsIEVPYmplY3QgbW9kZWwsIGZpbmFsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgZmluYWwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgZmluYWwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisgICAgQWJzdHJhY3RFbGVtZW50IF90ZXJtaW5hbCA9IGFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKTsKKyAgICB0aGlzLnByb3ZpZGVyLmNvbXBsZXRlX1NUUklORyhtb2RlbCwgKChSdWxlQ2FsbCkgX3Rlcm1pbmFsKSwgY29udGV4dCwgYWNjZXB0b3IpOworICB9CisgIAorICBwdWJsaWMgdm9pZCBjb21wbGV0ZVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lcl9BY2Nlc3NpYmlsaXR5UGhyYXNlKGZpbmFsIEVPYmplY3QgbW9kZWwsIGZpbmFsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgZmluYWwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgZmluYWwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisgICAgQWJzdHJhY3RFbGVtZW50IF90ZXJtaW5hbCA9IGFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKTsKKyAgICB0aGlzLnByb3ZpZGVyLmNvbXBsZXRlX1NUUklORyhtb2RlbCwgKChSdWxlQ2FsbCkgX3Rlcm1pbmFsKSwgY29udGV4dCwgYWNjZXB0b3IpOworICB9CisgIAorICBwdWJsaWMgdm9pZCBjb21wbGV0ZVBlcnNwZWN0aXZlUGFydF9BY2Nlc3NpYmlsaXR5UGhyYXNlKGZpbmFsIEVPYmplY3QgbW9kZWwsIGZpbmFsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgZmluYWwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgZmluYWwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisgICAgQWJzdHJhY3RFbGVtZW50IF90ZXJtaW5hbCA9IGFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKTsKKyAgICB0aGlzLnByb3ZpZGVyLmNvbXBsZXRlX1NUUklORyhtb2RlbCwgKChSdWxlQ2FsbCkgX3Rlcm1pbmFsKSwgY29udGV4dCwgYWNjZXB0b3IpOworICB9CisgIAorICBwdWJsaWMgdm9pZCBjb21wbGV0ZVBlcnNwZWN0aXZlUGFydFN0YWNrX0FjY2Vzc2liaWxpdHlQaHJhc2UoZmluYWwgRU9iamVjdCBtb2RlbCwgZmluYWwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBmaW5hbCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBmaW5hbCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKyAgICBBYnN0cmFjdEVsZW1lbnQgX3Rlcm1pbmFsID0gYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpOworICAgIHRoaXMucHJvdmlkZXIuY29tcGxldGVfU1RSSU5HKG1vZGVsLCAoKFJ1bGVDYWxsKSBfdGVybWluYWwpLCBjb250ZXh0LCBhY2NlcHRvcik7CisgIH0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udmVydGVyL0U0UGVyc3BlY3RpdmVUb0RTTENvbnZlcnRlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9jb252ZXJ0ZXIvRTRQZXJzcGVjdGl2ZVRvRFNMQ29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBkYmI5OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvY29udmVydGVyL0U0UGVyc3BlY3RpdmVUb0RTTENvbnZlcnRlci5qYXZhCkBAIC0wLDAgKzEsNDI5IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiAgQ29udHJpYnV0b3JzOgorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKiAKKyAqICBUaGlzIGNvcHlyaWdodCBub3RpY2Ugc2hvd3MgdXAgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLmNvbnZlcnRlcjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT2JqZWN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5NVUlFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmFkdmFuY2VkLk1QZXJzcGVjdGl2ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NUGFydFNhc2hDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVBhcnRTYXNoQ29udGFpbmVyRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5iYXNpYy5NUGFydFN0YWNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1TdGFja0VsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXMuTEltcG9ydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXMuT1NCUFR5cGVzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGlhbG9nZHNsLkRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRpYWxvZ2RzbC5EaWFsb2dEU0xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUNoYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUdyaWQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYXJ0U3RhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVJlcG9ydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlU2FzaENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5TYXNoT3JpZW50YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC50YWJsZS5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnRhYmxlLlRhYmxlRFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZDIubGliLlN0cmluZ0NvbmNhdGVuYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQubmFtaW5nLlF1YWxpZmllZE5hbWU7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuSUVPYmplY3REZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5JUmVzb3VyY2VEZXNjcmlwdGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkNvbGxlY3Rpb25MaXRlcmFsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuU3RyaW5nRXh0ZW5zaW9uczsKKworLyoqCisgKiBUaGlzIGNsYXNzIGNvbnZlcnRzIGEgZ2l2ZW4gRTQtUGVyc3BlY3RpdmUgdG8gYW4gT1NCUCBwZXJzcGVjdGl2ZSBtb2RlbCBvciBkc2wgdGV4dC4KKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgRTRQZXJzcGVjdGl2ZVRvRFNMQ29udmVydGVyIHsKKyAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE9TQlBfTlNfVVJJID0gIm9zYnAtTlMtVXJpIjsKKyAgCisgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBPU0JQX0ZRTiA9ICJvc2JwLW1vZGVsLWZxbiI7CisgIAorICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgT1NCUF9GTEFWT1IgPSAib3NicC1OUy1VcmktZmxhdm9yIjsKKyAgCisgIEBJbmplY3QKKyAgcHJpdmF0ZSBJUmVzb3VyY2VEZXNjcmlwdGlvbnMgZGVzY3JpcHRpb25zOworICAKKyAgcHJpdmF0ZSBQZXJzcGVjdGl2ZURzbEZhY3RvcnkgcEZhY3RvcnkgPSBQZXJzcGVjdGl2ZURzbEZhY3RvcnkuZUlOU1RBTkNFOworICAKKyAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBpbXBvcnRzID0gQ29sbGVjdGlvbkxpdGVyYWxzLjxTdHJpbmc+bmV3SGFzaFNldCgpOworICAKKyAgcHJpdmF0ZSBNYXA8TVVJRWxlbWVudCwgRU9iamVjdD4gZWxlbWVudHMgPSBDb2xsZWN0aW9uTGl0ZXJhbHMuPE1VSUVsZW1lbnQsIEVPYmplY3Q+bmV3SGFzaE1hcCgpOworICAKKyAgcHJpdmF0ZSBpbnQgY291bnRlcjsKKyAgCisgIHB1YmxpYyBQZXJzcGVjdGl2ZU1vZGVsIHRvTW9kZWwoZmluYWwgTVBlcnNwZWN0aXZlIG1QZXJzcGVjdGl2ZSkgeworICAgIHRoaXMuY291bnRlciA9IDA7CisgICAgdGhpcy5pbXBvcnRzLmNsZWFyKCk7CisgICAgZmluYWwgUGVyc3BlY3RpdmVNb2RlbCBvTW9kZWwgPSB0aGlzLnBGYWN0b3J5LmNyZWF0ZVBlcnNwZWN0aXZlTW9kZWwoKTsKKyAgICBmaW5hbCBQZXJzcGVjdGl2ZVBhY2thZ2Ugb1BrZyA9IHRoaXMucEZhY3RvcnkuY3JlYXRlUGVyc3BlY3RpdmVQYWNrYWdlKCk7CisgICAgb1BrZy5zZXROYW1lKCJ0by5iZS5kZWZpbmVkIik7CisgICAgRUxpc3Q8UGVyc3BlY3RpdmVQYWNrYWdlPiBfcGFja2FnZXMgPSBvTW9kZWwuZ2V0UGFja2FnZXMoKTsKKyAgICBfcGFja2FnZXMuYWRkKG9Qa2cpOworICAgIGZpbmFsIFBlcnNwZWN0aXZlIHBlcnNwZWN0aXZlID0gdGhpcy5jb252ZXJ0UGVyc3BlY3RpdmUobVBlcnNwZWN0aXZlKTsKKyAgICBFTGlzdDxQZXJzcGVjdGl2ZT4gX3BlcnNwZWN0aXZlcyA9IG9Qa2cuZ2V0UGVyc3BlY3RpdmVzKCk7CisgICAgX3BlcnNwZWN0aXZlcy5hZGQocGVyc3BlY3RpdmUpOworICAgIGZpbmFsIENvbnN1bWVyPFN0cmluZz4gX2Z1bmN0aW9uID0gbmV3IENvbnN1bWVyPFN0cmluZz4oKSB7CisgICAgICBwdWJsaWMgdm9pZCBhY2NlcHQoZmluYWwgU3RyaW5nIGl0KSB7CisgICAgICAgIGZpbmFsIExJbXBvcnQgaW1wID0gT1NCUFR5cGVzRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTEltcG9ydCgpOworICAgICAgICBpbXAuc2V0SW1wb3J0ZWROYW1lc3BhY2UoKGl0ICsgIi4qIikpOworICAgICAgICBFTGlzdDxMSW1wb3J0PiBfaW1wb3J0cyA9IG9Qa2cuZ2V0SW1wb3J0cygpOworICAgICAgICBfaW1wb3J0cy5hZGQoaW1wKTsKKyAgICAgIH0KKyAgICB9OworICAgIHRoaXMuaW1wb3J0cy5mb3JFYWNoKF9mdW5jdGlvbik7CisgICAgcmV0dXJuIG9Nb2RlbDsKKyAgfQorICAKKyAgcHVibGljIFBlcnNwZWN0aXZlIGNvbnZlcnRQZXJzcGVjdGl2ZShmaW5hbCBNUGVyc3BlY3RpdmUgbVBlcnNwZWN0aXZlKSB7CisgICAgZmluYWwgUGVyc3BlY3RpdmUgb1BlcnNwZWN0aXZlID0gdGhpcy5wRmFjdG9yeS5jcmVhdGVQZXJzcGVjdGl2ZSgpOworICAgIHRoaXMucmVnaXN0ZXIobVBlcnNwZWN0aXZlLCBvUGVyc3BlY3RpdmUpOworICAgIFN0cmluZyBfYWNjZXNzaWJpbGl0eVBocmFzZSA9IG1QZXJzcGVjdGl2ZS5nZXRBY2Nlc3NpYmlsaXR5UGhyYXNlKCk7CisgICAgb1BlcnNwZWN0aXZlLnNldEFjY2Vzc2liaWxpdHlQaHJhc2UoX2FjY2Vzc2liaWxpdHlQaHJhc2UpOworICAgIFN0cmluZyBfaWNvblVSSSA9IG1QZXJzcGVjdGl2ZS5nZXRJY29uVVJJKCk7CisgICAgb1BlcnNwZWN0aXZlLnNldEljb25VUkkoX2ljb25VUkkpOworICAgIFN0cmluZyBfbGFiZWwgPSBtUGVyc3BlY3RpdmUuZ2V0TGFiZWwoKTsKKyAgICBvUGVyc3BlY3RpdmUuc2V0TmFtZShfbGFiZWwpOworICAgIExpc3Q8TVBhcnRTYXNoQ29udGFpbmVyRWxlbWVudD4gX2NoaWxkcmVuID0gbVBlcnNwZWN0aXZlLmdldENoaWxkcmVuKCk7CisgICAgZmluYWwgQ29uc3VtZXI8TVBhcnRTYXNoQ29udGFpbmVyRWxlbWVudD4gX2Z1bmN0aW9uID0gbmV3IENvbnN1bWVyPE1QYXJ0U2FzaENvbnRhaW5lckVsZW1lbnQ+KCkgeworICAgICAgcHVibGljIHZvaWQgYWNjZXB0KGZpbmFsIE1QYXJ0U2FzaENvbnRhaW5lckVsZW1lbnQgaXQpIHsKKyAgICAgICAgZmluYWwgUGVyc3BlY3RpdmVFbGVtZW50IHJlc3VsdCA9IEU0UGVyc3BlY3RpdmVUb0RTTENvbnZlcnRlci50aGlzLmNvbnZlcnQoaXQpOworICAgICAgICBib29sZWFuIF9ub3RFcXVhbHMgPSAoIU9iamVjdHMuZXF1YWwocmVzdWx0LCBudWxsKSk7CisgICAgICAgIGlmIChfbm90RXF1YWxzKSB7CisgICAgICAgICAgRUxpc3Q8UGVyc3BlY3RpdmVFbGVtZW50PiBfZWxlbWVudHMgPSBvUGVyc3BlY3RpdmUuZ2V0RWxlbWVudHMoKTsKKyAgICAgICAgICBfZWxlbWVudHMuYWRkKHJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9OworICAgIF9jaGlsZHJlbi5mb3JFYWNoKF9mdW5jdGlvbik7CisgICAgcmV0dXJuIG9QZXJzcGVjdGl2ZTsKKyAgfQorICAKKyAgcHJvdGVjdGVkIFBlcnNwZWN0aXZlRWxlbWVudCBfY29udmVydChmaW5hbCBNUGFydFNhc2hDb250YWluZXJFbGVtZW50IGVsZW1lbnQpIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorICAKKyAgcHJvdGVjdGVkIFBlcnNwZWN0aXZlRWxlbWVudCBfY29udmVydChmaW5hbCBNU3RhY2tFbGVtZW50IGVsZW1lbnQpIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorICAKKyAgcHJvdGVjdGVkIFBlcnNwZWN0aXZlRWxlbWVudCBfY29udmVydChmaW5hbCBNUGFydFNhc2hDb250YWluZXIgbUVsZW1lbnQpIHsKKyAgICBmaW5hbCBQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIgb0VsZW1lbnQgPSB0aGlzLnBGYWN0b3J5LmNyZWF0ZVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lcigpOworICAgIHRoaXMucmVnaXN0ZXIobUVsZW1lbnQsIG9FbGVtZW50KTsKKyAgICBTdHJpbmcgX2FjY2Vzc2liaWxpdHlQaHJhc2UgPSBtRWxlbWVudC5nZXRBY2Nlc3NpYmlsaXR5UGhyYXNlKCk7CisgICAgb0VsZW1lbnQuc2V0QWNjZXNzaWJpbGl0eVBocmFzZShfYWNjZXNzaWJpbGl0eVBocmFzZSk7CisgICAgU3RyaW5nIF9jb250YWluZXJEYXRhID0gbUVsZW1lbnQuZ2V0Q29udGFpbmVyRGF0YSgpOworICAgIG9FbGVtZW50LnNldENvbnRhaW5lckRhdGEoX2NvbnRhaW5lckRhdGEpOworICAgIFN0cmluZyBfaWQgPSB0aGlzLnRvSWQoKTsKKyAgICBvRWxlbWVudC5zZXRFbGVtZW50SWQoX2lkKTsKKyAgICBib29sZWFuIF9pc0hvcml6b250YWwgPSBtRWxlbWVudC5pc0hvcml6b250YWwoKTsKKyAgICBTYXNoT3JpZW50YXRpb24gX29yaWVudGF0aW9uID0gdGhpcy50b09yaWVudGF0aW9uKF9pc0hvcml6b250YWwpOworICAgIG9FbGVtZW50LnNldE9yaWVudGF0aW9uKF9vcmllbnRhdGlvbik7CisgICAgTGlzdDxNUGFydFNhc2hDb250YWluZXJFbGVtZW50PiBfY2hpbGRyZW4gPSBtRWxlbWVudC5nZXRDaGlsZHJlbigpOworICAgIGZpbmFsIENvbnN1bWVyPE1QYXJ0U2FzaENvbnRhaW5lckVsZW1lbnQ+IF9mdW5jdGlvbiA9IG5ldyBDb25zdW1lcjxNUGFydFNhc2hDb250YWluZXJFbGVtZW50PigpIHsKKyAgICAgIHB1YmxpYyB2b2lkIGFjY2VwdChmaW5hbCBNUGFydFNhc2hDb250YWluZXJFbGVtZW50IGl0KSB7CisgICAgICAgIGZpbmFsIFBlcnNwZWN0aXZlRWxlbWVudCByZXN1bHQgPSBFNFBlcnNwZWN0aXZlVG9EU0xDb252ZXJ0ZXIudGhpcy5jb252ZXJ0KGl0KTsKKyAgICAgICAgYm9vbGVhbiBfbm90RXF1YWxzID0gKCFPYmplY3RzLmVxdWFsKHJlc3VsdCwgbnVsbCkpOworICAgICAgICBpZiAoX25vdEVxdWFscykgeworICAgICAgICAgIEVMaXN0PFBlcnNwZWN0aXZlRWxlbWVudD4gX2VsZW1lbnRzID0gb0VsZW1lbnQuZ2V0RWxlbWVudHMoKTsKKyAgICAgICAgICBfZWxlbWVudHMuYWRkKHJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9OworICAgIF9jaGlsZHJlbi5mb3JFYWNoKF9mdW5jdGlvbik7CisgICAgcmV0dXJuIG9FbGVtZW50OworICB9CisgIAorICBwdWJsaWMgU3RyaW5nIHRvSWQoKSB7CisgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJlIik7CisgICAgaW50IF9wbHVzUGx1cyA9IHRoaXMuY291bnRlcisrOworICAgIF9idWlsZGVyLmFwcGVuZChfcGx1c1BsdXMsICIiKTsKKyAgICByZXR1cm4gX2J1aWxkZXIudG9TdHJpbmcoKTsKKyAgfQorICAKKyAgcHJvdGVjdGVkIFBlcnNwZWN0aXZlRWxlbWVudCBfY29udmVydChmaW5hbCBNUGFydFN0YWNrIG1FbGVtZW50KSB7CisgICAgZmluYWwgUGVyc3BlY3RpdmVQYXJ0U3RhY2sgb0VsZW1lbnQgPSB0aGlzLnBGYWN0b3J5LmNyZWF0ZVBlcnNwZWN0aXZlUGFydFN0YWNrKCk7CisgICAgdGhpcy5yZWdpc3RlcihtRWxlbWVudCwgb0VsZW1lbnQpOworICAgIFN0cmluZyBfYWNjZXNzaWJpbGl0eVBocmFzZSA9IG1FbGVtZW50LmdldEFjY2Vzc2liaWxpdHlQaHJhc2UoKTsKKyAgICBvRWxlbWVudC5zZXRBY2Nlc3NpYmlsaXR5UGhyYXNlKF9hY2Nlc3NpYmlsaXR5UGhyYXNlKTsKKyAgICBTdHJpbmcgX2NvbnRhaW5lckRhdGEgPSBtRWxlbWVudC5nZXRDb250YWluZXJEYXRhKCk7CisgICAgb0VsZW1lbnQuc2V0Q29udGFpbmVyRGF0YShfY29udGFpbmVyRGF0YSk7CisgICAgU3RyaW5nIF9pZCA9IHRoaXMudG9JZCgpOworICAgIG9FbGVtZW50LnNldEVsZW1lbnRJZChfaWQpOworICAgIExpc3Q8TVN0YWNrRWxlbWVudD4gX2NoaWxkcmVuID0gbUVsZW1lbnQuZ2V0Q2hpbGRyZW4oKTsKKyAgICBmaW5hbCBDb25zdW1lcjxNU3RhY2tFbGVtZW50PiBfZnVuY3Rpb24gPSBuZXcgQ29uc3VtZXI8TVN0YWNrRWxlbWVudD4oKSB7CisgICAgICBwdWJsaWMgdm9pZCBhY2NlcHQoZmluYWwgTVN0YWNrRWxlbWVudCBpdCkgeworICAgICAgICBmaW5hbCBQZXJzcGVjdGl2ZUVsZW1lbnQgcmVzdWx0ID0gRTRQZXJzcGVjdGl2ZVRvRFNMQ29udmVydGVyLnRoaXMuY29udmVydChpdCk7CisgICAgICAgIGJvb2xlYW4gX25vdEVxdWFscyA9ICghT2JqZWN0cy5lcXVhbChyZXN1bHQsIG51bGwpKTsKKyAgICAgICAgaWYgKF9ub3RFcXVhbHMpIHsKKyAgICAgICAgICBFTGlzdDxQZXJzcGVjdGl2ZUVsZW1lbnQ+IF9lbGVtZW50cyA9IG9FbGVtZW50LmdldEVsZW1lbnRzKCk7CisgICAgICAgICAgX2VsZW1lbnRzLmFkZChyZXN1bHQpOworICAgICAgICB9CisgICAgICB9CisgICAgfTsKKyAgICBfY2hpbGRyZW4uZm9yRWFjaChfZnVuY3Rpb24pOworICAgIHJldHVybiBvRWxlbWVudDsKKyAgfQorICAKKyAgcHJvdGVjdGVkIFBlcnNwZWN0aXZlRWxlbWVudCBfY29udmVydChmaW5hbCBNUGFydCBtRWxlbWVudCkgeworICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gX3BlcnNpc3RlZFN0YXRlID0gbUVsZW1lbnQuZ2V0UGVyc2lzdGVkU3RhdGUoKTsKKyAgICBmaW5hbCBTdHJpbmcgbnNVUkkgPSBfcGVyc2lzdGVkU3RhdGUuZ2V0KEU0UGVyc3BlY3RpdmVUb0RTTENvbnZlcnRlci5PU0JQX05TX1VSSSk7CisgICAgZmluYWwgRVBhY2thZ2UgZVBrZyA9IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKG5zVVJJKTsKKyAgICBib29sZWFuIF9lcXVhbHMgPSBPYmplY3RzLmVxdWFsKGVQa2csIG51bGwpOworICAgIGlmIChfZXF1YWxzKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgZmluYWwgUGVyc3BlY3RpdmVQYXJ0IG9FbGVtZW50ID0gdGhpcy5wRmFjdG9yeS5jcmVhdGVQZXJzcGVjdGl2ZVBhcnQoKTsKKyAgICB0aGlzLnJlZ2lzdGVyKG1FbGVtZW50LCBvRWxlbWVudCk7CisgICAgU3RyaW5nIF9hY2Nlc3NpYmlsaXR5UGhyYXNlID0gbUVsZW1lbnQuZ2V0QWNjZXNzaWJpbGl0eVBocmFzZSgpOworICAgIG9FbGVtZW50LnNldEFjY2Vzc2liaWxpdHlQaHJhc2UoX2FjY2Vzc2liaWxpdHlQaHJhc2UpOworICAgIFN0cmluZyBfY29udGFpbmVyRGF0YSA9IG1FbGVtZW50LmdldENvbnRhaW5lckRhdGEoKTsKKyAgICBvRWxlbWVudC5zZXRDb250YWluZXJEYXRhKF9jb250YWluZXJEYXRhKTsKKyAgICBTdHJpbmcgX2xhYmVsID0gbUVsZW1lbnQuZ2V0TGFiZWwoKTsKKyAgICBib29sZWFuIF9lcXVhbHNfMSA9IE9iamVjdHMuZXF1YWwoX2xhYmVsLCBudWxsKTsKKyAgICBpZiAoX2VxdWFsc18xKSB7CisgICAgICBTdHJpbmcgX2lkID0gdGhpcy50b0lkKCk7CisgICAgICBvRWxlbWVudC5zZXRFbGVtZW50SWQoX2lkKTsKKyAgICB9IGVsc2UgeworICAgICAgU3RyaW5nIF9sYWJlbF8xID0gbUVsZW1lbnQuZ2V0TGFiZWwoKTsKKyAgICAgIFN0cmluZyBfcmVwbGFjZUFsbCA9IF9sYWJlbF8xLnJlcGxhY2VBbGwoIiAiLCAiIik7CisgICAgICBTdHJpbmcgX3JlcGxhY2VBbGxfMSA9IF9yZXBsYWNlQWxsLnJlcGxhY2VBbGwoIihcXFcpIiwgIiIpOworICAgICAgb0VsZW1lbnQuc2V0RWxlbWVudElkKF9yZXBsYWNlQWxsXzEpOworICAgIH0KKyAgICBTdHJpbmcgX2ljb25VUkkgPSBtRWxlbWVudC5nZXRJY29uVVJJKCk7CisgICAgb0VsZW1lbnQuc2V0SWNvblVSSShfaWNvblVSSSk7CisgICAgb0VsZW1lbnQuc2V0RGVzY3JpcHRpb24oZmFsc2UpOworICAgIGJvb2xlYW4gX2lzQ2xvc2VhYmxlID0gbUVsZW1lbnQuaXNDbG9zZWFibGUoKTsKKyAgICBvRWxlbWVudC5zZXRJc0Nsb3NhYmxlKF9pc0Nsb3NlYWJsZSk7CisgICAgdGhpcy5jb252ZXJ0VmlldyhlUGtnLCBtRWxlbWVudCwgb0VsZW1lbnQpOworICAgIHJldHVybiBvRWxlbWVudDsKKyAgfQorICAKKyAgcHJvdGVjdGVkIHZvaWQgX2NvbnZlcnRWaWV3KGZpbmFsIEVQYWNrYWdlIGVQYWNrYWdlLCBmaW5hbCBNUGFydCBtUGFydCwgZmluYWwgUGVyc3BlY3RpdmVQYXJ0IG9QYXJ0KSB7CisgIH0KKyAgCisgIHByb3RlY3RlZCB2b2lkIF9jb252ZXJ0VmlldyhmaW5hbCBUYWJsZURTTFBhY2thZ2UgZVBhY2thZ2UsIGZpbmFsIE1QYXJ0IG1QYXJ0LCBmaW5hbCBQZXJzcGVjdGl2ZVBhcnQgb1BhcnQpIHsKKyAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IF9wZXJzaXN0ZWRTdGF0ZSA9IG1QYXJ0LmdldFBlcnNpc3RlZFN0YXRlKCk7CisgICAgZmluYWwgU3RyaW5nIGZsYXZvciA9IF9wZXJzaXN0ZWRTdGF0ZS5nZXQoRTRQZXJzcGVjdGl2ZVRvRFNMQ29udmVydGVyLk9TQlBfRkxBVk9SKTsKKyAgICBib29sZWFuIF9hbmQgPSBmYWxzZTsKKyAgICBib29sZWFuIF9ub3RFcXVhbHMgPSAoIU9iamVjdHMuZXF1YWwoZmxhdm9yLCBudWxsKSk7CisgICAgaWYgKCFfbm90RXF1YWxzKSB7CisgICAgICBfYW5kID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGJvb2xlYW4gX2VxdWFscyA9IGZsYXZvci5lcXVhbHMoImdyaWQiKTsKKyAgICAgIF9hbmQgPSBfZXF1YWxzOworICAgIH0KKyAgICBpZiAoX2FuZCkgeworICAgICAgZmluYWwgUGVyc3BlY3RpdmVHcmlkIG9UYWJsZSA9IHRoaXMucEZhY3RvcnkuY3JlYXRlUGVyc3BlY3RpdmVHcmlkKCk7CisgICAgICBvUGFydC5zZXRWaWV3KG9UYWJsZSk7CisgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IF9wZXJzaXN0ZWRTdGF0ZV8xID0gbVBhcnQuZ2V0UGVyc2lzdGVkU3RhdGUoKTsKKyAgICAgIGZpbmFsIFN0cmluZyBmcW4gPSBfcGVyc2lzdGVkU3RhdGVfMS5nZXQoRTRQZXJzcGVjdGl2ZVRvRFNMQ29udmVydGVyLk9TQlBfRlFOKTsKKyAgICAgIGJvb2xlYW4gX2lzTnVsbE9yRW1wdHkgPSBTdHJpbmdFeHRlbnNpb25zLmlzTnVsbE9yRW1wdHkoZnFuKTsKKyAgICAgIGlmIChfaXNOdWxsT3JFbXB0eSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBpbnQgX2xhc3RJbmRleE9mID0gZnFuLmxhc3RJbmRleE9mKCIuIik7CisgICAgICBTdHJpbmcgX3N1YnN0cmluZyA9IGZxbi5zdWJzdHJpbmcoMCwgX2xhc3RJbmRleE9mKTsKKyAgICAgIHRoaXMuaW1wb3J0cy5hZGQoX3N1YnN0cmluZyk7CisgICAgICBTdHJpbmdbXSBfc3BsaXQgPSBmcW4uc3BsaXQoIlxcLiIpOworICAgICAgUXVhbGlmaWVkTmFtZSBfY3JlYXRlID0gUXVhbGlmaWVkTmFtZS5jcmVhdGUoX3NwbGl0KTsKKyAgICAgIGZpbmFsIEl0ZXJhYmxlPElFT2JqZWN0RGVzY3JpcHRpb24+IHJlc3VsdCA9IHRoaXMuZGVzY3JpcHRpb25zLmdldEV4cG9ydGVkT2JqZWN0cyhUYWJsZURTTFBhY2thZ2UuTGl0ZXJhbHMuVEFCTEUsIF9jcmVhdGUsIGZhbHNlKTsKKyAgICAgIEl0ZXJhdG9yPElFT2JqZWN0RGVzY3JpcHRpb24+IF9pdGVyYXRvciA9IHJlc3VsdC5pdGVyYXRvcigpOworICAgICAgYm9vbGVhbiBfaGFzTmV4dCA9IF9pdGVyYXRvci5oYXNOZXh0KCk7CisgICAgICBpZiAoX2hhc05leHQpIHsKKyAgICAgICAgSXRlcmF0b3I8SUVPYmplY3REZXNjcmlwdGlvbj4gX2l0ZXJhdG9yXzEgPSByZXN1bHQuaXRlcmF0b3IoKTsKKyAgICAgICAgZmluYWwgSUVPYmplY3REZXNjcmlwdGlvbiBlT2JqZWN0RGVzYyA9IF9pdGVyYXRvcl8xLm5leHQoKTsKKyAgICAgICAgRU9iamVjdCBfZU9iamVjdE9yUHJveHkgPSBlT2JqZWN0RGVzYy5nZXRFT2JqZWN0T3JQcm94eSgpOworICAgICAgICBvVGFibGUuc2V0UmVmKCgoVGFibGUpIF9lT2JqZWN0T3JQcm94eSkpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmaW5hbCBQZXJzcGVjdGl2ZVRhYmxlIG9UYWJsZV8xID0gdGhpcy5wRmFjdG9yeS5jcmVhdGVQZXJzcGVjdGl2ZVRhYmxlKCk7CisgICAgICBvUGFydC5zZXRWaWV3KG9UYWJsZV8xKTsKKyAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gX3BlcnNpc3RlZFN0YXRlXzIgPSBtUGFydC5nZXRQZXJzaXN0ZWRTdGF0ZSgpOworICAgICAgZmluYWwgU3RyaW5nIGZxbl8xID0gX3BlcnNpc3RlZFN0YXRlXzIuZ2V0KEU0UGVyc3BlY3RpdmVUb0RTTENvbnZlcnRlci5PU0JQX0ZRTik7CisgICAgICBib29sZWFuIF9pc051bGxPckVtcHR5XzEgPSBTdHJpbmdFeHRlbnNpb25zLmlzTnVsbE9yRW1wdHkoZnFuXzEpOworICAgICAgaWYgKF9pc051bGxPckVtcHR5XzEpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgaW50IF9sYXN0SW5kZXhPZl8xID0gZnFuXzEubGFzdEluZGV4T2YoIi4iKTsKKyAgICAgIFN0cmluZyBfc3Vic3RyaW5nXzEgPSBmcW5fMS5zdWJzdHJpbmcoMCwgX2xhc3RJbmRleE9mXzEpOworICAgICAgdGhpcy5pbXBvcnRzLmFkZChfc3Vic3RyaW5nXzEpOworICAgICAgU3RyaW5nW10gX3NwbGl0XzEgPSBmcW5fMS5zcGxpdCgiXFwuIik7CisgICAgICBRdWFsaWZpZWROYW1lIF9jcmVhdGVfMSA9IFF1YWxpZmllZE5hbWUuY3JlYXRlKF9zcGxpdF8xKTsKKyAgICAgIGZpbmFsIEl0ZXJhYmxlPElFT2JqZWN0RGVzY3JpcHRpb24+IHJlc3VsdF8xID0gdGhpcy5kZXNjcmlwdGlvbnMuZ2V0RXhwb3J0ZWRPYmplY3RzKFRhYmxlRFNMUGFja2FnZS5MaXRlcmFscy5UQUJMRSwgX2NyZWF0ZV8xLCBmYWxzZSk7CisgICAgICBJdGVyYXRvcjxJRU9iamVjdERlc2NyaXB0aW9uPiBfaXRlcmF0b3JfMiA9IHJlc3VsdF8xLml0ZXJhdG9yKCk7CisgICAgICBib29sZWFuIF9oYXNOZXh0XzEgPSBfaXRlcmF0b3JfMi5oYXNOZXh0KCk7CisgICAgICBpZiAoX2hhc05leHRfMSkgeworICAgICAgICBJdGVyYXRvcjxJRU9iamVjdERlc2NyaXB0aW9uPiBfaXRlcmF0b3JfMyA9IHJlc3VsdF8xLml0ZXJhdG9yKCk7CisgICAgICAgIGZpbmFsIElFT2JqZWN0RGVzY3JpcHRpb24gZU9iamVjdERlc2NfMSA9IF9pdGVyYXRvcl8zLm5leHQoKTsKKyAgICAgICAgRU9iamVjdCBfZU9iamVjdE9yUHJveHlfMSA9IGVPYmplY3REZXNjXzEuZ2V0RU9iamVjdE9yUHJveHkoKTsKKyAgICAgICAgb1RhYmxlXzEuc2V0UmVmKCgoVGFibGUpIF9lT2JqZWN0T3JQcm94eV8xKSk7CisgICAgICB9CisgICAgfQorICB9CisgIAorICBwcm90ZWN0ZWQgdm9pZCBfY29udmVydFZpZXcoZmluYWwgQ2hhcnREU0xQYWNrYWdlIGVQYWNrYWdlLCBmaW5hbCBNUGFydCBtUGFydCwgZmluYWwgUGVyc3BlY3RpdmVQYXJ0IG9QYXJ0KSB7CisgICAgZmluYWwgUGVyc3BlY3RpdmVDaGFydCBvQ2hhcnQgPSB0aGlzLnBGYWN0b3J5LmNyZWF0ZVBlcnNwZWN0aXZlQ2hhcnQoKTsKKyAgICBvUGFydC5zZXRWaWV3KG9DaGFydCk7CisgICAgTWFwPFN0cmluZywgU3RyaW5nPiBfcGVyc2lzdGVkU3RhdGUgPSBtUGFydC5nZXRQZXJzaXN0ZWRTdGF0ZSgpOworICAgIGZpbmFsIFN0cmluZyBmcW4gPSBfcGVyc2lzdGVkU3RhdGUuZ2V0KEU0UGVyc3BlY3RpdmVUb0RTTENvbnZlcnRlci5PU0JQX0ZRTik7CisgICAgYm9vbGVhbiBfaXNOdWxsT3JFbXB0eSA9IFN0cmluZ0V4dGVuc2lvbnMuaXNOdWxsT3JFbXB0eShmcW4pOworICAgIGlmIChfaXNOdWxsT3JFbXB0eSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQgX2xhc3RJbmRleE9mID0gZnFuLmxhc3RJbmRleE9mKCIuIik7CisgICAgU3RyaW5nIF9zdWJzdHJpbmcgPSBmcW4uc3Vic3RyaW5nKDAsIF9sYXN0SW5kZXhPZik7CisgICAgdGhpcy5pbXBvcnRzLmFkZChfc3Vic3RyaW5nKTsKKyAgICBmaW5hbCBTdHJpbmdbXSB0b2tlbnMgPSBmcW4uc3BsaXQoIlxcLiIpOworICAgIGludCBfbGVuZ3RoID0gdG9rZW5zLmxlbmd0aDsKKyAgICBpbnQgX21pbnVzID0gKF9sZW5ndGggLSAxKTsKKyAgICBTdHJpbmcgX2dldCA9IHRva2Vuc1tfbWludXNdOworICAgIFF1YWxpZmllZE5hbWUgX2NyZWF0ZSA9IFF1YWxpZmllZE5hbWUuY3JlYXRlKF9nZXQpOworICAgIGZpbmFsIEl0ZXJhYmxlPElFT2JqZWN0RGVzY3JpcHRpb24+IHJlc3VsdCA9IHRoaXMuZGVzY3JpcHRpb25zLmdldEV4cG9ydGVkT2JqZWN0cyhDaGFydERTTFBhY2thZ2UuTGl0ZXJhbHMuQ0hBUlQsIF9jcmVhdGUsIGZhbHNlKTsKKyAgICBJdGVyYXRvcjxJRU9iamVjdERlc2NyaXB0aW9uPiBfaXRlcmF0b3IgPSByZXN1bHQuaXRlcmF0b3IoKTsKKyAgICBib29sZWFuIF9oYXNOZXh0ID0gX2l0ZXJhdG9yLmhhc05leHQoKTsKKyAgICBpZiAoX2hhc05leHQpIHsKKyAgICAgIEl0ZXJhdG9yPElFT2JqZWN0RGVzY3JpcHRpb24+IF9pdGVyYXRvcl8xID0gcmVzdWx0Lml0ZXJhdG9yKCk7CisgICAgICBmaW5hbCBJRU9iamVjdERlc2NyaXB0aW9uIGVPYmplY3REZXNjID0gX2l0ZXJhdG9yXzEubmV4dCgpOworICAgICAgRU9iamVjdCBfZU9iamVjdE9yUHJveHkgPSBlT2JqZWN0RGVzYy5nZXRFT2JqZWN0T3JQcm94eSgpOworICAgICAgb0NoYXJ0LnNldFJlZigoKENoYXJ0KSBfZU9iamVjdE9yUHJveHkpKTsKKyAgICB9CisgIH0KKyAgCisgIHByb3RlY3RlZCB2b2lkIF9jb252ZXJ0VmlldyhmaW5hbCBSZXBvcnREU0xQYWNrYWdlIGVQYWNrYWdlLCBmaW5hbCBNUGFydCBtUGFydCwgZmluYWwgUGVyc3BlY3RpdmVQYXJ0IG9QYXJ0KSB7CisgICAgZmluYWwgUGVyc3BlY3RpdmVSZXBvcnQgb1JlcG9ydCA9IHRoaXMucEZhY3RvcnkuY3JlYXRlUGVyc3BlY3RpdmVSZXBvcnQoKTsKKyAgICBvUGFydC5zZXRWaWV3KG9SZXBvcnQpOworICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gX3BlcnNpc3RlZFN0YXRlID0gbVBhcnQuZ2V0UGVyc2lzdGVkU3RhdGUoKTsKKyAgICBmaW5hbCBTdHJpbmcgZnFuID0gX3BlcnNpc3RlZFN0YXRlLmdldChFNFBlcnNwZWN0aXZlVG9EU0xDb252ZXJ0ZXIuT1NCUF9GUU4pOworICAgIGJvb2xlYW4gX2lzTnVsbE9yRW1wdHkgPSBTdHJpbmdFeHRlbnNpb25zLmlzTnVsbE9yRW1wdHkoZnFuKTsKKyAgICBpZiAoX2lzTnVsbE9yRW1wdHkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW50IF9sYXN0SW5kZXhPZiA9IGZxbi5sYXN0SW5kZXhPZigiLiIpOworICAgIFN0cmluZyBfc3Vic3RyaW5nID0gZnFuLnN1YnN0cmluZygwLCBfbGFzdEluZGV4T2YpOworICAgIHRoaXMuaW1wb3J0cy5hZGQoX3N1YnN0cmluZyk7CisgICAgU3RyaW5nW10gX3NwbGl0ID0gZnFuLnNwbGl0KCJcXC4iKTsKKyAgICBRdWFsaWZpZWROYW1lIF9jcmVhdGUgPSBRdWFsaWZpZWROYW1lLmNyZWF0ZShfc3BsaXQpOworICAgIGZpbmFsIEl0ZXJhYmxlPElFT2JqZWN0RGVzY3JpcHRpb24+IHJlc3VsdCA9IHRoaXMuZGVzY3JpcHRpb25zLmdldEV4cG9ydGVkT2JqZWN0cyhSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlJFUE9SVCwgX2NyZWF0ZSwgZmFsc2UpOworICAgIEl0ZXJhdG9yPElFT2JqZWN0RGVzY3JpcHRpb24+IF9pdGVyYXRvciA9IHJlc3VsdC5pdGVyYXRvcigpOworICAgIGJvb2xlYW4gX2hhc05leHQgPSBfaXRlcmF0b3IuaGFzTmV4dCgpOworICAgIGlmIChfaGFzTmV4dCkgeworICAgICAgSXRlcmF0b3I8SUVPYmplY3REZXNjcmlwdGlvbj4gX2l0ZXJhdG9yXzEgPSByZXN1bHQuaXRlcmF0b3IoKTsKKyAgICAgIGZpbmFsIElFT2JqZWN0RGVzY3JpcHRpb24gZU9iamVjdERlc2MgPSBfaXRlcmF0b3JfMS5uZXh0KCk7CisgICAgICBFT2JqZWN0IF9lT2JqZWN0T3JQcm94eSA9IGVPYmplY3REZXNjLmdldEVPYmplY3RPclByb3h5KCk7CisgICAgICBvUmVwb3J0LnNldFJlZigoKFJlcG9ydCkgX2VPYmplY3RPclByb3h5KSk7CisgICAgfQorICB9CisgIAorICBwcm90ZWN0ZWQgdm9pZCBfY29udmVydFZpZXcoZmluYWwgRGlhbG9nRFNMUGFja2FnZSBlUGFja2FnZSwgZmluYWwgTVBhcnQgbVBhcnQsIGZpbmFsIFBlcnNwZWN0aXZlUGFydCBvUGFydCkgeworICAgIGZpbmFsIFBlcnNwZWN0aXZlRGlhbG9nIG9EaWFsb2cgPSB0aGlzLnBGYWN0b3J5LmNyZWF0ZVBlcnNwZWN0aXZlRGlhbG9nKCk7CisgICAgb1BhcnQuc2V0VmlldyhvRGlhbG9nKTsKKyAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IF9wZXJzaXN0ZWRTdGF0ZSA9IG1QYXJ0LmdldFBlcnNpc3RlZFN0YXRlKCk7CisgICAgZmluYWwgU3RyaW5nIGZxbiA9IF9wZXJzaXN0ZWRTdGF0ZS5nZXQoRTRQZXJzcGVjdGl2ZVRvRFNMQ29udmVydGVyLk9TQlBfRlFOKTsKKyAgICBib29sZWFuIF9pc051bGxPckVtcHR5ID0gU3RyaW5nRXh0ZW5zaW9ucy5pc051bGxPckVtcHR5KGZxbik7CisgICAgaWYgKF9pc051bGxPckVtcHR5KSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGludCBfbGFzdEluZGV4T2YgPSBmcW4ubGFzdEluZGV4T2YoIi4iKTsKKyAgICBTdHJpbmcgX3N1YnN0cmluZyA9IGZxbi5zdWJzdHJpbmcoMCwgX2xhc3RJbmRleE9mKTsKKyAgICB0aGlzLmltcG9ydHMuYWRkKF9zdWJzdHJpbmcpOworICAgIFN0cmluZ1tdIF9zcGxpdCA9IGZxbi5zcGxpdCgiXFwuIik7CisgICAgUXVhbGlmaWVkTmFtZSBfY3JlYXRlID0gUXVhbGlmaWVkTmFtZS5jcmVhdGUoX3NwbGl0KTsKKyAgICBmaW5hbCBJdGVyYWJsZTxJRU9iamVjdERlc2NyaXB0aW9uPiByZXN1bHQgPSB0aGlzLmRlc2NyaXB0aW9ucy5nZXRFeHBvcnRlZE9iamVjdHMoRGlhbG9nRFNMUGFja2FnZS5MaXRlcmFscy5ESUFMT0csIF9jcmVhdGUsIGZhbHNlKTsKKyAgICBJdGVyYXRvcjxJRU9iamVjdERlc2NyaXB0aW9uPiBfaXRlcmF0b3IgPSByZXN1bHQuaXRlcmF0b3IoKTsKKyAgICBib29sZWFuIF9oYXNOZXh0ID0gX2l0ZXJhdG9yLmhhc05leHQoKTsKKyAgICBpZiAoX2hhc05leHQpIHsKKyAgICAgIEl0ZXJhdG9yPElFT2JqZWN0RGVzY3JpcHRpb24+IF9pdGVyYXRvcl8xID0gcmVzdWx0Lml0ZXJhdG9yKCk7CisgICAgICBmaW5hbCBJRU9iamVjdERlc2NyaXB0aW9uIGVPYmplY3REZXNjID0gX2l0ZXJhdG9yXzEubmV4dCgpOworICAgICAgRU9iamVjdCBfZU9iamVjdE9yUHJveHkgPSBlT2JqZWN0RGVzYy5nZXRFT2JqZWN0T3JQcm94eSgpOworICAgICAgb0RpYWxvZy5zZXRSZWYoKChEaWFsb2cpIF9lT2JqZWN0T3JQcm94eSkpOworICAgIH0KKyAgfQorICAKKyAgcHVibGljIFNhc2hPcmllbnRhdGlvbiB0b09yaWVudGF0aW9uKGZpbmFsIGJvb2xlYW4gaXNIb3Jpem9udGFsKSB7CisgICAgU2FzaE9yaWVudGF0aW9uIF94aWZleHByZXNzaW9uID0gbnVsbDsKKyAgICBpZiAoaXNIb3Jpem9udGFsKSB7CisgICAgICByZXR1cm4gU2FzaE9yaWVudGF0aW9uLkhPUklaT05UQUw7CisgICAgfSBlbHNlIHsKKyAgICAgIF94aWZleHByZXNzaW9uID0gU2FzaE9yaWVudGF0aW9uLlZFUlRJQ0FMOworICAgIH0KKyAgICByZXR1cm4gX3hpZmV4cHJlc3Npb247CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKGZpbmFsIE1VSUVsZW1lbnQgbUVsZW1lbnQsIGZpbmFsIEVPYmplY3Qgb0VsZW1lbnQpIHsKKyAgICB0aGlzLmVsZW1lbnRzLnB1dChtRWxlbWVudCwgb0VsZW1lbnQpOworICB9CisgIAorICBwdWJsaWMgUGVyc3BlY3RpdmVFbGVtZW50IGNvbnZlcnQoZmluYWwgTVVJRWxlbWVudCBtRWxlbWVudCkgeworICAgIGlmIChtRWxlbWVudCBpbnN0YW5jZW9mIE1QYXJ0U2FzaENvbnRhaW5lcikgeworICAgICAgcmV0dXJuIF9jb252ZXJ0KChNUGFydFNhc2hDb250YWluZXIpbUVsZW1lbnQpOworICAgIH0gZWxzZSBpZiAobUVsZW1lbnQgaW5zdGFuY2VvZiBNUGFydFN0YWNrKSB7CisgICAgICByZXR1cm4gX2NvbnZlcnQoKE1QYXJ0U3RhY2spbUVsZW1lbnQpOworICAgIH0gZWxzZSBpZiAobUVsZW1lbnQgaW5zdGFuY2VvZiBNUGFydCkgeworICAgICAgcmV0dXJuIF9jb252ZXJ0KChNUGFydCltRWxlbWVudCk7CisgICAgfSBlbHNlIGlmIChtRWxlbWVudCBpbnN0YW5jZW9mIE1QYXJ0U2FzaENvbnRhaW5lckVsZW1lbnQpIHsKKyAgICAgIHJldHVybiBfY29udmVydCgoTVBhcnRTYXNoQ29udGFpbmVyRWxlbWVudCltRWxlbWVudCk7CisgICAgfSBlbHNlIGlmIChtRWxlbWVudCBpbnN0YW5jZW9mIE1TdGFja0VsZW1lbnQpIHsKKyAgICAgIHJldHVybiBfY29udmVydCgoTVN0YWNrRWxlbWVudCltRWxlbWVudCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuaGFuZGxlZCBwYXJhbWV0ZXIgdHlwZXM6ICIgKworICAgICAgICBBcnJheXMuPE9iamVjdD5hc0xpc3QobUVsZW1lbnQpLnRvU3RyaW5nKCkpOworICAgIH0KKyAgfQorICAKKyAgcHVibGljIHZvaWQgY29udmVydFZpZXcoZmluYWwgRVBhY2thZ2UgZVBhY2thZ2UsIGZpbmFsIE1QYXJ0IG1QYXJ0LCBmaW5hbCBQZXJzcGVjdGl2ZVBhcnQgb1BhcnQpIHsKKyAgICBpZiAoZVBhY2thZ2UgaW5zdGFuY2VvZiBDaGFydERTTFBhY2thZ2UpIHsKKyAgICAgIF9jb252ZXJ0VmlldygoQ2hhcnREU0xQYWNrYWdlKWVQYWNrYWdlLCBtUGFydCwgb1BhcnQpOworICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAoZVBhY2thZ2UgaW5zdGFuY2VvZiBEaWFsb2dEU0xQYWNrYWdlKSB7CisgICAgICBfY29udmVydFZpZXcoKERpYWxvZ0RTTFBhY2thZ2UpZVBhY2thZ2UsIG1QYXJ0LCBvUGFydCk7CisgICAgICByZXR1cm47CisgICAgfSBlbHNlIGlmIChlUGFja2FnZSBpbnN0YW5jZW9mIFJlcG9ydERTTFBhY2thZ2UpIHsKKyAgICAgIF9jb252ZXJ0VmlldygoUmVwb3J0RFNMUGFja2FnZSllUGFja2FnZSwgbVBhcnQsIG9QYXJ0KTsKKyAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKGVQYWNrYWdlIGluc3RhbmNlb2YgVGFibGVEU0xQYWNrYWdlKSB7CisgICAgICBfY29udmVydFZpZXcoKFRhYmxlRFNMUGFja2FnZSllUGFja2FnZSwgbVBhcnQsIG9QYXJ0KTsKKyAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKGVQYWNrYWdlICE9IG51bGwpIHsKKyAgICAgIF9jb252ZXJ0VmlldyhlUGFja2FnZSwgbVBhcnQsIG9QYXJ0KTsKKyAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5oYW5kbGVkIHBhcmFtZXRlciB0eXBlczogIiArCisgICAgICAgIEFycmF5cy48T2JqZWN0PmFzTGlzdChlUGFja2FnZSwgbVBhcnQsIG9QYXJ0KS50b1N0cmluZygpKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvbGFiZWxpbmcvUGVyc3BlY3RpdmVEc2xEZXNjcmlwdGlvbkxhYmVsUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvbGFiZWxpbmcvUGVyc3BlY3RpdmVEc2xEZXNjcmlwdGlvbkxhYmVsUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWU3MjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9sYWJlbGluZy9QZXJzcGVjdGl2ZURzbERlc2NyaXB0aW9uTGFiZWxQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqICBDb250cmlidXRvcnM6CisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqIAorICogIFRoaXMgY29weXJpZ2h0IG5vdGljZSBzaG93cyB1cCBpbiB0aGUgZ2VuZXJhdGVkIEphdmEgY29kZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkubGFiZWxpbmc7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5sYWJlbGluZy5YYmFzZURlc2NyaXB0aW9uTGFiZWxQcm92aWRlcjsKKworLyoqCisgKiBQcm92aWRlcyBsYWJlbHMgZm9yIGEgSUVPYmplY3REZXNjcmlwdGlvbnMgYW5kIElSZXNvdXJjZURlc2NyaXB0aW9ucy4KKyAqIAorICogc2VlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvWHRleHQvZG9jdW1lbnRhdGlvbi5odG1sI2xhYmVsUHJvdmlkZXIKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgUGVyc3BlY3RpdmVEc2xEZXNjcmlwdGlvbkxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBYYmFzZURlc2NyaXB0aW9uTGFiZWxQcm92aWRlciB7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL2xhYmVsaW5nL1BlcnNwZWN0aXZlRHNsTGFiZWxQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9sYWJlbGluZy9QZXJzcGVjdGl2ZURzbExhYmVsUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDAxN2M2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91aS9sYWJlbGluZy9QZXJzcGVjdGl2ZURzbExhYmVsUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDI1MyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogIENvbnRyaWJ1dG9yczoKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICogCisgKiAgVGhpcyBjb3B5cmlnaHQgbm90aWNlIHNob3dzIHVwIGluIHRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aS5sYWJlbGluZzsKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5iYXNpYy51aS5sYWJlbGluZy5CYXNpY0RTTExhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRpYWxvZ2RzbC5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5vcmdhbml6YXRpb25kc2wuT3JnYW5pemF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUJQTU47CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUNoYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUdyaWQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVPcmdhbml6YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVBhcnRTdGFjazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUmVwb3J0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVUb3BvbG9neTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC50YWJsZS5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnRvcG9sb2d5ZHNsLlRvcG9sb2d5OworCisvKioKKyAqIFByb3ZpZGVzIGxhYmVscyBmb3IgYSBFT2JqZWN0cy4KKyAqIAorICogc2VlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvWHRleHQvZG9jdW1lbnRhdGlvbi5odG1sI2xhYmVsUHJvdmlkZXIKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgUGVyc3BlY3RpdmVEc2xMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQmFzaWNEU0xMYWJlbFByb3ZpZGVyIHsKKyAgQEluamVjdAorICBwdWJsaWMgUGVyc3BlY3RpdmVEc2xMYWJlbFByb3ZpZGVyKGZpbmFsIEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciBkZWxlZ2F0ZSkgeworICAgIHN1cGVyKGRlbGVnYXRlKTsKKyAgfQorICAKKyAgcHVibGljIE9iamVjdCB0ZXh0KGZpbmFsIE9iamVjdCBvKSB7CisgICAgT2JqZWN0IF9zd2l0Y2hSZXN1bHQgPSBudWxsOworICAgIGJvb2xlYW4gX21hdGNoZWQgPSBmYWxzZTsKKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlUGFja2FnZSkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBTdHJpbmcgX25hbWUgPSAoKFBlcnNwZWN0aXZlUGFja2FnZSlvKS5nZXROYW1lKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdlbmVyYXRlVGV4dChvLCAicGFja2FnZSIsIF9uYW1lKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBQZXJzcGVjdGl2ZSkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBTdHJpbmcgX25hbWUgPSAoKFBlcnNwZWN0aXZlKW8pLmdldE5hbWUoKTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2VuZXJhdGVUZXh0KG8sICJwZXJzcGVjdGl2ZSIsIF9uYW1lKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgU3RyaW5nIF9lbGVtZW50SWQgPSAoKFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lcilvKS5nZXRFbGVtZW50SWQoKTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2VuZXJhdGVUZXh0KG8sICJzYXNoQ29udGFpbmVyIiwgX2VsZW1lbnRJZCk7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgUGVyc3BlY3RpdmVQYXJ0U3RhY2spIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgU3RyaW5nIF9lbGVtZW50SWQgPSAoKFBlcnNwZWN0aXZlUGFydFN0YWNrKW8pLmdldEVsZW1lbnRJZCgpOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZW5lcmF0ZVRleHQobywgInBhcnRTdGFjayIsIF9lbGVtZW50SWQpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlUGFydCkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBTdHJpbmcgX2VsZW1lbnRJZCA9ICgoUGVyc3BlY3RpdmVQYXJ0KW8pLmdldEVsZW1lbnRJZCgpOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZW5lcmF0ZVRleHQobywgInBhcnQiLCBfZWxlbWVudElkKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBQZXJzcGVjdGl2ZVNlbGVjdGlvbikgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBUYWJsZSBfcmVmID0gKChQZXJzcGVjdGl2ZVNlbGVjdGlvbilvKS5nZXRSZWYoKTsKKyAgICAgICAgU3RyaW5nIF9uYW1lID0gX3JlZi5nZXROYW1lKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdlbmVyYXRlVGV4dChvLCAic2VsZWN0IiwgX25hbWUpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlVGFibGUpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgVGFibGUgX3JlZiA9ICgoUGVyc3BlY3RpdmVUYWJsZSlvKS5nZXRSZWYoKTsKKyAgICAgICAgU3RyaW5nIF9uYW1lID0gX3JlZi5nZXROYW1lKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdlbmVyYXRlVGV4dChvLCAidGFibGUiLCBfbmFtZSk7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgUGVyc3BlY3RpdmVHcmlkKSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIFRhYmxlIF9yZWYgPSAoKFBlcnNwZWN0aXZlR3JpZClvKS5nZXRSZWYoKTsKKyAgICAgICAgU3RyaW5nIF9uYW1lID0gX3JlZi5nZXROYW1lKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdlbmVyYXRlVGV4dChvLCAiZ3JpZCIsIF9uYW1lKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBQZXJzcGVjdGl2ZUNoYXJ0KSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIENoYXJ0IF9yZWYgPSAoKFBlcnNwZWN0aXZlQ2hhcnQpbykuZ2V0UmVmKCk7CisgICAgICAgIFN0cmluZyBfbmFtZSA9IF9yZWYuZ2V0TmFtZSgpOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZW5lcmF0ZVRleHQobywgImNoYXJ0IiwgX25hbWUpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlUmVwb3J0KSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIFJlcG9ydCBfcmVmID0gKChQZXJzcGVjdGl2ZVJlcG9ydClvKS5nZXRSZWYoKTsKKyAgICAgICAgU3RyaW5nIF9uYW1lID0gX3JlZi5nZXROYW1lKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdlbmVyYXRlVGV4dChvLCAicmVwb3J0IiwgX25hbWUpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlT3JnYW5pemF0aW9uKSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIE9yZ2FuaXphdGlvbiBfcmVmID0gKChQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbilvKS5nZXRSZWYoKTsKKyAgICAgICAgU3RyaW5nIF9uYW1lID0gX3JlZi5nZXROYW1lKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdlbmVyYXRlVGV4dChvLCAib3JnYW5pZ3JhbSIsIF9uYW1lKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBQZXJzcGVjdGl2ZVRvcG9sb2d5KSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIFRvcG9sb2d5IF9yZWYgPSAoKFBlcnNwZWN0aXZlVG9wb2xvZ3kpbykuZ2V0UmVmKCk7CisgICAgICAgIFN0cmluZyBfbmFtZSA9IF9yZWYuZ2V0TmFtZSgpOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZW5lcmF0ZVRleHQobywgInRvcG9sb2d5IiwgX25hbWUpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlRGlhbG9nKSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIERpYWxvZyBfcmVmID0gKChQZXJzcGVjdGl2ZURpYWxvZylvKS5nZXRSZWYoKTsKKyAgICAgICAgU3RyaW5nIF9uYW1lID0gX3JlZi5nZXROYW1lKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdlbmVyYXRlVGV4dChvLCAiZGlhbG9nIiwgX25hbWUpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlQlBNTikgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZW5lcmF0ZVRleHQobywgImJwbW4iKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgX3N3aXRjaFJlc3VsdCA9IHN1cGVyLnRleHQobyk7CisgICAgfQorICAgIHJldHVybiBfc3dpdGNoUmVzdWx0OworICB9CisgIAorICBwdWJsaWMgT2JqZWN0IGltYWdlKGZpbmFsIE9iamVjdCBvKSB7CisgICAgT2JqZWN0IF9zd2l0Y2hSZXN1bHQgPSBudWxsOworICAgIGJvb2xlYW4gX21hdGNoZWQgPSBmYWxzZTsKKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlTW9kZWwpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFBlcnNwZWN0aXZlRHNsTGFiZWxQcm92aWRlcj4gX2NsYXNzID0gdGhpcy5nZXRDbGFzcygpOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZXRJbnRlcm5hbEltYWdlKCJtb2RlbC5wbmciLCBfY2xhc3MpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlUGFja2FnZSkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBDbGFzczw/IGV4dGVuZHMgUGVyc3BlY3RpdmVEc2xMYWJlbFByb3ZpZGVyPiBfY2xhc3MgPSB0aGlzLmdldENsYXNzKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdldEludGVybmFsSW1hZ2UoInBhY2thZ2UuZ2lmIiwgX2NsYXNzKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBQZXJzcGVjdGl2ZSkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBDbGFzczw/IGV4dGVuZHMgUGVyc3BlY3RpdmVEc2xMYWJlbFByb3ZpZGVyPiBfY2xhc3MgPSB0aGlzLmdldENsYXNzKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdldEludGVybmFsSW1hZ2UoImRzbF9wZXJzcGVjdGl2ZS5wbmciLCBfY2xhc3MpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlU2VsZWN0aW9uKSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBQZXJzcGVjdGl2ZURzbExhYmVsUHJvdmlkZXI+IF9jbGFzcyA9IHRoaXMuZ2V0Q2xhc3MoKTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2V0SW50ZXJuYWxJbWFnZSgiZHNsX3NlbGVjdC5wbmciLCBfY2xhc3MpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlVGFibGUpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFBlcnNwZWN0aXZlRHNsTGFiZWxQcm92aWRlcj4gX2NsYXNzID0gdGhpcy5nZXRDbGFzcygpOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZXRJbnRlcm5hbEltYWdlKCJkc2xfdGFibGUucG5nIiwgX2NsYXNzKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBQZXJzcGVjdGl2ZUdyaWQpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFBlcnNwZWN0aXZlRHNsTGFiZWxQcm92aWRlcj4gX2NsYXNzID0gdGhpcy5nZXRDbGFzcygpOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZXRJbnRlcm5hbEltYWdlKCJDeEdyaWRTb3VyY2VJbnB1dC5wbmciLCBfY2xhc3MpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlQ2hhcnQpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFBlcnNwZWN0aXZlRHNsTGFiZWxQcm92aWRlcj4gX2NsYXNzID0gdGhpcy5nZXRDbGFzcygpOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZXRJbnRlcm5hbEltYWdlKCJkc2xfY2hhcnQucG5nIiwgX2NsYXNzKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBQZXJzcGVjdGl2ZVJlcG9ydCkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBDbGFzczw/IGV4dGVuZHMgUGVyc3BlY3RpdmVEc2xMYWJlbFByb3ZpZGVyPiBfY2xhc3MgPSB0aGlzLmdldENsYXNzKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdldEludGVybmFsSW1hZ2UoImRzbF9yZXBvcnQuZ2lmIiwgX2NsYXNzKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbikgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBDbGFzczw/IGV4dGVuZHMgUGVyc3BlY3RpdmVEc2xMYWJlbFByb3ZpZGVyPiBfY2xhc3MgPSB0aGlzLmdldENsYXNzKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdldEludGVybmFsSW1hZ2UoImRzbF9vcmdhbmlncmFtLnBuZyIsIF9jbGFzcyk7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgUGVyc3BlY3RpdmVUb3BvbG9neSkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBDbGFzczw/IGV4dGVuZHMgUGVyc3BlY3RpdmVEc2xMYWJlbFByb3ZpZGVyPiBfY2xhc3MgPSB0aGlzLmdldENsYXNzKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdldEludGVybmFsSW1hZ2UoImRzbF90b3BvbG9neS5wbmciLCBfY2xhc3MpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlRGlhbG9nKSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBQZXJzcGVjdGl2ZURzbExhYmVsUHJvdmlkZXI+IF9jbGFzcyA9IHRoaXMuZ2V0Q2xhc3MoKTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2V0SW50ZXJuYWxJbWFnZSgiZHNsX2RpYWxvZy5naWYiLCBfY2xhc3MpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBfc3dpdGNoUmVzdWx0ID0gc3VwZXIuaW1hZ2Uobyk7CisgICAgfQorICAgIHJldHVybiBfc3dpdGNoUmVzdWx0OworICB9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL291dGxpbmUvUGVyc3BlY3RpdmVEc2xPdXRsaW5lVHJlZVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL291dGxpbmUvUGVyc3BlY3RpdmVEc2xPdXRsaW5lVHJlZVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU0OTMzYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvb3V0bGluZS9QZXJzcGVjdGl2ZURzbE91dGxpbmVUcmVlUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDI2IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiAgQ29udHJpYnV0b3JzOgorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKiAKKyAqICBUaGlzIGNvcHlyaWdodCBub3RpY2Ugc2hvd3MgdXAgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpLm91dGxpbmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iub3V0bGluZS5pbXBsLkRlZmF1bHRPdXRsaW5lVHJlZVByb3ZpZGVyOworCisvKioKKyAqIEN1c3RvbWl6YXRpb24gb2YgdGhlIGRlZmF1bHQgb3V0bGluZSBzdHJ1Y3R1cmUuCisgKiAKKyAqIHNlZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL1h0ZXh0L2RvY3VtZW50YXRpb24uaHRtbCNvdXRsaW5lCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIFBlcnNwZWN0aXZlRHNsT3V0bGluZVRyZWVQcm92aWRlciBleHRlbmRzIERlZmF1bHRPdXRsaW5lVHJlZVByb3ZpZGVyIHsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdWkvcXVpY2tmaXgvUGVyc3BlY3RpdmVEc2xRdWlja2ZpeFByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL3F1aWNrZml4L1BlcnNwZWN0aXZlRHNsUXVpY2tmaXhQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMzg5NWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3VpL3F1aWNrZml4L1BlcnNwZWN0aXZlRHNsUXVpY2tmaXhQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqICBDb250cmlidXRvcnM6CisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqIAorICogIFRoaXMgY29weXJpZ2h0IG5vdGljZSBzaG93cyB1cCBpbiB0aGUgZ2VuZXJhdGVkIEphdmEgY29kZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudWkucXVpY2tmaXg7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5hbm5vdGF0aW9ucy51aS5xdWlja2ZpeC5YYmFzZVdpdGhBbm5vdGF0aW9uc1F1aWNrZml4UHJvdmlkZXI7CisKKy8qKgorICogQ3VzdG9tIHF1aWNrZml4ZXMuCisgKiAKKyAqIHNlZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL1h0ZXh0L2RvY3VtZW50YXRpb24uaHRtbCNxdWlja2ZpeGVzCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIFBlcnNwZWN0aXZlRHNsUXVpY2tmaXhQcm92aWRlciBleHRlbmRzIFhiYXNlV2l0aEFubm90YXRpb25zUXVpY2tmaXhQcm92aWRlciB7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjA2NGMwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS8ucHJvamVjdApAQCAtMCwwICsxLDQ2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS54dGV4dC51aS5zaGFyZWQueHRleHRCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5yYmVCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLm0yZS5jb3JlLm1hdmVuMkJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLm0yZS5jb3JlLm1hdmVuMk5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UueHRleHQudWkuc2hhcmVkLnh0ZXh0TmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnJiZU5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9MSUNFTlNFLnR4dCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvTElDRU5TRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY0MmFkNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvTElDRU5TRS50eHQKQEAgLTAsMCArMSwxNjEgQEAKK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgLXYgMS4wCisKK1RIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuIEFOWSBVU0UsIFJFUFJPRFVDVElPTgorT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuCisKKzEuIERFRklOSVRJT05TCisKKyJDb250cmlidXRpb24iIG1lYW5zOgorCithKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kCisKK2IpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjoKKworaSkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kCisKK2lpKSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07CisKK3doZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLgorQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lCithY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUKK21vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QKK2Rlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uCisKKyJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS4KKworIkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mCitpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4KKworIlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC4KKworIlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuCisKKzIuIEdSQU5UIE9GIFJJR0hUUworCithKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKK3JveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZQorYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQorZm9ybS4KKworYikgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCityb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZQorQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlCitjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2gKK2FkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdAorYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuCisKK2MpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubworYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKK3JpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eQorYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCitsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQorcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZSB0aGUKK1Byb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uCisKK2QpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvCitncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LgorCiszLiBSRVFVSVJFTUVOVFMKKworQSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OgorCithKSBpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kCisKK2IpIGl0cyBsaWNlbnNlIGFncmVlbWVudDoKKworaSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcKK3dhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOworCitpaSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCitpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOworCitpaWkpIHN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkKK290aGVyIHBhcnR5OyBhbmQKKworaXYpIHN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdAoraW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLgorCitXaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06CisKK2EpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZAorCitiKSBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4KKworQ29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLgorCitFYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cworc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uCisKKzQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OCisKK0NvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZAordGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcwordGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvcgorb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IKKygiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpCithZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zCiticm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2gKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuIFRoZQorb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZQorQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5CisgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLgorCitGb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMKK3RoZW4gYSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzCityZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4KK1VuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvCit0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsCit0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLgorCis1LiBOTyBXQVJSQU5UWQorCitFWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCitDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLAorTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkgcmVzcG9uc2libGUgZm9yCitkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKK2V4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZQord2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgorCis2LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWQorCitFWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkKK0RJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksCitIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCitPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRAorSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworNy4gR0VORVJBTAorCitJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKK2VuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2gKK3Byb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLgorCitJZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCithbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaAorUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoCitsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCitBbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCitjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaAorbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24KK29mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcworIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLgorCitFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQKK2lzIGNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoCituZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZQorcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heQorYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YgdGhlCitBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUKK2Rpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCit0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlCituZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwordGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3IKK290aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLgorCitUaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcworb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlCitvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTU1OWQyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDk4IEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1OYW1lOiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlCitCdW5kbGUtVmVuZG9yOiBFY2xpcHNlIE9TQlAKK0J1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgorQnVuZGxlLVZlcnNpb246IDAuOS4wLnF1YWxpZmllcgorQnVuZGxlLUNsYXNzUGF0aDogLgorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZTtzaW5nbGV0b246PXRydWUKK0J1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CitSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2Uub3NicC5kc2wueHRleHQubGF6eXJlc29sdmVyLmFwaTtidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiLAorIG9yZy5zbGY0ai5hcGk7YnVuZGxlLXZlcnNpb249IjEuNy4yIiwKKyBvcmcuYXBhY2hlLnhlcmNlcztidW5kbGUtdmVyc2lvbj0iMi45LjAiLAorIG9yZy5hcGFjaGUubG9nNGo7YnVuZGxlLXZlcnNpb249IjEuMi4xNSIsCisgb3JnLmFudGxyLnJ1bnRpbWUsCisgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAorIG9yZy5lY2xpcHNlLmNvcmUuZGF0YWJpbmRpbmcsCisgb3JnLmVjbGlwc2UuY29yZS5kYXRhYmluZGluZy5iZWFucywKKyBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzLAorIG9yZy5lY2xpcHNlLmVtZi5lY29yZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLAorIG9yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuLmVjb3JlLAorIG9yZy5lY2xpcHNlLmVtZi5td2UudXRpbHMsCisgb3JnLmVjbGlwc2UuZTQuY29yZS5kaS5leHRlbnNpb25zLAorIG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMsCisgb3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcywKKyBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC53b3JrYmVuY2gsCisgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoO2J1bmRsZS12ZXJzaW9uPSIxLjIuMSIsCisgb3JnLmVjbGlwc2UueHRleHQ7YnVuZGxlLXZlcnNpb249IlsyLjcuMywyLjguMCkiLAorIG9yZy5lY2xpcHNlLnh0ZXh0LnV0aWw7YnVuZGxlLXZlcnNpb249IlsyLjcuMywyLjguMCkiLAorIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlO2J1bmRsZS12ZXJzaW9uPSJbMi43LjMsMi44LjApIjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmZ1bmN0aW9ubGlicmFyeWRzbDtidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvcjtidW5kbGUtdmVyc2lvbj0iWzIuNy4zLDIuOC4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCisgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzO2J1bmRsZS12ZXJzaW9uPSJbMi43LjMsMi44LjApIjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWI7YnVuZGxlLXZlcnNpb249IlsyLjcuMywyLjguMCkiLAorIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54Y29yZSwKKyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueGNvcmUubGliLAorIG9yZy5lY2xpcHNlLm9zYnAuaW5mb2dyaWQubW9kZWw7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcub2JqZWN0d2ViLmFzbTtidW5kbGUtdmVyc2lvbj0iWzUuMC4xLDYuMC4wKSIsCisgY29tLnZhYWRpbi5zZXJ2ZXI7YnVuZGxlLXZlcnNpb249Ils3LjUuNyw3LjcuMCkiLAorIG9yZy5lY2xpcHNlLm9zYnAucnVudGltZS53ZWIudmFhZGluLmRhdGFiaW5kaW5nO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC5ydW50aW1lLmNvbW1vbjtidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYnVpbGRlci54YmFzZS5zZXR1cHM7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJ1aWxkZXIudHlwZXMuYnVuZGxlcztidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYnVpbGRlci50eXBlcy5sb2FkZXIuYXBpO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5idWlsZGVyLnR5cGVzLmxvYWRlci5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC5pbmZvZ3JpZC5tb2RlbDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5vc2JwLmRzbC5jb21tb24ueHRleHQ7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIiwKKyBvcmcuZWNsaXBzZS5vc2JwLmRzbC5kdG8ueHRleHQ7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIiwKKyBvcmcuZWNsaXBzZS5vc2JwLmRzbC5lbnRpdHkueHRleHQ7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIiwKKyBvcmcuZWNsaXBzZS5vc2JwLmRzbC54dGV4dC5sYXp5cmVzb2x2ZXI7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJsaXA7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgbXVsdGlmaWxldXBsb2FkLm9zZ2k7YnVuZGxlLXZlcnNpb249IlsxLjEwLDEuMTEpIiwKKyBzaXplcmVwb3J0ZXIub3NnaTtidW5kbGUtdmVyc2lvbj0iWzAuMS40LDAuMS41KSIsCisgb3JnLmVjbGlwc2Uub3NicC5lY3ZpZXcuZHNsO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC5ldmVudGJyb2tlcjtidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiLAorIG9yZy5lY2xpcHNlLm9zYnAudXRpbHM7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnV0aWxzLnVpO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5pMThuO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hY3Rpb247YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0Lm1lc3NhZ2Vkc2w7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0O2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSI7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kaWFsb2dkc2w7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0Lm9yZ2FuaXphdGlvbmRzbDtidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQudGFibGU7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDtidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQudG9wb2xvZ3lkc2w7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5icG1uMjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSI7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2Uub3NicC5kc2wubXdlO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5iYXNpYztidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsLAorIG9yZy5lY2xpcHNlLmVtZi5td2UyLmxhdW5jaDtidW5kbGUtdmVyc2lvbj0iMi43LjEiO3Jlc29sdXRpb246PW9wdGlvbmFsLAorIG9yZy5lY2xpcHNlLm9zYnAuZ2l0aW5mbztidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYWRkb25zO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC5icG1uMi5lY29yZSwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZTtidW5kbGUtdmVyc2lvbj0iMC45LjAiCitJbXBvcnQtUGFja2FnZTogamF2YXgudmFsaWRhdGlvbiwKKyBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLAorIG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLAorIG9yZy5hcGFjaGUubG9nNGosCisgb3JnLmVjbGlwc2UuZTQuY29yZS5kaS5hbm5vdGF0aW9ucywKKyBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gsCisgb3JnLmVjbGlwc2Uub3NicC5icG0uYXBpO3ZlcnNpb249IjAuOS4wIgorQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xLjgKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlO3ZlcnNpb249IjAuOS4wIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmRlcml2ZWRzdGF0ZTt2ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5mb3JtYXR0aW5nO3ZlcnNpb249IjAuOS4wIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGw7dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuanZtbW9kZWw7dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUubGlua2luZzt2ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5wYXJzZXIuYW50bHI7dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUucGFyc2VyLmFudGxyLmludGVybmFsO3ZlcnNpb249IjAuOS4wIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnNjb3Bpbmc7dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuc2VyaWFsaXplcjt2ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5zZXJ2aWNlczt2ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51dGlsO3ZlcnNpb249IjAuOS4wIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnZhbGlkYXRpb247dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudmFsdWVjb252ZXJ0ZXI7dmVyc2lvbj0iMC45LjAiCitCdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLkFjdGl2YXRvcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9hYm91dC5odG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9hYm91dC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YzA1OTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2Fib3V0Lmh0bWwKQEAgLTAsMCArMSwyOCBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKKyAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KKzx0aXRsZT5BYm91dDwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keSBsYW5nPSJFTi1VUyI+Cis8aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KKyAKKzxwPkp1bmUgMSwgMjAxNjwvcD4JCis8aDM+TGljZW5zZTwvaDM+CisKKzxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAoraW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKK2F0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCitGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCis8cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAorYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQorYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAorcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCitpbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAorYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+CisKKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2Fib3V0LmluaSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvYWJvdXQuaW5pCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZjY3MWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2Fib3V0LmluaQpAQCAtMCwwICsxLDE3IEBACisjIGFib3V0LmluaQorIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKKyMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKKyMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKKyMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KKworIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCithYm91dFRleHQ9JWZlYXR1cmVUZXh0CisKKyMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKK2ZlYXR1cmVJbWFnZT0KKworIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKHRyYW5zbGF0ZWQpCithcHBOYW1lPSVmZWF0dXJlTmFtZQorCisjIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKK3dlbGNvbWVQYWdlPQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9hYm91dC5tYXBwaW5ncyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvYWJvdXQubWFwcGluZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUxMWEwYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvYWJvdXQubWFwcGluZ3MKQEAgLTAsMCArMSw2IEBACisjIGFib3V0Lm1hcHBpbmdzCisjIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCisjIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCisjIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCisKKzA9cXVhbGlmaWVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2Fib3V0LnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2Fib3V0LnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBhNDUyMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvYWJvdXQucHJvcGVydGllcwpAQCAtMCwwICsxLDI2IEBACisjCisjIENvcHlyaWdodCAoYykgMjAxMiwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKEhlaWRlbGJlcmcpCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMKKworIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKKworZmVhdHVyZU5hbWU9b3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZQorCisjIyMjIyMjIyMjIyMjIyMjIGJsdXJiIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZmVhdHVyZVRleHQ9XAorQ29weXJpZ2h0IChjKSAyMDEyLTIwMTYgLSBMb2V0eiBHbWJIJkNvLktHIFxuXAorQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAorYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCit3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAoraHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKK1xuXAorQ29udHJpYnV0b3JzOlxuXAorICAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvblxuCisjIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBibHVyYiBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2QyMThkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTcgQEAKK3NvdXJjZS4uID0gc3JjLyxcCisgICAgICAgICAgc3JjLWdlbi8sXAorICAgICAgICAgIGVtZi1nZW4vLFwKKyAgICAgICAgICB4dGVuZC1nZW4vCitiaW4uaW5jbHVkZXMgPSBhYm91dC5wcm9wZXJ0aWVzLCAgYWJvdXQubWFwcGluZ3MsICBhYm91dC5pbmksICBhYm91dC5odG1sLCAgbW9kZWwvLFwKKyAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCisgICAgICAgICAgICAgICAuLFwKKyAgICAgICAgICAgICAgIC5zZXR0aW5ncy8sXAorICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCisgICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCisgICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAorICAgICAgICAgICAgICAgTElDRU5TRS50eHQsXAorICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sCitzcmMuaW5jbHVkZXMgPSBhYm91dC5wcm9wZXJ0aWVzLCAgYWJvdXQubWFwcGluZ3MsICBhYm91dC5pbmksICBhYm91dC5odG1sLCAgbGljZW5zZS5odG1sLFwKKyAgICAgICAgICAgICAgIExJQ0VOU0UudHh0LFwKKyAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbAkJCSAgIAorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9QZXJzcGVjdGl2ZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvUGVyc3BlY3RpdmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2I0ZTBjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvUGVyc3BlY3RpdmUuamF2YQpAQCAtMCwwICsxLDI3NCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yc3sgIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmFjdGlvbi5BY3Rpb25Ub29sYmFyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5ibGlwLkJsaXA7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5ibGlwLkJsaXBVc2VyVGFzazsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy5Kdm1UeXBlUmVmZXJlbmNlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QZXJzcGVjdGl2ZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlI2lzRGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlI2dldERlc2NyaXB0aW9uVmFsdWUgPGVtPkRlc2NyaXB0aW9uIFZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlI2dldEljb25VUkkgPGVtPkljb24gVVJJPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlI2dldEFjY2Vzc2liaWxpdHlQaHJhc2UgPGVtPkFjY2Vzc2liaWxpdHkgUGhyYXNlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlI2dldFByb2Nlc3MgPGVtPlByb2Nlc3M8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmUjZ2V0VXNlclRhc2sgPGVtPlVzZXIgVGFzazwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZSNnZXRUb29sYmFyIDxlbT5Ub29sYmFyPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlI2dldFRvb2xiYXJUeXBlSnZtIDxlbT5Ub29sYmFyIFR5cGUgSnZtPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlI2dldEVsZW1lbnRzIDxlbT5FbGVtZW50czwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbFBhY2thZ2UjZ2V0UGVyc3BlY3RpdmUoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUGVyc3BlY3RpdmUgZXh0ZW5kcyBQZXJzcGVjdGl2ZUJhc2UgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0RGVzY3JpcHRpb24oYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2xQYWNrYWdlI2dldFBlcnNwZWN0aXZlX0Rlc2NyaXB0aW9uKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc0Rlc2NyaXB0aW9uKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlI2lzRGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNEZXNjcmlwdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RGVzY3JpcHRpb24oYm9vbGVhbiB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbiBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb24gVmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb24gVmFsdWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uVmFsdWUoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbFBhY2thZ2UjZ2V0UGVyc3BlY3RpdmVfRGVzY3JpcHRpb25WYWx1ZSgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXREZXNjcmlwdGlvblZhbHVlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlI2dldERlc2NyaXB0aW9uVmFsdWUgPGVtPkRlc2NyaXB0aW9uIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbiBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0RGVzY3JpcHRpb25WYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RGVzY3JpcHRpb25WYWx1ZShTdHJpbmcgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWNvbiBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkljb24gVVJJPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkljb24gVVJJPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRJY29uVVJJKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2xQYWNrYWdlI2dldFBlcnNwZWN0aXZlX0ljb25VUkkoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0SWNvblVSSSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZSNnZXRJY29uVVJJIDxlbT5JY29uIFVSSTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWNvbiBVUkk8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldEljb25VUkkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEljb25VUkkoU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjY2Vzc2liaWxpdHkgUGhyYXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY2Nlc3NpYmlsaXR5IFBocmFzZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3NpYmlsaXR5IFBocmFzZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0QWNjZXNzaWJpbGl0eVBocmFzZShTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsUGFja2FnZSNnZXRQZXJzcGVjdGl2ZV9BY2Nlc3NpYmlsaXR5UGhyYXNlKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldEFjY2Vzc2liaWxpdHlQaHJhc2UoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmUjZ2V0QWNjZXNzaWJpbGl0eVBocmFzZSA8ZW0+QWNjZXNzaWJpbGl0eSBQaHJhc2U8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY2Vzc2liaWxpdHkgUGhyYXNlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRBY2Nlc3NpYmlsaXR5UGhyYXNlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRBY2Nlc3NpYmlsaXR5UGhyYXNlKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9jZXNzPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9jZXNzPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2Nlc3M8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFByb2Nlc3MoQmxpcCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2xQYWNrYWdlI2dldFBlcnNwZWN0aXZlX1Byb2Nlc3MoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlCbGlwIGdldFByb2Nlc3MoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmUjZ2V0UHJvY2VzcyA8ZW0+UHJvY2VzczwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvY2VzczwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0UHJvY2VzcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UHJvY2VzcyhCbGlwIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVzZXIgVGFzazwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VXNlciBUYXNrPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVzZXIgVGFzazwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0VXNlclRhc2soQmxpcFVzZXJUYXNrKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbFBhY2thZ2UjZ2V0UGVyc3BlY3RpdmVfVXNlclRhc2soKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlCbGlwVXNlclRhc2sgZ2V0VXNlclRhc2soKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmUjZ2V0VXNlclRhc2sgPGVtPlVzZXIgVGFzazwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXNlciBUYXNrPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRVc2VyVGFzaygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0VXNlclRhc2soQmxpcFVzZXJUYXNrIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRvb2xiYXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRvb2xiYXI8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VG9vbGJhcjwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0VG9vbGJhcihBY3Rpb25Ub29sYmFyKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbFBhY2thZ2UjZ2V0UGVyc3BlY3RpdmVfVG9vbGJhcigpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCUFjdGlvblRvb2xiYXIgZ2V0VG9vbGJhcigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZSNnZXRUb29sYmFyIDxlbT5Ub29sYmFyPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ub29sYmFyPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRUb29sYmFyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRUb29sYmFyKEFjdGlvblRvb2xiYXIgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VG9vbGJhciBUeXBlIEp2bTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VG9vbGJhciBUeXBlIEp2bTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ub29sYmFyIFR5cGUgSnZtPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRUb29sYmFyVHlwZUp2bShKdm1UeXBlUmVmZXJlbmNlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbFBhY2thZ2UjZ2V0UGVyc3BlY3RpdmVfVG9vbGJhclR5cGVKdm0oKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJSnZtVHlwZVJlZmVyZW5jZSBnZXRUb29sYmFyVHlwZUp2bSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZSNnZXRUb29sYmFyVHlwZUp2bSA8ZW0+VG9vbGJhciBUeXBlIEp2bTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VG9vbGJhciBUeXBlIEp2bTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0VG9vbGJhclR5cGVKdm0oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFRvb2xiYXJUeXBlSnZtKEp2bVR5cGVSZWZlcmVuY2UgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWxlbWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRWxlbWVudH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbGVtZW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVsZW1lbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbFBhY2thZ2UjZ2V0UGVyc3BlY3RpdmVfRWxlbWVudHMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUxpc3Q8UGVyc3BlY3RpdmVFbGVtZW50PiBnZXRFbGVtZW50cygpOworCit9IC8vIFBlcnNwZWN0aXZlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9QZXJzcGVjdGl2ZUJQTU4uamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL1BlcnNwZWN0aXZlQlBNTi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNzhiNTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9QZXJzcGVjdGl2ZUJQTU4uamF2YQpAQCAtMCwwICsxLDI4IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZTsKKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QZXJzcGVjdGl2ZSBCUE1OPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2xQYWNrYWdlI2dldFBlcnNwZWN0aXZlQlBNTigpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBQZXJzcGVjdGl2ZUJQTU4gZXh0ZW5kcyBQZXJzcGVjdGl2ZVZpZXcgeworfSAvLyBQZXJzcGVjdGl2ZUJQTU4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL1BlcnNwZWN0aXZlQmFzZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvUGVyc3BlY3RpdmVCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFjMGUzNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL1BlcnNwZWN0aXZlQmFzZS5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnN7ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBlcnNwZWN0aXZlIEJhc2U8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUJhc2UjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbFBhY2thZ2UjZ2V0UGVyc3BlY3RpdmVCYXNlKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFBlcnNwZWN0aXZlQmFzZSBleHRlbmRzIFBlcnNwZWN0aXZlTGF6eVJlc29sdmVyIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbFBhY2thZ2UjZ2V0UGVyc3BlY3RpdmVCYXNlX05hbWUoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0TmFtZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUJhc2UjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOworCit9IC8vIFBlcnNwZWN0aXZlQmFzZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvUGVyc3BlY3RpdmVDaGFydC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvUGVyc3BlY3RpdmVDaGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMTA1M2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9QZXJzcGVjdGl2ZUNoYXJ0LmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yc3sgIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0OworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bVR5cGVSZWZlcmVuY2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBlcnNwZWN0aXZlIENoYXJ0PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVDaGFydCNnZXRSZWYgPGVtPlJlZjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUNoYXJ0I2dldFJlZlR5cGVKdm0gPGVtPlJlZiBUeXBlIEp2bTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbFBhY2thZ2UjZ2V0UGVyc3BlY3RpdmVDaGFydCgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBQZXJzcGVjdGl2ZUNoYXJ0IGV4dGVuZHMgUGVyc3BlY3RpdmVWaWV3IHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWY8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlZjwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWY8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFJlZihDaGFydCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2xQYWNrYWdlI2dldFBlcnNwZWN0aXZlQ2hhcnRfUmVmKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQ2hhcnQgZ2V0UmVmKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlQ2hhcnQjZ2V0UmVmIDxlbT5SZWY8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlZjwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0UmVmKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRSZWYoQ2hhcnQgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVmIFR5cGUgSnZtPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWYgVHlwZSBKdm08L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVmIFR5cGUgSnZtPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRSZWZUeXBlSnZtKEp2bVR5cGVSZWZlcmVuY2UpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsUGFja2FnZSNnZXRQZXJzcGVjdGl2ZUNoYXJ0X1JlZlR5cGVKdm0oKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJSnZtVHlwZVJlZmVyZW5jZSBnZXRSZWZUeXBlSnZtKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlQ2hhcnQjZ2V0UmVmVHlwZUp2bSA8ZW0+UmVmIFR5cGUgSnZtPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWYgVHlwZSBKdm08L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFJlZlR5cGVKdm0oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFJlZlR5cGVKdm0oSnZtVHlwZVJlZmVyZW5jZSB2YWx1ZSk7CisKK30gLy8gUGVyc3BlY3RpdmVDaGFydApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvUGVyc3BlY3RpdmVEaWFsb2cuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL1BlcnNwZWN0aXZlRGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRmMDY2OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL1BlcnNwZWN0aXZlRGlhbG9nLmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yc3sgIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRpYWxvZ2RzbC5EaWFsb2c7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtVHlwZVJlZmVyZW5jZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGVyc3BlY3RpdmUgRGlhbG9nPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEaWFsb2cjZ2V0UmVmIDxlbT5SZWY8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEaWFsb2cjZ2V0UmVmVHlwZUp2bSA8ZW0+UmVmIFR5cGUgSnZtPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsUGFja2FnZSNnZXRQZXJzcGVjdGl2ZURpYWxvZygpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBQZXJzcGVjdGl2ZURpYWxvZyBleHRlbmRzIFBlcnNwZWN0aXZlVmlldyB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVmPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWY8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVmPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRSZWYoRGlhbG9nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbFBhY2thZ2UjZ2V0UGVyc3BlY3RpdmVEaWFsb2dfUmVmKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRGlhbG9nIGdldFJlZigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURpYWxvZyNnZXRSZWYgPGVtPlJlZjwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVmPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRSZWYoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFJlZihEaWFsb2cgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVmIFR5cGUgSnZtPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWYgVHlwZSBKdm08L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVmIFR5cGUgSnZtPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRSZWZUeXBlSnZtKEp2bVR5cGVSZWZlcmVuY2UpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsUGFja2FnZSNnZXRQZXJzcGVjdGl2ZURpYWxvZ19SZWZUeXBlSnZtKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCUp2bVR5cGVSZWZlcmVuY2UgZ2V0UmVmVHlwZUp2bSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURpYWxvZyNnZXRSZWZUeXBlSnZtIDxlbT5SZWYgVHlwZSBKdm08L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlZiBUeXBlIEp2bTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0UmVmVHlwZUp2bSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UmVmVHlwZUp2bShKdm1UeXBlUmVmZXJlbmNlIHZhbHVlKTsKKworfSAvLyBQZXJzcGVjdGl2ZURpYWxvZwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvUGVyc3BlY3RpdmVEc2xGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9QZXJzcGVjdGl2ZURzbEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDQxZTViCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvUGVyc3BlY3RpdmVEc2xGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyMDYgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnN7ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2xQYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUGVyc3BlY3RpdmVEc2xGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgeworCS8qKgorCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUGVyc3BlY3RpdmVEc2xGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZURzbEZhY3RvcnlJbXBsLmluaXQoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGVyc3BlY3RpdmUgTW9kZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBlcnNwZWN0aXZlIE1vZGVsPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlQZXJzcGVjdGl2ZU1vZGVsIGNyZWF0ZVBlcnNwZWN0aXZlTW9kZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGVyc3BlY3RpdmUgTGF6eSBSZXNvbHZlcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGVyc3BlY3RpdmUgTGF6eSBSZXNvbHZlcjwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUGVyc3BlY3RpdmVMYXp5UmVzb2x2ZXIgY3JlYXRlUGVyc3BlY3RpdmVMYXp5UmVzb2x2ZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGVyc3BlY3RpdmUgUGFja2FnZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGVyc3BlY3RpdmUgUGFja2FnZTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUGVyc3BlY3RpdmVQYWNrYWdlIGNyZWF0ZVBlcnNwZWN0aXZlUGFja2FnZSgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QZXJzcGVjdGl2ZSBCYXNlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QZXJzcGVjdGl2ZSBCYXNlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlQZXJzcGVjdGl2ZUJhc2UgY3JlYXRlUGVyc3BlY3RpdmVCYXNlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBlcnNwZWN0aXZlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QZXJzcGVjdGl2ZTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUGVyc3BlY3RpdmUgY3JlYXRlUGVyc3BlY3RpdmUoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGVyc3BlY3RpdmUgRWxlbWVudDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGVyc3BlY3RpdmUgRWxlbWVudDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUGVyc3BlY3RpdmVFbGVtZW50IGNyZWF0ZVBlcnNwZWN0aXZlRWxlbWVudCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QZXJzcGVjdGl2ZSBTYXNoIENvbnRhaW5lcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGVyc3BlY3RpdmUgU2FzaCBDb250YWluZXI8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lciBjcmVhdGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGVyc3BlY3RpdmUgUGFydDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGVyc3BlY3RpdmUgUGFydDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUGVyc3BlY3RpdmVQYXJ0IGNyZWF0ZVBlcnNwZWN0aXZlUGFydCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QZXJzcGVjdGl2ZSBQYXJ0IFN0YWNrPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QZXJzcGVjdGl2ZSBQYXJ0IFN0YWNrPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlQZXJzcGVjdGl2ZVBhcnRTdGFjayBjcmVhdGVQZXJzcGVjdGl2ZVBhcnRTdGFjaygpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QZXJzcGVjdGl2ZSBTZWxlY3Rpb248L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBlcnNwZWN0aXZlIFNlbGVjdGlvbjwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUGVyc3BlY3RpdmVTZWxlY3Rpb24gY3JlYXRlUGVyc3BlY3RpdmVTZWxlY3Rpb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGVyc3BlY3RpdmUgVGFibGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBlcnNwZWN0aXZlIFRhYmxlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlQZXJzcGVjdGl2ZVRhYmxlIGNyZWF0ZVBlcnNwZWN0aXZlVGFibGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGVyc3BlY3RpdmUgR3JpZDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGVyc3BlY3RpdmUgR3JpZDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUGVyc3BlY3RpdmVHcmlkIGNyZWF0ZVBlcnNwZWN0aXZlR3JpZCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QZXJzcGVjdGl2ZSBDaGFydDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGVyc3BlY3RpdmUgQ2hhcnQ8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVBlcnNwZWN0aXZlQ2hhcnQgY3JlYXRlUGVyc3BlY3RpdmVDaGFydCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QZXJzcGVjdGl2ZSBSZXBvcnQ8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBlcnNwZWN0aXZlIFJlcG9ydDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUGVyc3BlY3RpdmVSZXBvcnQgY3JlYXRlUGVyc3BlY3RpdmVSZXBvcnQoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGVyc3BlY3RpdmUgT3JnYW5pemF0aW9uPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QZXJzcGVjdGl2ZSBPcmdhbml6YXRpb248L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVBlcnNwZWN0aXZlT3JnYW5pemF0aW9uIGNyZWF0ZVBlcnNwZWN0aXZlT3JnYW5pemF0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBlcnNwZWN0aXZlIFRvcG9sb2d5PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QZXJzcGVjdGl2ZSBUb3BvbG9neTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUGVyc3BlY3RpdmVUb3BvbG9neSBjcmVhdGVQZXJzcGVjdGl2ZVRvcG9sb2d5KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBlcnNwZWN0aXZlIERpYWxvZzwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGVyc3BlY3RpdmUgRGlhbG9nPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlQZXJzcGVjdGl2ZURpYWxvZyBjcmVhdGVQZXJzcGVjdGl2ZURpYWxvZygpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QZXJzcGVjdGl2ZSBCUE1OPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QZXJzcGVjdGl2ZSBCUE1OPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlQZXJzcGVjdGl2ZUJQTU4gY3JlYXRlUGVyc3BlY3RpdmVCUE1OKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCisJICogQGdlbmVyYXRlZAorCSAqLworCVBlcnNwZWN0aXZlRHNsUGFja2FnZSBnZXRQZXJzcGVjdGl2ZURzbFBhY2thZ2UoKTsKKworfSAvL1BlcnNwZWN0aXZlRHNsRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvUGVyc3BlY3RpdmVEc2xQYWNrYWdlLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9QZXJzcGVjdGl2ZURzbFBhY2thZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDA0OGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvUGVyc3BlY3RpdmVEc2xQYWNrYWdlLmphdmEKQEAgLTAsMCArMSwyNDgzIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuY29tbW9uLnR5cGVzLk9TQlBUeXBlc1BhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAorICogPHVsPgorICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgorICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KKyAqICAgPGxpPmVhY2ggb3BlcmF0aW9uIG9mIGVhY2ggY2xhc3MsPC9saT4KKyAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgorICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KKyAqIDwvdWw+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbEZhY3RvcnkKKyAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgorICogICAgICAgIGFubm90YXRpb249Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwgZmlsZUV4dGVuc2lvbnM9J3BlcnNwZWN0aXZlJyBtb2RlbE5hbWU9J1BlcnNwZWN0aXZlRHNsJyBwcmVmaXg9J1BlcnNwZWN0aXZlRHNsJyB1cGRhdGVDbGFzc3BhdGg9J2ZhbHNlJyBjb3B5cmlnaHRUZXh0PSdDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KVxyXG4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBcclxuIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCBcclxuIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IFxyXG4gaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgXHJcblxyXG4gQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlXHJcbiAgXHJcbiBDb250cmlidXRvcnN7ICBcclxuIFx0XHRDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gXHJcbiAnIGJhc2VQYWNrYWdlPSdvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0JyIKKyAqICAgICAgICBhbm5vdGF0aW9uPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIHJvb3RQYWNrYWdlPSdwZXJzcGVjdGl2ZWRzbCciCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgeworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGVOQU1FID0gInBlcnNwZWN0aXZlIjsKKworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovL29zYnAuZWNsaXBzZS5vcmcveHRleHQvcGVyc3BlY3RpdmUvUGVyc3BlY3RpdmVEc2wiOworCisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGVOU19QUkVGSVggPSAicGVyc3BlY3RpdmVkc2wiOworCisJLyoqCisJICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlQZXJzcGVjdGl2ZURzbFBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlRHNsUGFja2FnZUltcGwuaW5pdCgpOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVNb2RlbEltcGwgPGVtPlBlcnNwZWN0aXZlIE1vZGVsPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlTW9kZWxJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVEc2xQYWNrYWdlSW1wbCNnZXRQZXJzcGVjdGl2ZU1vZGVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX01PREVMID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYWNrYWdlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfTU9ERUxfX1BBQ0tBR0VTID0gMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QZXJzcGVjdGl2ZSBNb2RlbDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9NT0RFTF9GRUFUVVJFX0NPVU5UID0gMTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5QZXJzcGVjdGl2ZSBNb2RlbDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9NT0RFTF9PUEVSQVRJT05fQ09VTlQgPSAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVMYXp5UmVzb2x2ZXJJbXBsIDxlbT5QZXJzcGVjdGl2ZSBMYXp5IFJlc29sdmVyPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlTGF6eVJlc29sdmVySW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlRHNsUGFja2FnZUltcGwjZ2V0UGVyc3BlY3RpdmVMYXp5UmVzb2x2ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfTEFaWV9SRVNPTFZFUiA9IDE7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UGVyc3BlY3RpdmUgTGF6eSBSZXNvbHZlcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgPSAwOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX0xBWllfUkVTT0xWRVJfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5QZXJzcGVjdGl2ZSBMYXp5IFJlc29sdmVyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX0xBWllfUkVTT0xWRVJfT1BFUkFUSU9OX0NPVU5UID0gMTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlUGFja2FnZUltcGwgPGVtPlBlcnNwZWN0aXZlIFBhY2thZ2U8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVQYWNrYWdlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlRHNsUGFja2FnZUltcGwjZ2V0UGVyc3BlY3RpdmVQYWNrYWdlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX1BBQ0tBR0UgPSAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9QQUNLQUdFX19OQU1FID0gT1NCUFR5cGVzUGFja2FnZS5MUEFDS0FHRV9fTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBvcnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9QQUNLQUdFX19JTVBPUlRTID0gT1NCUFR5cGVzUGFja2FnZS5MUEFDS0FHRV9fSU1QT1JUUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJzcGVjdGl2ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX1BBQ0tBR0VfX1BFUlNQRUNUSVZFUyA9IE9TQlBUeXBlc1BhY2thZ2UuTFBBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UGVyc3BlY3RpdmUgUGFja2FnZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgPSBPU0JQVHlwZXNQYWNrYWdlLkxQQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX1BBQ0tBR0VfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gT1NCUFR5cGVzUGFja2FnZS5MUEFDS0FHRV9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+UGVyc3BlY3RpdmUgUGFja2FnZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9QQUNLQUdFX09QRVJBVElPTl9DT1VOVCA9IE9TQlBUeXBlc1BhY2thZ2UuTFBBQ0tBR0VfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlQmFzZUltcGwgPGVtPlBlcnNwZWN0aXZlIEJhc2U8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVCYXNlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlRHNsUGFja2FnZUltcGwjZ2V0UGVyc3BlY3RpdmVCYXNlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX0JBU0UgPSAzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9CQVNFX19OQU1FID0gUEVSU1BFQ1RJVkVfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QZXJzcGVjdGl2ZSBCYXNlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX0JBU0VfRkVBVFVSRV9DT1VOVCA9IFBFUlNQRUNUSVZFX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfQkFTRV9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBQRVJTUEVDVElWRV9MQVpZX1JFU09MVkVSX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5QZXJzcGVjdGl2ZSBCYXNlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX0JBU0VfT1BFUkFUSU9OX0NPVU5UID0gUEVSU1BFQ1RJVkVfTEFaWV9SRVNPTFZFUl9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVJbXBsIDxlbT5QZXJzcGVjdGl2ZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZURzbFBhY2thZ2VJbXBsI2dldFBlcnNwZWN0aXZlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFBFUlNQRUNUSVZFID0gNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfX05BTUUgPSBQRVJTUEVDVElWRV9CQVNFX19OQU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfX0RFU0NSSVBUSU9OID0gUEVSU1BFQ1RJVkVfQkFTRV9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbiBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX19ERVNDUklQVElPTl9WQUxVRSA9IFBFUlNQRUNUSVZFX0JBU0VfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbiBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9fSUNPTl9VUkkgPSBQRVJTUEVDVElWRV9CQVNFX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2Vzc2liaWxpdHkgUGhyYXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfX0FDQ0VTU0lCSUxJVFlfUEhSQVNFID0gUEVSU1BFQ1RJVkVfQkFTRV9GRUFUVVJFX0NPVU5UICsgMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfX1BST0NFU1MgPSBQRVJTUEVDVElWRV9CQVNFX0ZFQVRVUkVfQ09VTlQgKyA0OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzZXIgVGFzazwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX19VU0VSX1RBU0sgPSBQRVJTUEVDVElWRV9CQVNFX0ZFQVRVUkVfQ09VTlQgKyA1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2xiYXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9fVE9PTEJBUiA9IFBFUlNQRUNUSVZFX0JBU0VfRkVBVFVSRV9DT1VOVCArIDY7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG9vbGJhciBUeXBlIEp2bTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX19UT09MQkFSX1RZUEVfSlZNID0gUEVSU1BFQ1RJVkVfQkFTRV9GRUFUVVJFX0NPVU5UICsgNzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfX0VMRU1FTlRTID0gUEVSU1BFQ1RJVkVfQkFTRV9GRUFUVVJFX0NPVU5UICsgODsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QZXJzcGVjdGl2ZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9GRUFUVVJFX0NPVU5UID0gUEVSU1BFQ1RJVkVfQkFTRV9GRUFUVVJFX0NPVU5UICsgOTsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBQRVJTUEVDVElWRV9CQVNFX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5QZXJzcGVjdGl2ZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9PUEVSQVRJT05fQ09VTlQgPSBQRVJTUEVDVElWRV9CQVNFX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZUVsZW1lbnRJbXBsIDxlbT5QZXJzcGVjdGl2ZSBFbGVtZW50PC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlRWxlbWVudEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZURzbFBhY2thZ2VJbXBsI2dldFBlcnNwZWN0aXZlRWxlbWVudCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9FTEVNRU5UID0gNTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfRUxFTUVOVF9fRUxFTUVOVF9JRCA9IFBFUlNQRUNUSVZFX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzaWJpbGl0eSBQaHJhc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9FTEVNRU5UX19BQ0NFU1NJQklMSVRZX1BIUkFTRSA9IFBFUlNQRUNUSVZFX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyIERhdGE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9FTEVNRU5UX19DT05UQUlORVJfREFUQSA9IFBFUlNQRUNUSVZFX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX0VMRU1FTlRfX0VMRU1FTlRTID0gUEVSU1BFQ1RJVkVfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgMzsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QZXJzcGVjdGl2ZSBFbGVtZW50PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IFBFUlNQRUNUSVZFX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDQ7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfRUxFTUVOVF9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBQRVJTUEVDVElWRV9MQVpZX1JFU09MVkVSX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5QZXJzcGVjdGl2ZSBFbGVtZW50PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX0VMRU1FTlRfT1BFUkFUSU9OX0NPVU5UID0gUEVSU1BFQ1RJVkVfTEFaWV9SRVNPTFZFUl9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVySW1wbCA8ZW0+UGVyc3BlY3RpdmUgU2FzaCBDb250YWluZXI8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVySW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlRHNsUGFja2FnZUltcGwjZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX1NBU0hfQ09OVEFJTkVSID0gNjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfU0FTSF9DT05UQUlORVJfX0VMRU1FTlRfSUQgPSBQRVJTUEVDVElWRV9FTEVNRU5UX19FTEVNRU5UX0lEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2Vzc2liaWxpdHkgUGhyYXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfU0FTSF9DT05UQUlORVJfX0FDQ0VTU0lCSUxJVFlfUEhSQVNFID0gUEVSU1BFQ1RJVkVfRUxFTUVOVF9fQUNDRVNTSUJJTElUWV9QSFJBU0U7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyIERhdGE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9TQVNIX0NPTlRBSU5FUl9fQ09OVEFJTkVSX0RBVEEgPSBQRVJTUEVDVElWRV9FTEVNRU5UX19DT05UQUlORVJfREFUQTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfU0FTSF9DT05UQUlORVJfX0VMRU1FTlRTID0gUEVSU1BFQ1RJVkVfRUxFTUVOVF9fRUxFTUVOVFM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JpZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9TQVNIX0NPTlRBSU5FUl9fT1JJRU5UQVRJT04gPSBQRVJTUEVDVElWRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlbGVjdGVkIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9TQVNIX0NPTlRBSU5FUl9fU0VMRUNURURfRUxFTUVOVCA9IFBFUlNQRUNUSVZFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UGVyc3BlY3RpdmUgU2FzaCBDb250YWluZXI8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfU0FTSF9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCA9IFBFUlNQRUNUSVZFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfU0FTSF9DT05UQUlORVJfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gUEVSU1BFQ1RJVkVfRUxFTUVOVF9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+UGVyc3BlY3RpdmUgU2FzaCBDb250YWluZXI8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfU0FTSF9DT05UQUlORVJfT1BFUkFUSU9OX0NPVU5UID0gUEVSU1BFQ1RJVkVfRUxFTUVOVF9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVQYXJ0SW1wbCA8ZW0+UGVyc3BlY3RpdmUgUGFydDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZVBhcnRJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVEc2xQYWNrYWdlSW1wbCNnZXRQZXJzcGVjdGl2ZVBhcnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfUEFSVCA9IDc7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX1BBUlRfX0VMRU1FTlRfSUQgPSBQRVJTUEVDVElWRV9FTEVNRU5UX19FTEVNRU5UX0lEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2Vzc2liaWxpdHkgUGhyYXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfUEFSVF9fQUNDRVNTSUJJTElUWV9QSFJBU0UgPSBQRVJTUEVDVElWRV9FTEVNRU5UX19BQ0NFU1NJQklMSVRZX1BIUkFTRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXIgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX1BBUlRfX0NPTlRBSU5FUl9EQVRBID0gUEVSU1BFQ1RJVkVfRUxFTUVOVF9fQ09OVEFJTkVSX0RBVEE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX1BBUlRfX0VMRU1FTlRTID0gUEVSU1BFQ1RJVkVfRUxFTUVOVF9fRUxFTUVOVFM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9QQVJUX19ERVNDUklQVElPTiA9IFBFUlNQRUNUSVZFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb24gVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9QQVJUX19ERVNDUklQVElPTl9WQUxVRSA9IFBFUlNQRUNUSVZFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbiBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9QQVJUX19JQ09OX1VSSSA9IFBFUlNQRUNUSVZFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmlldzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX1BBUlRfX1ZJRVcgPSBQRVJTUEVDVElWRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIENsb3NhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfUEFSVF9fSVNfQ0xPU0FCTEUgPSBQRVJTUEVDVElWRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBlcnNwZWN0aXZlIFBhcnQ8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfUEFSVF9GRUFUVVJFX0NPVU5UID0gUEVSU1BFQ1RJVkVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9QQVJUX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IFBFUlNQRUNUSVZFX0VMRU1FTlRfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlBlcnNwZWN0aXZlIFBhcnQ8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfUEFSVF9PUEVSQVRJT05fQ09VTlQgPSBQRVJTUEVDVElWRV9FTEVNRU5UX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZVBhcnRTdGFja0ltcGwgPGVtPlBlcnNwZWN0aXZlIFBhcnQgU3RhY2s8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVQYXJ0U3RhY2tJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVEc2xQYWNrYWdlSW1wbCNnZXRQZXJzcGVjdGl2ZVBhcnRTdGFjaygpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9QQVJUX1NUQUNLID0gODsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfUEFSVF9TVEFDS19fRUxFTUVOVF9JRCA9IFBFUlNQRUNUSVZFX0VMRU1FTlRfX0VMRU1FTlRfSUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzaWJpbGl0eSBQaHJhc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9QQVJUX1NUQUNLX19BQ0NFU1NJQklMSVRZX1BIUkFTRSA9IFBFUlNQRUNUSVZFX0VMRU1FTlRfX0FDQ0VTU0lCSUxJVFlfUEhSQVNFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lciBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfUEFSVF9TVEFDS19fQ09OVEFJTkVSX0RBVEEgPSBQRVJTUEVDVElWRV9FTEVNRU5UX19DT05UQUlORVJfREFUQTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfUEFSVF9TVEFDS19fRUxFTUVOVFMgPSBQRVJTUEVDVElWRV9FTEVNRU5UX19FTEVNRU5UUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWxlY3RlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfUEFSVF9TVEFDS19fU0VMRUNURURfRUxFTUVOVCA9IFBFUlNQRUNUSVZFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UGVyc3BlY3RpdmUgUGFydCBTdGFjazwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9QQVJUX1NUQUNLX0ZFQVRVUkVfQ09VTlQgPSBQRVJTUEVDVElWRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX1BBUlRfU1RBQ0tfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gUEVSU1BFQ1RJVkVfRUxFTUVOVF9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+UGVyc3BlY3RpdmUgUGFydCBTdGFjazwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9QQVJUX1NUQUNLX09QRVJBVElPTl9DT1VOVCA9IFBFUlNQRUNUSVZFX0VMRU1FTlRfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVZpZXcgPGVtPlBlcnNwZWN0aXZlIFZpZXc8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlVmlldworCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlRHNsUGFja2FnZUltcGwjZ2V0UGVyc3BlY3RpdmVWaWV3KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX1ZJRVcgPSA5OworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBlcnNwZWN0aXZlIFZpZXc8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfVklFV19GRUFUVVJFX0NPVU5UID0gUEVSU1BFQ1RJVkVfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9WSUVXX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IFBFUlNQRUNUSVZFX0xBWllfUkVTT0xWRVJfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlBlcnNwZWN0aXZlIFZpZXc8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfVklFV19PUEVSQVRJT05fQ09VTlQgPSBQRVJTUEVDVElWRV9MQVpZX1JFU09MVkVSX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZVNlbGVjdGlvbkltcGwgPGVtPlBlcnNwZWN0aXZlIFNlbGVjdGlvbjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZVNlbGVjdGlvbkltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZURzbFBhY2thZ2VJbXBsI2dldFBlcnNwZWN0aXZlU2VsZWN0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX1NFTEVDVElPTiA9IDEwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZjwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX1NFTEVDVElPTl9fUkVGID0gUEVSU1BFQ1RJVkVfVklFV19GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWYgVHlwZSBKdm08L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9TRUxFQ1RJT05fX1JFRl9UWVBFX0pWTSA9IFBFUlNQRUNUSVZFX1ZJRVdfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UGVyc3BlY3RpdmUgU2VsZWN0aW9uPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX1NFTEVDVElPTl9GRUFUVVJFX0NPVU5UID0gUEVSU1BFQ1RJVkVfVklFV19GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9TRUxFQ1RJT05fX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gUEVSU1BFQ1RJVkVfVklFV19fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+UGVyc3BlY3RpdmUgU2VsZWN0aW9uPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX1NFTEVDVElPTl9PUEVSQVRJT05fQ09VTlQgPSBQRVJTUEVDVElWRV9WSUVXX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZVRhYmxlSW1wbCA8ZW0+UGVyc3BlY3RpdmUgVGFibGU8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVUYWJsZUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZURzbFBhY2thZ2VJbXBsI2dldFBlcnNwZWN0aXZlVGFibGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfVEFCTEUgPSAxMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWY8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9UQUJMRV9fUkVGID0gUEVSU1BFQ1RJVkVfVklFV19GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWYgVHlwZSBKdm08L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9UQUJMRV9fUkVGX1RZUEVfSlZNID0gUEVSU1BFQ1RJVkVfVklFV19GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QZXJzcGVjdGl2ZSBUYWJsZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9UQUJMRV9GRUFUVVJFX0NPVU5UID0gUEVSU1BFQ1RJVkVfVklFV19GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9UQUJMRV9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBQRVJTUEVDVElWRV9WSUVXX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5QZXJzcGVjdGl2ZSBUYWJsZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9UQUJMRV9PUEVSQVRJT05fQ09VTlQgPSBQRVJTUEVDVElWRV9WSUVXX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZUdyaWRJbXBsIDxlbT5QZXJzcGVjdGl2ZSBHcmlkPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlR3JpZEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZURzbFBhY2thZ2VJbXBsI2dldFBlcnNwZWN0aXZlR3JpZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9HUklEID0gMTI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfR1JJRF9fUkVGID0gUEVSU1BFQ1RJVkVfVklFV19GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWYgVHlwZSBKdm08L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9HUklEX19SRUZfVFlQRV9KVk0gPSBQRVJTUEVDVElWRV9WSUVXX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBlcnNwZWN0aXZlIEdyaWQ8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfR1JJRF9GRUFUVVJFX0NPVU5UID0gUEVSU1BFQ1RJVkVfVklFV19GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9HUklEX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IFBFUlNQRUNUSVZFX1ZJRVdfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlBlcnNwZWN0aXZlIEdyaWQ8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfR1JJRF9PUEVSQVRJT05fQ09VTlQgPSBQRVJTUEVDVElWRV9WSUVXX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZUNoYXJ0SW1wbCA8ZW0+UGVyc3BlY3RpdmUgQ2hhcnQ8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVDaGFydEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZURzbFBhY2thZ2VJbXBsI2dldFBlcnNwZWN0aXZlQ2hhcnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfQ0hBUlQgPSAxMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWY8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9DSEFSVF9fUkVGID0gUEVSU1BFQ1RJVkVfVklFV19GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWYgVHlwZSBKdm08L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9DSEFSVF9fUkVGX1RZUEVfSlZNID0gUEVSU1BFQ1RJVkVfVklFV19GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QZXJzcGVjdGl2ZSBDaGFydDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9DSEFSVF9GRUFUVVJFX0NPVU5UID0gUEVSU1BFQ1RJVkVfVklFV19GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9DSEFSVF9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBQRVJTUEVDVElWRV9WSUVXX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5QZXJzcGVjdGl2ZSBDaGFydDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9DSEFSVF9PUEVSQVRJT05fQ09VTlQgPSBQRVJTUEVDVElWRV9WSUVXX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZVJlcG9ydEltcGwgPGVtPlBlcnNwZWN0aXZlIFJlcG9ydDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZVJlcG9ydEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZURzbFBhY2thZ2VJbXBsI2dldFBlcnNwZWN0aXZlUmVwb3J0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX1JFUE9SVCA9IDE0OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZjwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX1JFUE9SVF9fUkVGID0gUEVSU1BFQ1RJVkVfVklFV19GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWYgVHlwZSBKdm08L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9SRVBPUlRfX1JFRl9UWVBFX0pWTSA9IFBFUlNQRUNUSVZFX1ZJRVdfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UGVyc3BlY3RpdmUgUmVwb3J0PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX1JFUE9SVF9GRUFUVVJFX0NPVU5UID0gUEVSU1BFQ1RJVkVfVklFV19GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9SRVBPUlRfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gUEVSU1BFQ1RJVkVfVklFV19fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+UGVyc3BlY3RpdmUgUmVwb3J0PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX1JFUE9SVF9PUEVSQVRJT05fQ09VTlQgPSBQRVJTUEVDVElWRV9WSUVXX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbkltcGwgPGVtPlBlcnNwZWN0aXZlIE9yZ2FuaXphdGlvbjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbkltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZURzbFBhY2thZ2VJbXBsI2dldFBlcnNwZWN0aXZlT3JnYW5pemF0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX09SR0FOSVpBVElPTiA9IDE1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZjwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX09SR0FOSVpBVElPTl9fUkVGID0gUEVSU1BFQ1RJVkVfVklFV19GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QZXJzcGVjdGl2ZSBPcmdhbml6YXRpb248L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfT1JHQU5JWkFUSU9OX0ZFQVRVUkVfQ09VTlQgPSBQRVJTUEVDVElWRV9WSUVXX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX09SR0FOSVpBVElPTl9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBQRVJTUEVDVElWRV9WSUVXX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5QZXJzcGVjdGl2ZSBPcmdhbml6YXRpb248L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfT1JHQU5JWkFUSU9OX09QRVJBVElPTl9DT1VOVCA9IFBFUlNQRUNUSVZFX1ZJRVdfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlVG9wb2xvZ3lJbXBsIDxlbT5QZXJzcGVjdGl2ZSBUb3BvbG9neTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZVRvcG9sb2d5SW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlRHNsUGFja2FnZUltcGwjZ2V0UGVyc3BlY3RpdmVUb3BvbG9neSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBQRVJTUEVDVElWRV9UT1BPTE9HWSA9IDE2OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZjwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX1RPUE9MT0dZX19SRUYgPSBQRVJTUEVDVElWRV9WSUVXX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZiBUeXBlIEp2bTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX1RPUE9MT0dZX19SRUZfVFlQRV9KVk0gPSBQRVJTUEVDVElWRV9WSUVXX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBlcnNwZWN0aXZlIFRvcG9sb2d5PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX1RPUE9MT0dZX0ZFQVRVUkVfQ09VTlQgPSBQRVJTUEVDVElWRV9WSUVXX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX1RPUE9MT0dZX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IFBFUlNQRUNUSVZFX1ZJRVdfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlBlcnNwZWN0aXZlIFRvcG9sb2d5PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX1RPUE9MT0dZX09QRVJBVElPTl9DT1VOVCA9IFBFUlNQRUNUSVZFX1ZJRVdfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlRGlhbG9nSW1wbCA8ZW0+UGVyc3BlY3RpdmUgRGlhbG9nPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlRGlhbG9nSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlRHNsUGFja2FnZUltcGwjZ2V0UGVyc3BlY3RpdmVEaWFsb2coKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfRElBTE9HID0gMTc7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfRElBTE9HX19SRUYgPSBQRVJTUEVDVElWRV9WSUVXX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZiBUeXBlIEp2bTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX0RJQUxPR19fUkVGX1RZUEVfSlZNID0gUEVSU1BFQ1RJVkVfVklFV19GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QZXJzcGVjdGl2ZSBEaWFsb2c8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfRElBTE9HX0ZFQVRVUkVfQ09VTlQgPSBQRVJTUEVDVElWRV9WSUVXX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX0RJQUxPR19fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBQRVJTUEVDVElWRV9WSUVXX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5QZXJzcGVjdGl2ZSBEaWFsb2c8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfRElBTE9HX09QRVJBVElPTl9DT1VOVCA9IFBFUlNQRUNUSVZFX1ZJRVdfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlQlBNTkltcGwgPGVtPlBlcnNwZWN0aXZlIEJQTU48L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVCUE1OSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlRHNsUGFja2FnZUltcGwjZ2V0UGVyc3BlY3RpdmVCUE1OKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX0JQTU4gPSAxODsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QZXJzcGVjdGl2ZSBCUE1OPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX0JQTU5fRkVBVFVSRV9DT1VOVCA9IFBFUlNQRUNUSVZFX1ZJRVdfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSU1BFQ1RJVkVfQlBNTl9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBQRVJTUEVDVElWRV9WSUVXX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5QZXJzcGVjdGl2ZSBCUE1OPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUlNQRUNUSVZFX0JQTU5fT1BFUkFUSU9OX0NPVU5UID0gUEVSU1BFQ1RJVkVfVklFV19PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlNhc2hPcmllbnRhdGlvbiA8ZW0+U2FzaCBPcmllbnRhdGlvbjwvZW0+fScgZW51bS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5TYXNoT3JpZW50YXRpb24KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZURzbFBhY2thZ2VJbXBsI2dldFNhc2hPcmllbnRhdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBTQVNIX09SSUVOVEFUSU9OID0gMTk7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkludGVybmFsIEVPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVEc2xQYWNrYWdlSW1wbCNnZXRJbnRlcm5hbEVPYmplY3QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgSU5URVJOQUxfRU9CSkVDVCA9IDIwOworCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlTW9kZWwgPGVtPlBlcnNwZWN0aXZlIE1vZGVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBlcnNwZWN0aXZlIE1vZGVsPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZU1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRQZXJzcGVjdGl2ZU1vZGVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZU1vZGVsI2dldFBhY2thZ2VzIDxlbT5QYWNrYWdlczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UGFja2FnZXM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlTW9kZWwjZ2V0UGFja2FnZXMoKQorCSAqIEBzZWUgI2dldFBlcnNwZWN0aXZlTW9kZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFBlcnNwZWN0aXZlTW9kZWxfUGFja2FnZXMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVMYXp5UmVzb2x2ZXIgPGVtPlBlcnNwZWN0aXZlIExhenkgUmVzb2x2ZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UGVyc3BlY3RpdmUgTGF6eSBSZXNvbHZlcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVMYXp5UmVzb2x2ZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFBlcnNwZWN0aXZlTGF6eVJlc29sdmVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUxhenlSZXNvbHZlciNlUmVzb2x2ZVByb3h5KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QpIDxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+fScgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVMYXp5UmVzb2x2ZXIjZVJlc29sdmVQcm94eShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFT3BlcmF0aW9uIGdldFBlcnNwZWN0aXZlTGF6eVJlc29sdmVyX19FUmVzb2x2ZVByb3h5X19JbnRlcm5hbEVPYmplY3QoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYWNrYWdlIDxlbT5QZXJzcGVjdGl2ZSBQYWNrYWdlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBlcnNwZWN0aXZlIFBhY2thZ2U8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUGFja2FnZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0UGVyc3BlY3RpdmVQYWNrYWdlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVBhY2thZ2UjZ2V0UGVyc3BlY3RpdmVzIDxlbT5QZXJzcGVjdGl2ZXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlBlcnNwZWN0aXZlczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYWNrYWdlI2dldFBlcnNwZWN0aXZlcygpCisJICogQHNlZSAjZ2V0UGVyc3BlY3RpdmVQYWNrYWdlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRQZXJzcGVjdGl2ZVBhY2thZ2VfUGVyc3BlY3RpdmVzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlQmFzZSA8ZW0+UGVyc3BlY3RpdmUgQmFzZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QZXJzcGVjdGl2ZSBCYXNlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUJhc2UKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFBlcnNwZWN0aXZlQmFzZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlQmFzZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVCYXNlI2dldE5hbWUoKQorCSAqIEBzZWUgI2dldFBlcnNwZWN0aXZlQmFzZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0UGVyc3BlY3RpdmVCYXNlX05hbWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmUgPGVtPlBlcnNwZWN0aXZlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBlcnNwZWN0aXZlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0UGVyc3BlY3RpdmUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZSNpc0Rlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZSNpc0Rlc2NyaXB0aW9uKCkKKwkgKiBAc2VlICNnZXRQZXJzcGVjdGl2ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0UGVyc3BlY3RpdmVfRGVzY3JpcHRpb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZSNnZXREZXNjcmlwdGlvblZhbHVlIDxlbT5EZXNjcmlwdGlvbiBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlc2NyaXB0aW9uIFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZSNnZXREZXNjcmlwdGlvblZhbHVlKCkKKwkgKiBAc2VlICNnZXRQZXJzcGVjdGl2ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0UGVyc3BlY3RpdmVfRGVzY3JpcHRpb25WYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlI2dldEljb25VUkkgPGVtPkljb24gVVJJPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWNvbiBVUkk8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlI2dldEljb25VUkkoKQorCSAqIEBzZWUgI2dldFBlcnNwZWN0aXZlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRQZXJzcGVjdGl2ZV9JY29uVVJJKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmUjZ2V0QWNjZXNzaWJpbGl0eVBocmFzZSA8ZW0+QWNjZXNzaWJpbGl0eSBQaHJhc2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY2Nlc3NpYmlsaXR5IFBocmFzZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmUjZ2V0QWNjZXNzaWJpbGl0eVBocmFzZSgpCisJICogQHNlZSAjZ2V0UGVyc3BlY3RpdmUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFBlcnNwZWN0aXZlX0FjY2Vzc2liaWxpdHlQaHJhc2UoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZSNnZXRQcm9jZXNzIDxlbT5Qcm9jZXNzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UHJvY2VzczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmUjZ2V0UHJvY2VzcygpCisJICogQHNlZSAjZ2V0UGVyc3BlY3RpdmUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFBlcnNwZWN0aXZlX1Byb2Nlc3MoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZSNnZXRVc2VyVGFzayA8ZW0+VXNlciBUYXNrPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+VXNlciBUYXNrPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZSNnZXRVc2VyVGFzaygpCisJICogQHNlZSAjZ2V0UGVyc3BlY3RpdmUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFBlcnNwZWN0aXZlX1VzZXJUYXNrKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmUjZ2V0VG9vbGJhciA8ZW0+VG9vbGJhcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlRvb2xiYXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlI2dldFRvb2xiYXIoKQorCSAqIEBzZWUgI2dldFBlcnNwZWN0aXZlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRQZXJzcGVjdGl2ZV9Ub29sYmFyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmUjZ2V0VG9vbGJhclR5cGVKdm0gPGVtPlRvb2xiYXIgVHlwZSBKdm08L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Ub29sYmFyIFR5cGUgSnZtPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZSNnZXRUb29sYmFyVHlwZUp2bSgpCisJICogQHNlZSAjZ2V0UGVyc3BlY3RpdmUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFBlcnNwZWN0aXZlX1Rvb2xiYXJUeXBlSnZtKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZSNnZXRFbGVtZW50cyA8ZW0+RWxlbWVudHM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVsZW1lbnRzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZSNnZXRFbGVtZW50cygpCisJICogQHNlZSAjZ2V0UGVyc3BlY3RpdmUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFBlcnNwZWN0aXZlX0VsZW1lbnRzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRWxlbWVudCA8ZW0+UGVyc3BlY3RpdmUgRWxlbWVudDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QZXJzcGVjdGl2ZSBFbGVtZW50PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUVsZW1lbnQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFBlcnNwZWN0aXZlRWxlbWVudCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRWxlbWVudCNnZXRFbGVtZW50SWQgPGVtPkVsZW1lbnQgSWQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FbGVtZW50IElkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUVsZW1lbnQjZ2V0RWxlbWVudElkKCkKKwkgKiBAc2VlICNnZXRQZXJzcGVjdGl2ZUVsZW1lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFBlcnNwZWN0aXZlRWxlbWVudF9FbGVtZW50SWQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUVsZW1lbnQjZ2V0QWNjZXNzaWJpbGl0eVBocmFzZSA8ZW0+QWNjZXNzaWJpbGl0eSBQaHJhc2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY2Nlc3NpYmlsaXR5IFBocmFzZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVFbGVtZW50I2dldEFjY2Vzc2liaWxpdHlQaHJhc2UoKQorCSAqIEBzZWUgI2dldFBlcnNwZWN0aXZlRWxlbWVudCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0UGVyc3BlY3RpdmVFbGVtZW50X0FjY2Vzc2liaWxpdHlQaHJhc2UoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUVsZW1lbnQjZ2V0Q29udGFpbmVyRGF0YSA8ZW0+Q29udGFpbmVyIERhdGE8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db250YWluZXIgRGF0YTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVFbGVtZW50I2dldENvbnRhaW5lckRhdGEoKQorCSAqIEBzZWUgI2dldFBlcnNwZWN0aXZlRWxlbWVudCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0UGVyc3BlY3RpdmVFbGVtZW50X0NvbnRhaW5lckRhdGEoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRWxlbWVudCNnZXRFbGVtZW50cyA8ZW0+RWxlbWVudHM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVsZW1lbnRzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUVsZW1lbnQjZ2V0RWxlbWVudHMoKQorCSAqIEBzZWUgI2dldFBlcnNwZWN0aXZlRWxlbWVudCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0UGVyc3BlY3RpdmVFbGVtZW50X0VsZW1lbnRzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlU2FzaENvbnRhaW5lciA8ZW0+UGVyc3BlY3RpdmUgU2FzaCBDb250YWluZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UGVyc3BlY3RpdmUgU2FzaCBDb250YWluZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlU2FzaENvbnRhaW5lcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyI2dldE9yaWVudGF0aW9uIDxlbT5PcmllbnRhdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk9yaWVudGF0aW9uPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVNhc2hDb250YWluZXIjZ2V0T3JpZW50YXRpb24oKQorCSAqIEBzZWUgI2dldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX09yaWVudGF0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyI2dldFNlbGVjdGVkRWxlbWVudCA8ZW0+U2VsZWN0ZWQgRWxlbWVudDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlNlbGVjdGVkIEVsZW1lbnQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlU2FzaENvbnRhaW5lciNnZXRTZWxlY3RlZEVsZW1lbnQoKQorCSAqIEBzZWUgI2dldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX1NlbGVjdGVkRWxlbWVudCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVBhcnQgPGVtPlBlcnNwZWN0aXZlIFBhcnQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UGVyc3BlY3RpdmUgUGFydDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYXJ0CisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRQZXJzcGVjdGl2ZVBhcnQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVBhcnQjaXNEZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYXJ0I2lzRGVzY3JpcHRpb24oKQorCSAqIEBzZWUgI2dldFBlcnNwZWN0aXZlUGFydCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0UGVyc3BlY3RpdmVQYXJ0X0Rlc2NyaXB0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYXJ0I2dldERlc2NyaXB0aW9uVmFsdWUgPGVtPkRlc2NyaXB0aW9uIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVzY3JpcHRpb24gVmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUGFydCNnZXREZXNjcmlwdGlvblZhbHVlKCkKKwkgKiBAc2VlICNnZXRQZXJzcGVjdGl2ZVBhcnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFBlcnNwZWN0aXZlUGFydF9EZXNjcmlwdGlvblZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYXJ0I2dldEljb25VUkkgPGVtPkljb24gVVJJPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWNvbiBVUkk8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUGFydCNnZXRJY29uVVJJKCkKKwkgKiBAc2VlICNnZXRQZXJzcGVjdGl2ZVBhcnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFBlcnNwZWN0aXZlUGFydF9JY29uVVJJKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYXJ0I2dldFZpZXcgPGVtPlZpZXc8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5WaWV3PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVBhcnQjZ2V0VmlldygpCisJICogQHNlZSAjZ2V0UGVyc3BlY3RpdmVQYXJ0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRQZXJzcGVjdGl2ZVBhcnRfVmlldygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUGFydCNpc0lzQ2xvc2FibGUgPGVtPklzIENsb3NhYmxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgQ2xvc2FibGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUGFydCNpc0lzQ2xvc2FibGUoKQorCSAqIEBzZWUgI2dldFBlcnNwZWN0aXZlUGFydCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0UGVyc3BlY3RpdmVQYXJ0X0lzQ2xvc2FibGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYXJ0U3RhY2sgPGVtPlBlcnNwZWN0aXZlIFBhcnQgU3RhY2s8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UGVyc3BlY3RpdmUgUGFydCBTdGFjazwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYXJ0U3RhY2sKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFBlcnNwZWN0aXZlUGFydFN0YWNrKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYXJ0U3RhY2sjZ2V0U2VsZWN0ZWRFbGVtZW50IDxlbT5TZWxlY3RlZCBFbGVtZW50PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+U2VsZWN0ZWQgRWxlbWVudDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYXJ0U3RhY2sjZ2V0U2VsZWN0ZWRFbGVtZW50KCkKKwkgKiBAc2VlICNnZXRQZXJzcGVjdGl2ZVBhcnRTdGFjaygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tfU2VsZWN0ZWRFbGVtZW50KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlVmlldyA8ZW0+UGVyc3BlY3RpdmUgVmlldzwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QZXJzcGVjdGl2ZSBWaWV3PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVZpZXcKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFBlcnNwZWN0aXZlVmlldygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVNlbGVjdGlvbiA8ZW0+UGVyc3BlY3RpdmUgU2VsZWN0aW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBlcnNwZWN0aXZlIFNlbGVjdGlvbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVTZWxlY3Rpb24KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFBlcnNwZWN0aXZlU2VsZWN0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVTZWxlY3Rpb24jZ2V0UmVmIDxlbT5SZWY8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5SZWY8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlU2VsZWN0aW9uI2dldFJlZigpCisJICogQHNlZSAjZ2V0UGVyc3BlY3RpdmVTZWxlY3Rpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFBlcnNwZWN0aXZlU2VsZWN0aW9uX1JlZigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlU2VsZWN0aW9uI2dldFJlZlR5cGVKdm0gPGVtPlJlZiBUeXBlIEp2bTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlJlZiBUeXBlIEp2bTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVTZWxlY3Rpb24jZ2V0UmVmVHlwZUp2bSgpCisJICogQHNlZSAjZ2V0UGVyc3BlY3RpdmVTZWxlY3Rpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFBlcnNwZWN0aXZlU2VsZWN0aW9uX1JlZlR5cGVKdm0oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVUYWJsZSA8ZW0+UGVyc3BlY3RpdmUgVGFibGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UGVyc3BlY3RpdmUgVGFibGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlVGFibGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFBlcnNwZWN0aXZlVGFibGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVRhYmxlI2dldFJlZiA8ZW0+UmVmPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UmVmPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVRhYmxlI2dldFJlZigpCisJICogQHNlZSAjZ2V0UGVyc3BlY3RpdmVUYWJsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0UGVyc3BlY3RpdmVUYWJsZV9SZWYoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVRhYmxlI2dldFJlZlR5cGVKdm0gPGVtPlJlZiBUeXBlIEp2bTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlJlZiBUeXBlIEp2bTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVUYWJsZSNnZXRSZWZUeXBlSnZtKCkKKwkgKiBAc2VlICNnZXRQZXJzcGVjdGl2ZVRhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRQZXJzcGVjdGl2ZVRhYmxlX1JlZlR5cGVKdm0oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVHcmlkIDxlbT5QZXJzcGVjdGl2ZSBHcmlkPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBlcnNwZWN0aXZlIEdyaWQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlR3JpZAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0UGVyc3BlY3RpdmVHcmlkKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVHcmlkI2dldFJlZiA8ZW0+UmVmPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UmVmPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUdyaWQjZ2V0UmVmKCkKKwkgKiBAc2VlICNnZXRQZXJzcGVjdGl2ZUdyaWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFBlcnNwZWN0aXZlR3JpZF9SZWYoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUdyaWQjZ2V0UmVmVHlwZUp2bSA8ZW0+UmVmIFR5cGUgSnZtPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UmVmIFR5cGUgSnZtPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUdyaWQjZ2V0UmVmVHlwZUp2bSgpCisJICogQHNlZSAjZ2V0UGVyc3BlY3RpdmVHcmlkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRQZXJzcGVjdGl2ZUdyaWRfUmVmVHlwZUp2bSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUNoYXJ0IDxlbT5QZXJzcGVjdGl2ZSBDaGFydDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QZXJzcGVjdGl2ZSBDaGFydDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVDaGFydAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0UGVyc3BlY3RpdmVDaGFydCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlQ2hhcnQjZ2V0UmVmIDxlbT5SZWY8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5SZWY8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlQ2hhcnQjZ2V0UmVmKCkKKwkgKiBAc2VlICNnZXRQZXJzcGVjdGl2ZUNoYXJ0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRQZXJzcGVjdGl2ZUNoYXJ0X1JlZigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlQ2hhcnQjZ2V0UmVmVHlwZUp2bSA8ZW0+UmVmIFR5cGUgSnZtPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UmVmIFR5cGUgSnZtPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUNoYXJ0I2dldFJlZlR5cGVKdm0oKQorCSAqIEBzZWUgI2dldFBlcnNwZWN0aXZlQ2hhcnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFBlcnNwZWN0aXZlQ2hhcnRfUmVmVHlwZUp2bSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVJlcG9ydCA8ZW0+UGVyc3BlY3RpdmUgUmVwb3J0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBlcnNwZWN0aXZlIFJlcG9ydDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVSZXBvcnQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFBlcnNwZWN0aXZlUmVwb3J0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVSZXBvcnQjZ2V0UmVmIDxlbT5SZWY8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5SZWY8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUmVwb3J0I2dldFJlZigpCisJICogQHNlZSAjZ2V0UGVyc3BlY3RpdmVSZXBvcnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFBlcnNwZWN0aXZlUmVwb3J0X1JlZigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUmVwb3J0I2dldFJlZlR5cGVKdm0gPGVtPlJlZiBUeXBlIEp2bTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlJlZiBUeXBlIEp2bTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVSZXBvcnQjZ2V0UmVmVHlwZUp2bSgpCisJICogQHNlZSAjZ2V0UGVyc3BlY3RpdmVSZXBvcnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFBlcnNwZWN0aXZlUmVwb3J0X1JlZlR5cGVKdm0oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVPcmdhbml6YXRpb24gPGVtPlBlcnNwZWN0aXZlIE9yZ2FuaXphdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QZXJzcGVjdGl2ZSBPcmdhbml6YXRpb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlT3JnYW5pemF0aW9uCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlT3JnYW5pemF0aW9uI2dldFJlZiA8ZW0+UmVmPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UmVmPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbiNnZXRSZWYoKQorCSAqIEBzZWUgI2dldFBlcnNwZWN0aXZlT3JnYW5pemF0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbl9SZWYoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVUb3BvbG9neSA8ZW0+UGVyc3BlY3RpdmUgVG9wb2xvZ3k8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UGVyc3BlY3RpdmUgVG9wb2xvZ3k8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlVG9wb2xvZ3kKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFBlcnNwZWN0aXZlVG9wb2xvZ3koKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVRvcG9sb2d5I2dldFJlZiA8ZW0+UmVmPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UmVmPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVRvcG9sb2d5I2dldFJlZigpCisJICogQHNlZSAjZ2V0UGVyc3BlY3RpdmVUb3BvbG9neSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0UGVyc3BlY3RpdmVUb3BvbG9neV9SZWYoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVRvcG9sb2d5I2dldFJlZlR5cGVKdm0gPGVtPlJlZiBUeXBlIEp2bTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlJlZiBUeXBlIEp2bTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVUb3BvbG9neSNnZXRSZWZUeXBlSnZtKCkKKwkgKiBAc2VlICNnZXRQZXJzcGVjdGl2ZVRvcG9sb2d5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRQZXJzcGVjdGl2ZVRvcG9sb2d5X1JlZlR5cGVKdm0oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEaWFsb2cgPGVtPlBlcnNwZWN0aXZlIERpYWxvZzwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QZXJzcGVjdGl2ZSBEaWFsb2c8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRGlhbG9nCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRQZXJzcGVjdGl2ZURpYWxvZygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRGlhbG9nI2dldFJlZiA8ZW0+UmVmPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UmVmPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURpYWxvZyNnZXRSZWYoKQorCSAqIEBzZWUgI2dldFBlcnNwZWN0aXZlRGlhbG9nKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRQZXJzcGVjdGl2ZURpYWxvZ19SZWYoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURpYWxvZyNnZXRSZWZUeXBlSnZtIDxlbT5SZWYgVHlwZSBKdm08L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5SZWYgVHlwZSBKdm08L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRGlhbG9nI2dldFJlZlR5cGVKdm0oKQorCSAqIEBzZWUgI2dldFBlcnNwZWN0aXZlRGlhbG9nKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRQZXJzcGVjdGl2ZURpYWxvZ19SZWZUeXBlSnZtKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlQlBNTiA8ZW0+UGVyc3BlY3RpdmUgQlBNTjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QZXJzcGVjdGl2ZSBCUE1OPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUJQTU4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFBlcnNwZWN0aXZlQlBNTigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlNhc2hPcmllbnRhdGlvbiA8ZW0+U2FzaCBPcmllbnRhdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlNhc2ggT3JpZW50YXRpb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlNhc2hPcmllbnRhdGlvbgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFRW51bSBnZXRTYXNoT3JpZW50YXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IDxlbT5JbnRlcm5hbCBFT2JqZWN0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5JbnRlcm5hbCBFT2JqZWN0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdAorCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFRGF0YVR5cGUgZ2V0SW50ZXJuYWxFT2JqZWN0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlQZXJzcGVjdGl2ZURzbEZhY3RvcnkgZ2V0UGVyc3BlY3RpdmVEc2xGYWN0b3J5KCk7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKKwkgKiA8dWw+CisJICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgorCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+CisJICogICA8bGk+ZWFjaCBvcGVyYXRpb24gb2YgZWFjaCBjbGFzcyw8L2xpPgorCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgorCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CisJICogPC91bD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50ZXJmYWNlIExpdGVyYWxzIHsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVNb2RlbEltcGwgPGVtPlBlcnNwZWN0aXZlIE1vZGVsPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlTW9kZWxJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlRHNsUGFja2FnZUltcGwjZ2V0UGVyc3BlY3RpdmVNb2RlbCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBQRVJTUEVDVElWRV9NT0RFTCA9IGVJTlNUQU5DRS5nZXRQZXJzcGVjdGl2ZU1vZGVsKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QYWNrYWdlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgUEVSU1BFQ1RJVkVfTU9ERUxfX1BBQ0tBR0VTID0gZUlOU1RBTkNFLmdldFBlcnNwZWN0aXZlTW9kZWxfUGFja2FnZXMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZUxhenlSZXNvbHZlckltcGwgPGVtPlBlcnNwZWN0aXZlIExhenkgUmVzb2x2ZXI8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVMYXp5UmVzb2x2ZXJJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlRHNsUGFja2FnZUltcGwjZ2V0UGVyc3BlY3RpdmVMYXp5UmVzb2x2ZXIoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgUEVSU1BFQ1RJVkVfTEFaWV9SRVNPTFZFUiA9IGVJTlNUQU5DRS5nZXRQZXJzcGVjdGl2ZUxhenlSZXNvbHZlcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RVJlc29sdmUgUHJveHk8L2I+PC9lbT4nIG9wZXJhdGlvbi4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVPcGVyYXRpb24gUEVSU1BFQ1RJVkVfTEFaWV9SRVNPTFZFUl9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBlSU5TVEFOQ0UuZ2V0UGVyc3BlY3RpdmVMYXp5UmVzb2x2ZXJfX0VSZXNvbHZlUHJveHlfX0ludGVybmFsRU9iamVjdCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlUGFja2FnZUltcGwgPGVtPlBlcnNwZWN0aXZlIFBhY2thZ2U8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVQYWNrYWdlSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZURzbFBhY2thZ2VJbXBsI2dldFBlcnNwZWN0aXZlUGFja2FnZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBQRVJTUEVDVElWRV9QQUNLQUdFID0gZUlOU1RBTkNFLmdldFBlcnNwZWN0aXZlUGFja2FnZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGVyc3BlY3RpdmVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBQRVJTUEVDVElWRV9QQUNLQUdFX19QRVJTUEVDVElWRVMgPSBlSU5TVEFOQ0UuZ2V0UGVyc3BlY3RpdmVQYWNrYWdlX1BlcnNwZWN0aXZlcygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlQmFzZUltcGwgPGVtPlBlcnNwZWN0aXZlIEJhc2U8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVCYXNlSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZURzbFBhY2thZ2VJbXBsI2dldFBlcnNwZWN0aXZlQmFzZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBQRVJTUEVDVElWRV9CQVNFID0gZUlOU1RBTkNFLmdldFBlcnNwZWN0aXZlQmFzZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFBFUlNQRUNUSVZFX0JBU0VfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0UGVyc3BlY3RpdmVCYXNlX05hbWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZUltcGwgPGVtPlBlcnNwZWN0aXZlPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZURzbFBhY2thZ2VJbXBsI2dldFBlcnNwZWN0aXZlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFBFUlNQRUNUSVZFID0gZUlOU1RBTkNFLmdldFBlcnNwZWN0aXZlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFBFUlNQRUNUSVZFX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRQZXJzcGVjdGl2ZV9EZXNjcmlwdGlvbigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb24gVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBQRVJTUEVDVElWRV9fREVTQ1JJUFRJT05fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0UGVyc3BlY3RpdmVfRGVzY3JpcHRpb25WYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWNvbiBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBQRVJTUEVDVElWRV9fSUNPTl9VUkkgPSBlSU5TVEFOQ0UuZ2V0UGVyc3BlY3RpdmVfSWNvblVSSSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzaWJpbGl0eSBQaHJhc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBQRVJTUEVDVElWRV9fQUNDRVNTSUJJTElUWV9QSFJBU0UgPSBlSU5TVEFOQ0UuZ2V0UGVyc3BlY3RpdmVfQWNjZXNzaWJpbGl0eVBocmFzZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvY2VzczwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFBFUlNQRUNUSVZFX19QUk9DRVNTID0gZUlOU1RBTkNFLmdldFBlcnNwZWN0aXZlX1Byb2Nlc3MoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVzZXIgVGFzazwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFBFUlNQRUNUSVZFX19VU0VSX1RBU0sgPSBlSU5TVEFOQ0UuZ2V0UGVyc3BlY3RpdmVfVXNlclRhc2soKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRvb2xiYXI8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBQRVJTUEVDVElWRV9fVE9PTEJBUiA9IGVJTlNUQU5DRS5nZXRQZXJzcGVjdGl2ZV9Ub29sYmFyKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ub29sYmFyIFR5cGUgSnZtPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgUEVSU1BFQ1RJVkVfX1RPT0xCQVJfVFlQRV9KVk0gPSBlSU5TVEFOQ0UuZ2V0UGVyc3BlY3RpdmVfVG9vbGJhclR5cGVKdm0oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBQRVJTUEVDVElWRV9fRUxFTUVOVFMgPSBlSU5TVEFOQ0UuZ2V0UGVyc3BlY3RpdmVfRWxlbWVudHMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZUVsZW1lbnRJbXBsIDxlbT5QZXJzcGVjdGl2ZSBFbGVtZW50PC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlRWxlbWVudEltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVEc2xQYWNrYWdlSW1wbCNnZXRQZXJzcGVjdGl2ZUVsZW1lbnQoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgUEVSU1BFQ1RJVkVfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRQZXJzcGVjdGl2ZUVsZW1lbnQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBQRVJTUEVDVElWRV9FTEVNRU5UX19FTEVNRU5UX0lEID0gZUlOU1RBTkNFLmdldFBlcnNwZWN0aXZlRWxlbWVudF9FbGVtZW50SWQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFjY2Vzc2liaWxpdHkgUGhyYXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgUEVSU1BFQ1RJVkVfRUxFTUVOVF9fQUNDRVNTSUJJTElUWV9QSFJBU0UgPSBlSU5TVEFOQ0UuZ2V0UGVyc3BlY3RpdmVFbGVtZW50X0FjY2Vzc2liaWxpdHlQaHJhc2UoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lciBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgUEVSU1BFQ1RJVkVfRUxFTUVOVF9fQ09OVEFJTkVSX0RBVEEgPSBlSU5TVEFOQ0UuZ2V0UGVyc3BlY3RpdmVFbGVtZW50X0NvbnRhaW5lckRhdGEoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBQRVJTUEVDVElWRV9FTEVNRU5UX19FTEVNRU5UUyA9IGVJTlNUQU5DRS5nZXRQZXJzcGVjdGl2ZUVsZW1lbnRfRWxlbWVudHMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZVNhc2hDb250YWluZXJJbXBsIDxlbT5QZXJzcGVjdGl2ZSBTYXNoIENvbnRhaW5lcjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZVNhc2hDb250YWluZXJJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlRHNsUGFja2FnZUltcGwjZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFBFUlNQRUNUSVZFX1NBU0hfQ09OVEFJTkVSID0gZUlOU1RBTkNFLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3JpZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBQRVJTUEVDVElWRV9TQVNIX0NPTlRBSU5FUl9fT1JJRU5UQVRJT04gPSBlSU5TVEFOQ0UuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX09yaWVudGF0aW9uKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZWxlY3RlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgUEVSU1BFQ1RJVkVfU0FTSF9DT05UQUlORVJfX1NFTEVDVEVEX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX1NlbGVjdGVkRWxlbWVudCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlUGFydEltcGwgPGVtPlBlcnNwZWN0aXZlIFBhcnQ8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVQYXJ0SW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZURzbFBhY2thZ2VJbXBsI2dldFBlcnNwZWN0aXZlUGFydCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBQRVJTUEVDVElWRV9QQVJUID0gZUlOU1RBTkNFLmdldFBlcnNwZWN0aXZlUGFydCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBQRVJTUEVDVElWRV9QQVJUX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRQZXJzcGVjdGl2ZVBhcnRfRGVzY3JpcHRpb24oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgUEVSU1BFQ1RJVkVfUEFSVF9fREVTQ1JJUFRJT05fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0UGVyc3BlY3RpdmVQYXJ0X0Rlc2NyaXB0aW9uVmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkljb24gVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgUEVSU1BFQ1RJVkVfUEFSVF9fSUNPTl9VUkkgPSBlSU5TVEFOQ0UuZ2V0UGVyc3BlY3RpdmVQYXJ0X0ljb25VUkkoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZpZXc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBQRVJTUEVDVElWRV9QQVJUX19WSUVXID0gZUlOU1RBTkNFLmdldFBlcnNwZWN0aXZlUGFydF9WaWV3KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBDbG9zYWJsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFBFUlNQRUNUSVZFX1BBUlRfX0lTX0NMT1NBQkxFID0gZUlOU1RBTkNFLmdldFBlcnNwZWN0aXZlUGFydF9Jc0Nsb3NhYmxlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVQYXJ0U3RhY2tJbXBsIDxlbT5QZXJzcGVjdGl2ZSBQYXJ0IFN0YWNrPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlUGFydFN0YWNrSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZURzbFBhY2thZ2VJbXBsI2dldFBlcnNwZWN0aXZlUGFydFN0YWNrKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFBFUlNQRUNUSVZFX1BBUlRfU1RBQ0sgPSBlSU5TVEFOQ0UuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2soKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlbGVjdGVkIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBQRVJTUEVDVElWRV9QQVJUX1NUQUNLX19TRUxFQ1RFRF9FTEVNRU5UID0gZUlOU1RBTkNFLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrX1NlbGVjdGVkRWxlbWVudCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVZpZXcgPGVtPlBlcnNwZWN0aXZlIFZpZXc8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlVmlldworCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZURzbFBhY2thZ2VJbXBsI2dldFBlcnNwZWN0aXZlVmlldygpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBQRVJTUEVDVElWRV9WSUVXID0gZUlOU1RBTkNFLmdldFBlcnNwZWN0aXZlVmlldygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlU2VsZWN0aW9uSW1wbCA8ZW0+UGVyc3BlY3RpdmUgU2VsZWN0aW9uPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlU2VsZWN0aW9uSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZURzbFBhY2thZ2VJbXBsI2dldFBlcnNwZWN0aXZlU2VsZWN0aW9uKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFBFUlNQRUNUSVZFX1NFTEVDVElPTiA9IGVJTlNUQU5DRS5nZXRQZXJzcGVjdGl2ZVNlbGVjdGlvbigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVmPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgUEVSU1BFQ1RJVkVfU0VMRUNUSU9OX19SRUYgPSBlSU5TVEFOQ0UuZ2V0UGVyc3BlY3RpdmVTZWxlY3Rpb25fUmVmKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWYgVHlwZSBKdm08L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBQRVJTUEVDVElWRV9TRUxFQ1RJT05fX1JFRl9UWVBFX0pWTSA9IGVJTlNUQU5DRS5nZXRQZXJzcGVjdGl2ZVNlbGVjdGlvbl9SZWZUeXBlSnZtKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVUYWJsZUltcGwgPGVtPlBlcnNwZWN0aXZlIFRhYmxlPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlVGFibGVJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlRHNsUGFja2FnZUltcGwjZ2V0UGVyc3BlY3RpdmVUYWJsZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBQRVJTUEVDVElWRV9UQUJMRSA9IGVJTlNUQU5DRS5nZXRQZXJzcGVjdGl2ZVRhYmxlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWY8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBQRVJTUEVDVElWRV9UQUJMRV9fUkVGID0gZUlOU1RBTkNFLmdldFBlcnNwZWN0aXZlVGFibGVfUmVmKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWYgVHlwZSBKdm08L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBQRVJTUEVDVElWRV9UQUJMRV9fUkVGX1RZUEVfSlZNID0gZUlOU1RBTkNFLmdldFBlcnNwZWN0aXZlVGFibGVfUmVmVHlwZUp2bSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlR3JpZEltcGwgPGVtPlBlcnNwZWN0aXZlIEdyaWQ8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVHcmlkSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZURzbFBhY2thZ2VJbXBsI2dldFBlcnNwZWN0aXZlR3JpZCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBQRVJTUEVDVElWRV9HUklEID0gZUlOU1RBTkNFLmdldFBlcnNwZWN0aXZlR3JpZCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVmPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgUEVSU1BFQ1RJVkVfR1JJRF9fUkVGID0gZUlOU1RBTkNFLmdldFBlcnNwZWN0aXZlR3JpZF9SZWYoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlZiBUeXBlIEp2bTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFBFUlNQRUNUSVZFX0dSSURfX1JFRl9UWVBFX0pWTSA9IGVJTlNUQU5DRS5nZXRQZXJzcGVjdGl2ZUdyaWRfUmVmVHlwZUp2bSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlQ2hhcnRJbXBsIDxlbT5QZXJzcGVjdGl2ZSBDaGFydDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZUNoYXJ0SW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZURzbFBhY2thZ2VJbXBsI2dldFBlcnNwZWN0aXZlQ2hhcnQoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgUEVSU1BFQ1RJVkVfQ0hBUlQgPSBlSU5TVEFOQ0UuZ2V0UGVyc3BlY3RpdmVDaGFydCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVmPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgUEVSU1BFQ1RJVkVfQ0hBUlRfX1JFRiA9IGVJTlNUQU5DRS5nZXRQZXJzcGVjdGl2ZUNoYXJ0X1JlZigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVmIFR5cGUgSnZtPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgUEVSU1BFQ1RJVkVfQ0hBUlRfX1JFRl9UWVBFX0pWTSA9IGVJTlNUQU5DRS5nZXRQZXJzcGVjdGl2ZUNoYXJ0X1JlZlR5cGVKdm0oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZVJlcG9ydEltcGwgPGVtPlBlcnNwZWN0aXZlIFJlcG9ydDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZVJlcG9ydEltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVEc2xQYWNrYWdlSW1wbCNnZXRQZXJzcGVjdGl2ZVJlcG9ydCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBQRVJTUEVDVElWRV9SRVBPUlQgPSBlSU5TVEFOQ0UuZ2V0UGVyc3BlY3RpdmVSZXBvcnQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlZjwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFBFUlNQRUNUSVZFX1JFUE9SVF9fUkVGID0gZUlOU1RBTkNFLmdldFBlcnNwZWN0aXZlUmVwb3J0X1JlZigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVmIFR5cGUgSnZtPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgUEVSU1BFQ1RJVkVfUkVQT1JUX19SRUZfVFlQRV9KVk0gPSBlSU5TVEFOQ0UuZ2V0UGVyc3BlY3RpdmVSZXBvcnRfUmVmVHlwZUp2bSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlT3JnYW5pemF0aW9uSW1wbCA8ZW0+UGVyc3BlY3RpdmUgT3JnYW5pemF0aW9uPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlT3JnYW5pemF0aW9uSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZURzbFBhY2thZ2VJbXBsI2dldFBlcnNwZWN0aXZlT3JnYW5pemF0aW9uKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFBFUlNQRUNUSVZFX09SR0FOSVpBVElPTiA9IGVJTlNUQU5DRS5nZXRQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVmPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgUEVSU1BFQ1RJVkVfT1JHQU5JWkFUSU9OX19SRUYgPSBlSU5TVEFOQ0UuZ2V0UGVyc3BlY3RpdmVPcmdhbml6YXRpb25fUmVmKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVUb3BvbG9neUltcGwgPGVtPlBlcnNwZWN0aXZlIFRvcG9sb2d5PC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlVG9wb2xvZ3lJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlRHNsUGFja2FnZUltcGwjZ2V0UGVyc3BlY3RpdmVUb3BvbG9neSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBQRVJTUEVDVElWRV9UT1BPTE9HWSA9IGVJTlNUQU5DRS5nZXRQZXJzcGVjdGl2ZVRvcG9sb2d5KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWY8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBQRVJTUEVDVElWRV9UT1BPTE9HWV9fUkVGID0gZUlOU1RBTkNFLmdldFBlcnNwZWN0aXZlVG9wb2xvZ3lfUmVmKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWYgVHlwZSBKdm08L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBQRVJTUEVDVElWRV9UT1BPTE9HWV9fUkVGX1RZUEVfSlZNID0gZUlOU1RBTkNFLmdldFBlcnNwZWN0aXZlVG9wb2xvZ3lfUmVmVHlwZUp2bSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlRGlhbG9nSW1wbCA8ZW0+UGVyc3BlY3RpdmUgRGlhbG9nPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlRGlhbG9nSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZURzbFBhY2thZ2VJbXBsI2dldFBlcnNwZWN0aXZlRGlhbG9nKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFBFUlNQRUNUSVZFX0RJQUxPRyA9IGVJTlNUQU5DRS5nZXRQZXJzcGVjdGl2ZURpYWxvZygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVmPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgUEVSU1BFQ1RJVkVfRElBTE9HX19SRUYgPSBlSU5TVEFOQ0UuZ2V0UGVyc3BlY3RpdmVEaWFsb2dfUmVmKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWYgVHlwZSBKdm08L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBQRVJTUEVDVElWRV9ESUFMT0dfX1JFRl9UWVBFX0pWTSA9IGVJTlNUQU5DRS5nZXRQZXJzcGVjdGl2ZURpYWxvZ19SZWZUeXBlSnZtKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVCUE1OSW1wbCA8ZW0+UGVyc3BlY3RpdmUgQlBNTjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZUJQTU5JbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlRHNsUGFja2FnZUltcGwjZ2V0UGVyc3BlY3RpdmVCUE1OKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFBFUlNQRUNUSVZFX0JQTU4gPSBlSU5TVEFOQ0UuZ2V0UGVyc3BlY3RpdmVCUE1OKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlNhc2hPcmllbnRhdGlvbiA8ZW0+U2FzaCBPcmllbnRhdGlvbjwvZW0+fScgZW51bS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5TYXNoT3JpZW50YXRpb24KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVEc2xQYWNrYWdlSW1wbCNnZXRTYXNoT3JpZW50YXRpb24oKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFRW51bSBTQVNIX09SSUVOVEFUSU9OID0gZUlOU1RBTkNFLmdldFNhc2hPcmllbnRhdGlvbigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+SW50ZXJuYWwgRU9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVEc2xQYWNrYWdlSW1wbCNnZXRJbnRlcm5hbEVPYmplY3QoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFRGF0YVR5cGUgSU5URVJOQUxfRU9CSkVDVCA9IGVJTlNUQU5DRS5nZXRJbnRlcm5hbEVPYmplY3QoKTsKKworCX0KKworfSAvL1BlcnNwZWN0aXZlRHNsUGFja2FnZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvUGVyc3BlY3RpdmVFbGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9QZXJzcGVjdGl2ZUVsZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjNmZTExCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvUGVyc3BlY3RpdmVFbGVtZW50LmphdmEKQEAgLTAsMCArMSwxMzIgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnN7ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QZXJzcGVjdGl2ZSBFbGVtZW50PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVFbGVtZW50I2dldEVsZW1lbnRJZCA8ZW0+RWxlbWVudCBJZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUVsZW1lbnQjZ2V0QWNjZXNzaWJpbGl0eVBocmFzZSA8ZW0+QWNjZXNzaWJpbGl0eSBQaHJhc2U8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVFbGVtZW50I2dldENvbnRhaW5lckRhdGEgPGVtPkNvbnRhaW5lciBEYXRhPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRWxlbWVudCNnZXRFbGVtZW50cyA8ZW0+RWxlbWVudHM8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2xQYWNrYWdlI2dldFBlcnNwZWN0aXZlRWxlbWVudCgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBQZXJzcGVjdGl2ZUVsZW1lbnQgZXh0ZW5kcyBQZXJzcGVjdGl2ZUxhenlSZXNvbHZlciB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWxlbWVudCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWxlbWVudCBJZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50IElkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRFbGVtZW50SWQoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbFBhY2thZ2UjZ2V0UGVyc3BlY3RpdmVFbGVtZW50X0VsZW1lbnRJZCgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRFbGVtZW50SWQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVFbGVtZW50I2dldEVsZW1lbnRJZCA8ZW0+RWxlbWVudCBJZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWxlbWVudCBJZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0RWxlbWVudElkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRFbGVtZW50SWQoU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjY2Vzc2liaWxpdHkgUGhyYXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY2Nlc3NpYmlsaXR5IFBocmFzZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3NpYmlsaXR5IFBocmFzZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0QWNjZXNzaWJpbGl0eVBocmFzZShTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsUGFja2FnZSNnZXRQZXJzcGVjdGl2ZUVsZW1lbnRfQWNjZXNzaWJpbGl0eVBocmFzZSgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRBY2Nlc3NpYmlsaXR5UGhyYXNlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRWxlbWVudCNnZXRBY2Nlc3NpYmlsaXR5UGhyYXNlIDxlbT5BY2Nlc3NpYmlsaXR5IFBocmFzZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzaWJpbGl0eSBQaHJhc2U8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldEFjY2Vzc2liaWxpdHlQaHJhc2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEFjY2Vzc2liaWxpdHlQaHJhc2UoU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRhaW5lciBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db250YWluZXIgRGF0YTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250YWluZXIgRGF0YTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0Q29udGFpbmVyRGF0YShTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsUGFja2FnZSNnZXRQZXJzcGVjdGl2ZUVsZW1lbnRfQ29udGFpbmVyRGF0YSgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRDb250YWluZXJEYXRhKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRWxlbWVudCNnZXRDb250YWluZXJEYXRhIDxlbT5Db250YWluZXIgRGF0YTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGFpbmVyIERhdGE8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldENvbnRhaW5lckRhdGEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldENvbnRhaW5lckRhdGEoU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUVsZW1lbnR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWxlbWVudHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2xQYWNrYWdlI2dldFBlcnNwZWN0aXZlRWxlbWVudF9FbGVtZW50cygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxQZXJzcGVjdGl2ZUVsZW1lbnQ+IGdldEVsZW1lbnRzKCk7CisKK30gLy8gUGVyc3BlY3RpdmVFbGVtZW50CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9QZXJzcGVjdGl2ZUdyaWQuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL1BlcnNwZWN0aXZlR3JpZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MzJmNDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9QZXJzcGVjdGl2ZUdyaWQuamF2YQpAQCAtMCwwICsxLDkwIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQudGFibGUuVGFibGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtVHlwZVJlZmVyZW5jZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGVyc3BlY3RpdmUgR3JpZDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlR3JpZCNnZXRSZWYgPGVtPlJlZjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUdyaWQjZ2V0UmVmVHlwZUp2bSA8ZW0+UmVmIFR5cGUgSnZtPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsUGFja2FnZSNnZXRQZXJzcGVjdGl2ZUdyaWQoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUGVyc3BlY3RpdmVHcmlkIGV4dGVuZHMgUGVyc3BlY3RpdmVWaWV3IHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWY8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlZjwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWY8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFJlZihUYWJsZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2xQYWNrYWdlI2dldFBlcnNwZWN0aXZlR3JpZF9SZWYoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlUYWJsZSBnZXRSZWYoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVHcmlkI2dldFJlZiA8ZW0+UmVmPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWY8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFJlZigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UmVmKFRhYmxlIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZiBUeXBlIEp2bTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVmIFR5cGUgSnZtPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlZiBUeXBlIEp2bTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0UmVmVHlwZUp2bShKdm1UeXBlUmVmZXJlbmNlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbFBhY2thZ2UjZ2V0UGVyc3BlY3RpdmVHcmlkX1JlZlR5cGVKdm0oKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJSnZtVHlwZVJlZmVyZW5jZSBnZXRSZWZUeXBlSnZtKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlR3JpZCNnZXRSZWZUeXBlSnZtIDxlbT5SZWYgVHlwZSBKdm08L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlZiBUeXBlIEp2bTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0UmVmVHlwZUp2bSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UmVmVHlwZUp2bShKdm1UeXBlUmVmZXJlbmNlIHZhbHVlKTsKKworfSAvLyBQZXJzcGVjdGl2ZUdyaWQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL1BlcnNwZWN0aXZlTGF6eVJlc29sdmVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9QZXJzcGVjdGl2ZUxhenlSZXNvbHZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNDgwMTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9QZXJzcGVjdGl2ZUxhenlSZXNvbHZlci5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnN7ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGVyc3BlY3RpdmUgTGF6eSBSZXNvbHZlcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsUGFja2FnZSNnZXRQZXJzcGVjdGl2ZUxhenlSZXNvbHZlcigpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBQZXJzcGVjdGl2ZUxhenlSZXNvbHZlciBleHRlbmRzIEVPYmplY3QgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHByb3h5RGF0YVR5cGU9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuSW50ZXJuYWxFT2JqZWN0IiBwcm94eVVuaXF1ZT0iZmFsc2UiCisJICogICAgICAgIGFubm90YXRpb249Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwgYm9keT0nPCVvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UlPiBfZVJlc291cmNlID0gdGhpcy5lUmVzb3VyY2UoKTtcbjwlb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0JT4gX3Jlc291cmNlU2V0ID0gX2VSZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpO1xucmV0dXJuIDwlb3JnLmVjbGlwc2Uub3NicC5kc2wueHRleHQubGF6eXJlc29sdmVyLmFwaS5FY29yZVV0aWwzJT4ucmVzb2x2ZShwcm94eSwgX3Jlc291cmNlU2V0KTsnIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFT2JqZWN0IGVSZXNvbHZlUHJveHkoSW50ZXJuYWxFT2JqZWN0IHByb3h5KTsKKworfSAvLyBQZXJzcGVjdGl2ZUxhenlSZXNvbHZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvUGVyc3BlY3RpdmVNb2RlbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvUGVyc3BlY3RpdmVNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkM2Y3M2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9QZXJzcGVjdGl2ZU1vZGVsLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yc3sgIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGVyc3BlY3RpdmUgTW9kZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZU1vZGVsI2dldFBhY2thZ2VzIDxlbT5QYWNrYWdlczwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbFBhY2thZ2UjZ2V0UGVyc3BlY3RpdmVNb2RlbCgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBQZXJzcGVjdGl2ZU1vZGVsIGV4dGVuZHMgRU9iamVjdCB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFja2FnZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUGFja2FnZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYWNrYWdlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhY2thZ2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbFBhY2thZ2UjZ2V0UGVyc3BlY3RpdmVNb2RlbF9QYWNrYWdlcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxQZXJzcGVjdGl2ZVBhY2thZ2U+IGdldFBhY2thZ2VzKCk7CisKK30gLy8gUGVyc3BlY3RpdmVNb2RlbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvUGVyc3BlY3RpdmVPcmdhbml6YXRpb24uamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL1BlcnNwZWN0aXZlT3JnYW5pemF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc2Mzg0YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL1BlcnNwZWN0aXZlT3JnYW5pemF0aW9uLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yc3sgIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0Lm9yZ2FuaXphdGlvbmRzbC5Pcmdhbml6YXRpb247CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBlcnNwZWN0aXZlIE9yZ2FuaXphdGlvbjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlT3JnYW5pemF0aW9uI2dldFJlZiA8ZW0+UmVmPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsUGFja2FnZSNnZXRQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbigpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbiBleHRlbmRzIFBlcnNwZWN0aXZlVmlldyB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVmPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWY8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVmPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRSZWYoT3JnYW5pemF0aW9uKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbFBhY2thZ2UjZ2V0UGVyc3BlY3RpdmVPcmdhbml6YXRpb25fUmVmKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJT3JnYW5pemF0aW9uIGdldFJlZigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbiNnZXRSZWYgPGVtPlJlZjwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVmPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRSZWYoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFJlZihPcmdhbml6YXRpb24gdmFsdWUpOworCit9IC8vIFBlcnNwZWN0aXZlT3JnYW5pemF0aW9uCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9QZXJzcGVjdGl2ZVBhY2thZ2UuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL1BlcnNwZWN0aXZlUGFja2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmOGIxMDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9QZXJzcGVjdGl2ZVBhY2thZ2UuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmNvbW1vbi50eXBlcy5MUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGVyc3BlY3RpdmUgUGFja2FnZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUGFja2FnZSNnZXRQZXJzcGVjdGl2ZXMgPGVtPlBlcnNwZWN0aXZlczwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbFBhY2thZ2UjZ2V0UGVyc3BlY3RpdmVQYWNrYWdlKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFBlcnNwZWN0aXZlUGFja2FnZSBleHRlbmRzIExQYWNrYWdlIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZXJzcGVjdGl2ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBlcnNwZWN0aXZlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcnNwZWN0aXZlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2xQYWNrYWdlI2dldFBlcnNwZWN0aXZlUGFja2FnZV9QZXJzcGVjdGl2ZXMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUxpc3Q8UGVyc3BlY3RpdmU+IGdldFBlcnNwZWN0aXZlcygpOworCit9IC8vIFBlcnNwZWN0aXZlUGFja2FnZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvUGVyc3BlY3RpdmVQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9QZXJzcGVjdGl2ZVBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjM0NmVhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvUGVyc3BlY3RpdmVQYXJ0LmphdmEKQEAgLTAsMCArMSwxNjggQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnN7ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBlcnNwZWN0aXZlIFBhcnQ8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVBhcnQjaXNEZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYXJ0I2dldERlc2NyaXB0aW9uVmFsdWUgPGVtPkRlc2NyaXB0aW9uIFZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUGFydCNnZXRJY29uVVJJIDxlbT5JY29uIFVSSTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVBhcnQjZ2V0VmlldyA8ZW0+VmlldzwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVBhcnQjaXNJc0Nsb3NhYmxlIDxlbT5JcyBDbG9zYWJsZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbFBhY2thZ2UjZ2V0UGVyc3BlY3RpdmVQYXJ0KCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFBlcnNwZWN0aXZlUGFydCBleHRlbmRzIFBlcnNwZWN0aXZlRWxlbWVudCB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXREZXNjcmlwdGlvbihib29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbFBhY2thZ2UjZ2V0UGVyc3BlY3RpdmVQYXJ0X0Rlc2NyaXB0aW9uKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc0Rlc2NyaXB0aW9uKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUGFydCNpc0Rlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzRGVzY3JpcHRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldERlc2NyaXB0aW9uKGJvb2xlYW4gdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb24gVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXREZXNjcmlwdGlvblZhbHVlKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2xQYWNrYWdlI2dldFBlcnNwZWN0aXZlUGFydF9EZXNjcmlwdGlvblZhbHVlKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldERlc2NyaXB0aW9uVmFsdWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYXJ0I2dldERlc2NyaXB0aW9uVmFsdWUgPGVtPkRlc2NyaXB0aW9uIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbiBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0RGVzY3JpcHRpb25WYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RGVzY3JpcHRpb25WYWx1ZShTdHJpbmcgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWNvbiBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkljb24gVVJJPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkljb24gVVJJPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRJY29uVVJJKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2xQYWNrYWdlI2dldFBlcnNwZWN0aXZlUGFydF9JY29uVVJJKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldEljb25VUkkoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYXJ0I2dldEljb25VUkkgPGVtPkljb24gVVJJPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JY29uIFVSSTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0SWNvblVSSSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0SWNvblVSSShTdHJpbmcgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmlldzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmlldzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WaWV3PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRWaWV3KFBlcnNwZWN0aXZlVmlldykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2xQYWNrYWdlI2dldFBlcnNwZWN0aXZlUGFydF9WaWV3KCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCVBlcnNwZWN0aXZlVmlldyBnZXRWaWV3KCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUGFydCNnZXRWaWV3IDxlbT5WaWV3PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WaWV3PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRWaWV3KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRWaWV3KFBlcnNwZWN0aXZlVmlldyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBDbG9zYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SXMgQ2xvc2FibGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgQ2xvc2FibGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldElzQ2xvc2FibGUoYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2xQYWNrYWdlI2dldFBlcnNwZWN0aXZlUGFydF9Jc0Nsb3NhYmxlKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc0lzQ2xvc2FibGUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYXJ0I2lzSXNDbG9zYWJsZSA8ZW0+SXMgQ2xvc2FibGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIENsb3NhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc0lzQ2xvc2FibGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldElzQ2xvc2FibGUoYm9vbGVhbiB2YWx1ZSk7CisKK30gLy8gUGVyc3BlY3RpdmVQYXJ0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9QZXJzcGVjdGl2ZVBhcnRTdGFjay5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvUGVyc3BlY3RpdmVQYXJ0U3RhY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjZjYjBhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvUGVyc3BlY3RpdmVQYXJ0U3RhY2suamF2YQpAQCAtMCwwICsxLDYwIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZTsKKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QZXJzcGVjdGl2ZSBQYXJ0IFN0YWNrPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYXJ0U3RhY2sjZ2V0U2VsZWN0ZWRFbGVtZW50IDxlbT5TZWxlY3RlZCBFbGVtZW50PC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsUGFja2FnZSNnZXRQZXJzcGVjdGl2ZVBhcnRTdGFjaygpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBQZXJzcGVjdGl2ZVBhcnRTdGFjayBleHRlbmRzIFBlcnNwZWN0aXZlRWxlbWVudCB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VsZWN0ZWQgRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VsZWN0ZWQgRWxlbWVudDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZWxlY3RlZCBFbGVtZW50PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRTZWxlY3RlZEVsZW1lbnQoUGVyc3BlY3RpdmVQYXJ0KQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbFBhY2thZ2UjZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tfU2VsZWN0ZWRFbGVtZW50KCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUGVyc3BlY3RpdmVQYXJ0IGdldFNlbGVjdGVkRWxlbWVudCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVBhcnRTdGFjayNnZXRTZWxlY3RlZEVsZW1lbnQgPGVtPlNlbGVjdGVkIEVsZW1lbnQ8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlbGVjdGVkIEVsZW1lbnQ8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFNlbGVjdGVkRWxlbWVudCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0U2VsZWN0ZWRFbGVtZW50KFBlcnNwZWN0aXZlUGFydCB2YWx1ZSk7CisKK30gLy8gUGVyc3BlY3RpdmVQYXJ0U3RhY2sKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL1BlcnNwZWN0aXZlUmVwb3J0LmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9QZXJzcGVjdGl2ZVJlcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMzJjM2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9QZXJzcGVjdGl2ZVJlcG9ydC5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnN7ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0OworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bVR5cGVSZWZlcmVuY2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBlcnNwZWN0aXZlIFJlcG9ydDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUmVwb3J0I2dldFJlZiA8ZW0+UmVmPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUmVwb3J0I2dldFJlZlR5cGVKdm0gPGVtPlJlZiBUeXBlIEp2bTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbFBhY2thZ2UjZ2V0UGVyc3BlY3RpdmVSZXBvcnQoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUGVyc3BlY3RpdmVSZXBvcnQgZXh0ZW5kcyBQZXJzcGVjdGl2ZVZpZXcgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZjwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVmPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlZjwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0UmVmKFJlcG9ydCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2xQYWNrYWdlI2dldFBlcnNwZWN0aXZlUmVwb3J0X1JlZigpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCVJlcG9ydCBnZXRSZWYoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVSZXBvcnQjZ2V0UmVmIDxlbT5SZWY8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlZjwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0UmVmKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRSZWYoUmVwb3J0IHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZiBUeXBlIEp2bTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVmIFR5cGUgSnZtPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlZiBUeXBlIEp2bTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0UmVmVHlwZUp2bShKdm1UeXBlUmVmZXJlbmNlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbFBhY2thZ2UjZ2V0UGVyc3BlY3RpdmVSZXBvcnRfUmVmVHlwZUp2bSgpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlKdm1UeXBlUmVmZXJlbmNlIGdldFJlZlR5cGVKdm0oKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVSZXBvcnQjZ2V0UmVmVHlwZUp2bSA8ZW0+UmVmIFR5cGUgSnZtPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWYgVHlwZSBKdm08L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFJlZlR5cGVKdm0oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFJlZlR5cGVKdm0oSnZtVHlwZVJlZmVyZW5jZSB2YWx1ZSk7CisKK30gLy8gUGVyc3BlY3RpdmVSZXBvcnQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFlNTc0ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lci5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnN7ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBlcnNwZWN0aXZlIFNhc2ggQ29udGFpbmVyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyI2dldE9yaWVudGF0aW9uIDxlbT5PcmllbnRhdGlvbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVNhc2hDb250YWluZXIjZ2V0U2VsZWN0ZWRFbGVtZW50IDxlbT5TZWxlY3RlZCBFbGVtZW50PC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsUGFja2FnZSNnZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyIGV4dGVuZHMgUGVyc3BlY3RpdmVFbGVtZW50IHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcmllbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuU2FzaE9yaWVudGF0aW9ufS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9yaWVudGF0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9yaWVudGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuU2FzaE9yaWVudGF0aW9uCisJICogQHNlZSAjc2V0T3JpZW50YXRpb24oU2FzaE9yaWVudGF0aW9uKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbFBhY2thZ2UjZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX09yaWVudGF0aW9uKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU2FzaE9yaWVudGF0aW9uIGdldE9yaWVudGF0aW9uKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlU2FzaENvbnRhaW5lciNnZXRPcmllbnRhdGlvbiA8ZW0+T3JpZW50YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9yaWVudGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuU2FzaE9yaWVudGF0aW9uCisJICogQHNlZSAjZ2V0T3JpZW50YXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE9yaWVudGF0aW9uKFNhc2hPcmllbnRhdGlvbiB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZWxlY3RlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZWxlY3RlZCBFbGVtZW50PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlbGVjdGVkIEVsZW1lbnQ8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFNlbGVjdGVkRWxlbWVudChQZXJzcGVjdGl2ZUVsZW1lbnQpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsUGFja2FnZSNnZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfU2VsZWN0ZWRFbGVtZW50KCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUGVyc3BlY3RpdmVFbGVtZW50IGdldFNlbGVjdGVkRWxlbWVudCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVNhc2hDb250YWluZXIjZ2V0U2VsZWN0ZWRFbGVtZW50IDxlbT5TZWxlY3RlZCBFbGVtZW50PC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZWxlY3RlZCBFbGVtZW50PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRTZWxlY3RlZEVsZW1lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFNlbGVjdGVkRWxlbWVudChQZXJzcGVjdGl2ZUVsZW1lbnQgdmFsdWUpOworCit9IC8vIFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvUGVyc3BlY3RpdmVTZWxlY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL1BlcnNwZWN0aXZlU2VsZWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlNzI0ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL1BlcnNwZWN0aXZlU2VsZWN0aW9uLmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yc3sgIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnRhYmxlLlRhYmxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bVR5cGVSZWZlcmVuY2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBlcnNwZWN0aXZlIFNlbGVjdGlvbjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlU2VsZWN0aW9uI2dldFJlZiA8ZW0+UmVmPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlU2VsZWN0aW9uI2dldFJlZlR5cGVKdm0gPGVtPlJlZiBUeXBlIEp2bTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbFBhY2thZ2UjZ2V0UGVyc3BlY3RpdmVTZWxlY3Rpb24oKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUGVyc3BlY3RpdmVTZWxlY3Rpb24gZXh0ZW5kcyBQZXJzcGVjdGl2ZVZpZXcgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZjwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVmPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlZjwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0UmVmKFRhYmxlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbFBhY2thZ2UjZ2V0UGVyc3BlY3RpdmVTZWxlY3Rpb25fUmVmKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJVGFibGUgZ2V0UmVmKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlU2VsZWN0aW9uI2dldFJlZiA8ZW0+UmVmPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWY8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFJlZigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UmVmKFRhYmxlIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZiBUeXBlIEp2bTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVmIFR5cGUgSnZtPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlZiBUeXBlIEp2bTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0UmVmVHlwZUp2bShKdm1UeXBlUmVmZXJlbmNlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbFBhY2thZ2UjZ2V0UGVyc3BlY3RpdmVTZWxlY3Rpb25fUmVmVHlwZUp2bSgpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlKdm1UeXBlUmVmZXJlbmNlIGdldFJlZlR5cGVKdm0oKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVTZWxlY3Rpb24jZ2V0UmVmVHlwZUp2bSA8ZW0+UmVmIFR5cGUgSnZtPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWYgVHlwZSBKdm08L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFJlZlR5cGVKdm0oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFJlZlR5cGVKdm0oSnZtVHlwZVJlZmVyZW5jZSB2YWx1ZSk7CisKK30gLy8gUGVyc3BlY3RpdmVTZWxlY3Rpb24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL1BlcnNwZWN0aXZlVGFibGUuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL1BlcnNwZWN0aXZlVGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmZjNDM0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvUGVyc3BlY3RpdmVUYWJsZS5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnN7ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC50YWJsZS5UYWJsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy5Kdm1UeXBlUmVmZXJlbmNlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QZXJzcGVjdGl2ZSBUYWJsZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlVGFibGUjZ2V0UmVmIDxlbT5SZWY8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVUYWJsZSNnZXRSZWZUeXBlSnZtIDxlbT5SZWYgVHlwZSBKdm08L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2xQYWNrYWdlI2dldFBlcnNwZWN0aXZlVGFibGUoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUGVyc3BlY3RpdmVUYWJsZSBleHRlbmRzIFBlcnNwZWN0aXZlVmlldyB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVmPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWY8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVmPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRSZWYoVGFibGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsUGFja2FnZSNnZXRQZXJzcGVjdGl2ZVRhYmxlX1JlZigpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCVRhYmxlIGdldFJlZigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVRhYmxlI2dldFJlZiA8ZW0+UmVmPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWY8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFJlZigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UmVmKFRhYmxlIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZiBUeXBlIEp2bTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVmIFR5cGUgSnZtPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlZiBUeXBlIEp2bTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0UmVmVHlwZUp2bShKdm1UeXBlUmVmZXJlbmNlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbFBhY2thZ2UjZ2V0UGVyc3BlY3RpdmVUYWJsZV9SZWZUeXBlSnZtKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCUp2bVR5cGVSZWZlcmVuY2UgZ2V0UmVmVHlwZUp2bSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVRhYmxlI2dldFJlZlR5cGVKdm0gPGVtPlJlZiBUeXBlIEp2bTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVmIFR5cGUgSnZtPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRSZWZUeXBlSnZtKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRSZWZUeXBlSnZtKEp2bVR5cGVSZWZlcmVuY2UgdmFsdWUpOworCit9IC8vIFBlcnNwZWN0aXZlVGFibGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL1BlcnNwZWN0aXZlVG9wb2xvZ3kuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL1BlcnNwZWN0aXZlVG9wb2xvZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDI5NzUxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvUGVyc3BlY3RpdmVUb3BvbG9neS5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnN7ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC50b3BvbG9neWRzbC5Ub3BvbG9neTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy5Kdm1UeXBlUmVmZXJlbmNlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QZXJzcGVjdGl2ZSBUb3BvbG9neTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlVG9wb2xvZ3kjZ2V0UmVmIDxlbT5SZWY8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVUb3BvbG9neSNnZXRSZWZUeXBlSnZtIDxlbT5SZWYgVHlwZSBKdm08L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2xQYWNrYWdlI2dldFBlcnNwZWN0aXZlVG9wb2xvZ3koKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUGVyc3BlY3RpdmVUb3BvbG9neSBleHRlbmRzIFBlcnNwZWN0aXZlVmlldyB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVmPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWY8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVmPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRSZWYoVG9wb2xvZ3kpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsUGFja2FnZSNnZXRQZXJzcGVjdGl2ZVRvcG9sb2d5X1JlZigpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCVRvcG9sb2d5IGdldFJlZigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVRvcG9sb2d5I2dldFJlZiA8ZW0+UmVmPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWY8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFJlZigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UmVmKFRvcG9sb2d5IHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZiBUeXBlIEp2bTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVmIFR5cGUgSnZtPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlZiBUeXBlIEp2bTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0UmVmVHlwZUp2bShKdm1UeXBlUmVmZXJlbmNlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbFBhY2thZ2UjZ2V0UGVyc3BlY3RpdmVUb3BvbG9neV9SZWZUeXBlSnZtKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCUp2bVR5cGVSZWZlcmVuY2UgZ2V0UmVmVHlwZUp2bSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVRvcG9sb2d5I2dldFJlZlR5cGVKdm0gPGVtPlJlZiBUeXBlIEp2bTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVmIFR5cGUgSnZtPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRSZWZUeXBlSnZtKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRSZWZUeXBlSnZtKEp2bVR5cGVSZWZlcmVuY2UgdmFsdWUpOworCit9IC8vIFBlcnNwZWN0aXZlVG9wb2xvZ3kKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL1BlcnNwZWN0aXZlVmlldy5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvUGVyc3BlY3RpdmVWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUxNzA1YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL1BlcnNwZWN0aXZlVmlldy5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnN7ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBlcnNwZWN0aXZlIFZpZXc8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbFBhY2thZ2UjZ2V0UGVyc3BlY3RpdmVWaWV3KCkKKyAqIEBtb2RlbCBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFBlcnNwZWN0aXZlVmlldyBleHRlbmRzIFBlcnNwZWN0aXZlTGF6eVJlc29sdmVyIHsKK30gLy8gUGVyc3BlY3RpdmVWaWV3CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9TYXNoT3JpZW50YXRpb24uamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL1Nhc2hPcmllbnRhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNjgwYTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9TYXNoT3JpZW50YXRpb24uamF2YQpAQCAtMCwwICsxLDIxOCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yc3sgIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5TYXNoIE9yaWVudGF0aW9uPC9iPjwvZW0+JywKKyAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2xQYWNrYWdlI2dldFNhc2hPcmllbnRhdGlvbigpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGVudW0gU2FzaE9yaWVudGF0aW9uIGltcGxlbWVudHMgRW51bWVyYXRvciB7CisJLyoqCisJICogVGhlICc8ZW0+PGI+SE9SSVpPTlRBTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNIT1JJWk9OVEFMX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJSE9SSVpPTlRBTCgwLCAiSE9SSVpPTlRBTCIsICJob3Jpem9udGFsIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5WRVJUSUNBTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNWRVJUSUNBTF9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVZFUlRJQ0FMKDAsICJWRVJUSUNBTCIsICJ2ZXJ0aWNhbCIpOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+SE9SSVpPTlRBTDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SE9SSVpPTlRBTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNIT1JJWk9OVEFMCisJICogQG1vZGVsIGxpdGVyYWw9Imhvcml6b250YWwiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSE9SSVpPTlRBTF9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5WRVJUSUNBTDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+VkVSVElDQUw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjVkVSVElDQUwKKwkgKiBAbW9kZWwgbGl0ZXJhbD0idmVydGljYWwiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSVElDQUxfVkFMVUUgPSAwOworCisJLyoqCisJICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlNhc2ggT3JpZW50YXRpb248L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFNhc2hPcmllbnRhdGlvbltdIFZBTFVFU19BUlJBWSA9CisJCW5ldyBTYXNoT3JpZW50YXRpb25bXSB7CisJCQlIT1JJWk9OVEFMLAorCQkJVkVSVElDQUwsCisJCX07CisKKwkvKioKKwkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+U2FzaCBPcmllbnRhdGlvbjwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFNhc2hPcmllbnRhdGlvbj4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5TYXNoIE9yaWVudGF0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgU2FzaE9yaWVudGF0aW9uIGdldChTdHJpbmcgbGl0ZXJhbCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgeworCQkJU2FzaE9yaWVudGF0aW9uIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+U2FzaCBPcmllbnRhdGlvbjwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFNhc2hPcmllbnRhdGlvbiBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCVNhc2hPcmllbnRhdGlvbiByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+U2FzaCBPcmllbnRhdGlvbjwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFNhc2hPcmllbnRhdGlvbiBnZXQoaW50IHZhbHVlKSB7CisJCXN3aXRjaCAodmFsdWUpIHsKKwkJCWNhc2UgSE9SSVpPTlRBTF9WQUxVRTogcmV0dXJuIEhPUklaT05UQUw7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKKworCS8qKgorCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIFNhc2hPcmllbnRhdGlvbihpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRWYWx1ZSgpIHsKKwkgIHJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJICByZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKSB7CisJICByZXR1cm4gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBsaXRlcmFsOworCX0KKwkKK30gLy9TYXNoT3JpZW50YXRpb24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2ltcGwvUGVyc3BlY3RpdmVCUE1OSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvaW1wbC9QZXJzcGVjdGl2ZUJQTU5JbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcwZGI2NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2ltcGwvUGVyc3BlY3RpdmVCUE1OSW1wbC5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnN7ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUJQTU47CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbFBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QZXJzcGVjdGl2ZSBCUE1OPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgUGVyc3BlY3RpdmVCUE1OSW1wbCBleHRlbmRzIFBlcnNwZWN0aXZlTGF6eVJlc29sdmVySW1wbCBpbXBsZW1lbnRzIFBlcnNwZWN0aXZlQlBNTiB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFBlcnNwZWN0aXZlQlBNTkltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuTGl0ZXJhbHMuUEVSU1BFQ1RJVkVfQlBNTjsKKwl9CisKK30gLy9QZXJzcGVjdGl2ZUJQTU5JbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9pbXBsL1BlcnNwZWN0aXZlQmFzZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2ltcGwvUGVyc3BlY3RpdmVCYXNlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZjM5OGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9pbXBsL1BlcnNwZWN0aXZlQmFzZUltcGwuamF2YQpAQCAtMCwwICsxLDE3MyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yc3sgIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVCYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2xQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGVyc3BlY3RpdmUgQmFzZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlQmFzZUltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFBlcnNwZWN0aXZlQmFzZUltcGwgZXh0ZW5kcyBQZXJzcGVjdGl2ZUxhenlSZXNvbHZlckltcGwgaW1wbGVtZW50cyBQZXJzcGVjdGl2ZUJhc2UgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXROYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFBlcnNwZWN0aXZlQmFzZUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuTGl0ZXJhbHMuUEVSU1BFQ1RJVkVfQkFTRTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKKwkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOworCQluYW1lID0gbmV3TmFtZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX0JBU0VfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9CQVNFX19OQU1FOgorCQkJCXJldHVybiBnZXROYW1lKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX0JBU0VfX05BTUU6CisJCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfQkFTRV9fTkFNRToKKwkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfQkFTRV9fTkFNRToKKwkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7CisJCXJlc3VsdC5hcHBlbmQobmFtZSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL1BlcnNwZWN0aXZlQmFzZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2ltcGwvUGVyc3BlY3RpdmVDaGFydEltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2ltcGwvUGVyc3BlY3RpdmVDaGFydEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmRjMDliCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvaW1wbC9QZXJzcGVjdGl2ZUNoYXJ0SW1wbC5qYXZhCkBAIC0wLDAgKzEsMjczIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUNoYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2xQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bVR5cGVSZWZlcmVuY2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QZXJzcGVjdGl2ZSBDaGFydDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlQ2hhcnRJbXBsI2dldFJlZiA8ZW0+UmVmPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVDaGFydEltcGwjZ2V0UmVmVHlwZUp2bSA8ZW0+UmVmIFR5cGUgSnZtPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgUGVyc3BlY3RpdmVDaGFydEltcGwgZXh0ZW5kcyBQZXJzcGVjdGl2ZUxhenlSZXNvbHZlckltcGwgaW1wbGVtZW50cyBQZXJzcGVjdGl2ZUNoYXJ0IHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWYoKSA8ZW0+UmVmPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSZWYoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBDaGFydCByZWY7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZUeXBlSnZtKCkgPGVtPlJlZiBUeXBlIEp2bTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmVmVHlwZUp2bSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEp2bVR5cGVSZWZlcmVuY2UgcmVmVHlwZUp2bTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBQZXJzcGVjdGl2ZUNoYXJ0SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5MaXRlcmFscy5QRVJTUEVDVElWRV9DSEFSVDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ2hhcnQgZ2V0UmVmKCkgeworCQlpZiAocmVmICE9IG51bGwgJiYgcmVmLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRSZWYgPSAoSW50ZXJuYWxFT2JqZWN0KXJlZjsKKwkJCXJlZiA9IChDaGFydCllUmVzb2x2ZVByb3h5KG9sZFJlZik7CisJCQlpZiAocmVmICE9IG9sZFJlZikgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9DSEFSVF9fUkVGLCBvbGRSZWYsIHJlZikpOworCQkJfQorCQl9CisJCXJldHVybiByZWY7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENoYXJ0IGJhc2ljR2V0UmVmKCkgeworCQlyZXR1cm4gcmVmOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlZihDaGFydCBuZXdSZWYpIHsKKwkJQ2hhcnQgb2xkUmVmID0gcmVmOworCQlyZWYgPSBuZXdSZWY7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9DSEFSVF9fUkVGLCBvbGRSZWYsIHJlZikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBKdm1UeXBlUmVmZXJlbmNlIGdldFJlZlR5cGVKdm0oKSB7CisJCWlmIChyZWZUeXBlSnZtICE9IG51bGwgJiYgcmVmVHlwZUp2bS5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkUmVmVHlwZUp2bSA9IChJbnRlcm5hbEVPYmplY3QpcmVmVHlwZUp2bTsKKwkJCXJlZlR5cGVKdm0gPSAoSnZtVHlwZVJlZmVyZW5jZSllUmVzb2x2ZVByb3h5KG9sZFJlZlR5cGVKdm0pOworCQkJaWYgKHJlZlR5cGVKdm0gIT0gb2xkUmVmVHlwZUp2bSkgeworCQkJCUludGVybmFsRU9iamVjdCBuZXdSZWZUeXBlSnZtID0gKEludGVybmFsRU9iamVjdClyZWZUeXBlSnZtOworCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGRSZWZUeXBlSnZtLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfQ0hBUlRfX1JFRl9UWVBFX0pWTSwgbnVsbCwgbnVsbCk7CisJCQkJaWYgKG5ld1JlZlR5cGVKdm0uZUludGVybmFsQ29udGFpbmVyKCkgPT0gbnVsbCkgeworCQkJCQltc2dzID0gbmV3UmVmVHlwZUp2bS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX0NIQVJUX19SRUZfVFlQRV9KVk0sIG51bGwsIG1zZ3MpOworCQkJCX0KKwkJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX0NIQVJUX19SRUZfVFlQRV9KVk0sIG9sZFJlZlR5cGVKdm0sIHJlZlR5cGVKdm0pKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVmVHlwZUp2bTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSnZtVHlwZVJlZmVyZW5jZSBiYXNpY0dldFJlZlR5cGVKdm0oKSB7CisJCXJldHVybiByZWZUeXBlSnZtOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFJlZlR5cGVKdm0oSnZtVHlwZVJlZmVyZW5jZSBuZXdSZWZUeXBlSnZtLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCUp2bVR5cGVSZWZlcmVuY2Ugb2xkUmVmVHlwZUp2bSA9IHJlZlR5cGVKdm07CisJCXJlZlR5cGVKdm0gPSBuZXdSZWZUeXBlSnZtOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfQ0hBUlRfX1JFRl9UWVBFX0pWTSwgb2xkUmVmVHlwZUp2bSwgbmV3UmVmVHlwZUp2bSk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UmVmVHlwZUp2bShKdm1UeXBlUmVmZXJlbmNlIG5ld1JlZlR5cGVKdm0pIHsKKwkJaWYgKG5ld1JlZlR5cGVKdm0gIT0gcmVmVHlwZUp2bSkgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAocmVmVHlwZUp2bSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyZWZUeXBlSnZtKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX0NIQVJUX19SRUZfVFlQRV9KVk0sIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld1JlZlR5cGVKdm0gIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UmVmVHlwZUp2bSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9DSEFSVF9fUkVGX1RZUEVfSlZNLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldFJlZlR5cGVKdm0obmV3UmVmVHlwZUp2bSwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfQ0hBUlRfX1JFRl9UWVBFX0pWTSwgbmV3UmVmVHlwZUp2bSwgbmV3UmVmVHlwZUp2bSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX0NIQVJUX19SRUZfVFlQRV9KVk06CisJCQkJcmV0dXJuIGJhc2ljU2V0UmVmVHlwZUp2bShudWxsLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfQ0hBUlRfX1JFRjoKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFJlZigpOworCQkJCXJldHVybiBiYXNpY0dldFJlZigpOworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfQ0hBUlRfX1JFRl9UWVBFX0pWTToKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFJlZlR5cGVKdm0oKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRSZWZUeXBlSnZtKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX0NIQVJUX19SRUY6CisJCQkJc2V0UmVmKChDaGFydCluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfQ0hBUlRfX1JFRl9UWVBFX0pWTToKKwkJCQlzZXRSZWZUeXBlSnZtKChKdm1UeXBlUmVmZXJlbmNlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfQ0hBUlRfX1JFRjoKKwkJCQlzZXRSZWYoKENoYXJ0KW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX0NIQVJUX19SRUZfVFlQRV9KVk06CisJCQkJc2V0UmVmVHlwZUp2bSgoSnZtVHlwZVJlZmVyZW5jZSludWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX0NIQVJUX19SRUY6CisJCQkJcmV0dXJuIHJlZiAhPSBudWxsOworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfQ0hBUlRfX1JFRl9UWVBFX0pWTToKKwkJCQlyZXR1cm4gcmVmVHlwZUp2bSAhPSBudWxsOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKK30gLy9QZXJzcGVjdGl2ZUNoYXJ0SW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvaW1wbC9QZXJzcGVjdGl2ZURpYWxvZ0ltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2ltcGwvUGVyc3BlY3RpdmVEaWFsb2dJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAxYjY5MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2ltcGwvUGVyc3BlY3RpdmVEaWFsb2dJbXBsLmphdmEKQEAgLTAsMCArMSwyNzMgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnN7ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGlhbG9nZHNsLkRpYWxvZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbFBhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtVHlwZVJlZmVyZW5jZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBlcnNwZWN0aXZlIERpYWxvZzwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlRGlhbG9nSW1wbCNnZXRSZWYgPGVtPlJlZjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlRGlhbG9nSW1wbCNnZXRSZWZUeXBlSnZtIDxlbT5SZWYgVHlwZSBKdm08L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBQZXJzcGVjdGl2ZURpYWxvZ0ltcGwgZXh0ZW5kcyBQZXJzcGVjdGl2ZUxhenlSZXNvbHZlckltcGwgaW1wbGVtZW50cyBQZXJzcGVjdGl2ZURpYWxvZyB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmKCkgPGVtPlJlZjwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmVmKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRGlhbG9nIHJlZjsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZlR5cGVKdm0oKSA8ZW0+UmVmIFR5cGUgSnZtPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSZWZUeXBlSnZtKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSnZtVHlwZVJlZmVyZW5jZSByZWZUeXBlSnZtOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFBlcnNwZWN0aXZlRGlhbG9nSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5MaXRlcmFscy5QRVJTUEVDVElWRV9ESUFMT0c7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERpYWxvZyBnZXRSZWYoKSB7CisJCWlmIChyZWYgIT0gbnVsbCAmJiByZWYuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFJlZiA9IChJbnRlcm5hbEVPYmplY3QpcmVmOworCQkJcmVmID0gKERpYWxvZyllUmVzb2x2ZVByb3h5KG9sZFJlZik7CisJCQlpZiAocmVmICE9IG9sZFJlZikgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9ESUFMT0dfX1JFRiwgb2xkUmVmLCByZWYpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVmOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEaWFsb2cgYmFzaWNHZXRSZWYoKSB7CisJCXJldHVybiByZWY7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UmVmKERpYWxvZyBuZXdSZWYpIHsKKwkJRGlhbG9nIG9sZFJlZiA9IHJlZjsKKwkJcmVmID0gbmV3UmVmOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfRElBTE9HX19SRUYsIG9sZFJlZiwgcmVmKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEp2bVR5cGVSZWZlcmVuY2UgZ2V0UmVmVHlwZUp2bSgpIHsKKwkJaWYgKHJlZlR5cGVKdm0gIT0gbnVsbCAmJiByZWZUeXBlSnZtLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRSZWZUeXBlSnZtID0gKEludGVybmFsRU9iamVjdClyZWZUeXBlSnZtOworCQkJcmVmVHlwZUp2bSA9IChKdm1UeXBlUmVmZXJlbmNlKWVSZXNvbHZlUHJveHkob2xkUmVmVHlwZUp2bSk7CisJCQlpZiAocmVmVHlwZUp2bSAhPSBvbGRSZWZUeXBlSnZtKSB7CisJCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1JlZlR5cGVKdm0gPSAoSW50ZXJuYWxFT2JqZWN0KXJlZlR5cGVKdm07CisJCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG9sZFJlZlR5cGVKdm0uZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9ESUFMT0dfX1JFRl9UWVBFX0pWTSwgbnVsbCwgbnVsbCk7CisJCQkJaWYgKG5ld1JlZlR5cGVKdm0uZUludGVybmFsQ29udGFpbmVyKCkgPT0gbnVsbCkgeworCQkJCQltc2dzID0gbmV3UmVmVHlwZUp2bS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX0RJQUxPR19fUkVGX1RZUEVfSlZNLCBudWxsLCBtc2dzKTsKKwkJCQl9CisJCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9ESUFMT0dfX1JFRl9UWVBFX0pWTSwgb2xkUmVmVHlwZUp2bSwgcmVmVHlwZUp2bSkpOworCQkJfQorCQl9CisJCXJldHVybiByZWZUeXBlSnZtOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBKdm1UeXBlUmVmZXJlbmNlIGJhc2ljR2V0UmVmVHlwZUp2bSgpIHsKKwkJcmV0dXJuIHJlZlR5cGVKdm07CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmVmVHlwZUp2bShKdm1UeXBlUmVmZXJlbmNlIG5ld1JlZlR5cGVKdm0sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJSnZtVHlwZVJlZmVyZW5jZSBvbGRSZWZUeXBlSnZtID0gcmVmVHlwZUp2bTsKKwkJcmVmVHlwZUp2bSA9IG5ld1JlZlR5cGVKdm07CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9ESUFMT0dfX1JFRl9UWVBFX0pWTSwgb2xkUmVmVHlwZUp2bSwgbmV3UmVmVHlwZUp2bSk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UmVmVHlwZUp2bShKdm1UeXBlUmVmZXJlbmNlIG5ld1JlZlR5cGVKdm0pIHsKKwkJaWYgKG5ld1JlZlR5cGVKdm0gIT0gcmVmVHlwZUp2bSkgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAocmVmVHlwZUp2bSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyZWZUeXBlSnZtKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX0RJQUxPR19fUkVGX1RZUEVfSlZNLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdSZWZUeXBlSnZtICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1JlZlR5cGVKdm0pLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfRElBTE9HX19SRUZfVFlQRV9KVk0sIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0UmVmVHlwZUp2bShuZXdSZWZUeXBlSnZtLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9ESUFMT0dfX1JFRl9UWVBFX0pWTSwgbmV3UmVmVHlwZUp2bSwgbmV3UmVmVHlwZUp2bSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX0RJQUxPR19fUkVGX1RZUEVfSlZNOgorCQkJCXJldHVybiBiYXNpY1NldFJlZlR5cGVKdm0obnVsbCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX0RJQUxPR19fUkVGOgorCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0UmVmKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0UmVmKCk7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9ESUFMT0dfX1JFRl9UWVBFX0pWTToKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFJlZlR5cGVKdm0oKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRSZWZUeXBlSnZtKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX0RJQUxPR19fUkVGOgorCQkJCXNldFJlZigoRGlhbG9nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9ESUFMT0dfX1JFRl9UWVBFX0pWTToKKwkJCQlzZXRSZWZUeXBlSnZtKChKdm1UeXBlUmVmZXJlbmNlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfRElBTE9HX19SRUY6CisJCQkJc2V0UmVmKChEaWFsb2cpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfRElBTE9HX19SRUZfVFlQRV9KVk06CisJCQkJc2V0UmVmVHlwZUp2bSgoSnZtVHlwZVJlZmVyZW5jZSludWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX0RJQUxPR19fUkVGOgorCQkJCXJldHVybiByZWYgIT0gbnVsbDsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX0RJQUxPR19fUkVGX1RZUEVfSlZNOgorCQkJCXJldHVybiByZWZUeXBlSnZtICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworfSAvL1BlcnNwZWN0aXZlRGlhbG9nSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvaW1wbC9QZXJzcGVjdGl2ZURzbEZhY3RvcnlJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9pbXBsL1BlcnNwZWN0aXZlRHNsRmFjdG9yeUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTdkNjJhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvaW1wbC9QZXJzcGVjdGl2ZURzbEZhY3RvcnlJbXBsLmphdmEKQEAgLTAsMCArMSwzNjcgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnN7ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS4qOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFBlcnNwZWN0aXZlRHNsRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBQZXJzcGVjdGl2ZURzbEZhY3RvcnkgeworCS8qKgorCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFBlcnNwZWN0aXZlRHNsRmFjdG9yeSBpbml0KCkgeworCQl0cnkgeworCQkJUGVyc3BlY3RpdmVEc2xGYWN0b3J5IHRoZVBlcnNwZWN0aXZlRHNsRmFjdG9yeSA9IChQZXJzcGVjdGl2ZURzbEZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoUGVyc3BlY3RpdmVEc2xQYWNrYWdlLmVOU19VUkkpOworCQkJaWYgKHRoZVBlcnNwZWN0aXZlRHNsRmFjdG9yeSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHRoZVBlcnNwZWN0aXZlRHNsRmFjdG9yeTsKKwkJCX0KKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCX0KKwkJcmV0dXJuIG5ldyBQZXJzcGVjdGl2ZURzbEZhY3RvcnlJbXBsKCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUGVyc3BlY3RpdmVEc2xGYWN0b3J5SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgeworCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgeworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfTU9ERUw6IHJldHVybiBjcmVhdGVQZXJzcGVjdGl2ZU1vZGVsKCk7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9MQVpZX1JFU09MVkVSOiByZXR1cm4gY3JlYXRlUGVyc3BlY3RpdmVMYXp5UmVzb2x2ZXIoKTsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1BBQ0tBR0U6IHJldHVybiBjcmVhdGVQZXJzcGVjdGl2ZVBhY2thZ2UoKTsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX0JBU0U6IHJldHVybiBjcmVhdGVQZXJzcGVjdGl2ZUJhc2UoKTsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFOiByZXR1cm4gY3JlYXRlUGVyc3BlY3RpdmUoKTsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX0VMRU1FTlQ6IHJldHVybiBjcmVhdGVQZXJzcGVjdGl2ZUVsZW1lbnQoKTsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1NBU0hfQ09OVEFJTkVSOiByZXR1cm4gY3JlYXRlUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyKCk7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9QQVJUOiByZXR1cm4gY3JlYXRlUGVyc3BlY3RpdmVQYXJ0KCk7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9QQVJUX1NUQUNLOiByZXR1cm4gY3JlYXRlUGVyc3BlY3RpdmVQYXJ0U3RhY2soKTsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1NFTEVDVElPTjogcmV0dXJuIGNyZWF0ZVBlcnNwZWN0aXZlU2VsZWN0aW9uKCk7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9UQUJMRTogcmV0dXJuIGNyZWF0ZVBlcnNwZWN0aXZlVGFibGUoKTsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX0dSSUQ6IHJldHVybiBjcmVhdGVQZXJzcGVjdGl2ZUdyaWQoKTsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX0NIQVJUOiByZXR1cm4gY3JlYXRlUGVyc3BlY3RpdmVDaGFydCgpOworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfUkVQT1JUOiByZXR1cm4gY3JlYXRlUGVyc3BlY3RpdmVSZXBvcnQoKTsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX09SR0FOSVpBVElPTjogcmV0dXJuIGNyZWF0ZVBlcnNwZWN0aXZlT3JnYW5pemF0aW9uKCk7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9UT1BPTE9HWTogcmV0dXJuIGNyZWF0ZVBlcnNwZWN0aXZlVG9wb2xvZ3koKTsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX0RJQUxPRzogcmV0dXJuIGNyZWF0ZVBlcnNwZWN0aXZlRGlhbG9nKCk7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9CUE1OOiByZXR1cm4gY3JlYXRlUGVyc3BlY3RpdmVCUE1OKCk7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7CisJCX0KKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgeworCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgeworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuU0FTSF9PUklFTlRBVElPTjoKKwkJCQlyZXR1cm4gY3JlYXRlU2FzaE9yaWVudGF0aW9uRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5JTlRFUk5BTF9FT0JKRUNUOgorCQkJCXJldHVybiBjcmVhdGVJbnRlcm5hbEVPYmplY3RGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKKwkJCWRlZmF1bHQ6CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKKwkJfQorCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7CisJCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5TQVNIX09SSUVOVEFUSU9OOgorCQkJCXJldHVybiBjb252ZXJ0U2FzaE9yaWVudGF0aW9uVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLklOVEVSTkFMX0VPQkpFQ1Q6CisJCQkJcmV0dXJuIGNvbnZlcnRJbnRlcm5hbEVPYmplY3RUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOworCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFBlcnNwZWN0aXZlTW9kZWwgY3JlYXRlUGVyc3BlY3RpdmVNb2RlbCgpIHsKKwkJUGVyc3BlY3RpdmVNb2RlbEltcGwgcGVyc3BlY3RpdmVNb2RlbCA9IG5ldyBQZXJzcGVjdGl2ZU1vZGVsSW1wbCgpOworCQlyZXR1cm4gcGVyc3BlY3RpdmVNb2RlbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUGVyc3BlY3RpdmVMYXp5UmVzb2x2ZXIgY3JlYXRlUGVyc3BlY3RpdmVMYXp5UmVzb2x2ZXIoKSB7CisJCVBlcnNwZWN0aXZlTGF6eVJlc29sdmVySW1wbCBwZXJzcGVjdGl2ZUxhenlSZXNvbHZlciA9IG5ldyBQZXJzcGVjdGl2ZUxhenlSZXNvbHZlckltcGwoKTsKKwkJcmV0dXJuIHBlcnNwZWN0aXZlTGF6eVJlc29sdmVyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQZXJzcGVjdGl2ZVBhY2thZ2UgY3JlYXRlUGVyc3BlY3RpdmVQYWNrYWdlKCkgeworCQlQZXJzcGVjdGl2ZVBhY2thZ2VJbXBsIHBlcnNwZWN0aXZlUGFja2FnZSA9IG5ldyBQZXJzcGVjdGl2ZVBhY2thZ2VJbXBsKCk7CisJCXJldHVybiBwZXJzcGVjdGl2ZVBhY2thZ2U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFBlcnNwZWN0aXZlQmFzZSBjcmVhdGVQZXJzcGVjdGl2ZUJhc2UoKSB7CisJCVBlcnNwZWN0aXZlQmFzZUltcGwgcGVyc3BlY3RpdmVCYXNlID0gbmV3IFBlcnNwZWN0aXZlQmFzZUltcGwoKTsKKwkJcmV0dXJuIHBlcnNwZWN0aXZlQmFzZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUGVyc3BlY3RpdmUgY3JlYXRlUGVyc3BlY3RpdmUoKSB7CisJCVBlcnNwZWN0aXZlSW1wbCBwZXJzcGVjdGl2ZSA9IG5ldyBQZXJzcGVjdGl2ZUltcGwoKTsKKwkJcmV0dXJuIHBlcnNwZWN0aXZlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQZXJzcGVjdGl2ZUVsZW1lbnQgY3JlYXRlUGVyc3BlY3RpdmVFbGVtZW50KCkgeworCQlQZXJzcGVjdGl2ZUVsZW1lbnRJbXBsIHBlcnNwZWN0aXZlRWxlbWVudCA9IG5ldyBQZXJzcGVjdGl2ZUVsZW1lbnRJbXBsKCk7CisJCXJldHVybiBwZXJzcGVjdGl2ZUVsZW1lbnQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lciBjcmVhdGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIoKSB7CisJCVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckltcGwgcGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyID0gbmV3IFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckltcGwoKTsKKwkJcmV0dXJuIHBlcnNwZWN0aXZlU2FzaENvbnRhaW5lcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUGVyc3BlY3RpdmVQYXJ0IGNyZWF0ZVBlcnNwZWN0aXZlUGFydCgpIHsKKwkJUGVyc3BlY3RpdmVQYXJ0SW1wbCBwZXJzcGVjdGl2ZVBhcnQgPSBuZXcgUGVyc3BlY3RpdmVQYXJ0SW1wbCgpOworCQlyZXR1cm4gcGVyc3BlY3RpdmVQYXJ0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQZXJzcGVjdGl2ZVBhcnRTdGFjayBjcmVhdGVQZXJzcGVjdGl2ZVBhcnRTdGFjaygpIHsKKwkJUGVyc3BlY3RpdmVQYXJ0U3RhY2tJbXBsIHBlcnNwZWN0aXZlUGFydFN0YWNrID0gbmV3IFBlcnNwZWN0aXZlUGFydFN0YWNrSW1wbCgpOworCQlyZXR1cm4gcGVyc3BlY3RpdmVQYXJ0U3RhY2s7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFBlcnNwZWN0aXZlU2VsZWN0aW9uIGNyZWF0ZVBlcnNwZWN0aXZlU2VsZWN0aW9uKCkgeworCQlQZXJzcGVjdGl2ZVNlbGVjdGlvbkltcGwgcGVyc3BlY3RpdmVTZWxlY3Rpb24gPSBuZXcgUGVyc3BlY3RpdmVTZWxlY3Rpb25JbXBsKCk7CisJCXJldHVybiBwZXJzcGVjdGl2ZVNlbGVjdGlvbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUGVyc3BlY3RpdmVUYWJsZSBjcmVhdGVQZXJzcGVjdGl2ZVRhYmxlKCkgeworCQlQZXJzcGVjdGl2ZVRhYmxlSW1wbCBwZXJzcGVjdGl2ZVRhYmxlID0gbmV3IFBlcnNwZWN0aXZlVGFibGVJbXBsKCk7CisJCXJldHVybiBwZXJzcGVjdGl2ZVRhYmxlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQZXJzcGVjdGl2ZUdyaWQgY3JlYXRlUGVyc3BlY3RpdmVHcmlkKCkgeworCQlQZXJzcGVjdGl2ZUdyaWRJbXBsIHBlcnNwZWN0aXZlR3JpZCA9IG5ldyBQZXJzcGVjdGl2ZUdyaWRJbXBsKCk7CisJCXJldHVybiBwZXJzcGVjdGl2ZUdyaWQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFBlcnNwZWN0aXZlQ2hhcnQgY3JlYXRlUGVyc3BlY3RpdmVDaGFydCgpIHsKKwkJUGVyc3BlY3RpdmVDaGFydEltcGwgcGVyc3BlY3RpdmVDaGFydCA9IG5ldyBQZXJzcGVjdGl2ZUNoYXJ0SW1wbCgpOworCQlyZXR1cm4gcGVyc3BlY3RpdmVDaGFydDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUGVyc3BlY3RpdmVSZXBvcnQgY3JlYXRlUGVyc3BlY3RpdmVSZXBvcnQoKSB7CisJCVBlcnNwZWN0aXZlUmVwb3J0SW1wbCBwZXJzcGVjdGl2ZVJlcG9ydCA9IG5ldyBQZXJzcGVjdGl2ZVJlcG9ydEltcGwoKTsKKwkJcmV0dXJuIHBlcnNwZWN0aXZlUmVwb3J0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbiBjcmVhdGVQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbigpIHsKKwkJUGVyc3BlY3RpdmVPcmdhbml6YXRpb25JbXBsIHBlcnNwZWN0aXZlT3JnYW5pemF0aW9uID0gbmV3IFBlcnNwZWN0aXZlT3JnYW5pemF0aW9uSW1wbCgpOworCQlyZXR1cm4gcGVyc3BlY3RpdmVPcmdhbml6YXRpb247CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFBlcnNwZWN0aXZlVG9wb2xvZ3kgY3JlYXRlUGVyc3BlY3RpdmVUb3BvbG9neSgpIHsKKwkJUGVyc3BlY3RpdmVUb3BvbG9neUltcGwgcGVyc3BlY3RpdmVUb3BvbG9neSA9IG5ldyBQZXJzcGVjdGl2ZVRvcG9sb2d5SW1wbCgpOworCQlyZXR1cm4gcGVyc3BlY3RpdmVUb3BvbG9neTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUGVyc3BlY3RpdmVEaWFsb2cgY3JlYXRlUGVyc3BlY3RpdmVEaWFsb2coKSB7CisJCVBlcnNwZWN0aXZlRGlhbG9nSW1wbCBwZXJzcGVjdGl2ZURpYWxvZyA9IG5ldyBQZXJzcGVjdGl2ZURpYWxvZ0ltcGwoKTsKKwkJcmV0dXJuIHBlcnNwZWN0aXZlRGlhbG9nOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQZXJzcGVjdGl2ZUJQTU4gY3JlYXRlUGVyc3BlY3RpdmVCUE1OKCkgeworCQlQZXJzcGVjdGl2ZUJQTU5JbXBsIHBlcnNwZWN0aXZlQlBNTiA9IG5ldyBQZXJzcGVjdGl2ZUJQTU5JbXBsKCk7CisJCXJldHVybiBwZXJzcGVjdGl2ZUJQTU47CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNhc2hPcmllbnRhdGlvbiBjcmVhdGVTYXNoT3JpZW50YXRpb25Gcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJU2FzaE9yaWVudGF0aW9uIHJlc3VsdCA9IFNhc2hPcmllbnRhdGlvbi5nZXQoaW5pdGlhbFZhbHVlKTsKKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBjb252ZXJ0U2FzaE9yaWVudGF0aW9uVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEludGVybmFsRU9iamVjdCBjcmVhdGVJbnRlcm5hbEVPYmplY3RGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJcmV0dXJuIChJbnRlcm5hbEVPYmplY3Qpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBjb252ZXJ0SW50ZXJuYWxFT2JqZWN0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQZXJzcGVjdGl2ZURzbFBhY2thZ2UgZ2V0UGVyc3BlY3RpdmVEc2xQYWNrYWdlKCkgeworCQlyZXR1cm4gKFBlcnNwZWN0aXZlRHNsUGFja2FnZSlnZXRFUGFja2FnZSgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGRlcHJlY2F0ZWQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQERlcHJlY2F0ZWQKKwlwdWJsaWMgc3RhdGljIFBlcnNwZWN0aXZlRHNsUGFja2FnZSBnZXRQYWNrYWdlKCkgeworCQlyZXR1cm4gUGVyc3BlY3RpdmVEc2xQYWNrYWdlLmVJTlNUQU5DRTsKKwl9CisKK30gLy9QZXJzcGVjdGl2ZURzbEZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9pbXBsL1BlcnNwZWN0aXZlRHNsUGFja2FnZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2ltcGwvUGVyc3BlY3RpdmVEc2xQYWNrYWdlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMTliOGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9pbXBsL1BlcnNwZWN0aXZlRHNsUGFja2FnZUltcGwuamF2YQpAQCAtMCwwICsxLDExMjggQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnN7ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXMuT1NCUFR5cGVzUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYWN0aW9uLkFjdGlvbkRTTFBhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJsaXAuQmxpcERTTFBhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGlhbG9nZHNsLkRpYWxvZ0RTTFBhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0Lm9yZ2FuaXphdGlvbmRzbC5Pcmdhbml6YXRpb25EU0xQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlQlBNTjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlQmFzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlQ2hhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlR3JpZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlTGF6eVJlc29sdmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlT3JnYW5pemF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYXJ0U3RhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVJlcG9ydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlU2FzaENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVUYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlVG9wb2xvZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVZpZXc7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5TYXNoT3JpZW50YXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC50YWJsZS5UYWJsZURTTFBhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnRvcG9sb2d5ZHNsLlRvcG9sb2d5RFNMUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy5UeXBlc1BhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgUGVyc3BlY3RpdmVEc2xQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIFBlcnNwZWN0aXZlRHNsUGFja2FnZSB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgcGVyc3BlY3RpdmVNb2RlbEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBwZXJzcGVjdGl2ZUxhenlSZXNvbHZlckVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBwZXJzcGVjdGl2ZVBhY2thZ2VFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgcGVyc3BlY3RpdmVCYXNlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHBlcnNwZWN0aXZlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHBlcnNwZWN0aXZlRWxlbWVudEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBwZXJzcGVjdGl2ZVNhc2hDb250YWluZXJFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgcGVyc3BlY3RpdmVQYXJ0RUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHBlcnNwZWN0aXZlUGFydFN0YWNrRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHBlcnNwZWN0aXZlVmlld0VDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBwZXJzcGVjdGl2ZVNlbGVjdGlvbkVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBwZXJzcGVjdGl2ZVRhYmxlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHBlcnNwZWN0aXZlR3JpZEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBwZXJzcGVjdGl2ZUNoYXJ0RUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHBlcnNwZWN0aXZlUmVwb3J0RUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHBlcnNwZWN0aXZlT3JnYW5pemF0aW9uRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHBlcnNwZWN0aXZlVG9wb2xvZ3lFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgcGVyc3BlY3RpdmVEaWFsb2dFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgcGVyc3BlY3RpdmVCUE1ORUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUVudW0gc2FzaE9yaWVudGF0aW9uRUVudW0gPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFRGF0YVR5cGUgaW50ZXJuYWxFT2JqZWN0RURhdGFUeXBlID0gbnVsbDsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQorCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgorCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKKwkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcworCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCisJICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2xQYWNrYWdlI2VOU19VUkkKKwkgKiBAc2VlICNpbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2VJbXBsKCkgeworCQlzdXBlcihlTlNfVVJJLCBQZXJzcGVjdGl2ZURzbEZhY3RvcnkuZUlOU1RBTkNFKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7CisKKwkvKioKKwkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMgbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuCisJICogCisJICogPHA+VGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbml0aWFsaXplIHtAbGluayBQZXJzcGVjdGl2ZURzbFBhY2thZ2UjZUlOU1RBTkNFfSB3aGVuIHRoYXQgZmllbGQgaXMgYWNjZXNzZWQuCisJICogQ2xpZW50cyBzaG91bGQgbm90IGludm9rZSBpdCBkaXJlY3RseS4gSW5zdGVhZCwgdGhleSBzaG91bGQgc2ltcGx5IGFjY2VzcyB0aGF0IGZpZWxkIHRvIG9idGFpbiB0aGUgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2VOU19VUkkKKwkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQorCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFBlcnNwZWN0aXZlRHNsUGFja2FnZSBpbml0KCkgeworCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoUGVyc3BlY3RpdmVEc2xQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFBlcnNwZWN0aXZlRHNsUGFja2FnZS5lTlNfVVJJKTsKKworCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCisJCVBlcnNwZWN0aXZlRHNsUGFja2FnZUltcGwgdGhlUGVyc3BlY3RpdmVEc2xQYWNrYWdlID0gKFBlcnNwZWN0aXZlRHNsUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlRHNsUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgOiBuZXcgUGVyc3BlY3RpdmVEc2xQYWNrYWdlSW1wbCgpKTsKKworCQlpc0luaXRlZCA9IHRydWU7CisKKwkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCisJCVRhYmxlRFNMUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisJCURpYWxvZ0RTTFBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOworCQlSZXBvcnREU0xQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKKwkJT3JnYW5pemF0aW9uRFNMUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisJCUNoYXJ0RFNMUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisJCVRvcG9sb2d5RFNMUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisKKwkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKKwkJdGhlUGVyc3BlY3RpdmVEc2xQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCisJCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKKwkJdGhlUGVyc3BlY3RpdmVEc2xQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKworCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCisJCXRoZVBlcnNwZWN0aXZlRHNsUGFja2FnZS5mcmVlemUoKTsKKworICAKKwkJLy8gVXBkYXRlIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJuIHRoZSBwYWNrYWdlCisJCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dChQZXJzcGVjdGl2ZURzbFBhY2thZ2UuZU5TX1VSSSwgdGhlUGVyc3BlY3RpdmVEc2xQYWNrYWdlKTsKKwkJcmV0dXJuIHRoZVBlcnNwZWN0aXZlRHNsUGFja2FnZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFBlcnNwZWN0aXZlTW9kZWwoKSB7CisJCXJldHVybiBwZXJzcGVjdGl2ZU1vZGVsRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBlcnNwZWN0aXZlTW9kZWxfUGFja2FnZXMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlwZXJzcGVjdGl2ZU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRQZXJzcGVjdGl2ZUxhenlSZXNvbHZlcigpIHsKKwkJcmV0dXJuIHBlcnNwZWN0aXZlTGF6eVJlc29sdmVyRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFT3BlcmF0aW9uIGdldFBlcnNwZWN0aXZlTGF6eVJlc29sdmVyX19FUmVzb2x2ZVByb3h5X19JbnRlcm5hbEVPYmplY3QoKSB7CisJCXJldHVybiBwZXJzcGVjdGl2ZUxhenlSZXNvbHZlckVDbGFzcy5nZXRFT3BlcmF0aW9ucygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFBlcnNwZWN0aXZlUGFja2FnZSgpIHsKKwkJcmV0dXJuIHBlcnNwZWN0aXZlUGFja2FnZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQZXJzcGVjdGl2ZVBhY2thZ2VfUGVyc3BlY3RpdmVzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpcGVyc3BlY3RpdmVQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRQZXJzcGVjdGl2ZUJhc2UoKSB7CisJCXJldHVybiBwZXJzcGVjdGl2ZUJhc2VFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGVyc3BlY3RpdmVCYXNlX05hbWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlwZXJzcGVjdGl2ZUJhc2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFBlcnNwZWN0aXZlKCkgeworCQlyZXR1cm4gcGVyc3BlY3RpdmVFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGVyc3BlY3RpdmVfRGVzY3JpcHRpb24oKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlwZXJzcGVjdGl2ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFBlcnNwZWN0aXZlX0Rlc2NyaXB0aW9uVmFsdWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlwZXJzcGVjdGl2ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFBlcnNwZWN0aXZlX0ljb25VUkkoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlwZXJzcGVjdGl2ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFBlcnNwZWN0aXZlX0FjY2Vzc2liaWxpdHlQaHJhc2UoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlwZXJzcGVjdGl2ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBlcnNwZWN0aXZlX1Byb2Nlc3MoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlwZXJzcGVjdGl2ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBlcnNwZWN0aXZlX1VzZXJUYXNrKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpcGVyc3BlY3RpdmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQZXJzcGVjdGl2ZV9Ub29sYmFyKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpcGVyc3BlY3RpdmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQZXJzcGVjdGl2ZV9Ub29sYmFyVHlwZUp2bSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXBlcnNwZWN0aXZlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0UGVyc3BlY3RpdmVfRWxlbWVudHMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlwZXJzcGVjdGl2ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0UGVyc3BlY3RpdmVFbGVtZW50KCkgeworCQlyZXR1cm4gcGVyc3BlY3RpdmVFbGVtZW50RUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFBlcnNwZWN0aXZlRWxlbWVudF9FbGVtZW50SWQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlwZXJzcGVjdGl2ZUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQZXJzcGVjdGl2ZUVsZW1lbnRfQWNjZXNzaWJpbGl0eVBocmFzZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXBlcnNwZWN0aXZlRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFBlcnNwZWN0aXZlRWxlbWVudF9Db250YWluZXJEYXRhKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGVyc3BlY3RpdmVFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0UGVyc3BlY3RpdmVFbGVtZW50X0VsZW1lbnRzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpcGVyc3BlY3RpdmVFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIoKSB7CisJCXJldHVybiBwZXJzcGVjdGl2ZVNhc2hDb250YWluZXJFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX09yaWVudGF0aW9uKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX1NlbGVjdGVkRWxlbWVudCgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0UGVyc3BlY3RpdmVQYXJ0KCkgeworCQlyZXR1cm4gcGVyc3BlY3RpdmVQYXJ0RUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFBlcnNwZWN0aXZlUGFydF9EZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXBlcnNwZWN0aXZlUGFydEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFBlcnNwZWN0aXZlUGFydF9EZXNjcmlwdGlvblZhbHVlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGVyc3BlY3RpdmVQYXJ0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGVyc3BlY3RpdmVQYXJ0X0ljb25VUkkoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlwZXJzcGVjdGl2ZVBhcnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQZXJzcGVjdGl2ZVBhcnRfVmlldygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXBlcnNwZWN0aXZlUGFydEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFBlcnNwZWN0aXZlUGFydF9Jc0Nsb3NhYmxlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGVyc3BlY3RpdmVQYXJ0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRQZXJzcGVjdGl2ZVBhcnRTdGFjaygpIHsKKwkJcmV0dXJuIHBlcnNwZWN0aXZlUGFydFN0YWNrRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBlcnNwZWN0aXZlUGFydFN0YWNrX1NlbGVjdGVkRWxlbWVudCgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXBlcnNwZWN0aXZlUGFydFN0YWNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRQZXJzcGVjdGl2ZVZpZXcoKSB7CisJCXJldHVybiBwZXJzcGVjdGl2ZVZpZXdFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRQZXJzcGVjdGl2ZVNlbGVjdGlvbigpIHsKKwkJcmV0dXJuIHBlcnNwZWN0aXZlU2VsZWN0aW9uRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBlcnNwZWN0aXZlU2VsZWN0aW9uX1JlZigpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXBlcnNwZWN0aXZlU2VsZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0UGVyc3BlY3RpdmVTZWxlY3Rpb25fUmVmVHlwZUp2bSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXBlcnNwZWN0aXZlU2VsZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRQZXJzcGVjdGl2ZVRhYmxlKCkgeworCQlyZXR1cm4gcGVyc3BlY3RpdmVUYWJsZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQZXJzcGVjdGl2ZVRhYmxlX1JlZigpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXBlcnNwZWN0aXZlVGFibGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQZXJzcGVjdGl2ZVRhYmxlX1JlZlR5cGVKdm0oKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlwZXJzcGVjdGl2ZVRhYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRQZXJzcGVjdGl2ZUdyaWQoKSB7CisJCXJldHVybiBwZXJzcGVjdGl2ZUdyaWRFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0UGVyc3BlY3RpdmVHcmlkX1JlZigpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXBlcnNwZWN0aXZlR3JpZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBlcnNwZWN0aXZlR3JpZF9SZWZUeXBlSnZtKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpcGVyc3BlY3RpdmVHcmlkRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRQZXJzcGVjdGl2ZUNoYXJ0KCkgeworCQlyZXR1cm4gcGVyc3BlY3RpdmVDaGFydEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQZXJzcGVjdGl2ZUNoYXJ0X1JlZigpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXBlcnNwZWN0aXZlQ2hhcnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQZXJzcGVjdGl2ZUNoYXJ0X1JlZlR5cGVKdm0oKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlwZXJzcGVjdGl2ZUNoYXJ0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRQZXJzcGVjdGl2ZVJlcG9ydCgpIHsKKwkJcmV0dXJuIHBlcnNwZWN0aXZlUmVwb3J0RUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBlcnNwZWN0aXZlUmVwb3J0X1JlZigpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXBlcnNwZWN0aXZlUmVwb3J0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0UGVyc3BlY3RpdmVSZXBvcnRfUmVmVHlwZUp2bSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXBlcnNwZWN0aXZlUmVwb3J0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbigpIHsKKwkJcmV0dXJuIHBlcnNwZWN0aXZlT3JnYW5pemF0aW9uRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBlcnNwZWN0aXZlT3JnYW5pemF0aW9uX1JlZigpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXBlcnNwZWN0aXZlT3JnYW5pemF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRQZXJzcGVjdGl2ZVRvcG9sb2d5KCkgeworCQlyZXR1cm4gcGVyc3BlY3RpdmVUb3BvbG9neUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQZXJzcGVjdGl2ZVRvcG9sb2d5X1JlZigpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXBlcnNwZWN0aXZlVG9wb2xvZ3lFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQZXJzcGVjdGl2ZVRvcG9sb2d5X1JlZlR5cGVKdm0oKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlwZXJzcGVjdGl2ZVRvcG9sb2d5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRQZXJzcGVjdGl2ZURpYWxvZygpIHsKKwkJcmV0dXJuIHBlcnNwZWN0aXZlRGlhbG9nRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBlcnNwZWN0aXZlRGlhbG9nX1JlZigpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXBlcnNwZWN0aXZlRGlhbG9nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0UGVyc3BlY3RpdmVEaWFsb2dfUmVmVHlwZUp2bSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXBlcnNwZWN0aXZlRGlhbG9nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRQZXJzcGVjdGl2ZUJQTU4oKSB7CisJCXJldHVybiBwZXJzcGVjdGl2ZUJQTU5FQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVFbnVtIGdldFNhc2hPcmllbnRhdGlvbigpIHsKKwkJcmV0dXJuIHNhc2hPcmllbnRhdGlvbkVFbnVtOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFRGF0YVR5cGUgZ2V0SW50ZXJuYWxFT2JqZWN0KCkgeworCQlyZXR1cm4gaW50ZXJuYWxFT2JqZWN0RURhdGFUeXBlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQZXJzcGVjdGl2ZURzbEZhY3RvcnkgZ2V0UGVyc3BlY3RpdmVEc2xGYWN0b3J5KCkgeworCQlyZXR1cm4gKFBlcnNwZWN0aXZlRHNsRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOworCisJLyoqCisJICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCisJICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKKwkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOworCQlpc0NyZWF0ZWQgPSB0cnVlOworCisJCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcworCQlwZXJzcGVjdGl2ZU1vZGVsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBFUlNQRUNUSVZFX01PREVMKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShwZXJzcGVjdGl2ZU1vZGVsRUNsYXNzLCBQRVJTUEVDVElWRV9NT0RFTF9fUEFDS0FHRVMpOworCisJCXBlcnNwZWN0aXZlTGF6eVJlc29sdmVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBFUlNQRUNUSVZFX0xBWllfUkVTT0xWRVIpOworCQljcmVhdGVFT3BlcmF0aW9uKHBlcnNwZWN0aXZlTGF6eVJlc29sdmVyRUNsYXNzLCBQRVJTUEVDVElWRV9MQVpZX1JFU09MVkVSX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCk7CisKKwkJcGVyc3BlY3RpdmVQYWNrYWdlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBFUlNQRUNUSVZFX1BBQ0tBR0UpOworCQljcmVhdGVFUmVmZXJlbmNlKHBlcnNwZWN0aXZlUGFja2FnZUVDbGFzcywgUEVSU1BFQ1RJVkVfUEFDS0FHRV9fUEVSU1BFQ1RJVkVTKTsKKworCQlwZXJzcGVjdGl2ZUJhc2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUEVSU1BFQ1RJVkVfQkFTRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUocGVyc3BlY3RpdmVCYXNlRUNsYXNzLCBQRVJTUEVDVElWRV9CQVNFX19OQU1FKTsKKworCQlwZXJzcGVjdGl2ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQRVJTUEVDVElWRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUocGVyc3BlY3RpdmVFQ2xhc3MsIFBFUlNQRUNUSVZFX19ERVNDUklQVElPTik7CisJCWNyZWF0ZUVBdHRyaWJ1dGUocGVyc3BlY3RpdmVFQ2xhc3MsIFBFUlNQRUNUSVZFX19ERVNDUklQVElPTl9WQUxVRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUocGVyc3BlY3RpdmVFQ2xhc3MsIFBFUlNQRUNUSVZFX19JQ09OX1VSSSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUocGVyc3BlY3RpdmVFQ2xhc3MsIFBFUlNQRUNUSVZFX19BQ0NFU1NJQklMSVRZX1BIUkFTRSk7CisJCWNyZWF0ZUVSZWZlcmVuY2UocGVyc3BlY3RpdmVFQ2xhc3MsIFBFUlNQRUNUSVZFX19QUk9DRVNTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShwZXJzcGVjdGl2ZUVDbGFzcywgUEVSU1BFQ1RJVkVfX1VTRVJfVEFTSyk7CisJCWNyZWF0ZUVSZWZlcmVuY2UocGVyc3BlY3RpdmVFQ2xhc3MsIFBFUlNQRUNUSVZFX19UT09MQkFSKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShwZXJzcGVjdGl2ZUVDbGFzcywgUEVSU1BFQ1RJVkVfX1RPT0xCQVJfVFlQRV9KVk0pOworCQljcmVhdGVFUmVmZXJlbmNlKHBlcnNwZWN0aXZlRUNsYXNzLCBQRVJTUEVDVElWRV9fRUxFTUVOVFMpOworCisJCXBlcnNwZWN0aXZlRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQRVJTUEVDVElWRV9FTEVNRU5UKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShwZXJzcGVjdGl2ZUVsZW1lbnRFQ2xhc3MsIFBFUlNQRUNUSVZFX0VMRU1FTlRfX0VMRU1FTlRfSUQpOworCQljcmVhdGVFQXR0cmlidXRlKHBlcnNwZWN0aXZlRWxlbWVudEVDbGFzcywgUEVSU1BFQ1RJVkVfRUxFTUVOVF9fQUNDRVNTSUJJTElUWV9QSFJBU0UpOworCQljcmVhdGVFQXR0cmlidXRlKHBlcnNwZWN0aXZlRWxlbWVudEVDbGFzcywgUEVSU1BFQ1RJVkVfRUxFTUVOVF9fQ09OVEFJTkVSX0RBVEEpOworCQljcmVhdGVFUmVmZXJlbmNlKHBlcnNwZWN0aXZlRWxlbWVudEVDbGFzcywgUEVSU1BFQ1RJVkVfRUxFTUVOVF9fRUxFTUVOVFMpOworCisJCXBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQRVJTUEVDVElWRV9TQVNIX0NPTlRBSU5FUik7CisJCWNyZWF0ZUVBdHRyaWJ1dGUocGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyRUNsYXNzLCBQRVJTUEVDVElWRV9TQVNIX0NPTlRBSU5FUl9fT1JJRU5UQVRJT04pOworCQljcmVhdGVFUmVmZXJlbmNlKHBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckVDbGFzcywgUEVSU1BFQ1RJVkVfU0FTSF9DT05UQUlORVJfX1NFTEVDVEVEX0VMRU1FTlQpOworCisJCXBlcnNwZWN0aXZlUGFydEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQRVJTUEVDVElWRV9QQVJUKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShwZXJzcGVjdGl2ZVBhcnRFQ2xhc3MsIFBFUlNQRUNUSVZFX1BBUlRfX0RFU0NSSVBUSU9OKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShwZXJzcGVjdGl2ZVBhcnRFQ2xhc3MsIFBFUlNQRUNUSVZFX1BBUlRfX0RFU0NSSVBUSU9OX1ZBTFVFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShwZXJzcGVjdGl2ZVBhcnRFQ2xhc3MsIFBFUlNQRUNUSVZFX1BBUlRfX0lDT05fVVJJKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShwZXJzcGVjdGl2ZVBhcnRFQ2xhc3MsIFBFUlNQRUNUSVZFX1BBUlRfX1ZJRVcpOworCQljcmVhdGVFQXR0cmlidXRlKHBlcnNwZWN0aXZlUGFydEVDbGFzcywgUEVSU1BFQ1RJVkVfUEFSVF9fSVNfQ0xPU0FCTEUpOworCisJCXBlcnNwZWN0aXZlUGFydFN0YWNrRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBFUlNQRUNUSVZFX1BBUlRfU1RBQ0spOworCQljcmVhdGVFUmVmZXJlbmNlKHBlcnNwZWN0aXZlUGFydFN0YWNrRUNsYXNzLCBQRVJTUEVDVElWRV9QQVJUX1NUQUNLX19TRUxFQ1RFRF9FTEVNRU5UKTsKKworCQlwZXJzcGVjdGl2ZVZpZXdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUEVSU1BFQ1RJVkVfVklFVyk7CisKKwkJcGVyc3BlY3RpdmVTZWxlY3Rpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUEVSU1BFQ1RJVkVfU0VMRUNUSU9OKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShwZXJzcGVjdGl2ZVNlbGVjdGlvbkVDbGFzcywgUEVSU1BFQ1RJVkVfU0VMRUNUSU9OX19SRUYpOworCQljcmVhdGVFUmVmZXJlbmNlKHBlcnNwZWN0aXZlU2VsZWN0aW9uRUNsYXNzLCBQRVJTUEVDVElWRV9TRUxFQ1RJT05fX1JFRl9UWVBFX0pWTSk7CisKKwkJcGVyc3BlY3RpdmVUYWJsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQRVJTUEVDVElWRV9UQUJMRSk7CisJCWNyZWF0ZUVSZWZlcmVuY2UocGVyc3BlY3RpdmVUYWJsZUVDbGFzcywgUEVSU1BFQ1RJVkVfVEFCTEVfX1JFRik7CisJCWNyZWF0ZUVSZWZlcmVuY2UocGVyc3BlY3RpdmVUYWJsZUVDbGFzcywgUEVSU1BFQ1RJVkVfVEFCTEVfX1JFRl9UWVBFX0pWTSk7CisKKwkJcGVyc3BlY3RpdmVHcmlkRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBFUlNQRUNUSVZFX0dSSUQpOworCQljcmVhdGVFUmVmZXJlbmNlKHBlcnNwZWN0aXZlR3JpZEVDbGFzcywgUEVSU1BFQ1RJVkVfR1JJRF9fUkVGKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShwZXJzcGVjdGl2ZUdyaWRFQ2xhc3MsIFBFUlNQRUNUSVZFX0dSSURfX1JFRl9UWVBFX0pWTSk7CisKKwkJcGVyc3BlY3RpdmVDaGFydEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQRVJTUEVDVElWRV9DSEFSVCk7CisJCWNyZWF0ZUVSZWZlcmVuY2UocGVyc3BlY3RpdmVDaGFydEVDbGFzcywgUEVSU1BFQ1RJVkVfQ0hBUlRfX1JFRik7CisJCWNyZWF0ZUVSZWZlcmVuY2UocGVyc3BlY3RpdmVDaGFydEVDbGFzcywgUEVSU1BFQ1RJVkVfQ0hBUlRfX1JFRl9UWVBFX0pWTSk7CisKKwkJcGVyc3BlY3RpdmVSZXBvcnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUEVSU1BFQ1RJVkVfUkVQT1JUKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShwZXJzcGVjdGl2ZVJlcG9ydEVDbGFzcywgUEVSU1BFQ1RJVkVfUkVQT1JUX19SRUYpOworCQljcmVhdGVFUmVmZXJlbmNlKHBlcnNwZWN0aXZlUmVwb3J0RUNsYXNzLCBQRVJTUEVDVElWRV9SRVBPUlRfX1JFRl9UWVBFX0pWTSk7CisKKwkJcGVyc3BlY3RpdmVPcmdhbml6YXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUEVSU1BFQ1RJVkVfT1JHQU5JWkFUSU9OKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShwZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbkVDbGFzcywgUEVSU1BFQ1RJVkVfT1JHQU5JWkFUSU9OX19SRUYpOworCisJCXBlcnNwZWN0aXZlVG9wb2xvZ3lFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUEVSU1BFQ1RJVkVfVE9QT0xPR1kpOworCQljcmVhdGVFUmVmZXJlbmNlKHBlcnNwZWN0aXZlVG9wb2xvZ3lFQ2xhc3MsIFBFUlNQRUNUSVZFX1RPUE9MT0dZX19SRUYpOworCQljcmVhdGVFUmVmZXJlbmNlKHBlcnNwZWN0aXZlVG9wb2xvZ3lFQ2xhc3MsIFBFUlNQRUNUSVZFX1RPUE9MT0dZX19SRUZfVFlQRV9KVk0pOworCisJCXBlcnNwZWN0aXZlRGlhbG9nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBFUlNQRUNUSVZFX0RJQUxPRyk7CisJCWNyZWF0ZUVSZWZlcmVuY2UocGVyc3BlY3RpdmVEaWFsb2dFQ2xhc3MsIFBFUlNQRUNUSVZFX0RJQUxPR19fUkVGKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShwZXJzcGVjdGl2ZURpYWxvZ0VDbGFzcywgUEVSU1BFQ1RJVkVfRElBTE9HX19SRUZfVFlQRV9KVk0pOworCisJCXBlcnNwZWN0aXZlQlBNTkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQRVJTUEVDVElWRV9CUE1OKTsKKworCQkvLyBDcmVhdGUgZW51bXMKKwkJc2FzaE9yaWVudGF0aW9uRUVudW0gPSBjcmVhdGVFRW51bShTQVNIX09SSUVOVEFUSU9OKTsKKworCQkvLyBDcmVhdGUgZGF0YSB0eXBlcworCQlpbnRlcm5hbEVPYmplY3RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoSU5URVJOQUxfRU9CSkVDVCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCisJICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgeworCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOworCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKKworCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKKwkJc2V0TmFtZShlTkFNRSk7CisJCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOworCQlzZXROc1VSSShlTlNfVVJJKTsKKworCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCisJCUVjb3JlUGFja2FnZSB0aGVFY29yZVBhY2thZ2UgPSAoRWNvcmVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjb3JlUGFja2FnZS5lTlNfVVJJKTsKKwkJT1NCUFR5cGVzUGFja2FnZSB0aGVPU0JQVHlwZXNQYWNrYWdlID0gKE9TQlBUeXBlc1BhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoT1NCUFR5cGVzUGFja2FnZS5lTlNfVVJJKTsKKwkJQmxpcERTTFBhY2thZ2UgdGhlQmxpcERTTFBhY2thZ2UgPSAoQmxpcERTTFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQmxpcERTTFBhY2thZ2UuZU5TX1VSSSk7CisJCUFjdGlvbkRTTFBhY2thZ2UgdGhlQWN0aW9uRFNMUGFja2FnZSA9IChBY3Rpb25EU0xQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFjdGlvbkRTTFBhY2thZ2UuZU5TX1VSSSk7CisJCVR5cGVzUGFja2FnZSB0aGVUeXBlc1BhY2thZ2UgPSAoVHlwZXNQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFR5cGVzUGFja2FnZS5lTlNfVVJJKTsKKwkJVGFibGVEU0xQYWNrYWdlIHRoZVRhYmxlRFNMUGFja2FnZSA9IChUYWJsZURTTFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVGFibGVEU0xQYWNrYWdlLmVOU19VUkkpOworCQlDaGFydERTTFBhY2thZ2UgdGhlQ2hhcnREU0xQYWNrYWdlID0gKENoYXJ0RFNMUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDaGFydERTTFBhY2thZ2UuZU5TX1VSSSk7CisJCVJlcG9ydERTTFBhY2thZ2UgdGhlUmVwb3J0RFNMUGFja2FnZSA9IChSZXBvcnREU0xQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFJlcG9ydERTTFBhY2thZ2UuZU5TX1VSSSk7CisJCU9yZ2FuaXphdGlvbkRTTFBhY2thZ2UgdGhlT3JnYW5pemF0aW9uRFNMUGFja2FnZSA9IChPcmdhbml6YXRpb25EU0xQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE9yZ2FuaXphdGlvbkRTTFBhY2thZ2UuZU5TX1VSSSk7CisJCVRvcG9sb2d5RFNMUGFja2FnZSB0aGVUb3BvbG9neURTTFBhY2thZ2UgPSAoVG9wb2xvZ3lEU0xQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRvcG9sb2d5RFNMUGFja2FnZS5lTlNfVVJJKTsKKwkJRGlhbG9nRFNMUGFja2FnZSB0aGVEaWFsb2dEU0xQYWNrYWdlID0gKERpYWxvZ0RTTFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRGlhbG9nRFNMUGFja2FnZS5lTlNfVVJJKTsKKworCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCisKKwkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCisKKwkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcworCQlwZXJzcGVjdGl2ZVBhY2thZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT1NCUFR5cGVzUGFja2FnZS5nZXRMUGFja2FnZSgpKTsKKwkJcGVyc3BlY3RpdmVCYXNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UGVyc3BlY3RpdmVMYXp5UmVzb2x2ZXIoKSk7CisJCXBlcnNwZWN0aXZlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UGVyc3BlY3RpdmVCYXNlKCkpOworCQlwZXJzcGVjdGl2ZUVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQZXJzcGVjdGl2ZUxhenlSZXNvbHZlcigpKTsKKwkJcGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UGVyc3BlY3RpdmVFbGVtZW50KCkpOworCQlwZXJzcGVjdGl2ZVBhcnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQZXJzcGVjdGl2ZUVsZW1lbnQoKSk7CisJCXBlcnNwZWN0aXZlUGFydFN0YWNrRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UGVyc3BlY3RpdmVFbGVtZW50KCkpOworCQlwZXJzcGVjdGl2ZVZpZXdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQZXJzcGVjdGl2ZUxhenlSZXNvbHZlcigpKTsKKwkJcGVyc3BlY3RpdmVTZWxlY3Rpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQZXJzcGVjdGl2ZVZpZXcoKSk7CisJCXBlcnNwZWN0aXZlVGFibGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQZXJzcGVjdGl2ZVZpZXcoKSk7CisJCXBlcnNwZWN0aXZlR3JpZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBlcnNwZWN0aXZlVmlldygpKTsKKwkJcGVyc3BlY3RpdmVDaGFydEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBlcnNwZWN0aXZlVmlldygpKTsKKwkJcGVyc3BlY3RpdmVSZXBvcnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQZXJzcGVjdGl2ZVZpZXcoKSk7CisJCXBlcnNwZWN0aXZlT3JnYW5pemF0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UGVyc3BlY3RpdmVWaWV3KCkpOworCQlwZXJzcGVjdGl2ZVRvcG9sb2d5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UGVyc3BlY3RpdmVWaWV3KCkpOworCQlwZXJzcGVjdGl2ZURpYWxvZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBlcnNwZWN0aXZlVmlldygpKTsKKwkJcGVyc3BlY3RpdmVCUE1ORUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UGVyc3BlY3RpdmVWaWV3KCkpOworCisJCS8vIEluaXRpYWxpemUgY2xhc3NlcywgZmVhdHVyZXMsIGFuZCBvcGVyYXRpb25zOyBhZGQgcGFyYW1ldGVycworCQlpbml0RUNsYXNzKHBlcnNwZWN0aXZlTW9kZWxFQ2xhc3MsIFBlcnNwZWN0aXZlTW9kZWwuY2xhc3MsICJQZXJzcGVjdGl2ZU1vZGVsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZShnZXRQZXJzcGVjdGl2ZU1vZGVsX1BhY2thZ2VzKCksIHRoaXMuZ2V0UGVyc3BlY3RpdmVQYWNrYWdlKCksIG51bGwsICJwYWNrYWdlcyIsIG51bGwsIDAsIC0xLCBQZXJzcGVjdGl2ZU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MocGVyc3BlY3RpdmVMYXp5UmVzb2x2ZXJFQ2xhc3MsIFBlcnNwZWN0aXZlTGF6eVJlc29sdmVyLmNsYXNzLCAiUGVyc3BlY3RpdmVMYXp5UmVzb2x2ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisKKwkJRU9wZXJhdGlvbiBvcCA9IGluaXRFT3BlcmF0aW9uKGdldFBlcnNwZWN0aXZlTGF6eVJlc29sdmVyX19FUmVzb2x2ZVByb3h5X19JbnRlcm5hbEVPYmplY3QoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVPYmplY3QoKSwgImVSZXNvbHZlUHJveHkiLCAwLCAxLCAhSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsKKwkJYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJbnRlcm5hbEVPYmplY3QoKSwgInByb3h5IiwgMCwgMSwgIUlTX1VOSVFVRSwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyhwZXJzcGVjdGl2ZVBhY2thZ2VFQ2xhc3MsIFBlcnNwZWN0aXZlUGFja2FnZS5jbGFzcywgIlBlcnNwZWN0aXZlUGFja2FnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0UGVyc3BlY3RpdmVQYWNrYWdlX1BlcnNwZWN0aXZlcygpLCB0aGlzLmdldFBlcnNwZWN0aXZlKCksIG51bGwsICJwZXJzcGVjdGl2ZXMiLCBudWxsLCAwLCAtMSwgUGVyc3BlY3RpdmVQYWNrYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MocGVyc3BlY3RpdmVCYXNlRUNsYXNzLCBQZXJzcGVjdGl2ZUJhc2UuY2xhc3MsICJQZXJzcGVjdGl2ZUJhc2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldFBlcnNwZWN0aXZlQmFzZV9OYW1lKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgUGVyc3BlY3RpdmVCYXNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHBlcnNwZWN0aXZlRUNsYXNzLCBQZXJzcGVjdGl2ZS5jbGFzcywgIlBlcnNwZWN0aXZlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRQZXJzcGVjdGl2ZV9EZXNjcmlwdGlvbigpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgUGVyc3BlY3RpdmUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRQZXJzcGVjdGl2ZV9EZXNjcmlwdGlvblZhbHVlKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvblZhbHVlIiwgbnVsbCwgMCwgMSwgUGVyc3BlY3RpdmUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRQZXJzcGVjdGl2ZV9JY29uVVJJKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpY29uVVJJIiwgbnVsbCwgMCwgMSwgUGVyc3BlY3RpdmUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRQZXJzcGVjdGl2ZV9BY2Nlc3NpYmlsaXR5UGhyYXNlKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJhY2Nlc3NpYmlsaXR5UGhyYXNlIiwgbnVsbCwgMCwgMSwgUGVyc3BlY3RpdmUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRQZXJzcGVjdGl2ZV9Qcm9jZXNzKCksIHRoZUJsaXBEU0xQYWNrYWdlLmdldEJsaXAoKSwgbnVsbCwgInByb2Nlc3MiLCBudWxsLCAwLCAxLCBQZXJzcGVjdGl2ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0UGVyc3BlY3RpdmVfVXNlclRhc2soKSwgdGhlQmxpcERTTFBhY2thZ2UuZ2V0QmxpcFVzZXJUYXNrKCksIG51bGwsICJ1c2VyVGFzayIsIG51bGwsIDAsIDEsIFBlcnNwZWN0aXZlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRQZXJzcGVjdGl2ZV9Ub29sYmFyKCksIHRoZUFjdGlvbkRTTFBhY2thZ2UuZ2V0QWN0aW9uVG9vbGJhcigpLCBudWxsLCAidG9vbGJhciIsIG51bGwsIDAsIDEsIFBlcnNwZWN0aXZlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRQZXJzcGVjdGl2ZV9Ub29sYmFyVHlwZUp2bSgpLCB0aGVUeXBlc1BhY2thZ2UuZ2V0SnZtVHlwZVJlZmVyZW5jZSgpLCBudWxsLCAidG9vbGJhclR5cGVKdm0iLCBudWxsLCAwLCAxLCBQZXJzcGVjdGl2ZS5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldFBlcnNwZWN0aXZlX0VsZW1lbnRzKCksIHRoaXMuZ2V0UGVyc3BlY3RpdmVFbGVtZW50KCksIG51bGwsICJlbGVtZW50cyIsIG51bGwsIDAsIC0xLCBQZXJzcGVjdGl2ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHBlcnNwZWN0aXZlRWxlbWVudEVDbGFzcywgUGVyc3BlY3RpdmVFbGVtZW50LmNsYXNzLCAiUGVyc3BlY3RpdmVFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRQZXJzcGVjdGl2ZUVsZW1lbnRfRWxlbWVudElkKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJlbGVtZW50SWQiLCBudWxsLCAwLCAxLCBQZXJzcGVjdGl2ZUVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRQZXJzcGVjdGl2ZUVsZW1lbnRfQWNjZXNzaWJpbGl0eVBocmFzZSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiYWNjZXNzaWJpbGl0eVBocmFzZSIsIG51bGwsIDAsIDEsIFBlcnNwZWN0aXZlRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldFBlcnNwZWN0aXZlRWxlbWVudF9Db250YWluZXJEYXRhKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb250YWluZXJEYXRhIiwgbnVsbCwgMCwgMSwgUGVyc3BlY3RpdmVFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0UGVyc3BlY3RpdmVFbGVtZW50X0VsZW1lbnRzKCksIHRoaXMuZ2V0UGVyc3BlY3RpdmVFbGVtZW50KCksIG51bGwsICJlbGVtZW50cyIsIG51bGwsIDAsIC0xLCBQZXJzcGVjdGl2ZUVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyhwZXJzcGVjdGl2ZVNhc2hDb250YWluZXJFQ2xhc3MsIFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lci5jbGFzcywgIlBlcnNwZWN0aXZlU2FzaENvbnRhaW5lciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX09yaWVudGF0aW9uKCksIHRoaXMuZ2V0U2FzaE9yaWVudGF0aW9uKCksICJvcmllbnRhdGlvbiIsIG51bGwsIDAsIDEsIFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lcl9TZWxlY3RlZEVsZW1lbnQoKSwgdGhpcy5nZXRQZXJzcGVjdGl2ZUVsZW1lbnQoKSwgbnVsbCwgInNlbGVjdGVkRWxlbWVudCIsIG51bGwsIDAsIDEsIFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHBlcnNwZWN0aXZlUGFydEVDbGFzcywgUGVyc3BlY3RpdmVQYXJ0LmNsYXNzLCAiUGVyc3BlY3RpdmVQYXJ0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRQZXJzcGVjdGl2ZVBhcnRfRGVzY3JpcHRpb24oKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFBlcnNwZWN0aXZlUGFydC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldFBlcnNwZWN0aXZlUGFydF9EZXNjcmlwdGlvblZhbHVlKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvblZhbHVlIiwgbnVsbCwgMCwgMSwgUGVyc3BlY3RpdmVQYXJ0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGVyc3BlY3RpdmVQYXJ0X0ljb25VUkkoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImljb25VUkkiLCBudWxsLCAwLCAxLCBQZXJzcGVjdGl2ZVBhcnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRQZXJzcGVjdGl2ZVBhcnRfVmlldygpLCB0aGlzLmdldFBlcnNwZWN0aXZlVmlldygpLCBudWxsLCAidmlldyIsIG51bGwsIDAsIDEsIFBlcnNwZWN0aXZlUGFydC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGVyc3BlY3RpdmVQYXJ0X0lzQ2xvc2FibGUoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJpc0Nsb3NhYmxlIiwgbnVsbCwgMCwgMSwgUGVyc3BlY3RpdmVQYXJ0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHBlcnNwZWN0aXZlUGFydFN0YWNrRUNsYXNzLCBQZXJzcGVjdGl2ZVBhcnRTdGFjay5jbGFzcywgIlBlcnNwZWN0aXZlUGFydFN0YWNrIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZShnZXRQZXJzcGVjdGl2ZVBhcnRTdGFja19TZWxlY3RlZEVsZW1lbnQoKSwgdGhpcy5nZXRQZXJzcGVjdGl2ZVBhcnQoKSwgbnVsbCwgInNlbGVjdGVkRWxlbWVudCIsIG51bGwsIDAsIDEsIFBlcnNwZWN0aXZlUGFydFN0YWNrLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MocGVyc3BlY3RpdmVWaWV3RUNsYXNzLCBQZXJzcGVjdGl2ZVZpZXcuY2xhc3MsICJQZXJzcGVjdGl2ZVZpZXciLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCisJCWluaXRFQ2xhc3MocGVyc3BlY3RpdmVTZWxlY3Rpb25FQ2xhc3MsIFBlcnNwZWN0aXZlU2VsZWN0aW9uLmNsYXNzLCAiUGVyc3BlY3RpdmVTZWxlY3Rpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFUmVmZXJlbmNlKGdldFBlcnNwZWN0aXZlU2VsZWN0aW9uX1JlZigpLCB0aGVUYWJsZURTTFBhY2thZ2UuZ2V0VGFibGUoKSwgbnVsbCwgInJlZiIsIG51bGwsIDAsIDEsIFBlcnNwZWN0aXZlU2VsZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRQZXJzcGVjdGl2ZVNlbGVjdGlvbl9SZWZUeXBlSnZtKCksIHRoZVR5cGVzUGFja2FnZS5nZXRKdm1UeXBlUmVmZXJlbmNlKCksIG51bGwsICJyZWZUeXBlSnZtIiwgbnVsbCwgMCwgMSwgUGVyc3BlY3RpdmVTZWxlY3Rpb24uY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MocGVyc3BlY3RpdmVUYWJsZUVDbGFzcywgUGVyc3BlY3RpdmVUYWJsZS5jbGFzcywgIlBlcnNwZWN0aXZlVGFibGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFUmVmZXJlbmNlKGdldFBlcnNwZWN0aXZlVGFibGVfUmVmKCksIHRoZVRhYmxlRFNMUGFja2FnZS5nZXRUYWJsZSgpLCBudWxsLCAicmVmIiwgbnVsbCwgMCwgMSwgUGVyc3BlY3RpdmVUYWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0UGVyc3BlY3RpdmVUYWJsZV9SZWZUeXBlSnZtKCksIHRoZVR5cGVzUGFja2FnZS5nZXRKdm1UeXBlUmVmZXJlbmNlKCksIG51bGwsICJyZWZUeXBlSnZtIiwgbnVsbCwgMCwgMSwgUGVyc3BlY3RpdmVUYWJsZS5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyhwZXJzcGVjdGl2ZUdyaWRFQ2xhc3MsIFBlcnNwZWN0aXZlR3JpZC5jbGFzcywgIlBlcnNwZWN0aXZlR3JpZCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0UGVyc3BlY3RpdmVHcmlkX1JlZigpLCB0aGVUYWJsZURTTFBhY2thZ2UuZ2V0VGFibGUoKSwgbnVsbCwgInJlZiIsIG51bGwsIDAsIDEsIFBlcnNwZWN0aXZlR3JpZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0UGVyc3BlY3RpdmVHcmlkX1JlZlR5cGVKdm0oKSwgdGhlVHlwZXNQYWNrYWdlLmdldEp2bVR5cGVSZWZlcmVuY2UoKSwgbnVsbCwgInJlZlR5cGVKdm0iLCBudWxsLCAwLCAxLCBQZXJzcGVjdGl2ZUdyaWQuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MocGVyc3BlY3RpdmVDaGFydEVDbGFzcywgUGVyc3BlY3RpdmVDaGFydC5jbGFzcywgIlBlcnNwZWN0aXZlQ2hhcnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFUmVmZXJlbmNlKGdldFBlcnNwZWN0aXZlQ2hhcnRfUmVmKCksIHRoZUNoYXJ0RFNMUGFja2FnZS5nZXRDaGFydCgpLCBudWxsLCAicmVmIiwgbnVsbCwgMCwgMSwgUGVyc3BlY3RpdmVDaGFydC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0UGVyc3BlY3RpdmVDaGFydF9SZWZUeXBlSnZtKCksIHRoZVR5cGVzUGFja2FnZS5nZXRKdm1UeXBlUmVmZXJlbmNlKCksIG51bGwsICJyZWZUeXBlSnZtIiwgbnVsbCwgMCwgMSwgUGVyc3BlY3RpdmVDaGFydC5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyhwZXJzcGVjdGl2ZVJlcG9ydEVDbGFzcywgUGVyc3BlY3RpdmVSZXBvcnQuY2xhc3MsICJQZXJzcGVjdGl2ZVJlcG9ydCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0UGVyc3BlY3RpdmVSZXBvcnRfUmVmKCksIHRoZVJlcG9ydERTTFBhY2thZ2UuZ2V0UmVwb3J0KCksIG51bGwsICJyZWYiLCBudWxsLCAwLCAxLCBQZXJzcGVjdGl2ZVJlcG9ydC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0UGVyc3BlY3RpdmVSZXBvcnRfUmVmVHlwZUp2bSgpLCB0aGVUeXBlc1BhY2thZ2UuZ2V0SnZtVHlwZVJlZmVyZW5jZSgpLCBudWxsLCAicmVmVHlwZUp2bSIsIG51bGwsIDAsIDEsIFBlcnNwZWN0aXZlUmVwb3J0LmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHBlcnNwZWN0aXZlT3JnYW5pemF0aW9uRUNsYXNzLCBQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbi5jbGFzcywgIlBlcnNwZWN0aXZlT3JnYW5pemF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZShnZXRQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbl9SZWYoKSwgdGhlT3JnYW5pemF0aW9uRFNMUGFja2FnZS5nZXRPcmdhbml6YXRpb24oKSwgbnVsbCwgInJlZiIsIG51bGwsIDAsIDEsIFBlcnNwZWN0aXZlT3JnYW5pemF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MocGVyc3BlY3RpdmVUb3BvbG9neUVDbGFzcywgUGVyc3BlY3RpdmVUb3BvbG9neS5jbGFzcywgIlBlcnNwZWN0aXZlVG9wb2xvZ3kiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFUmVmZXJlbmNlKGdldFBlcnNwZWN0aXZlVG9wb2xvZ3lfUmVmKCksIHRoZVRvcG9sb2d5RFNMUGFja2FnZS5nZXRUb3BvbG9neSgpLCBudWxsLCAicmVmIiwgbnVsbCwgMCwgMSwgUGVyc3BlY3RpdmVUb3BvbG9neS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0UGVyc3BlY3RpdmVUb3BvbG9neV9SZWZUeXBlSnZtKCksIHRoZVR5cGVzUGFja2FnZS5nZXRKdm1UeXBlUmVmZXJlbmNlKCksIG51bGwsICJyZWZUeXBlSnZtIiwgbnVsbCwgMCwgMSwgUGVyc3BlY3RpdmVUb3BvbG9neS5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyhwZXJzcGVjdGl2ZURpYWxvZ0VDbGFzcywgUGVyc3BlY3RpdmVEaWFsb2cuY2xhc3MsICJQZXJzcGVjdGl2ZURpYWxvZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0UGVyc3BlY3RpdmVEaWFsb2dfUmVmKCksIHRoZURpYWxvZ0RTTFBhY2thZ2UuZ2V0RGlhbG9nKCksIG51bGwsICJyZWYiLCBudWxsLCAwLCAxLCBQZXJzcGVjdGl2ZURpYWxvZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0UGVyc3BlY3RpdmVEaWFsb2dfUmVmVHlwZUp2bSgpLCB0aGVUeXBlc1BhY2thZ2UuZ2V0SnZtVHlwZVJlZmVyZW5jZSgpLCBudWxsLCAicmVmVHlwZUp2bSIsIG51bGwsIDAsIDEsIFBlcnNwZWN0aXZlRGlhbG9nLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHBlcnNwZWN0aXZlQlBNTkVDbGFzcywgUGVyc3BlY3RpdmVCUE1OLmNsYXNzLCAiUGVyc3BlY3RpdmVCUE1OIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCisJCS8vIEluaXRpYWxpemUgZW51bXMgYW5kIGFkZCBlbnVtIGxpdGVyYWxzCisJCWluaXRFRW51bShzYXNoT3JpZW50YXRpb25FRW51bSwgU2FzaE9yaWVudGF0aW9uLmNsYXNzLCAiU2FzaE9yaWVudGF0aW9uIik7CisJCWFkZEVFbnVtTGl0ZXJhbChzYXNoT3JpZW50YXRpb25FRW51bSwgU2FzaE9yaWVudGF0aW9uLkhPUklaT05UQUwpOworCQlhZGRFRW51bUxpdGVyYWwoc2FzaE9yaWVudGF0aW9uRUVudW0sIFNhc2hPcmllbnRhdGlvbi5WRVJUSUNBTCk7CisKKwkJLy8gSW5pdGlhbGl6ZSBkYXRhIHR5cGVzCisJCWluaXRFRGF0YVR5cGUoaW50ZXJuYWxFT2JqZWN0RURhdGFUeXBlLCBJbnRlcm5hbEVPYmplY3QuY2xhc3MsICJJbnRlcm5hbEVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCisJCS8vIENyZWF0ZSByZXNvdXJjZQorCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKKworCQkvLyBDcmVhdGUgYW5ub3RhdGlvbnMKKwkJLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZQorCQljcmVhdGVFY29yZUFubm90YXRpb25zKCk7CisJfQorCisJLyoqCisJICogSW5pdGlhbGl6ZXMgdGhlIGFubm90YXRpb25zIGZvciA8Yj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlPC9iPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFY29yZUFubm90YXRpb25zKCkgeworCQlTdHJpbmcgc291cmNlID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiOwkKKwkJYWRkQW5ub3RhdGlvbgorCQkgICh0aGlzLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAicm9vdFBhY2thZ2UiLCAicGVyc3BlY3RpdmVkc2wiCisJCSAgIH0pOworCX0KKworfSAvL1BlcnNwZWN0aXZlRHNsUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2ltcGwvUGVyc3BlY3RpdmVFbGVtZW50SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvaW1wbC9QZXJzcGVjdGl2ZUVsZW1lbnRJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFkZjg2OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2ltcGwvUGVyc3BlY3RpdmVFbGVtZW50SW1wbC5qYXZhCkBAIC0wLDAgKzEsMzM5IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRWxlbWVudDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBlcnNwZWN0aXZlIEVsZW1lbnQ8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZUVsZW1lbnRJbXBsI2dldEVsZW1lbnRJZCA8ZW0+RWxlbWVudCBJZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlRWxlbWVudEltcGwjZ2V0QWNjZXNzaWJpbGl0eVBocmFzZSA8ZW0+QWNjZXNzaWJpbGl0eSBQaHJhc2U8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZUVsZW1lbnRJbXBsI2dldENvbnRhaW5lckRhdGEgPGVtPkNvbnRhaW5lciBEYXRhPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVFbGVtZW50SW1wbCNnZXRFbGVtZW50cyA8ZW0+RWxlbWVudHM8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBQZXJzcGVjdGl2ZUVsZW1lbnRJbXBsIGV4dGVuZHMgUGVyc3BlY3RpdmVMYXp5UmVzb2x2ZXJJbXBsIGltcGxlbWVudHMgUGVyc3BlY3RpdmVFbGVtZW50IHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWxlbWVudElkKCkgPGVtPkVsZW1lbnQgSWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEVsZW1lbnRJZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9JRF9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbGVtZW50SWQoKSA8ZW0+RWxlbWVudCBJZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RWxlbWVudElkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGVsZW1lbnRJZCA9IEVMRU1FTlRfSURfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWNjZXNzaWJpbGl0eVBocmFzZSgpIDxlbT5BY2Nlc3NpYmlsaXR5IFBocmFzZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QWNjZXNzaWJpbGl0eVBocmFzZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDRVNTSUJJTElUWV9QSFJBU0VfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWNjZXNzaWJpbGl0eVBocmFzZSgpIDxlbT5BY2Nlc3NpYmlsaXR5IFBocmFzZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QWNjZXNzaWJpbGl0eVBocmFzZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBhY2Nlc3NpYmlsaXR5UGhyYXNlID0gQUNDRVNTSUJJTElUWV9QSFJBU0VfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udGFpbmVyRGF0YSgpIDxlbT5Db250YWluZXIgRGF0YTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q29udGFpbmVyRGF0YSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEFJTkVSX0RBVEFfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udGFpbmVyRGF0YSgpIDxlbT5Db250YWluZXIgRGF0YTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q29udGFpbmVyRGF0YSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBjb250YWluZXJEYXRhID0gQ09OVEFJTkVSX0RBVEFfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbGVtZW50cygpIDxlbT5FbGVtZW50czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRFbGVtZW50cygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFBlcnNwZWN0aXZlRWxlbWVudD4gZWxlbWVudHM7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUGVyc3BlY3RpdmVFbGVtZW50SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5MaXRlcmFscy5QRVJTUEVDVElWRV9FTEVNRU5UOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudElkKCkgeworCQlyZXR1cm4gZWxlbWVudElkOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEVsZW1lbnRJZChTdHJpbmcgbmV3RWxlbWVudElkKSB7CisJCVN0cmluZyBvbGRFbGVtZW50SWQgPSBlbGVtZW50SWQ7CisJCWVsZW1lbnRJZCA9IG5ld0VsZW1lbnRJZDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX0VMRU1FTlRfX0VMRU1FTlRfSUQsIG9sZEVsZW1lbnRJZCwgZWxlbWVudElkKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRBY2Nlc3NpYmlsaXR5UGhyYXNlKCkgeworCQlyZXR1cm4gYWNjZXNzaWJpbGl0eVBocmFzZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NpYmlsaXR5UGhyYXNlKFN0cmluZyBuZXdBY2Nlc3NpYmlsaXR5UGhyYXNlKSB7CisJCVN0cmluZyBvbGRBY2Nlc3NpYmlsaXR5UGhyYXNlID0gYWNjZXNzaWJpbGl0eVBocmFzZTsKKwkJYWNjZXNzaWJpbGl0eVBocmFzZSA9IG5ld0FjY2Vzc2liaWxpdHlQaHJhc2U7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9FTEVNRU5UX19BQ0NFU1NJQklMSVRZX1BIUkFTRSwgb2xkQWNjZXNzaWJpbGl0eVBocmFzZSwgYWNjZXNzaWJpbGl0eVBocmFzZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGFpbmVyRGF0YSgpIHsKKwkJcmV0dXJuIGNvbnRhaW5lckRhdGE7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q29udGFpbmVyRGF0YShTdHJpbmcgbmV3Q29udGFpbmVyRGF0YSkgeworCQlTdHJpbmcgb2xkQ29udGFpbmVyRGF0YSA9IGNvbnRhaW5lckRhdGE7CisJCWNvbnRhaW5lckRhdGEgPSBuZXdDb250YWluZXJEYXRhOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfRUxFTUVOVF9fQ09OVEFJTkVSX0RBVEEsIG9sZENvbnRhaW5lckRhdGEsIGNvbnRhaW5lckRhdGEpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8UGVyc3BlY3RpdmVFbGVtZW50PiBnZXRFbGVtZW50cygpIHsKKwkJaWYgKGVsZW1lbnRzID09IG51bGwpIHsKKwkJCWVsZW1lbnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFBlcnNwZWN0aXZlRWxlbWVudD4oUGVyc3BlY3RpdmVFbGVtZW50LmNsYXNzLCB0aGlzLCBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfRUxFTUVOVF9fRUxFTUVOVFMpOworCQl9CisJCXJldHVybiBlbGVtZW50czsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9FTEVNRU5UX19FTEVNRU5UUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEVsZW1lbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfRUxFTUVOVF9fRUxFTUVOVF9JRDoKKwkJCQlyZXR1cm4gZ2V0RWxlbWVudElkKCk7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9FTEVNRU5UX19BQ0NFU1NJQklMSVRZX1BIUkFTRToKKwkJCQlyZXR1cm4gZ2V0QWNjZXNzaWJpbGl0eVBocmFzZSgpOworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfRUxFTUVOVF9fQ09OVEFJTkVSX0RBVEE6CisJCQkJcmV0dXJuIGdldENvbnRhaW5lckRhdGEoKTsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX0VMRU1FTlRfX0VMRU1FTlRTOgorCQkJCXJldHVybiBnZXRFbGVtZW50cygpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9FTEVNRU5UX19FTEVNRU5UX0lEOgorCQkJCXNldEVsZW1lbnRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9FTEVNRU5UX19BQ0NFU1NJQklMSVRZX1BIUkFTRToKKwkJCQlzZXRBY2Nlc3NpYmlsaXR5UGhyYXNlKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX0VMRU1FTlRfX0NPTlRBSU5FUl9EQVRBOgorCQkJCXNldENvbnRhaW5lckRhdGEoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfRUxFTUVOVF9fRUxFTUVOVFM6CisJCQkJZ2V0RWxlbWVudHMoKS5jbGVhcigpOworCQkJCWdldEVsZW1lbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBQZXJzcGVjdGl2ZUVsZW1lbnQ+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfRUxFTUVOVF9fRUxFTUVOVF9JRDoKKwkJCQlzZXRFbGVtZW50SWQoRUxFTUVOVF9JRF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfRUxFTUVOVF9fQUNDRVNTSUJJTElUWV9QSFJBU0U6CisJCQkJc2V0QWNjZXNzaWJpbGl0eVBocmFzZShBQ0NFU1NJQklMSVRZX1BIUkFTRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfRUxFTUVOVF9fQ09OVEFJTkVSX0RBVEE6CisJCQkJc2V0Q29udGFpbmVyRGF0YShDT05UQUlORVJfREFUQV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfRUxFTUVOVF9fRUxFTUVOVFM6CisJCQkJZ2V0RWxlbWVudHMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfRUxFTUVOVF9fRUxFTUVOVF9JRDoKKwkJCQlyZXR1cm4gRUxFTUVOVF9JRF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudElkICE9IG51bGwgOiAhRUxFTUVOVF9JRF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudElkKTsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX0VMRU1FTlRfX0FDQ0VTU0lCSUxJVFlfUEhSQVNFOgorCQkJCXJldHVybiBBQ0NFU1NJQklMSVRZX1BIUkFTRV9FREVGQVVMVCA9PSBudWxsID8gYWNjZXNzaWJpbGl0eVBocmFzZSAhPSBudWxsIDogIUFDQ0VTU0lCSUxJVFlfUEhSQVNFX0VERUZBVUxULmVxdWFscyhhY2Nlc3NpYmlsaXR5UGhyYXNlKTsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX0VMRU1FTlRfX0NPTlRBSU5FUl9EQVRBOgorCQkJCXJldHVybiBDT05UQUlORVJfREFUQV9FREVGQVVMVCA9PSBudWxsID8gY29udGFpbmVyRGF0YSAhPSBudWxsIDogIUNPTlRBSU5FUl9EQVRBX0VERUZBVUxULmVxdWFscyhjb250YWluZXJEYXRhKTsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX0VMRU1FTlRfX0VMRU1FTlRTOgorCQkJCXJldHVybiBlbGVtZW50cyAhPSBudWxsICYmICFlbGVtZW50cy5pc0VtcHR5KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChlbGVtZW50SWQ6ICIpOworCQlyZXN1bHQuYXBwZW5kKGVsZW1lbnRJZCk7CisJCXJlc3VsdC5hcHBlbmQoIiwgYWNjZXNzaWJpbGl0eVBocmFzZTogIik7CisJCXJlc3VsdC5hcHBlbmQoYWNjZXNzaWJpbGl0eVBocmFzZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgY29udGFpbmVyRGF0YTogIik7CisJCXJlc3VsdC5hcHBlbmQoY29udGFpbmVyRGF0YSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL1BlcnNwZWN0aXZlRWxlbWVudEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2ltcGwvUGVyc3BlY3RpdmVHcmlkSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvaW1wbC9QZXJzcGVjdGl2ZUdyaWRJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIwYmIzMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2ltcGwvUGVyc3BlY3RpdmVHcmlkSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjczIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlR3JpZDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQudGFibGUuVGFibGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtVHlwZVJlZmVyZW5jZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBlcnNwZWN0aXZlIEdyaWQ8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZUdyaWRJbXBsI2dldFJlZiA8ZW0+UmVmPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVHcmlkSW1wbCNnZXRSZWZUeXBlSnZtIDxlbT5SZWYgVHlwZSBKdm08L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBQZXJzcGVjdGl2ZUdyaWRJbXBsIGV4dGVuZHMgUGVyc3BlY3RpdmVMYXp5UmVzb2x2ZXJJbXBsIGltcGxlbWVudHMgUGVyc3BlY3RpdmVHcmlkIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWYoKSA8ZW0+UmVmPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSZWYoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBUYWJsZSByZWY7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZUeXBlSnZtKCkgPGVtPlJlZiBUeXBlIEp2bTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmVmVHlwZUp2bSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEp2bVR5cGVSZWZlcmVuY2UgcmVmVHlwZUp2bTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBQZXJzcGVjdGl2ZUdyaWRJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUGVyc3BlY3RpdmVEc2xQYWNrYWdlLkxpdGVyYWxzLlBFUlNQRUNUSVZFX0dSSUQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRhYmxlIGdldFJlZigpIHsKKwkJaWYgKHJlZiAhPSBudWxsICYmIHJlZi5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkUmVmID0gKEludGVybmFsRU9iamVjdClyZWY7CisJCQlyZWYgPSAoVGFibGUpZVJlc29sdmVQcm94eShvbGRSZWYpOworCQkJaWYgKHJlZiAhPSBvbGRSZWYpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfR1JJRF9fUkVGLCBvbGRSZWYsIHJlZikpOworCQkJfQorCQl9CisJCXJldHVybiByZWY7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRhYmxlIGJhc2ljR2V0UmVmKCkgeworCQlyZXR1cm4gcmVmOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlZihUYWJsZSBuZXdSZWYpIHsKKwkJVGFibGUgb2xkUmVmID0gcmVmOworCQlyZWYgPSBuZXdSZWY7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9HUklEX19SRUYsIG9sZFJlZiwgcmVmKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEp2bVR5cGVSZWZlcmVuY2UgZ2V0UmVmVHlwZUp2bSgpIHsKKwkJaWYgKHJlZlR5cGVKdm0gIT0gbnVsbCAmJiByZWZUeXBlSnZtLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRSZWZUeXBlSnZtID0gKEludGVybmFsRU9iamVjdClyZWZUeXBlSnZtOworCQkJcmVmVHlwZUp2bSA9IChKdm1UeXBlUmVmZXJlbmNlKWVSZXNvbHZlUHJveHkob2xkUmVmVHlwZUp2bSk7CisJCQlpZiAocmVmVHlwZUp2bSAhPSBvbGRSZWZUeXBlSnZtKSB7CisJCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1JlZlR5cGVKdm0gPSAoSW50ZXJuYWxFT2JqZWN0KXJlZlR5cGVKdm07CisJCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG9sZFJlZlR5cGVKdm0uZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9HUklEX19SRUZfVFlQRV9KVk0sIG51bGwsIG51bGwpOworCQkJCWlmIChuZXdSZWZUeXBlSnZtLmVJbnRlcm5hbENvbnRhaW5lcigpID09IG51bGwpIHsKKwkJCQkJbXNncyA9IG5ld1JlZlR5cGVKdm0uZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9HUklEX19SRUZfVFlQRV9KVk0sIG51bGwsIG1zZ3MpOworCQkJCX0KKwkJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX0dSSURfX1JFRl9UWVBFX0pWTSwgb2xkUmVmVHlwZUp2bSwgcmVmVHlwZUp2bSkpOworCQkJfQorCQl9CisJCXJldHVybiByZWZUeXBlSnZtOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBKdm1UeXBlUmVmZXJlbmNlIGJhc2ljR2V0UmVmVHlwZUp2bSgpIHsKKwkJcmV0dXJuIHJlZlR5cGVKdm07CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmVmVHlwZUp2bShKdm1UeXBlUmVmZXJlbmNlIG5ld1JlZlR5cGVKdm0sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJSnZtVHlwZVJlZmVyZW5jZSBvbGRSZWZUeXBlSnZtID0gcmVmVHlwZUp2bTsKKwkJcmVmVHlwZUp2bSA9IG5ld1JlZlR5cGVKdm07CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9HUklEX19SRUZfVFlQRV9KVk0sIG9sZFJlZlR5cGVKdm0sIG5ld1JlZlR5cGVKdm0pOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlZlR5cGVKdm0oSnZtVHlwZVJlZmVyZW5jZSBuZXdSZWZUeXBlSnZtKSB7CisJCWlmIChuZXdSZWZUeXBlSnZtICE9IHJlZlR5cGVKdm0pIHsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKHJlZlR5cGVKdm0gIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcmVmVHlwZUp2bSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9HUklEX19SRUZfVFlQRV9KVk0sIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld1JlZlR5cGVKdm0gIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UmVmVHlwZUp2bSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9HUklEX19SRUZfVFlQRV9KVk0sIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0UmVmVHlwZUp2bShuZXdSZWZUeXBlSnZtLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9HUklEX19SRUZfVFlQRV9KVk0sIG5ld1JlZlR5cGVKdm0sIG5ld1JlZlR5cGVKdm0pKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9HUklEX19SRUZfVFlQRV9KVk06CisJCQkJcmV0dXJuIGJhc2ljU2V0UmVmVHlwZUp2bShudWxsLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfR1JJRF9fUkVGOgorCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0UmVmKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0UmVmKCk7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9HUklEX19SRUZfVFlQRV9KVk06CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRSZWZUeXBlSnZtKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0UmVmVHlwZUp2bSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9HUklEX19SRUY6CisJCQkJc2V0UmVmKChUYWJsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfR1JJRF9fUkVGX1RZUEVfSlZNOgorCQkJCXNldFJlZlR5cGVKdm0oKEp2bVR5cGVSZWZlcmVuY2UpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9HUklEX19SRUY6CisJCQkJc2V0UmVmKChUYWJsZSludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9HUklEX19SRUZfVFlQRV9KVk06CisJCQkJc2V0UmVmVHlwZUp2bSgoSnZtVHlwZVJlZmVyZW5jZSludWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX0dSSURfX1JFRjoKKwkJCQlyZXR1cm4gcmVmICE9IG51bGw7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9HUklEX19SRUZfVFlQRV9KVk06CisJCQkJcmV0dXJuIHJlZlR5cGVKdm0gIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCit9IC8vUGVyc3BlY3RpdmVHcmlkSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvaW1wbC9QZXJzcGVjdGl2ZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2ltcGwvUGVyc3BlY3RpdmVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdlOGE3NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2ltcGwvUGVyc3BlY3RpdmVJbXBsLmphdmEKQEAgLTAsMCArMSw2NzEgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnN7ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYWN0aW9uLkFjdGlvblRvb2xiYXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJsaXAuQmxpcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJsaXAuQmxpcFVzZXJUYXNrOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRWxlbWVudDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy5Kdm1UeXBlUmVmZXJlbmNlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGVyc3BlY3RpdmU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZUltcGwjaXNEZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZUltcGwjZ2V0RGVzY3JpcHRpb25WYWx1ZSA8ZW0+RGVzY3JpcHRpb24gVmFsdWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZUltcGwjZ2V0SWNvblVSSSA8ZW0+SWNvbiBVUkk8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZUltcGwjZ2V0QWNjZXNzaWJpbGl0eVBocmFzZSA8ZW0+QWNjZXNzaWJpbGl0eSBQaHJhc2U8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZUltcGwjZ2V0UHJvY2VzcyA8ZW0+UHJvY2VzczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlSW1wbCNnZXRVc2VyVGFzayA8ZW0+VXNlciBUYXNrPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVJbXBsI2dldFRvb2xiYXIgPGVtPlRvb2xiYXI8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZUltcGwjZ2V0VG9vbGJhclR5cGVKdm0gPGVtPlRvb2xiYXIgVHlwZSBKdm08L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZUltcGwjZ2V0RWxlbWVudHMgPGVtPkVsZW1lbnRzPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgUGVyc3BlY3RpdmVJbXBsIGV4dGVuZHMgUGVyc3BlY3RpdmVCYXNlSW1wbCBpbXBsZW1lbnRzIFBlcnNwZWN0aXZlIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNEZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNEZXNjcmlwdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERFU0NSSVBUSU9OX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Rlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0Rlc2NyaXB0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uVmFsdWUoKSA8ZW0+RGVzY3JpcHRpb24gVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX1ZBTFVFX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uVmFsdWUoKSA8ZW0+RGVzY3JpcHRpb24gVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb25WYWx1ZSA9IERFU0NSSVBUSU9OX1ZBTFVFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEljb25VUkkoKSA8ZW0+SWNvbiBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEljb25VUkkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fVVJJX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEljb25VUkkoKSA8ZW0+SWNvbiBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEljb25VUkkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgaWNvblVSSSA9IElDT05fVVJJX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2Vzc2liaWxpdHlQaHJhc2UoKSA8ZW0+QWNjZXNzaWJpbGl0eSBQaHJhc2U8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEFjY2Vzc2liaWxpdHlQaHJhc2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ0VTU0lCSUxJVFlfUEhSQVNFX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2Vzc2liaWxpdHlQaHJhc2UoKSA8ZW0+QWNjZXNzaWJpbGl0eSBQaHJhc2U8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEFjY2Vzc2liaWxpdHlQaHJhc2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgYWNjZXNzaWJpbGl0eVBocmFzZSA9IEFDQ0VTU0lCSUxJVFlfUEhSQVNFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvY2VzcygpIDxlbT5Qcm9jZXNzPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRQcm9jZXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQmxpcCBwcm9jZXNzOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXNlclRhc2soKSA8ZW0+VXNlciBUYXNrPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRVc2VyVGFzaygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEJsaXBVc2VyVGFzayB1c2VyVGFzazsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRvb2xiYXIoKSA8ZW0+VG9vbGJhcjwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VG9vbGJhcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEFjdGlvblRvb2xiYXIgdG9vbGJhcjsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRvb2xiYXJUeXBlSnZtKCkgPGVtPlRvb2xiYXIgVHlwZSBKdm08L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFRvb2xiYXJUeXBlSnZtKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSnZtVHlwZVJlZmVyZW5jZSB0b29sYmFyVHlwZUp2bTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVsZW1lbnRzKCkgPGVtPkVsZW1lbnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEVsZW1lbnRzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8UGVyc3BlY3RpdmVFbGVtZW50PiBlbGVtZW50czsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBQZXJzcGVjdGl2ZUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuTGl0ZXJhbHMuUEVSU1BFQ1RJVkU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNEZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIGRlc2NyaXB0aW9uOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKGJvb2xlYW4gbmV3RGVzY3JpcHRpb24pIHsKKwkJYm9vbGVhbiBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uVmFsdWUoKSB7CisJCXJldHVybiBkZXNjcmlwdGlvblZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uVmFsdWUoU3RyaW5nIG5ld0Rlc2NyaXB0aW9uVmFsdWUpIHsKKwkJU3RyaW5nIG9sZERlc2NyaXB0aW9uVmFsdWUgPSBkZXNjcmlwdGlvblZhbHVlOworCQlkZXNjcmlwdGlvblZhbHVlID0gbmV3RGVzY3JpcHRpb25WYWx1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX19ERVNDUklQVElPTl9WQUxVRSwgb2xkRGVzY3JpcHRpb25WYWx1ZSwgZGVzY3JpcHRpb25WYWx1ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0SWNvblVSSSgpIHsKKwkJcmV0dXJuIGljb25VUkk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0SWNvblVSSShTdHJpbmcgbmV3SWNvblVSSSkgeworCQlTdHJpbmcgb2xkSWNvblVSSSA9IGljb25VUkk7CisJCWljb25VUkkgPSBuZXdJY29uVVJJOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfX0lDT05fVVJJLCBvbGRJY29uVVJJLCBpY29uVVJJKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRBY2Nlc3NpYmlsaXR5UGhyYXNlKCkgeworCQlyZXR1cm4gYWNjZXNzaWJpbGl0eVBocmFzZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NpYmlsaXR5UGhyYXNlKFN0cmluZyBuZXdBY2Nlc3NpYmlsaXR5UGhyYXNlKSB7CisJCVN0cmluZyBvbGRBY2Nlc3NpYmlsaXR5UGhyYXNlID0gYWNjZXNzaWJpbGl0eVBocmFzZTsKKwkJYWNjZXNzaWJpbGl0eVBocmFzZSA9IG5ld0FjY2Vzc2liaWxpdHlQaHJhc2U7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9fQUNDRVNTSUJJTElUWV9QSFJBU0UsIG9sZEFjY2Vzc2liaWxpdHlQaHJhc2UsIGFjY2Vzc2liaWxpdHlQaHJhc2UpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQmxpcCBnZXRQcm9jZXNzKCkgeworCQlpZiAocHJvY2VzcyAhPSBudWxsICYmIHByb2Nlc3MuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFByb2Nlc3MgPSAoSW50ZXJuYWxFT2JqZWN0KXByb2Nlc3M7CisJCQlwcm9jZXNzID0gKEJsaXApZVJlc29sdmVQcm94eShvbGRQcm9jZXNzKTsKKwkJCWlmIChwcm9jZXNzICE9IG9sZFByb2Nlc3MpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfX1BST0NFU1MsIG9sZFByb2Nlc3MsIHByb2Nlc3MpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcHJvY2VzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQmxpcCBiYXNpY0dldFByb2Nlc3MoKSB7CisJCXJldHVybiBwcm9jZXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFByb2Nlc3MoQmxpcCBuZXdQcm9jZXNzKSB7CisJCUJsaXAgb2xkUHJvY2VzcyA9IHByb2Nlc3M7CisJCXByb2Nlc3MgPSBuZXdQcm9jZXNzOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfX1BST0NFU1MsIG9sZFByb2Nlc3MsIHByb2Nlc3MpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQmxpcFVzZXJUYXNrIGdldFVzZXJUYXNrKCkgeworCQlpZiAodXNlclRhc2sgIT0gbnVsbCAmJiB1c2VyVGFzay5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkVXNlclRhc2sgPSAoSW50ZXJuYWxFT2JqZWN0KXVzZXJUYXNrOworCQkJdXNlclRhc2sgPSAoQmxpcFVzZXJUYXNrKWVSZXNvbHZlUHJveHkob2xkVXNlclRhc2spOworCQkJaWYgKHVzZXJUYXNrICE9IG9sZFVzZXJUYXNrKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX19VU0VSX1RBU0ssIG9sZFVzZXJUYXNrLCB1c2VyVGFzaykpOworCQkJfQorCQl9CisJCXJldHVybiB1c2VyVGFzazsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQmxpcFVzZXJUYXNrIGJhc2ljR2V0VXNlclRhc2soKSB7CisJCXJldHVybiB1c2VyVGFzazsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRVc2VyVGFzayhCbGlwVXNlclRhc2sgbmV3VXNlclRhc2spIHsKKwkJQmxpcFVzZXJUYXNrIG9sZFVzZXJUYXNrID0gdXNlclRhc2s7CisJCXVzZXJUYXNrID0gbmV3VXNlclRhc2s7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9fVVNFUl9UQVNLLCBvbGRVc2VyVGFzaywgdXNlclRhc2spKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWN0aW9uVG9vbGJhciBnZXRUb29sYmFyKCkgeworCQlpZiAodG9vbGJhciAhPSBudWxsICYmIHRvb2xiYXIuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFRvb2xiYXIgPSAoSW50ZXJuYWxFT2JqZWN0KXRvb2xiYXI7CisJCQl0b29sYmFyID0gKEFjdGlvblRvb2xiYXIpZVJlc29sdmVQcm94eShvbGRUb29sYmFyKTsKKwkJCWlmICh0b29sYmFyICE9IG9sZFRvb2xiYXIpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfX1RPT0xCQVIsIG9sZFRvb2xiYXIsIHRvb2xiYXIpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdG9vbGJhcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWN0aW9uVG9vbGJhciBiYXNpY0dldFRvb2xiYXIoKSB7CisJCXJldHVybiB0b29sYmFyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFRvb2xiYXIoQWN0aW9uVG9vbGJhciBuZXdUb29sYmFyKSB7CisJCUFjdGlvblRvb2xiYXIgb2xkVG9vbGJhciA9IHRvb2xiYXI7CisJCXRvb2xiYXIgPSBuZXdUb29sYmFyOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfX1RPT0xCQVIsIG9sZFRvb2xiYXIsIHRvb2xiYXIpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSnZtVHlwZVJlZmVyZW5jZSBnZXRUb29sYmFyVHlwZUp2bSgpIHsKKwkJaWYgKHRvb2xiYXJUeXBlSnZtICE9IG51bGwgJiYgdG9vbGJhclR5cGVKdm0uZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFRvb2xiYXJUeXBlSnZtID0gKEludGVybmFsRU9iamVjdCl0b29sYmFyVHlwZUp2bTsKKwkJCXRvb2xiYXJUeXBlSnZtID0gKEp2bVR5cGVSZWZlcmVuY2UpZVJlc29sdmVQcm94eShvbGRUb29sYmFyVHlwZUp2bSk7CisJCQlpZiAodG9vbGJhclR5cGVKdm0gIT0gb2xkVG9vbGJhclR5cGVKdm0pIHsKKwkJCQlJbnRlcm5hbEVPYmplY3QgbmV3VG9vbGJhclR5cGVKdm0gPSAoSW50ZXJuYWxFT2JqZWN0KXRvb2xiYXJUeXBlSnZtOworCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGRUb29sYmFyVHlwZUp2bS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX19UT09MQkFSX1RZUEVfSlZNLCBudWxsLCBudWxsKTsKKwkJCQlpZiAobmV3VG9vbGJhclR5cGVKdm0uZUludGVybmFsQ29udGFpbmVyKCkgPT0gbnVsbCkgeworCQkJCQltc2dzID0gbmV3VG9vbGJhclR5cGVKdm0uZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9fVE9PTEJBUl9UWVBFX0pWTSwgbnVsbCwgbXNncyk7CisJCQkJfQorCQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfX1RPT0xCQVJfVFlQRV9KVk0sIG9sZFRvb2xiYXJUeXBlSnZtLCB0b29sYmFyVHlwZUp2bSkpOworCQkJfQorCQl9CisJCXJldHVybiB0b29sYmFyVHlwZUp2bTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSnZtVHlwZVJlZmVyZW5jZSBiYXNpY0dldFRvb2xiYXJUeXBlSnZtKCkgeworCQlyZXR1cm4gdG9vbGJhclR5cGVKdm07CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VG9vbGJhclR5cGVKdm0oSnZtVHlwZVJlZmVyZW5jZSBuZXdUb29sYmFyVHlwZUp2bSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlKdm1UeXBlUmVmZXJlbmNlIG9sZFRvb2xiYXJUeXBlSnZtID0gdG9vbGJhclR5cGVKdm07CisJCXRvb2xiYXJUeXBlSnZtID0gbmV3VG9vbGJhclR5cGVKdm07CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9fVE9PTEJBUl9UWVBFX0pWTSwgb2xkVG9vbGJhclR5cGVKdm0sIG5ld1Rvb2xiYXJUeXBlSnZtKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUb29sYmFyVHlwZUp2bShKdm1UeXBlUmVmZXJlbmNlIG5ld1Rvb2xiYXJUeXBlSnZtKSB7CisJCWlmIChuZXdUb29sYmFyVHlwZUp2bSAhPSB0b29sYmFyVHlwZUp2bSkgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAodG9vbGJhclR5cGVKdm0gIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdG9vbGJhclR5cGVKdm0pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfX1RPT0xCQVJfVFlQRV9KVk0sIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld1Rvb2xiYXJUeXBlSnZtICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1Rvb2xiYXJUeXBlSnZtKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX19UT09MQkFSX1RZUEVfSlZNLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldFRvb2xiYXJUeXBlSnZtKG5ld1Rvb2xiYXJUeXBlSnZtLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9fVE9PTEJBUl9UWVBFX0pWTSwgbmV3VG9vbGJhclR5cGVKdm0sIG5ld1Rvb2xiYXJUeXBlSnZtKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PFBlcnNwZWN0aXZlRWxlbWVudD4gZ2V0RWxlbWVudHMoKSB7CisJCWlmIChlbGVtZW50cyA9PSBudWxsKSB7CisJCQllbGVtZW50cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxQZXJzcGVjdGl2ZUVsZW1lbnQ+KFBlcnNwZWN0aXZlRWxlbWVudC5jbGFzcywgdGhpcywgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX19FTEVNRU5UUyk7CisJCX0KKwkJcmV0dXJuIGVsZW1lbnRzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX19UT09MQkFSX1RZUEVfSlZNOgorCQkJCXJldHVybiBiYXNpY1NldFRvb2xiYXJUeXBlSnZtKG51bGwsIG1zZ3MpOworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfX0VMRU1FTlRTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RWxlbWVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9fREVTQ1JJUFRJT046CisJCQkJcmV0dXJuIGlzRGVzY3JpcHRpb24oKTsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX19ERVNDUklQVElPTl9WQUxVRToKKwkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25WYWx1ZSgpOworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfX0lDT05fVVJJOgorCQkJCXJldHVybiBnZXRJY29uVVJJKCk7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9fQUNDRVNTSUJJTElUWV9QSFJBU0U6CisJCQkJcmV0dXJuIGdldEFjY2Vzc2liaWxpdHlQaHJhc2UoKTsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX19QUk9DRVNTOgorCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0UHJvY2VzcygpOworCQkJCXJldHVybiBiYXNpY0dldFByb2Nlc3MoKTsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX19VU0VSX1RBU0s6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRVc2VyVGFzaygpOworCQkJCXJldHVybiBiYXNpY0dldFVzZXJUYXNrKCk7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9fVE9PTEJBUjoKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFRvb2xiYXIoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRUb29sYmFyKCk7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9fVE9PTEJBUl9UWVBFX0pWTToKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFRvb2xiYXJUeXBlSnZtKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0VG9vbGJhclR5cGVKdm0oKTsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX19FTEVNRU5UUzoKKwkJCQlyZXR1cm4gZ2V0RWxlbWVudHMoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfX0RFU0NSSVBUSU9OOgorCQkJCXNldERlc2NyaXB0aW9uKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9fREVTQ1JJUFRJT05fVkFMVUU6CisJCQkJc2V0RGVzY3JpcHRpb25WYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9fSUNPTl9VUkk6CisJCQkJc2V0SWNvblVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9fQUNDRVNTSUJJTElUWV9QSFJBU0U6CisJCQkJc2V0QWNjZXNzaWJpbGl0eVBocmFzZSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9fUFJPQ0VTUzoKKwkJCQlzZXRQcm9jZXNzKChCbGlwKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9fVVNFUl9UQVNLOgorCQkJCXNldFVzZXJUYXNrKChCbGlwVXNlclRhc2spbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX19UT09MQkFSOgorCQkJCXNldFRvb2xiYXIoKEFjdGlvblRvb2xiYXIpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX19UT09MQkFSX1RZUEVfSlZNOgorCQkJCXNldFRvb2xiYXJUeXBlSnZtKChKdm1UeXBlUmVmZXJlbmNlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9fRUxFTUVOVFM6CisJCQkJZ2V0RWxlbWVudHMoKS5jbGVhcigpOworCQkJCWdldEVsZW1lbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBQZXJzcGVjdGl2ZUVsZW1lbnQ+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfX0RFU0NSSVBUSU9OOgorCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9fREVTQ1JJUFRJT05fVkFMVUU6CisJCQkJc2V0RGVzY3JpcHRpb25WYWx1ZShERVNDUklQVElPTl9WQUxVRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfX0lDT05fVVJJOgorCQkJCXNldEljb25VUkkoSUNPTl9VUklfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX19BQ0NFU1NJQklMSVRZX1BIUkFTRToKKwkJCQlzZXRBY2Nlc3NpYmlsaXR5UGhyYXNlKEFDQ0VTU0lCSUxJVFlfUEhSQVNFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9fUFJPQ0VTUzoKKwkJCQlzZXRQcm9jZXNzKChCbGlwKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX19VU0VSX1RBU0s6CisJCQkJc2V0VXNlclRhc2soKEJsaXBVc2VyVGFzayludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9fVE9PTEJBUjoKKwkJCQlzZXRUb29sYmFyKChBY3Rpb25Ub29sYmFyKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX19UT09MQkFSX1RZUEVfSlZNOgorCQkJCXNldFRvb2xiYXJUeXBlSnZtKChKdm1UeXBlUmVmZXJlbmNlKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX19FTEVNRU5UUzoKKwkJCQlnZXRFbGVtZW50cygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9fREVTQ1JJUFRJT046CisJCQkJcmV0dXJuIGRlc2NyaXB0aW9uICE9IERFU0NSSVBUSU9OX0VERUZBVUxUOworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfX0RFU0NSSVBUSU9OX1ZBTFVFOgorCQkJCXJldHVybiBERVNDUklQVElPTl9WQUxVRV9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb25WYWx1ZSAhPSBudWxsIDogIURFU0NSSVBUSU9OX1ZBTFVFX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvblZhbHVlKTsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX19JQ09OX1VSSToKKwkJCQlyZXR1cm4gSUNPTl9VUklfRURFRkFVTFQgPT0gbnVsbCA/IGljb25VUkkgIT0gbnVsbCA6ICFJQ09OX1VSSV9FREVGQVVMVC5lcXVhbHMoaWNvblVSSSk7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9fQUNDRVNTSUJJTElUWV9QSFJBU0U6CisJCQkJcmV0dXJuIEFDQ0VTU0lCSUxJVFlfUEhSQVNFX0VERUZBVUxUID09IG51bGwgPyBhY2Nlc3NpYmlsaXR5UGhyYXNlICE9IG51bGwgOiAhQUNDRVNTSUJJTElUWV9QSFJBU0VfRURFRkFVTFQuZXF1YWxzKGFjY2Vzc2liaWxpdHlQaHJhc2UpOworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfX1BST0NFU1M6CisJCQkJcmV0dXJuIHByb2Nlc3MgIT0gbnVsbDsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX19VU0VSX1RBU0s6CisJCQkJcmV0dXJuIHVzZXJUYXNrICE9IG51bGw7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9fVE9PTEJBUjoKKwkJCQlyZXR1cm4gdG9vbGJhciAhPSBudWxsOworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfX1RPT0xCQVJfVFlQRV9KVk06CisJCQkJcmV0dXJuIHRvb2xiYXJUeXBlSnZtICE9IG51bGw7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9fRUxFTUVOVFM6CisJCQkJcmV0dXJuIGVsZW1lbnRzICE9IG51bGwgJiYgIWVsZW1lbnRzLmlzRW1wdHkoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7CisJCXJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb25WYWx1ZTogIik7CisJCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb25WYWx1ZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgaWNvblVSSTogIik7CisJCXJlc3VsdC5hcHBlbmQoaWNvblVSSSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgYWNjZXNzaWJpbGl0eVBocmFzZTogIik7CisJCXJlc3VsdC5hcHBlbmQoYWNjZXNzaWJpbGl0eVBocmFzZSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL1BlcnNwZWN0aXZlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvaW1wbC9QZXJzcGVjdGl2ZUxhenlSZXNvbHZlckltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2ltcGwvUGVyc3BlY3RpdmVMYXp5UmVzb2x2ZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU1Yzg2ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2ltcGwvUGVyc3BlY3RpdmVMYXp5UmVzb2x2ZXJJbXBsLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yc3sgIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5NaW5pbWFsRU9iamVjdEltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wueHRleHQubGF6eXJlc29sdmVyLmFwaS5FY29yZVV0aWwzOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUxhenlSZXNvbHZlcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBlcnNwZWN0aXZlIExhenkgUmVzb2x2ZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBQZXJzcGVjdGl2ZUxhenlSZXNvbHZlckltcGwgZXh0ZW5kcyBNaW5pbWFsRU9iamVjdEltcGwuQ29udGFpbmVyIGltcGxlbWVudHMgUGVyc3BlY3RpdmVMYXp5UmVzb2x2ZXIgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBQZXJzcGVjdGl2ZUxhenlSZXNvbHZlckltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuTGl0ZXJhbHMuUEVSU1BFQ1RJVkVfTEFaWV9SRVNPTFZFUjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRU9iamVjdCBlUmVzb2x2ZVByb3h5KGZpbmFsIEludGVybmFsRU9iamVjdCBwcm94eSkgeworCQlSZXNvdXJjZSBfZVJlc291cmNlID0gdGhpcy5lUmVzb3VyY2UoKTsKKwkJUmVzb3VyY2VTZXQgX3Jlc291cmNlU2V0ID0gX2VSZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOworCQlyZXR1cm4gRWNvcmVVdGlsMy5yZXNvbHZlKHByb3h5LCBfcmVzb3VyY2VTZXQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUludm9rZShpbnQgb3BlcmF0aW9uSUQsIEVMaXN0PD8+IGFyZ3VtZW50cykgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24geworCQlzd2l0Y2ggKG9wZXJhdGlvbklEKSB7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9MQVpZX1JFU09MVkVSX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDoKKwkJCQlyZXR1cm4gZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KWFyZ3VtZW50cy5nZXQoMCkpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52b2tlKG9wZXJhdGlvbklELCBhcmd1bWVudHMpOworCX0KKworfSAvL1BlcnNwZWN0aXZlTGF6eVJlc29sdmVySW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvaW1wbC9QZXJzcGVjdGl2ZU1vZGVsSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvaW1wbC9QZXJzcGVjdGl2ZU1vZGVsSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMTM1ODYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9pbXBsL1BlcnNwZWN0aXZlTW9kZWxJbXBsLmphdmEKQEAgLTAsMCArMSwxNjMgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnN7ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuTWluaW1hbEVPYmplY3RJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBlcnNwZWN0aXZlIE1vZGVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVNb2RlbEltcGwjZ2V0UGFja2FnZXMgPGVtPlBhY2thZ2VzPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgUGVyc3BlY3RpdmVNb2RlbEltcGwgZXh0ZW5kcyBNaW5pbWFsRU9iamVjdEltcGwuQ29udGFpbmVyIGltcGxlbWVudHMgUGVyc3BlY3RpdmVNb2RlbCB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFja2FnZXMoKSA8ZW0+UGFja2FnZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UGFja2FnZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxQZXJzcGVjdGl2ZVBhY2thZ2U+IHBhY2thZ2VzOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFBlcnNwZWN0aXZlTW9kZWxJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUGVyc3BlY3RpdmVEc2xQYWNrYWdlLkxpdGVyYWxzLlBFUlNQRUNUSVZFX01PREVMOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxQZXJzcGVjdGl2ZVBhY2thZ2U+IGdldFBhY2thZ2VzKCkgeworCQlpZiAocGFja2FnZXMgPT0gbnVsbCkgeworCQkJcGFja2FnZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8UGVyc3BlY3RpdmVQYWNrYWdlPihQZXJzcGVjdGl2ZVBhY2thZ2UuY2xhc3MsIHRoaXMsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9NT0RFTF9fUEFDS0FHRVMpOworCQl9CisJCXJldHVybiBwYWNrYWdlczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9NT0RFTF9fUEFDS0FHRVM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQYWNrYWdlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX01PREVMX19QQUNLQUdFUzoKKwkJCQlyZXR1cm4gZ2V0UGFja2FnZXMoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfTU9ERUxfX1BBQ0tBR0VTOgorCQkJCWdldFBhY2thZ2VzKCkuY2xlYXIoKTsKKwkJCQlnZXRQYWNrYWdlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUGVyc3BlY3RpdmVQYWNrYWdlPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX01PREVMX19QQUNLQUdFUzoKKwkJCQlnZXRQYWNrYWdlcygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9NT0RFTF9fUEFDS0FHRVM6CisJCQkJcmV0dXJuIHBhY2thZ2VzICE9IG51bGwgJiYgIXBhY2thZ2VzLmlzRW1wdHkoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCit9IC8vUGVyc3BlY3RpdmVNb2RlbEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2ltcGwvUGVyc3BlY3RpdmVPcmdhbml6YXRpb25JbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9pbXBsL1BlcnNwZWN0aXZlT3JnYW5pemF0aW9uSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlOWQ3NzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9pbXBsL1BlcnNwZWN0aXZlT3JnYW5pemF0aW9uSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTY4IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0Lm9yZ2FuaXphdGlvbmRzbC5Pcmdhbml6YXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlT3JnYW5pemF0aW9uOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGVyc3BlY3RpdmUgT3JnYW5pemF0aW9uPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVPcmdhbml6YXRpb25JbXBsI2dldFJlZiA8ZW0+UmVmPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgUGVyc3BlY3RpdmVPcmdhbml6YXRpb25JbXBsIGV4dGVuZHMgUGVyc3BlY3RpdmVMYXp5UmVzb2x2ZXJJbXBsIGltcGxlbWVudHMgUGVyc3BlY3RpdmVPcmdhbml6YXRpb24geworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZigpIDxlbT5SZWY8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFJlZigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIE9yZ2FuaXphdGlvbiByZWY7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUGVyc3BlY3RpdmVPcmdhbml6YXRpb25JbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUGVyc3BlY3RpdmVEc2xQYWNrYWdlLkxpdGVyYWxzLlBFUlNQRUNUSVZFX09SR0FOSVpBVElPTjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgT3JnYW5pemF0aW9uIGdldFJlZigpIHsKKwkJaWYgKHJlZiAhPSBudWxsICYmIHJlZi5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkUmVmID0gKEludGVybmFsRU9iamVjdClyZWY7CisJCQlyZWYgPSAoT3JnYW5pemF0aW9uKWVSZXNvbHZlUHJveHkob2xkUmVmKTsKKwkJCWlmIChyZWYgIT0gb2xkUmVmKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX09SR0FOSVpBVElPTl9fUkVGLCBvbGRSZWYsIHJlZikpOworCQkJfQorCQl9CisJCXJldHVybiByZWY7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE9yZ2FuaXphdGlvbiBiYXNpY0dldFJlZigpIHsKKwkJcmV0dXJuIHJlZjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZWYoT3JnYW5pemF0aW9uIG5ld1JlZikgeworCQlPcmdhbml6YXRpb24gb2xkUmVmID0gcmVmOworCQlyZWYgPSBuZXdSZWY7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9PUkdBTklaQVRJT05fX1JFRiwgb2xkUmVmLCByZWYpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9PUkdBTklaQVRJT05fX1JFRjoKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFJlZigpOworCQkJCXJldHVybiBiYXNpY0dldFJlZigpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9PUkdBTklaQVRJT05fX1JFRjoKKwkJCQlzZXRSZWYoKE9yZ2FuaXphdGlvbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX09SR0FOSVpBVElPTl9fUkVGOgorCQkJCXNldFJlZigoT3JnYW5pemF0aW9uKW51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfT1JHQU5JWkFUSU9OX19SRUY6CisJCQkJcmV0dXJuIHJlZiAhPSBudWxsOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKK30gLy9QZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbkltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2ltcGwvUGVyc3BlY3RpdmVQYWNrYWdlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvaW1wbC9QZXJzcGVjdGl2ZVBhY2thZ2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg3ZDE1NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2ltcGwvUGVyc3BlY3RpdmVQYWNrYWdlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTYzIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXMuaW1wbC5MUGFja2FnZUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGVyc3BlY3RpdmUgUGFja2FnZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlUGFja2FnZUltcGwjZ2V0UGVyc3BlY3RpdmVzIDxlbT5QZXJzcGVjdGl2ZXM8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBQZXJzcGVjdGl2ZVBhY2thZ2VJbXBsIGV4dGVuZHMgTFBhY2thZ2VJbXBsIGltcGxlbWVudHMgUGVyc3BlY3RpdmVQYWNrYWdlIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJzcGVjdGl2ZXMoKSA8ZW0+UGVyc3BlY3RpdmVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBlcnNwZWN0aXZlcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFBlcnNwZWN0aXZlPiBwZXJzcGVjdGl2ZXM7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUGVyc3BlY3RpdmVQYWNrYWdlSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5MaXRlcmFscy5QRVJTUEVDVElWRV9QQUNLQUdFOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxQZXJzcGVjdGl2ZT4gZ2V0UGVyc3BlY3RpdmVzKCkgeworCQlpZiAocGVyc3BlY3RpdmVzID09IG51bGwpIHsKKwkJCXBlcnNwZWN0aXZlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxQZXJzcGVjdGl2ZT4oUGVyc3BlY3RpdmUuY2xhc3MsIHRoaXMsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9QQUNLQUdFX19QRVJTUEVDVElWRVMpOworCQl9CisJCXJldHVybiBwZXJzcGVjdGl2ZXM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfUEFDS0FHRV9fUEVSU1BFQ1RJVkVTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UGVyc3BlY3RpdmVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfUEFDS0FHRV9fUEVSU1BFQ1RJVkVTOgorCQkJCXJldHVybiBnZXRQZXJzcGVjdGl2ZXMoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfUEFDS0FHRV9fUEVSU1BFQ1RJVkVTOgorCQkJCWdldFBlcnNwZWN0aXZlcygpLmNsZWFyKCk7CisJCQkJZ2V0UGVyc3BlY3RpdmVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBQZXJzcGVjdGl2ZT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9QQUNLQUdFX19QRVJTUEVDVElWRVM6CisJCQkJZ2V0UGVyc3BlY3RpdmVzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1BBQ0tBR0VfX1BFUlNQRUNUSVZFUzoKKwkJCQlyZXR1cm4gcGVyc3BlY3RpdmVzICE9IG51bGwgJiYgIXBlcnNwZWN0aXZlcy5pc0VtcHR5KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworfSAvL1BlcnNwZWN0aXZlUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2ltcGwvUGVyc3BlY3RpdmVQYXJ0SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvaW1wbC9QZXJzcGVjdGl2ZVBhcnRJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc3OGQ1MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2ltcGwvUGVyc3BlY3RpdmVQYXJ0SW1wbC5qYXZhCkBAIC0wLDAgKzEsNDE2IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlVmlldzsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBlcnNwZWN0aXZlIFBhcnQ8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZVBhcnRJbXBsI2lzRGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVQYXJ0SW1wbCNnZXREZXNjcmlwdGlvblZhbHVlIDxlbT5EZXNjcmlwdGlvbiBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlUGFydEltcGwjZ2V0SWNvblVSSSA8ZW0+SWNvbiBVUkk8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZVBhcnRJbXBsI2dldFZpZXcgPGVtPlZpZXc8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZVBhcnRJbXBsI2lzSXNDbG9zYWJsZSA8ZW0+SXMgQ2xvc2FibGU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBQZXJzcGVjdGl2ZVBhcnRJbXBsIGV4dGVuZHMgUGVyc3BlY3RpdmVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFBlcnNwZWN0aXZlUGFydCB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzRGVzY3JpcHRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBERVNDUklQVElPTl9FREVGQVVMVCA9IGZhbHNlOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNEZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNEZXNjcmlwdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvblZhbHVlKCkgPGVtPkRlc2NyaXB0aW9uIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvblZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9WQUxVRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvblZhbHVlKCkgPGVtPkRlc2NyaXB0aW9uIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvblZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uVmFsdWUgPSBERVNDUklQVElPTl9WQUxVRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJY29uVVJJKCkgPGVtPkljb24gVVJJPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJY29uVVJJKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1VSSV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJY29uVVJJKCkgPGVtPkljb24gVVJJPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJY29uVVJJKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGljb25VUkkgPSBJQ09OX1VSSV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZpZXcoKSA8ZW0+VmlldzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VmlldygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFBlcnNwZWN0aXZlVmlldyB2aWV3OworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNDbG9zYWJsZSgpIDxlbT5JcyBDbG9zYWJsZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNJc0Nsb3NhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfQ0xPU0FCTEVfRURFRkFVTFQgPSBmYWxzZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNDbG9zYWJsZSgpIDxlbT5JcyBDbG9zYWJsZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNJc0Nsb3NhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Nsb3NhYmxlID0gSVNfQ0xPU0FCTEVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUGVyc3BlY3RpdmVQYXJ0SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5MaXRlcmFscy5QRVJTUEVDVElWRV9QQVJUOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRGVzY3JpcHRpb24oKSB7CisJCXJldHVybiBkZXNjcmlwdGlvbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihib29sZWFuIG5ld0Rlc2NyaXB0aW9uKSB7CisJCWJvb2xlYW4gb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKwkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1BBUlRfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uVmFsdWUoKSB7CisJCXJldHVybiBkZXNjcmlwdGlvblZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uVmFsdWUoU3RyaW5nIG5ld0Rlc2NyaXB0aW9uVmFsdWUpIHsKKwkJU3RyaW5nIG9sZERlc2NyaXB0aW9uVmFsdWUgPSBkZXNjcmlwdGlvblZhbHVlOworCQlkZXNjcmlwdGlvblZhbHVlID0gbmV3RGVzY3JpcHRpb25WYWx1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1BBUlRfX0RFU0NSSVBUSU9OX1ZBTFVFLCBvbGREZXNjcmlwdGlvblZhbHVlLCBkZXNjcmlwdGlvblZhbHVlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRJY29uVVJJKCkgeworCQlyZXR1cm4gaWNvblVSSTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJY29uVVJJKFN0cmluZyBuZXdJY29uVVJJKSB7CisJCVN0cmluZyBvbGRJY29uVVJJID0gaWNvblVSSTsKKwkJaWNvblVSSSA9IG5ld0ljb25VUkk7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9QQVJUX19JQ09OX1VSSSwgb2xkSWNvblVSSSwgaWNvblVSSSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQZXJzcGVjdGl2ZVZpZXcgZ2V0VmlldygpIHsKKwkJcmV0dXJuIHZpZXc7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VmlldyhQZXJzcGVjdGl2ZVZpZXcgbmV3VmlldywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlQZXJzcGVjdGl2ZVZpZXcgb2xkVmlldyA9IHZpZXc7CisJCXZpZXcgPSBuZXdWaWV3OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfUEFSVF9fVklFVywgb2xkVmlldywgbmV3Vmlldyk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0VmlldyhQZXJzcGVjdGl2ZVZpZXcgbmV3VmlldykgeworCQlpZiAobmV3VmlldyAhPSB2aWV3KSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmICh2aWV3ICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXZpZXcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfUEFSVF9fVklFVywgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3VmlldyAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdWaWV3KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1BBUlRfX1ZJRVcsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0VmlldyhuZXdWaWV3LCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9QQVJUX19WSUVXLCBuZXdWaWV3LCBuZXdWaWV3KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNJc0Nsb3NhYmxlKCkgeworCQlyZXR1cm4gaXNDbG9zYWJsZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJc0Nsb3NhYmxlKGJvb2xlYW4gbmV3SXNDbG9zYWJsZSkgeworCQlib29sZWFuIG9sZElzQ2xvc2FibGUgPSBpc0Nsb3NhYmxlOworCQlpc0Nsb3NhYmxlID0gbmV3SXNDbG9zYWJsZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1BBUlRfX0lTX0NMT1NBQkxFLCBvbGRJc0Nsb3NhYmxlLCBpc0Nsb3NhYmxlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfUEFSVF9fVklFVzoKKwkJCQlyZXR1cm4gYmFzaWNTZXRWaWV3KG51bGwsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9QQVJUX19ERVNDUklQVElPTjoKKwkJCQlyZXR1cm4gaXNEZXNjcmlwdGlvbigpOworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfUEFSVF9fREVTQ1JJUFRJT05fVkFMVUU6CisJCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uVmFsdWUoKTsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1BBUlRfX0lDT05fVVJJOgorCQkJCXJldHVybiBnZXRJY29uVVJJKCk7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9QQVJUX19WSUVXOgorCQkJCXJldHVybiBnZXRWaWV3KCk7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9QQVJUX19JU19DTE9TQUJMRToKKwkJCQlyZXR1cm4gaXNJc0Nsb3NhYmxlKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1BBUlRfX0RFU0NSSVBUSU9OOgorCQkJCXNldERlc2NyaXB0aW9uKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9QQVJUX19ERVNDUklQVElPTl9WQUxVRToKKwkJCQlzZXREZXNjcmlwdGlvblZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1BBUlRfX0lDT05fVVJJOgorCQkJCXNldEljb25VUkkoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfUEFSVF9fVklFVzoKKwkJCQlzZXRWaWV3KChQZXJzcGVjdGl2ZVZpZXcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1BBUlRfX0lTX0NMT1NBQkxFOgorCQkJCXNldElzQ2xvc2FibGUoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9QQVJUX19ERVNDUklQVElPTjoKKwkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfUEFSVF9fREVTQ1JJUFRJT05fVkFMVUU6CisJCQkJc2V0RGVzY3JpcHRpb25WYWx1ZShERVNDUklQVElPTl9WQUxVRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfUEFSVF9fSUNPTl9VUkk6CisJCQkJc2V0SWNvblVSSShJQ09OX1VSSV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfUEFSVF9fVklFVzoKKwkJCQlzZXRWaWV3KChQZXJzcGVjdGl2ZVZpZXcpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfUEFSVF9fSVNfQ0xPU0FCTEU6CisJCQkJc2V0SXNDbG9zYWJsZShJU19DTE9TQUJMRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9QQVJUX19ERVNDUklQVElPTjoKKwkJCQlyZXR1cm4gZGVzY3JpcHRpb24gIT0gREVTQ1JJUFRJT05fRURFRkFVTFQ7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9QQVJUX19ERVNDUklQVElPTl9WQUxVRToKKwkJCQlyZXR1cm4gREVTQ1JJUFRJT05fVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uVmFsdWUgIT0gbnVsbCA6ICFERVNDUklQVElPTl9WQUxVRV9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb25WYWx1ZSk7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9QQVJUX19JQ09OX1VSSToKKwkJCQlyZXR1cm4gSUNPTl9VUklfRURFRkFVTFQgPT0gbnVsbCA/IGljb25VUkkgIT0gbnVsbCA6ICFJQ09OX1VSSV9FREVGQVVMVC5lcXVhbHMoaWNvblVSSSk7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9QQVJUX19WSUVXOgorCQkJCXJldHVybiB2aWV3ICE9IG51bGw7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9QQVJUX19JU19DTE9TQUJMRToKKwkJCQlyZXR1cm4gaXNDbG9zYWJsZSAhPSBJU19DTE9TQUJMRV9FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7CisJCXJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb25WYWx1ZTogIik7CisJCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb25WYWx1ZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgaWNvblVSSTogIik7CisJCXJlc3VsdC5hcHBlbmQoaWNvblVSSSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgaXNDbG9zYWJsZTogIik7CisJCXJlc3VsdC5hcHBlbmQoaXNDbG9zYWJsZSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL1BlcnNwZWN0aXZlUGFydEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2ltcGwvUGVyc3BlY3RpdmVQYXJ0U3RhY2tJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9pbXBsL1BlcnNwZWN0aXZlUGFydFN0YWNrSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MjlhZWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9pbXBsL1BlcnNwZWN0aXZlUGFydFN0YWNrSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTY3IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUGFydFN0YWNrOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGVyc3BlY3RpdmUgUGFydCBTdGFjazwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlUGFydFN0YWNrSW1wbCNnZXRTZWxlY3RlZEVsZW1lbnQgPGVtPlNlbGVjdGVkIEVsZW1lbnQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBQZXJzcGVjdGl2ZVBhcnRTdGFja0ltcGwgZXh0ZW5kcyBQZXJzcGVjdGl2ZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgUGVyc3BlY3RpdmVQYXJ0U3RhY2sgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlbGVjdGVkRWxlbWVudCgpIDxlbT5TZWxlY3RlZCBFbGVtZW50PC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTZWxlY3RlZEVsZW1lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBQZXJzcGVjdGl2ZVBhcnQgc2VsZWN0ZWRFbGVtZW50OworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFBlcnNwZWN0aXZlUGFydFN0YWNrSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5MaXRlcmFscy5QRVJTUEVDVElWRV9QQVJUX1NUQUNLOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQZXJzcGVjdGl2ZVBhcnQgZ2V0U2VsZWN0ZWRFbGVtZW50KCkgeworCQlpZiAoc2VsZWN0ZWRFbGVtZW50ICE9IG51bGwgJiYgc2VsZWN0ZWRFbGVtZW50LmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRTZWxlY3RlZEVsZW1lbnQgPSAoSW50ZXJuYWxFT2JqZWN0KXNlbGVjdGVkRWxlbWVudDsKKwkJCXNlbGVjdGVkRWxlbWVudCA9IChQZXJzcGVjdGl2ZVBhcnQpZVJlc29sdmVQcm94eShvbGRTZWxlY3RlZEVsZW1lbnQpOworCQkJaWYgKHNlbGVjdGVkRWxlbWVudCAhPSBvbGRTZWxlY3RlZEVsZW1lbnQpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfUEFSVF9TVEFDS19fU0VMRUNURURfRUxFTUVOVCwgb2xkU2VsZWN0ZWRFbGVtZW50LCBzZWxlY3RlZEVsZW1lbnQpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc2VsZWN0ZWRFbGVtZW50OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQZXJzcGVjdGl2ZVBhcnQgYmFzaWNHZXRTZWxlY3RlZEVsZW1lbnQoKSB7CisJCXJldHVybiBzZWxlY3RlZEVsZW1lbnQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRFbGVtZW50KFBlcnNwZWN0aXZlUGFydCBuZXdTZWxlY3RlZEVsZW1lbnQpIHsKKwkJUGVyc3BlY3RpdmVQYXJ0IG9sZFNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkRWxlbWVudDsKKwkJc2VsZWN0ZWRFbGVtZW50ID0gbmV3U2VsZWN0ZWRFbGVtZW50OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfUEFSVF9TVEFDS19fU0VMRUNURURfRUxFTUVOVCwgb2xkU2VsZWN0ZWRFbGVtZW50LCBzZWxlY3RlZEVsZW1lbnQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9QQVJUX1NUQUNLX19TRUxFQ1RFRF9FTEVNRU5UOgorCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0U2VsZWN0ZWRFbGVtZW50KCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0U2VsZWN0ZWRFbGVtZW50KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1BBUlRfU1RBQ0tfX1NFTEVDVEVEX0VMRU1FTlQ6CisJCQkJc2V0U2VsZWN0ZWRFbGVtZW50KChQZXJzcGVjdGl2ZVBhcnQpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9QQVJUX1NUQUNLX19TRUxFQ1RFRF9FTEVNRU5UOgorCQkJCXNldFNlbGVjdGVkRWxlbWVudCgoUGVyc3BlY3RpdmVQYXJ0KW51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfUEFSVF9TVEFDS19fU0VMRUNURURfRUxFTUVOVDoKKwkJCQlyZXR1cm4gc2VsZWN0ZWRFbGVtZW50ICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworfSAvL1BlcnNwZWN0aXZlUGFydFN0YWNrSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvaW1wbC9QZXJzcGVjdGl2ZVJlcG9ydEltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2ltcGwvUGVyc3BlY3RpdmVSZXBvcnRJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFmNmYyYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2ltcGwvUGVyc3BlY3RpdmVSZXBvcnRJbXBsLmphdmEKQEAgLTAsMCArMSwyNzMgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnN7ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVSZXBvcnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtVHlwZVJlZmVyZW5jZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBlcnNwZWN0aXZlIFJlcG9ydDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlUmVwb3J0SW1wbCNnZXRSZWYgPGVtPlJlZjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlUmVwb3J0SW1wbCNnZXRSZWZUeXBlSnZtIDxlbT5SZWYgVHlwZSBKdm08L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBQZXJzcGVjdGl2ZVJlcG9ydEltcGwgZXh0ZW5kcyBQZXJzcGVjdGl2ZUxhenlSZXNvbHZlckltcGwgaW1wbGVtZW50cyBQZXJzcGVjdGl2ZVJlcG9ydCB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmKCkgPGVtPlJlZjwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmVmKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUmVwb3J0IHJlZjsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZlR5cGVKdm0oKSA8ZW0+UmVmIFR5cGUgSnZtPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSZWZUeXBlSnZtKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSnZtVHlwZVJlZmVyZW5jZSByZWZUeXBlSnZtOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFBlcnNwZWN0aXZlUmVwb3J0SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5MaXRlcmFscy5QRVJTUEVDVElWRV9SRVBPUlQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFJlcG9ydCBnZXRSZWYoKSB7CisJCWlmIChyZWYgIT0gbnVsbCAmJiByZWYuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFJlZiA9IChJbnRlcm5hbEVPYmplY3QpcmVmOworCQkJcmVmID0gKFJlcG9ydCllUmVzb2x2ZVByb3h5KG9sZFJlZik7CisJCQlpZiAocmVmICE9IG9sZFJlZikgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9SRVBPUlRfX1JFRiwgb2xkUmVmLCByZWYpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVmOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBSZXBvcnQgYmFzaWNHZXRSZWYoKSB7CisJCXJldHVybiByZWY7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UmVmKFJlcG9ydCBuZXdSZWYpIHsKKwkJUmVwb3J0IG9sZFJlZiA9IHJlZjsKKwkJcmVmID0gbmV3UmVmOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfUkVQT1JUX19SRUYsIG9sZFJlZiwgcmVmKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEp2bVR5cGVSZWZlcmVuY2UgZ2V0UmVmVHlwZUp2bSgpIHsKKwkJaWYgKHJlZlR5cGVKdm0gIT0gbnVsbCAmJiByZWZUeXBlSnZtLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRSZWZUeXBlSnZtID0gKEludGVybmFsRU9iamVjdClyZWZUeXBlSnZtOworCQkJcmVmVHlwZUp2bSA9IChKdm1UeXBlUmVmZXJlbmNlKWVSZXNvbHZlUHJveHkob2xkUmVmVHlwZUp2bSk7CisJCQlpZiAocmVmVHlwZUp2bSAhPSBvbGRSZWZUeXBlSnZtKSB7CisJCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1JlZlR5cGVKdm0gPSAoSW50ZXJuYWxFT2JqZWN0KXJlZlR5cGVKdm07CisJCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG9sZFJlZlR5cGVKdm0uZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9SRVBPUlRfX1JFRl9UWVBFX0pWTSwgbnVsbCwgbnVsbCk7CisJCQkJaWYgKG5ld1JlZlR5cGVKdm0uZUludGVybmFsQ29udGFpbmVyKCkgPT0gbnVsbCkgeworCQkJCQltc2dzID0gbmV3UmVmVHlwZUp2bS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1JFUE9SVF9fUkVGX1RZUEVfSlZNLCBudWxsLCBtc2dzKTsKKwkJCQl9CisJCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9SRVBPUlRfX1JFRl9UWVBFX0pWTSwgb2xkUmVmVHlwZUp2bSwgcmVmVHlwZUp2bSkpOworCQkJfQorCQl9CisJCXJldHVybiByZWZUeXBlSnZtOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBKdm1UeXBlUmVmZXJlbmNlIGJhc2ljR2V0UmVmVHlwZUp2bSgpIHsKKwkJcmV0dXJuIHJlZlR5cGVKdm07CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmVmVHlwZUp2bShKdm1UeXBlUmVmZXJlbmNlIG5ld1JlZlR5cGVKdm0sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJSnZtVHlwZVJlZmVyZW5jZSBvbGRSZWZUeXBlSnZtID0gcmVmVHlwZUp2bTsKKwkJcmVmVHlwZUp2bSA9IG5ld1JlZlR5cGVKdm07CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9SRVBPUlRfX1JFRl9UWVBFX0pWTSwgb2xkUmVmVHlwZUp2bSwgbmV3UmVmVHlwZUp2bSk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UmVmVHlwZUp2bShKdm1UeXBlUmVmZXJlbmNlIG5ld1JlZlR5cGVKdm0pIHsKKwkJaWYgKG5ld1JlZlR5cGVKdm0gIT0gcmVmVHlwZUp2bSkgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAocmVmVHlwZUp2bSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyZWZUeXBlSnZtKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1JFUE9SVF9fUkVGX1RZUEVfSlZNLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdSZWZUeXBlSnZtICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1JlZlR5cGVKdm0pLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfUkVQT1JUX19SRUZfVFlQRV9KVk0sIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0UmVmVHlwZUp2bShuZXdSZWZUeXBlSnZtLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9SRVBPUlRfX1JFRl9UWVBFX0pWTSwgbmV3UmVmVHlwZUp2bSwgbmV3UmVmVHlwZUp2bSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1JFUE9SVF9fUkVGX1RZUEVfSlZNOgorCQkJCXJldHVybiBiYXNpY1NldFJlZlR5cGVKdm0obnVsbCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1JFUE9SVF9fUkVGOgorCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0UmVmKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0UmVmKCk7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9SRVBPUlRfX1JFRl9UWVBFX0pWTToKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFJlZlR5cGVKdm0oKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRSZWZUeXBlSnZtKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1JFUE9SVF9fUkVGOgorCQkJCXNldFJlZigoUmVwb3J0KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9SRVBPUlRfX1JFRl9UWVBFX0pWTToKKwkJCQlzZXRSZWZUeXBlSnZtKChKdm1UeXBlUmVmZXJlbmNlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfUkVQT1JUX19SRUY6CisJCQkJc2V0UmVmKChSZXBvcnQpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfUkVQT1JUX19SRUZfVFlQRV9KVk06CisJCQkJc2V0UmVmVHlwZUp2bSgoSnZtVHlwZVJlZmVyZW5jZSludWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1JFUE9SVF9fUkVGOgorCQkJCXJldHVybiByZWYgIT0gbnVsbDsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1JFUE9SVF9fUkVGX1RZUEVfSlZNOgorCQkJCXJldHVybiByZWZUeXBlSnZtICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworfSAvL1BlcnNwZWN0aXZlUmVwb3J0SW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvaW1wbC9QZXJzcGVjdGl2ZVNhc2hDb250YWluZXJJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9pbXBsL1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjFjMmFlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvaW1wbC9QZXJzcGVjdGl2ZVNhc2hDb250YWluZXJJbXBsLmphdmEKQEAgLTAsMCArMSwyMzYgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnN7ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuU2FzaE9yaWVudGF0aW9uOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGVyc3BlY3RpdmUgU2FzaCBDb250YWluZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZVNhc2hDb250YWluZXJJbXBsI2dldE9yaWVudGF0aW9uIDxlbT5PcmllbnRhdGlvbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckltcGwjZ2V0U2VsZWN0ZWRFbGVtZW50IDxlbT5TZWxlY3RlZCBFbGVtZW50PC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVySW1wbCBleHRlbmRzIFBlcnNwZWN0aXZlRWxlbWVudEltcGwgaW1wbGVtZW50cyBQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcmllbnRhdGlvbigpIDxlbT5PcmllbnRhdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0T3JpZW50YXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU2FzaE9yaWVudGF0aW9uIE9SSUVOVEFUSU9OX0VERUZBVUxUID0gU2FzaE9yaWVudGF0aW9uLkhPUklaT05UQUw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcmllbnRhdGlvbigpIDxlbT5PcmllbnRhdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0T3JpZW50YXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTYXNoT3JpZW50YXRpb24gb3JpZW50YXRpb24gPSBPUklFTlRBVElPTl9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlbGVjdGVkRWxlbWVudCgpIDxlbT5TZWxlY3RlZCBFbGVtZW50PC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTZWxlY3RlZEVsZW1lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBQZXJzcGVjdGl2ZUVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50OworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuTGl0ZXJhbHMuUEVSU1BFQ1RJVkVfU0FTSF9DT05UQUlORVI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNhc2hPcmllbnRhdGlvbiBnZXRPcmllbnRhdGlvbigpIHsKKwkJcmV0dXJuIG9yaWVudGF0aW9uOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE9yaWVudGF0aW9uKFNhc2hPcmllbnRhdGlvbiBuZXdPcmllbnRhdGlvbikgeworCQlTYXNoT3JpZW50YXRpb24gb2xkT3JpZW50YXRpb24gPSBvcmllbnRhdGlvbjsKKwkJb3JpZW50YXRpb24gPSBuZXdPcmllbnRhdGlvbiA9PSBudWxsID8gT1JJRU5UQVRJT05fRURFRkFVTFQgOiBuZXdPcmllbnRhdGlvbjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1NBU0hfQ09OVEFJTkVSX19PUklFTlRBVElPTiwgb2xkT3JpZW50YXRpb24sIG9yaWVudGF0aW9uKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFBlcnNwZWN0aXZlRWxlbWVudCBnZXRTZWxlY3RlZEVsZW1lbnQoKSB7CisJCWlmIChzZWxlY3RlZEVsZW1lbnQgIT0gbnVsbCAmJiBzZWxlY3RlZEVsZW1lbnQuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFNlbGVjdGVkRWxlbWVudCA9IChJbnRlcm5hbEVPYmplY3Qpc2VsZWN0ZWRFbGVtZW50OworCQkJc2VsZWN0ZWRFbGVtZW50ID0gKFBlcnNwZWN0aXZlRWxlbWVudCllUmVzb2x2ZVByb3h5KG9sZFNlbGVjdGVkRWxlbWVudCk7CisJCQlpZiAoc2VsZWN0ZWRFbGVtZW50ICE9IG9sZFNlbGVjdGVkRWxlbWVudCkgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9TQVNIX0NPTlRBSU5FUl9fU0VMRUNURURfRUxFTUVOVCwgb2xkU2VsZWN0ZWRFbGVtZW50LCBzZWxlY3RlZEVsZW1lbnQpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc2VsZWN0ZWRFbGVtZW50OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQZXJzcGVjdGl2ZUVsZW1lbnQgYmFzaWNHZXRTZWxlY3RlZEVsZW1lbnQoKSB7CisJCXJldHVybiBzZWxlY3RlZEVsZW1lbnQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRFbGVtZW50KFBlcnNwZWN0aXZlRWxlbWVudCBuZXdTZWxlY3RlZEVsZW1lbnQpIHsKKwkJUGVyc3BlY3RpdmVFbGVtZW50IG9sZFNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkRWxlbWVudDsKKwkJc2VsZWN0ZWRFbGVtZW50ID0gbmV3U2VsZWN0ZWRFbGVtZW50OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfU0FTSF9DT05UQUlORVJfX1NFTEVDVEVEX0VMRU1FTlQsIG9sZFNlbGVjdGVkRWxlbWVudCwgc2VsZWN0ZWRFbGVtZW50KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfU0FTSF9DT05UQUlORVJfX09SSUVOVEFUSU9OOgorCQkJCXJldHVybiBnZXRPcmllbnRhdGlvbigpOworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfU0FTSF9DT05UQUlORVJfX1NFTEVDVEVEX0VMRU1FTlQ6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRTZWxlY3RlZEVsZW1lbnQoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRTZWxlY3RlZEVsZW1lbnQoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfU0FTSF9DT05UQUlORVJfX09SSUVOVEFUSU9OOgorCQkJCXNldE9yaWVudGF0aW9uKChTYXNoT3JpZW50YXRpb24pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1NBU0hfQ09OVEFJTkVSX19TRUxFQ1RFRF9FTEVNRU5UOgorCQkJCXNldFNlbGVjdGVkRWxlbWVudCgoUGVyc3BlY3RpdmVFbGVtZW50KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfU0FTSF9DT05UQUlORVJfX09SSUVOVEFUSU9OOgorCQkJCXNldE9yaWVudGF0aW9uKE9SSUVOVEFUSU9OX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9TQVNIX0NPTlRBSU5FUl9fU0VMRUNURURfRUxFTUVOVDoKKwkJCQlzZXRTZWxlY3RlZEVsZW1lbnQoKFBlcnNwZWN0aXZlRWxlbWVudCludWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1NBU0hfQ09OVEFJTkVSX19PUklFTlRBVElPTjoKKwkJCQlyZXR1cm4gb3JpZW50YXRpb24gIT0gT1JJRU5UQVRJT05fRURFRkFVTFQ7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9TQVNIX0NPTlRBSU5FUl9fU0VMRUNURURfRUxFTUVOVDoKKwkJCQlyZXR1cm4gc2VsZWN0ZWRFbGVtZW50ICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChvcmllbnRhdGlvbjogIik7CisJCXJlc3VsdC5hcHBlbmQob3JpZW50YXRpb24pOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9QZXJzcGVjdGl2ZVNhc2hDb250YWluZXJJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9pbXBsL1BlcnNwZWN0aXZlU2VsZWN0aW9uSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvaW1wbC9QZXJzcGVjdGl2ZVNlbGVjdGlvbkltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjdlNmYwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvaW1wbC9QZXJzcGVjdGl2ZVNlbGVjdGlvbkltcGwuamF2YQpAQCAtMCwwICsxLDI3MyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yc3sgIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVNlbGVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQudGFibGUuVGFibGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtVHlwZVJlZmVyZW5jZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBlcnNwZWN0aXZlIFNlbGVjdGlvbjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlU2VsZWN0aW9uSW1wbCNnZXRSZWYgPGVtPlJlZjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlU2VsZWN0aW9uSW1wbCNnZXRSZWZUeXBlSnZtIDxlbT5SZWYgVHlwZSBKdm08L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBQZXJzcGVjdGl2ZVNlbGVjdGlvbkltcGwgZXh0ZW5kcyBQZXJzcGVjdGl2ZUxhenlSZXNvbHZlckltcGwgaW1wbGVtZW50cyBQZXJzcGVjdGl2ZVNlbGVjdGlvbiB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmKCkgPGVtPlJlZjwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmVmKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVGFibGUgcmVmOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmVHlwZUp2bSgpIDxlbT5SZWYgVHlwZSBKdm08L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFJlZlR5cGVKdm0oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBKdm1UeXBlUmVmZXJlbmNlIHJlZlR5cGVKdm07CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUGVyc3BlY3RpdmVTZWxlY3Rpb25JbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUGVyc3BlY3RpdmVEc2xQYWNrYWdlLkxpdGVyYWxzLlBFUlNQRUNUSVZFX1NFTEVDVElPTjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVGFibGUgZ2V0UmVmKCkgeworCQlpZiAocmVmICE9IG51bGwgJiYgcmVmLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRSZWYgPSAoSW50ZXJuYWxFT2JqZWN0KXJlZjsKKwkJCXJlZiA9IChUYWJsZSllUmVzb2x2ZVByb3h5KG9sZFJlZik7CisJCQlpZiAocmVmICE9IG9sZFJlZikgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9TRUxFQ1RJT05fX1JFRiwgb2xkUmVmLCByZWYpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVmOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUYWJsZSBiYXNpY0dldFJlZigpIHsKKwkJcmV0dXJuIHJlZjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZWYoVGFibGUgbmV3UmVmKSB7CisJCVRhYmxlIG9sZFJlZiA9IHJlZjsKKwkJcmVmID0gbmV3UmVmOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfU0VMRUNUSU9OX19SRUYsIG9sZFJlZiwgcmVmKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEp2bVR5cGVSZWZlcmVuY2UgZ2V0UmVmVHlwZUp2bSgpIHsKKwkJaWYgKHJlZlR5cGVKdm0gIT0gbnVsbCAmJiByZWZUeXBlSnZtLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRSZWZUeXBlSnZtID0gKEludGVybmFsRU9iamVjdClyZWZUeXBlSnZtOworCQkJcmVmVHlwZUp2bSA9IChKdm1UeXBlUmVmZXJlbmNlKWVSZXNvbHZlUHJveHkob2xkUmVmVHlwZUp2bSk7CisJCQlpZiAocmVmVHlwZUp2bSAhPSBvbGRSZWZUeXBlSnZtKSB7CisJCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1JlZlR5cGVKdm0gPSAoSW50ZXJuYWxFT2JqZWN0KXJlZlR5cGVKdm07CisJCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG9sZFJlZlR5cGVKdm0uZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9TRUxFQ1RJT05fX1JFRl9UWVBFX0pWTSwgbnVsbCwgbnVsbCk7CisJCQkJaWYgKG5ld1JlZlR5cGVKdm0uZUludGVybmFsQ29udGFpbmVyKCkgPT0gbnVsbCkgeworCQkJCQltc2dzID0gbmV3UmVmVHlwZUp2bS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1NFTEVDVElPTl9fUkVGX1RZUEVfSlZNLCBudWxsLCBtc2dzKTsKKwkJCQl9CisJCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9TRUxFQ1RJT05fX1JFRl9UWVBFX0pWTSwgb2xkUmVmVHlwZUp2bSwgcmVmVHlwZUp2bSkpOworCQkJfQorCQl9CisJCXJldHVybiByZWZUeXBlSnZtOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBKdm1UeXBlUmVmZXJlbmNlIGJhc2ljR2V0UmVmVHlwZUp2bSgpIHsKKwkJcmV0dXJuIHJlZlR5cGVKdm07CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmVmVHlwZUp2bShKdm1UeXBlUmVmZXJlbmNlIG5ld1JlZlR5cGVKdm0sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJSnZtVHlwZVJlZmVyZW5jZSBvbGRSZWZUeXBlSnZtID0gcmVmVHlwZUp2bTsKKwkJcmVmVHlwZUp2bSA9IG5ld1JlZlR5cGVKdm07CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9TRUxFQ1RJT05fX1JFRl9UWVBFX0pWTSwgb2xkUmVmVHlwZUp2bSwgbmV3UmVmVHlwZUp2bSk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UmVmVHlwZUp2bShKdm1UeXBlUmVmZXJlbmNlIG5ld1JlZlR5cGVKdm0pIHsKKwkJaWYgKG5ld1JlZlR5cGVKdm0gIT0gcmVmVHlwZUp2bSkgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAocmVmVHlwZUp2bSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyZWZUeXBlSnZtKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1NFTEVDVElPTl9fUkVGX1RZUEVfSlZNLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdSZWZUeXBlSnZtICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1JlZlR5cGVKdm0pLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfU0VMRUNUSU9OX19SRUZfVFlQRV9KVk0sIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0UmVmVHlwZUp2bShuZXdSZWZUeXBlSnZtLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9TRUxFQ1RJT05fX1JFRl9UWVBFX0pWTSwgbmV3UmVmVHlwZUp2bSwgbmV3UmVmVHlwZUp2bSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1NFTEVDVElPTl9fUkVGX1RZUEVfSlZNOgorCQkJCXJldHVybiBiYXNpY1NldFJlZlR5cGVKdm0obnVsbCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1NFTEVDVElPTl9fUkVGOgorCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0UmVmKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0UmVmKCk7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9TRUxFQ1RJT05fX1JFRl9UWVBFX0pWTToKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFJlZlR5cGVKdm0oKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRSZWZUeXBlSnZtKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1NFTEVDVElPTl9fUkVGOgorCQkJCXNldFJlZigoVGFibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1NFTEVDVElPTl9fUkVGX1RZUEVfSlZNOgorCQkJCXNldFJlZlR5cGVKdm0oKEp2bVR5cGVSZWZlcmVuY2UpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9TRUxFQ1RJT05fX1JFRjoKKwkJCQlzZXRSZWYoKFRhYmxlKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1NFTEVDVElPTl9fUkVGX1RZUEVfSlZNOgorCQkJCXNldFJlZlR5cGVKdm0oKEp2bVR5cGVSZWZlcmVuY2UpbnVsbCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9TRUxFQ1RJT05fX1JFRjoKKwkJCQlyZXR1cm4gcmVmICE9IG51bGw7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9TRUxFQ1RJT05fX1JFRl9UWVBFX0pWTToKKwkJCQlyZXR1cm4gcmVmVHlwZUp2bSAhPSBudWxsOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKK30gLy9QZXJzcGVjdGl2ZVNlbGVjdGlvbkltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2ltcGwvUGVyc3BlY3RpdmVUYWJsZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2ltcGwvUGVyc3BlY3RpdmVUYWJsZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTkzMmJiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvaW1wbC9QZXJzcGVjdGl2ZVRhYmxlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjczIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlVGFibGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnRhYmxlLlRhYmxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bVR5cGVSZWZlcmVuY2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QZXJzcGVjdGl2ZSBUYWJsZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5pbXBsLlBlcnNwZWN0aXZlVGFibGVJbXBsI2dldFJlZiA8ZW0+UmVmPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVUYWJsZUltcGwjZ2V0UmVmVHlwZUp2bSA8ZW0+UmVmIFR5cGUgSnZtPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgUGVyc3BlY3RpdmVUYWJsZUltcGwgZXh0ZW5kcyBQZXJzcGVjdGl2ZUxhenlSZXNvbHZlckltcGwgaW1wbGVtZW50cyBQZXJzcGVjdGl2ZVRhYmxlIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWYoKSA8ZW0+UmVmPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSZWYoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBUYWJsZSByZWY7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZUeXBlSnZtKCkgPGVtPlJlZiBUeXBlIEp2bTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmVmVHlwZUp2bSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEp2bVR5cGVSZWZlcmVuY2UgcmVmVHlwZUp2bTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBQZXJzcGVjdGl2ZVRhYmxlSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5MaXRlcmFscy5QRVJTUEVDVElWRV9UQUJMRTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVGFibGUgZ2V0UmVmKCkgeworCQlpZiAocmVmICE9IG51bGwgJiYgcmVmLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRSZWYgPSAoSW50ZXJuYWxFT2JqZWN0KXJlZjsKKwkJCXJlZiA9IChUYWJsZSllUmVzb2x2ZVByb3h5KG9sZFJlZik7CisJCQlpZiAocmVmICE9IG9sZFJlZikgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9UQUJMRV9fUkVGLCBvbGRSZWYsIHJlZikpOworCQkJfQorCQl9CisJCXJldHVybiByZWY7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRhYmxlIGJhc2ljR2V0UmVmKCkgeworCQlyZXR1cm4gcmVmOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlZihUYWJsZSBuZXdSZWYpIHsKKwkJVGFibGUgb2xkUmVmID0gcmVmOworCQlyZWYgPSBuZXdSZWY7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9UQUJMRV9fUkVGLCBvbGRSZWYsIHJlZikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBKdm1UeXBlUmVmZXJlbmNlIGdldFJlZlR5cGVKdm0oKSB7CisJCWlmIChyZWZUeXBlSnZtICE9IG51bGwgJiYgcmVmVHlwZUp2bS5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkUmVmVHlwZUp2bSA9IChJbnRlcm5hbEVPYmplY3QpcmVmVHlwZUp2bTsKKwkJCXJlZlR5cGVKdm0gPSAoSnZtVHlwZVJlZmVyZW5jZSllUmVzb2x2ZVByb3h5KG9sZFJlZlR5cGVKdm0pOworCQkJaWYgKHJlZlR5cGVKdm0gIT0gb2xkUmVmVHlwZUp2bSkgeworCQkJCUludGVybmFsRU9iamVjdCBuZXdSZWZUeXBlSnZtID0gKEludGVybmFsRU9iamVjdClyZWZUeXBlSnZtOworCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGRSZWZUeXBlSnZtLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfVEFCTEVfX1JFRl9UWVBFX0pWTSwgbnVsbCwgbnVsbCk7CisJCQkJaWYgKG5ld1JlZlR5cGVKdm0uZUludGVybmFsQ29udGFpbmVyKCkgPT0gbnVsbCkgeworCQkJCQltc2dzID0gbmV3UmVmVHlwZUp2bS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1RBQkxFX19SRUZfVFlQRV9KVk0sIG51bGwsIG1zZ3MpOworCQkJCX0KKwkJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1RBQkxFX19SRUZfVFlQRV9KVk0sIG9sZFJlZlR5cGVKdm0sIHJlZlR5cGVKdm0pKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVmVHlwZUp2bTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSnZtVHlwZVJlZmVyZW5jZSBiYXNpY0dldFJlZlR5cGVKdm0oKSB7CisJCXJldHVybiByZWZUeXBlSnZtOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFJlZlR5cGVKdm0oSnZtVHlwZVJlZmVyZW5jZSBuZXdSZWZUeXBlSnZtLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCUp2bVR5cGVSZWZlcmVuY2Ugb2xkUmVmVHlwZUp2bSA9IHJlZlR5cGVKdm07CisJCXJlZlR5cGVKdm0gPSBuZXdSZWZUeXBlSnZtOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfVEFCTEVfX1JFRl9UWVBFX0pWTSwgb2xkUmVmVHlwZUp2bSwgbmV3UmVmVHlwZUp2bSk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UmVmVHlwZUp2bShKdm1UeXBlUmVmZXJlbmNlIG5ld1JlZlR5cGVKdm0pIHsKKwkJaWYgKG5ld1JlZlR5cGVKdm0gIT0gcmVmVHlwZUp2bSkgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAocmVmVHlwZUp2bSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyZWZUeXBlSnZtKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1RBQkxFX19SRUZfVFlQRV9KVk0sIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld1JlZlR5cGVKdm0gIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UmVmVHlwZUp2bSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9UQUJMRV9fUkVGX1RZUEVfSlZNLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldFJlZlR5cGVKdm0obmV3UmVmVHlwZUp2bSwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfVEFCTEVfX1JFRl9UWVBFX0pWTSwgbmV3UmVmVHlwZUp2bSwgbmV3UmVmVHlwZUp2bSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1RBQkxFX19SRUZfVFlQRV9KVk06CisJCQkJcmV0dXJuIGJhc2ljU2V0UmVmVHlwZUp2bShudWxsLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfVEFCTEVfX1JFRjoKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFJlZigpOworCQkJCXJldHVybiBiYXNpY0dldFJlZigpOworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfVEFCTEVfX1JFRl9UWVBFX0pWTToKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFJlZlR5cGVKdm0oKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRSZWZUeXBlSnZtKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1RBQkxFX19SRUY6CisJCQkJc2V0UmVmKChUYWJsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfVEFCTEVfX1JFRl9UWVBFX0pWTToKKwkJCQlzZXRSZWZUeXBlSnZtKChKdm1UeXBlUmVmZXJlbmNlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfVEFCTEVfX1JFRjoKKwkJCQlzZXRSZWYoKFRhYmxlKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1RBQkxFX19SRUZfVFlQRV9KVk06CisJCQkJc2V0UmVmVHlwZUp2bSgoSnZtVHlwZVJlZmVyZW5jZSludWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1RBQkxFX19SRUY6CisJCQkJcmV0dXJuIHJlZiAhPSBudWxsOworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfVEFCTEVfX1JFRl9UWVBFX0pWTToKKwkJCQlyZXR1cm4gcmVmVHlwZUp2bSAhPSBudWxsOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKK30gLy9QZXJzcGVjdGl2ZVRhYmxlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvaW1wbC9QZXJzcGVjdGl2ZVRvcG9sb2d5SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvaW1wbC9QZXJzcGVjdGl2ZVRvcG9sb2d5SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOGI3OTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9pbXBsL1BlcnNwZWN0aXZlVG9wb2xvZ3lJbXBsLmphdmEKQEAgLTAsMCArMSwyNzMgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnN7ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVUb3BvbG9neTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQudG9wb2xvZ3lkc2wuVG9wb2xvZ3k7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtVHlwZVJlZmVyZW5jZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBlcnNwZWN0aXZlIFRvcG9sb2d5PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmltcGwuUGVyc3BlY3RpdmVUb3BvbG9neUltcGwjZ2V0UmVmIDxlbT5SZWY8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuaW1wbC5QZXJzcGVjdGl2ZVRvcG9sb2d5SW1wbCNnZXRSZWZUeXBlSnZtIDxlbT5SZWYgVHlwZSBKdm08L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBQZXJzcGVjdGl2ZVRvcG9sb2d5SW1wbCBleHRlbmRzIFBlcnNwZWN0aXZlTGF6eVJlc29sdmVySW1wbCBpbXBsZW1lbnRzIFBlcnNwZWN0aXZlVG9wb2xvZ3kgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZigpIDxlbT5SZWY8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFJlZigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFRvcG9sb2d5IHJlZjsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZlR5cGVKdm0oKSA8ZW0+UmVmIFR5cGUgSnZtPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSZWZUeXBlSnZtKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSnZtVHlwZVJlZmVyZW5jZSByZWZUeXBlSnZtOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFBlcnNwZWN0aXZlVG9wb2xvZ3lJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUGVyc3BlY3RpdmVEc2xQYWNrYWdlLkxpdGVyYWxzLlBFUlNQRUNUSVZFX1RPUE9MT0dZOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUb3BvbG9neSBnZXRSZWYoKSB7CisJCWlmIChyZWYgIT0gbnVsbCAmJiByZWYuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFJlZiA9IChJbnRlcm5hbEVPYmplY3QpcmVmOworCQkJcmVmID0gKFRvcG9sb2d5KWVSZXNvbHZlUHJveHkob2xkUmVmKTsKKwkJCWlmIChyZWYgIT0gb2xkUmVmKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1RPUE9MT0dZX19SRUYsIG9sZFJlZiwgcmVmKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlZjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVG9wb2xvZ3kgYmFzaWNHZXRSZWYoKSB7CisJCXJldHVybiByZWY7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UmVmKFRvcG9sb2d5IG5ld1JlZikgeworCQlUb3BvbG9neSBvbGRSZWYgPSByZWY7CisJCXJlZiA9IG5ld1JlZjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1RPUE9MT0dZX19SRUYsIG9sZFJlZiwgcmVmKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEp2bVR5cGVSZWZlcmVuY2UgZ2V0UmVmVHlwZUp2bSgpIHsKKwkJaWYgKHJlZlR5cGVKdm0gIT0gbnVsbCAmJiByZWZUeXBlSnZtLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRSZWZUeXBlSnZtID0gKEludGVybmFsRU9iamVjdClyZWZUeXBlSnZtOworCQkJcmVmVHlwZUp2bSA9IChKdm1UeXBlUmVmZXJlbmNlKWVSZXNvbHZlUHJveHkob2xkUmVmVHlwZUp2bSk7CisJCQlpZiAocmVmVHlwZUp2bSAhPSBvbGRSZWZUeXBlSnZtKSB7CisJCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1JlZlR5cGVKdm0gPSAoSW50ZXJuYWxFT2JqZWN0KXJlZlR5cGVKdm07CisJCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG9sZFJlZlR5cGVKdm0uZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9UT1BPTE9HWV9fUkVGX1RZUEVfSlZNLCBudWxsLCBudWxsKTsKKwkJCQlpZiAobmV3UmVmVHlwZUp2bS5lSW50ZXJuYWxDb250YWluZXIoKSA9PSBudWxsKSB7CisJCQkJCW1zZ3MgPSBuZXdSZWZUeXBlSnZtLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfVE9QT0xPR1lfX1JFRl9UWVBFX0pWTSwgbnVsbCwgbXNncyk7CisJCQkJfQorCQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfVE9QT0xPR1lfX1JFRl9UWVBFX0pWTSwgb2xkUmVmVHlwZUp2bSwgcmVmVHlwZUp2bSkpOworCQkJfQorCQl9CisJCXJldHVybiByZWZUeXBlSnZtOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBKdm1UeXBlUmVmZXJlbmNlIGJhc2ljR2V0UmVmVHlwZUp2bSgpIHsKKwkJcmV0dXJuIHJlZlR5cGVKdm07CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmVmVHlwZUp2bShKdm1UeXBlUmVmZXJlbmNlIG5ld1JlZlR5cGVKdm0sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJSnZtVHlwZVJlZmVyZW5jZSBvbGRSZWZUeXBlSnZtID0gcmVmVHlwZUp2bTsKKwkJcmVmVHlwZUp2bSA9IG5ld1JlZlR5cGVKdm07CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9UT1BPTE9HWV9fUkVGX1RZUEVfSlZNLCBvbGRSZWZUeXBlSnZtLCBuZXdSZWZUeXBlSnZtKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZWZUeXBlSnZtKEp2bVR5cGVSZWZlcmVuY2UgbmV3UmVmVHlwZUp2bSkgeworCQlpZiAobmV3UmVmVHlwZUp2bSAhPSByZWZUeXBlSnZtKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChyZWZUeXBlSnZtICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXJlZlR5cGVKdm0pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfVE9QT0xPR1lfX1JFRl9UWVBFX0pWTSwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3UmVmVHlwZUp2bSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSZWZUeXBlSnZtKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1RPUE9MT0dZX19SRUZfVFlQRV9KVk0sIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0UmVmVHlwZUp2bShuZXdSZWZUeXBlSnZtLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9UT1BPTE9HWV9fUkVGX1RZUEVfSlZNLCBuZXdSZWZUeXBlSnZtLCBuZXdSZWZUeXBlSnZtKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfVE9QT0xPR1lfX1JFRl9UWVBFX0pWTToKKwkJCQlyZXR1cm4gYmFzaWNTZXRSZWZUeXBlSnZtKG51bGwsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9UT1BPTE9HWV9fUkVGOgorCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0UmVmKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0UmVmKCk7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9UT1BPTE9HWV9fUkVGX1RZUEVfSlZNOgorCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0UmVmVHlwZUp2bSgpOworCQkJCXJldHVybiBiYXNpY0dldFJlZlR5cGVKdm0oKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfVE9QT0xPR1lfX1JFRjoKKwkJCQlzZXRSZWYoKFRvcG9sb2d5KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9UT1BPTE9HWV9fUkVGX1RZUEVfSlZNOgorCQkJCXNldFJlZlR5cGVKdm0oKEp2bVR5cGVSZWZlcmVuY2UpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9UT1BPTE9HWV9fUkVGOgorCQkJCXNldFJlZigoVG9wb2xvZ3kpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfVE9QT0xPR1lfX1JFRl9UWVBFX0pWTToKKwkJCQlzZXRSZWZUeXBlSnZtKChKdm1UeXBlUmVmZXJlbmNlKW51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfVE9QT0xPR1lfX1JFRjoKKwkJCQlyZXR1cm4gcmVmICE9IG51bGw7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9UT1BPTE9HWV9fUkVGX1RZUEVfSlZNOgorCQkJCXJldHVybiByZWZUeXBlSnZtICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworfSAvL1BlcnNwZWN0aXZlVG9wb2xvZ3lJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91dGlsL1BlcnNwZWN0aXZlRHNsQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3V0aWwvUGVyc3BlY3RpdmVEc2xBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NzJlOWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91dGlsL1BlcnNwZWN0aXZlRHNsQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDQ5NCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yc3sgIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudXRpbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuY29tbW9uLnR5cGVzLkxMYXp5UmVzb2x2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuY29tbW9uLnR5cGVzLkxQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS4qOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbFBhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFBlcnNwZWN0aXZlRHNsQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIFBlcnNwZWN0aXZlRHNsUGFja2FnZSBtb2RlbFBhY2thZ2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFBlcnNwZWN0aXZlRHNsQWRhcHRlckZhY3RvcnkoKSB7CisJCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgeworCQkJbW9kZWxQYWNrYWdlID0gUGVyc3BlY3RpdmVEc2xQYWNrYWdlLmVJTlNUQU5DRTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7CisJCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIFRoZSBzd2l0Y2ggdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUGVyc3BlY3RpdmVEc2xTd2l0Y2g8QWRhcHRlcj4gbW9kZWxTd2l0Y2ggPQorCQluZXcgUGVyc3BlY3RpdmVEc2xTd2l0Y2g8QWRhcHRlcj4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQZXJzcGVjdGl2ZU1vZGVsKFBlcnNwZWN0aXZlTW9kZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVBlcnNwZWN0aXZlTW9kZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQZXJzcGVjdGl2ZUxhenlSZXNvbHZlcihQZXJzcGVjdGl2ZUxhenlSZXNvbHZlciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlUGVyc3BlY3RpdmVMYXp5UmVzb2x2ZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQZXJzcGVjdGl2ZVBhY2thZ2UoUGVyc3BlY3RpdmVQYWNrYWdlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVQZXJzcGVjdGl2ZVBhY2thZ2VBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQZXJzcGVjdGl2ZUJhc2UoUGVyc3BlY3RpdmVCYXNlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVQZXJzcGVjdGl2ZUJhc2VBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQZXJzcGVjdGl2ZShQZXJzcGVjdGl2ZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlUGVyc3BlY3RpdmVBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQZXJzcGVjdGl2ZUVsZW1lbnQoUGVyc3BlY3RpdmVFbGVtZW50IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVQZXJzcGVjdGl2ZUVsZW1lbnRBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIoUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQZXJzcGVjdGl2ZVBhcnQoUGVyc3BlY3RpdmVQYXJ0IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVQZXJzcGVjdGl2ZVBhcnRBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQZXJzcGVjdGl2ZVBhcnRTdGFjayhQZXJzcGVjdGl2ZVBhcnRTdGFjayBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlUGVyc3BlY3RpdmVQYXJ0U3RhY2tBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQZXJzcGVjdGl2ZVZpZXcoUGVyc3BlY3RpdmVWaWV3IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVQZXJzcGVjdGl2ZVZpZXdBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQZXJzcGVjdGl2ZVNlbGVjdGlvbihQZXJzcGVjdGl2ZVNlbGVjdGlvbiBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlUGVyc3BlY3RpdmVTZWxlY3Rpb25BZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQZXJzcGVjdGl2ZVRhYmxlKFBlcnNwZWN0aXZlVGFibGUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVBlcnNwZWN0aXZlVGFibGVBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQZXJzcGVjdGl2ZUdyaWQoUGVyc3BlY3RpdmVHcmlkIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVQZXJzcGVjdGl2ZUdyaWRBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQZXJzcGVjdGl2ZUNoYXJ0KFBlcnNwZWN0aXZlQ2hhcnQgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVBlcnNwZWN0aXZlQ2hhcnRBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQZXJzcGVjdGl2ZVJlcG9ydChQZXJzcGVjdGl2ZVJlcG9ydCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlUGVyc3BlY3RpdmVSZXBvcnRBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbihQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbiBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlUGVyc3BlY3RpdmVPcmdhbml6YXRpb25BZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQZXJzcGVjdGl2ZVRvcG9sb2d5KFBlcnNwZWN0aXZlVG9wb2xvZ3kgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVBlcnNwZWN0aXZlVG9wb2xvZ3lBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQZXJzcGVjdGl2ZURpYWxvZyhQZXJzcGVjdGl2ZURpYWxvZyBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlUGVyc3BlY3RpdmVEaWFsb2dBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQZXJzcGVjdGl2ZUJQTU4oUGVyc3BlY3RpdmVCUE1OIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVQZXJzcGVjdGl2ZUJQTU5BZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VMTGF6eVJlc29sdmVyKExMYXp5UmVzb2x2ZXIgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUxMYXp5UmVzb2x2ZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VMUGFja2FnZShMUGFja2FnZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlTFBhY2thZ2VBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7CisJCQl9CisJCX07CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgorCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgeworCQlyZXR1cm4gbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKKwl9CisKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZU1vZGVsIDxlbT5QZXJzcGVjdGl2ZSBNb2RlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlTW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlUGVyc3BlY3RpdmVNb2RlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUxhenlSZXNvbHZlciA8ZW0+UGVyc3BlY3RpdmUgTGF6eSBSZXNvbHZlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlTGF6eVJlc29sdmVyCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBlcnNwZWN0aXZlTGF6eVJlc29sdmVyQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUGFja2FnZSA8ZW0+UGVyc3BlY3RpdmUgUGFja2FnZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUGFja2FnZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVQZXJzcGVjdGl2ZVBhY2thZ2VBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVCYXNlIDxlbT5QZXJzcGVjdGl2ZSBCYXNlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVCYXNlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBlcnNwZWN0aXZlQmFzZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZSA8ZW0+UGVyc3BlY3RpdmU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVQZXJzcGVjdGl2ZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUVsZW1lbnQgPGVtPlBlcnNwZWN0aXZlIEVsZW1lbnQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUVsZW1lbnQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlUGVyc3BlY3RpdmVFbGVtZW50QWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlU2FzaENvbnRhaW5lciA8ZW0+UGVyc3BlY3RpdmUgU2FzaCBDb250YWluZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVNhc2hDb250YWluZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUGFydCA8ZW0+UGVyc3BlY3RpdmUgUGFydDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUGFydAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVQZXJzcGVjdGl2ZVBhcnRBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYXJ0U3RhY2sgPGVtPlBlcnNwZWN0aXZlIFBhcnQgU3RhY2s8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVBhcnRTdGFjaworCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVQZXJzcGVjdGl2ZVBhcnRTdGFja0FkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVZpZXcgPGVtPlBlcnNwZWN0aXZlIFZpZXc8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVZpZXcKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlUGVyc3BlY3RpdmVWaWV3QWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlU2VsZWN0aW9uIDxlbT5QZXJzcGVjdGl2ZSBTZWxlY3Rpb248L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVNlbGVjdGlvbgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVQZXJzcGVjdGl2ZVNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVRhYmxlIDxlbT5QZXJzcGVjdGl2ZSBUYWJsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlVGFibGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlUGVyc3BlY3RpdmVUYWJsZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUdyaWQgPGVtPlBlcnNwZWN0aXZlIEdyaWQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUdyaWQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlUGVyc3BlY3RpdmVHcmlkQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlQ2hhcnQgPGVtPlBlcnNwZWN0aXZlIENoYXJ0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVDaGFydAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVQZXJzcGVjdGl2ZUNoYXJ0QWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUmVwb3J0IDxlbT5QZXJzcGVjdGl2ZSBSZXBvcnQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVJlcG9ydAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVQZXJzcGVjdGl2ZVJlcG9ydEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbiA8ZW0+UGVyc3BlY3RpdmUgT3JnYW5pemF0aW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVPcmdhbml6YXRpb24KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlUGVyc3BlY3RpdmVPcmdhbml6YXRpb25BZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVUb3BvbG9neSA8ZW0+UGVyc3BlY3RpdmUgVG9wb2xvZ3k8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVRvcG9sb2d5CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBlcnNwZWN0aXZlVG9wb2xvZ3lBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEaWFsb2cgPGVtPlBlcnNwZWN0aXZlIERpYWxvZzwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRGlhbG9nCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBlcnNwZWN0aXZlRGlhbG9nQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlQlBNTiA8ZW0+UGVyc3BlY3RpdmUgQlBNTjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlQlBNTgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVQZXJzcGVjdGl2ZUJQTU5BZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmNvbW1vbi50eXBlcy5MTGF6eVJlc29sdmVyIDxlbT5MTGF6eSBSZXNvbHZlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXMuTExhenlSZXNvbHZlcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVMTGF6eVJlc29sdmVyQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXMuTFBhY2thZ2UgPGVtPkxQYWNrYWdlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmNvbW1vbi50eXBlcy5MUGFja2FnZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVMUGFja2FnZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30gLy9QZXJzcGVjdGl2ZURzbEFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91dGlsL1BlcnNwZWN0aXZlRHNsU3dpdGNoLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS91dGlsL1BlcnNwZWN0aXZlRHNsU3dpdGNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVjYmQ3NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3V0aWwvUGVyc3BlY3RpdmVEc2xTd2l0Y2guamF2YQpAQCAtMCwwICsxLDU2MyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yc3sgIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudXRpbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLlN3aXRjaDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmNvbW1vbi50eXBlcy5MTGF6eVJlc29sdmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmNvbW1vbi50eXBlcy5MUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuKjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KKyAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2goRU9iamVjdCkgZG9Td2l0Y2gob2JqZWN0KX0KKyAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKKyAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0CisgKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5CisgKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKKyAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsUGFja2FnZQorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgUGVyc3BlY3RpdmVEc2xTd2l0Y2g8VD4gZXh0ZW5kcyBTd2l0Y2g8VD4geworCS8qKgorCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgUGVyc3BlY3RpdmVEc2xQYWNrYWdlIG1vZGVsUGFja2FnZTsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUGVyc3BlY3RpdmVEc2xTd2l0Y2goKSB7CisJCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgeworCQkJbW9kZWxQYWNrYWdlID0gUGVyc3BlY3RpdmVEc2xQYWNrYWdlLmVJTlNUQU5DRTsKKwkJfQorCX0KKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIHRoaXMgaXMgYSBzd2l0Y2ggZm9yIHRoZSBnaXZlbiBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtZXRlciBlUGFja2FnZSB0aGUgcGFja2FnZSBpbiBxdWVzdGlvbi4KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBpcyBhIHN3aXRjaCBmb3IgdGhlIGdpdmVuIHBhY2thZ2UuCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIGlzU3dpdGNoRm9yKEVQYWNrYWdlIGVQYWNrYWdlKSB7CisJCXJldHVybiBlUGFja2FnZSA9PSBtb2RlbFBhY2thZ2U7CisJfQorCisJLyoqCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgVCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKKwkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX01PREVMOiB7CisJCQkJUGVyc3BlY3RpdmVNb2RlbCBwZXJzcGVjdGl2ZU1vZGVsID0gKFBlcnNwZWN0aXZlTW9kZWwpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VQZXJzcGVjdGl2ZU1vZGVsKHBlcnNwZWN0aXZlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX0xBWllfUkVTT0xWRVI6IHsKKwkJCQlQZXJzcGVjdGl2ZUxhenlSZXNvbHZlciBwZXJzcGVjdGl2ZUxhenlSZXNvbHZlciA9IChQZXJzcGVjdGl2ZUxhenlSZXNvbHZlcil0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVBlcnNwZWN0aXZlTGF6eVJlc29sdmVyKHBlcnNwZWN0aXZlTGF6eVJlc29sdmVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9QQUNLQUdFOiB7CisJCQkJUGVyc3BlY3RpdmVQYWNrYWdlIHBlcnNwZWN0aXZlUGFja2FnZSA9IChQZXJzcGVjdGl2ZVBhY2thZ2UpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VQZXJzcGVjdGl2ZVBhY2thZ2UocGVyc3BlY3RpdmVQYWNrYWdlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMUGFja2FnZShwZXJzcGVjdGl2ZVBhY2thZ2UpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxMYXp5UmVzb2x2ZXIocGVyc3BlY3RpdmVQYWNrYWdlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9CQVNFOiB7CisJCQkJUGVyc3BlY3RpdmVCYXNlIHBlcnNwZWN0aXZlQmFzZSA9IChQZXJzcGVjdGl2ZUJhc2UpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VQZXJzcGVjdGl2ZUJhc2UocGVyc3BlY3RpdmVCYXNlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQZXJzcGVjdGl2ZUxhenlSZXNvbHZlcihwZXJzcGVjdGl2ZUJhc2UpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFOiB7CisJCQkJUGVyc3BlY3RpdmUgcGVyc3BlY3RpdmUgPSAoUGVyc3BlY3RpdmUpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VQZXJzcGVjdGl2ZShwZXJzcGVjdGl2ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGVyc3BlY3RpdmVCYXNlKHBlcnNwZWN0aXZlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQZXJzcGVjdGl2ZUxhenlSZXNvbHZlcihwZXJzcGVjdGl2ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfRUxFTUVOVDogeworCQkJCVBlcnNwZWN0aXZlRWxlbWVudCBwZXJzcGVjdGl2ZUVsZW1lbnQgPSAoUGVyc3BlY3RpdmVFbGVtZW50KXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlUGVyc3BlY3RpdmVFbGVtZW50KHBlcnNwZWN0aXZlRWxlbWVudCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGVyc3BlY3RpdmVMYXp5UmVzb2x2ZXIocGVyc3BlY3RpdmVFbGVtZW50KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9TQVNIX0NPTlRBSU5FUjogeworCQkJCVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lciBwZXJzcGVjdGl2ZVNhc2hDb250YWluZXIgPSAoUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyKHBlcnNwZWN0aXZlU2FzaENvbnRhaW5lcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGVyc3BlY3RpdmVFbGVtZW50KHBlcnNwZWN0aXZlU2FzaENvbnRhaW5lcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGVyc3BlY3RpdmVMYXp5UmVzb2x2ZXIocGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9QQVJUOiB7CisJCQkJUGVyc3BlY3RpdmVQYXJ0IHBlcnNwZWN0aXZlUGFydCA9IChQZXJzcGVjdGl2ZVBhcnQpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VQZXJzcGVjdGl2ZVBhcnQocGVyc3BlY3RpdmVQYXJ0KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQZXJzcGVjdGl2ZUVsZW1lbnQocGVyc3BlY3RpdmVQYXJ0KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQZXJzcGVjdGl2ZUxhenlSZXNvbHZlcihwZXJzcGVjdGl2ZVBhcnQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1BBUlRfU1RBQ0s6IHsKKwkJCQlQZXJzcGVjdGl2ZVBhcnRTdGFjayBwZXJzcGVjdGl2ZVBhcnRTdGFjayA9IChQZXJzcGVjdGl2ZVBhcnRTdGFjayl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVBlcnNwZWN0aXZlUGFydFN0YWNrKHBlcnNwZWN0aXZlUGFydFN0YWNrKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQZXJzcGVjdGl2ZUVsZW1lbnQocGVyc3BlY3RpdmVQYXJ0U3RhY2spOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBlcnNwZWN0aXZlTGF6eVJlc29sdmVyKHBlcnNwZWN0aXZlUGFydFN0YWNrKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9WSUVXOiB7CisJCQkJUGVyc3BlY3RpdmVWaWV3IHBlcnNwZWN0aXZlVmlldyA9IChQZXJzcGVjdGl2ZVZpZXcpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VQZXJzcGVjdGl2ZVZpZXcocGVyc3BlY3RpdmVWaWV3KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQZXJzcGVjdGl2ZUxhenlSZXNvbHZlcihwZXJzcGVjdGl2ZVZpZXcpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1NFTEVDVElPTjogeworCQkJCVBlcnNwZWN0aXZlU2VsZWN0aW9uIHBlcnNwZWN0aXZlU2VsZWN0aW9uID0gKFBlcnNwZWN0aXZlU2VsZWN0aW9uKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlUGVyc3BlY3RpdmVTZWxlY3Rpb24ocGVyc3BlY3RpdmVTZWxlY3Rpb24pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBlcnNwZWN0aXZlVmlldyhwZXJzcGVjdGl2ZVNlbGVjdGlvbik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGVyc3BlY3RpdmVMYXp5UmVzb2x2ZXIocGVyc3BlY3RpdmVTZWxlY3Rpb24pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1RBQkxFOiB7CisJCQkJUGVyc3BlY3RpdmVUYWJsZSBwZXJzcGVjdGl2ZVRhYmxlID0gKFBlcnNwZWN0aXZlVGFibGUpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VQZXJzcGVjdGl2ZVRhYmxlKHBlcnNwZWN0aXZlVGFibGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBlcnNwZWN0aXZlVmlldyhwZXJzcGVjdGl2ZVRhYmxlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQZXJzcGVjdGl2ZUxhenlSZXNvbHZlcihwZXJzcGVjdGl2ZVRhYmxlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9HUklEOiB7CisJCQkJUGVyc3BlY3RpdmVHcmlkIHBlcnNwZWN0aXZlR3JpZCA9IChQZXJzcGVjdGl2ZUdyaWQpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VQZXJzcGVjdGl2ZUdyaWQocGVyc3BlY3RpdmVHcmlkKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQZXJzcGVjdGl2ZVZpZXcocGVyc3BlY3RpdmVHcmlkKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQZXJzcGVjdGl2ZUxhenlSZXNvbHZlcihwZXJzcGVjdGl2ZUdyaWQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX0NIQVJUOiB7CisJCQkJUGVyc3BlY3RpdmVDaGFydCBwZXJzcGVjdGl2ZUNoYXJ0ID0gKFBlcnNwZWN0aXZlQ2hhcnQpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VQZXJzcGVjdGl2ZUNoYXJ0KHBlcnNwZWN0aXZlQ2hhcnQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBlcnNwZWN0aXZlVmlldyhwZXJzcGVjdGl2ZUNoYXJ0KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQZXJzcGVjdGl2ZUxhenlSZXNvbHZlcihwZXJzcGVjdGl2ZUNoYXJ0KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9SRVBPUlQ6IHsKKwkJCQlQZXJzcGVjdGl2ZVJlcG9ydCBwZXJzcGVjdGl2ZVJlcG9ydCA9IChQZXJzcGVjdGl2ZVJlcG9ydCl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVBlcnNwZWN0aXZlUmVwb3J0KHBlcnNwZWN0aXZlUmVwb3J0KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQZXJzcGVjdGl2ZVZpZXcocGVyc3BlY3RpdmVSZXBvcnQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBlcnNwZWN0aXZlTGF6eVJlc29sdmVyKHBlcnNwZWN0aXZlUmVwb3J0KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9PUkdBTklaQVRJT046IHsKKwkJCQlQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbiBwZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbiA9IChQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbil0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVBlcnNwZWN0aXZlT3JnYW5pemF0aW9uKHBlcnNwZWN0aXZlT3JnYW5pemF0aW9uKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQZXJzcGVjdGl2ZVZpZXcocGVyc3BlY3RpdmVPcmdhbml6YXRpb24pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBlcnNwZWN0aXZlTGF6eVJlc29sdmVyKHBlcnNwZWN0aXZlT3JnYW5pemF0aW9uKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9UT1BPTE9HWTogeworCQkJCVBlcnNwZWN0aXZlVG9wb2xvZ3kgcGVyc3BlY3RpdmVUb3BvbG9neSA9IChQZXJzcGVjdGl2ZVRvcG9sb2d5KXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlUGVyc3BlY3RpdmVUb3BvbG9neShwZXJzcGVjdGl2ZVRvcG9sb2d5KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQZXJzcGVjdGl2ZVZpZXcocGVyc3BlY3RpdmVUb3BvbG9neSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGVyc3BlY3RpdmVMYXp5UmVzb2x2ZXIocGVyc3BlY3RpdmVUb3BvbG9neSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfRElBTE9HOiB7CisJCQkJUGVyc3BlY3RpdmVEaWFsb2cgcGVyc3BlY3RpdmVEaWFsb2cgPSAoUGVyc3BlY3RpdmVEaWFsb2cpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VQZXJzcGVjdGl2ZURpYWxvZyhwZXJzcGVjdGl2ZURpYWxvZyk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGVyc3BlY3RpdmVWaWV3KHBlcnNwZWN0aXZlRGlhbG9nKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQZXJzcGVjdGl2ZUxhenlSZXNvbHZlcihwZXJzcGVjdGl2ZURpYWxvZyk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfQlBNTjogeworCQkJCVBlcnNwZWN0aXZlQlBNTiBwZXJzcGVjdGl2ZUJQTU4gPSAoUGVyc3BlY3RpdmVCUE1OKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlUGVyc3BlY3RpdmVCUE1OKHBlcnNwZWN0aXZlQlBNTik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGVyc3BlY3RpdmVWaWV3KHBlcnNwZWN0aXZlQlBNTik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGVyc3BlY3RpdmVMYXp5UmVzb2x2ZXIocGVyc3BlY3RpdmVCUE1OKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QZXJzcGVjdGl2ZSBNb2RlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBlcnNwZWN0aXZlIE1vZGVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlUGVyc3BlY3RpdmVNb2RlbChQZXJzcGVjdGl2ZU1vZGVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QZXJzcGVjdGl2ZSBMYXp5IFJlc29sdmVyPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGVyc3BlY3RpdmUgTGF6eSBSZXNvbHZlcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVBlcnNwZWN0aXZlTGF6eVJlc29sdmVyKFBlcnNwZWN0aXZlTGF6eVJlc29sdmVyIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QZXJzcGVjdGl2ZSBQYWNrYWdlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGVyc3BlY3RpdmUgUGFja2FnZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVBlcnNwZWN0aXZlUGFja2FnZShQZXJzcGVjdGl2ZVBhY2thZ2Ugb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBlcnNwZWN0aXZlIEJhc2U8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QZXJzcGVjdGl2ZSBCYXNlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlUGVyc3BlY3RpdmVCYXNlKFBlcnNwZWN0aXZlQmFzZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGVyc3BlY3RpdmU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QZXJzcGVjdGl2ZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVBlcnNwZWN0aXZlKFBlcnNwZWN0aXZlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QZXJzcGVjdGl2ZSBFbGVtZW50PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGVyc3BlY3RpdmUgRWxlbWVudDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVBlcnNwZWN0aXZlRWxlbWVudChQZXJzcGVjdGl2ZUVsZW1lbnQgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBlcnNwZWN0aXZlIFNhc2ggQ29udGFpbmVyPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGVyc3BlY3RpdmUgU2FzaCBDb250YWluZXI8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIoUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QZXJzcGVjdGl2ZSBQYXJ0PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGVyc3BlY3RpdmUgUGFydDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVBlcnNwZWN0aXZlUGFydChQZXJzcGVjdGl2ZVBhcnQgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBlcnNwZWN0aXZlIFBhcnQgU3RhY2s8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QZXJzcGVjdGl2ZSBQYXJ0IFN0YWNrPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlUGVyc3BlY3RpdmVQYXJ0U3RhY2soUGVyc3BlY3RpdmVQYXJ0U3RhY2sgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBlcnNwZWN0aXZlIFZpZXc8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QZXJzcGVjdGl2ZSBWaWV3PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlUGVyc3BlY3RpdmVWaWV3KFBlcnNwZWN0aXZlVmlldyBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGVyc3BlY3RpdmUgU2VsZWN0aW9uPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGVyc3BlY3RpdmUgU2VsZWN0aW9uPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlUGVyc3BlY3RpdmVTZWxlY3Rpb24oUGVyc3BlY3RpdmVTZWxlY3Rpb24gb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBlcnNwZWN0aXZlIFRhYmxlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGVyc3BlY3RpdmUgVGFibGU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VQZXJzcGVjdGl2ZVRhYmxlKFBlcnNwZWN0aXZlVGFibGUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBlcnNwZWN0aXZlIEdyaWQ8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QZXJzcGVjdGl2ZSBHcmlkPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlUGVyc3BlY3RpdmVHcmlkKFBlcnNwZWN0aXZlR3JpZCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGVyc3BlY3RpdmUgQ2hhcnQ8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QZXJzcGVjdGl2ZSBDaGFydDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVBlcnNwZWN0aXZlQ2hhcnQoUGVyc3BlY3RpdmVDaGFydCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGVyc3BlY3RpdmUgUmVwb3J0PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGVyc3BlY3RpdmUgUmVwb3J0PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlUGVyc3BlY3RpdmVSZXBvcnQoUGVyc3BlY3RpdmVSZXBvcnQgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBlcnNwZWN0aXZlIE9yZ2FuaXphdGlvbjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBlcnNwZWN0aXZlIE9yZ2FuaXphdGlvbjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVBlcnNwZWN0aXZlT3JnYW5pemF0aW9uKFBlcnNwZWN0aXZlT3JnYW5pemF0aW9uIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QZXJzcGVjdGl2ZSBUb3BvbG9neTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBlcnNwZWN0aXZlIFRvcG9sb2d5PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlUGVyc3BlY3RpdmVUb3BvbG9neShQZXJzcGVjdGl2ZVRvcG9sb2d5IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QZXJzcGVjdGl2ZSBEaWFsb2c8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QZXJzcGVjdGl2ZSBEaWFsb2c8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VQZXJzcGVjdGl2ZURpYWxvZyhQZXJzcGVjdGl2ZURpYWxvZyBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGVyc3BlY3RpdmUgQlBNTjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBlcnNwZWN0aXZlIEJQTU48L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VQZXJzcGVjdGl2ZUJQTU4oUGVyc3BlY3RpdmVCUE1OIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5MTGF6eSBSZXNvbHZlcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxMYXp5IFJlc29sdmVyPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlTExhenlSZXNvbHZlcihMTGF6eVJlc29sdmVyIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5MUGFja2FnZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxQYWNrYWdlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlTFBhY2thZ2UoTFBhY2thZ2Ugb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFQgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCit9IC8vUGVyc3BlY3RpdmVEc2xTd2l0Y2gKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZXBsLXYxMC5odG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9lcGwtdjEwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM5OGFjYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvZXBsLXYxMC5odG1sCkBAIC0wLDAgKzEsMjU5IEBACis8IS0tP3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/LS0+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKzx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKyAgYm9keSB7CisgICAgc2l6ZTogOC41aW4gMTEuMGluOworICAgIG1hcmdpbjogMC4yNWluIDAuNWluIDAuMjVpbiAwLjVpbjsKKyAgICB0YWItaW50ZXJ2YWw6IDAuNWluOworICAgIH0KKyAgcCB7ICAJCisgICAgbWFyZ2luLWxlZnQ6IGF1dG87CisgICAgbWFyZ2luLXRvcDogIDAuNWVtOworICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOworICAgIH0KKyAgcC5saXN0IHsKKyAgCW1hcmdpbi1sZWZ0OiAwLjVpbjsKKyAgICBtYXJnaW4tdG9wOiAgMC4wNWVtOworICAgIG1hcmdpbi1ib3R0b206IDAuMDVlbTsKKyAgICB9CisgIDwvc3R5bGU+CisKKzwvaGVhZD4KKworPGJvZHkgbGFuZz0iRU4tVVMiPgorCis8aDI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9oMj4KKworPHA+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UKK1BVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUgorRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUworQUdSRUVNRU5ULjwvcD4KKworPHA+PGI+MS4gREVGSU5JVElPTlM8L2I+PC9wPgorCis8cD4iQ29udHJpYnV0aW9uIiBtZWFuczo8L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwKK2NvZGUgYW5kIGRvY3VtZW50YXRpb24gZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDwvcD4KKzxwIGNsYXNzPSJsaXN0Ij5iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9wPgorPHAgY2xhc3M9Imxpc3QiPmkpIGNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvcD4KKzxwIGNsYXNzPSJsaXN0Ij5paSkgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvcD4KKzxwIGNsYXNzPSJsaXN0Ij53aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbQorb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEKK0NvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUKK1Byb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoCitDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCitQcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4KK2Nvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKQorYXJlIG5vdCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLjwvcD4KKworPHA+IkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzCit0aGUgUHJvZ3JhbS48L3A+CisKKzxwPiJMaWNlbnNlZCBQYXRlbnRzIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhCitDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMKK0NvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uPC9wPgorCis8cD4iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZQord2l0aCB0aGlzIEFncmVlbWVudC48L3A+CisKKzxwPiJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIKK3RoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3A+CisKKzxwPjxiPjIuIEdSQU5UIE9GIFJJR0hUUzwvYj48L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5hKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaAorQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCityb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3MKK29mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZQorQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4KK3NvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmIpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoCitDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKK3JveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwKK29mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAorQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50CitsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUKK1Byb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLAorc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQKK2J5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueSBvdGhlcgorY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCitsaWNlbnNlZCBoZXJldW5kZXIuPC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvcgorZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzCithcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlCitwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoCitDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5Cithbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCitvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQgbGljZW5zZXMKK2dyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvCitzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvcgorZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQKK3RvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUKK3RoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmQpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQKK2hhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudAordGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC48L3A+CisKKzxwPjxiPjMuIFJFUVVJUkVNRU5UUzwvYj48L3A+CisKKzxwPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlCitmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YSkgaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcworQWdyZWVtZW50OyBhbmQ8L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5iKSBpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+aSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzCithbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMKK29yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IKK2NvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTs8L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5paSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMKK2FsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAoraW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czs8L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5paWkpIHN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMKK0FncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyCitwYXJ0eTsgYW5kPC9wPgorCis8cCBjbGFzcz0ibGlzdCI+aXYpIHN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUKK2Zyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYQorcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZQorZXhjaGFuZ2UuPC9wPgorCis8cD5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YSkgaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kPC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoCitjb3B5IG9mIHRoZSBQcm9ncmFtLjwvcD4KKworPHA+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQKK3dpdGhpbiB0aGUgUHJvZ3JhbS48L3A+CisKKzxwPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzCitDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50CitSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uPC9wPgorCis8cD48Yj40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvYj48L3A+CisKKzxwPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbgorcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlCitsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YKK3RoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAorcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlCitwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvcgoraW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IKKygiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZAoraW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yICgiSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IiKQorYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKQorYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkCitwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUKK2FjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzCitkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuIFRoZQorb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcworcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluCitvcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkKK3RoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZQorQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZQorSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24KK2V4cGVuc2UuPC9wPgorCis8cD5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAorcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsCitDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKK2NsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlCitjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5CithbG9uZS4gVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvCitkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlCitwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlcgorQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgorbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3A+CisKKzxwPjxiPjUuIE5PIFdBUlJBTlRZPC9iPjwvcD4KKworPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTCitQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUworT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sCitBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkKK09SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKK3Jlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZAorZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzCitleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCit0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLAorZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IKK2ludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLjwvcD4KKworPHA+PGI+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L2I+PC9wPgorCis8cD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQKK05PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCitJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HCitXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCitORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SCitESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRAorSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3A+CisKKzxwPjxiPjcuIEdFTkVSQUw8L2I+PC9wPgorCis8cD5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mCit0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24KK2J5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0KK2V4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9wPgorCis8cD5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkKKyhpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZQorUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlcgorc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCitSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZQorZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuPC9wPgorCis8cD5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdAorZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMKK0FncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lCithZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMKK3VuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCitkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAorUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5CitSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuPC9wPgorCis8cD5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcworQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCitjb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZQorQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcKK3JldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZQorQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlCitGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heQorYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYQorc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZQorZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0gKGluY2x1ZGluZworQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZQorQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24KK29mIHRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUKK1Byb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMKK2V4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vCityaWdodHMgb3IgbGljZW5zZXMgdG8gdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIKK3RoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yCitvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMKK0FncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9wPgorCis8cD5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kCit0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkKK3RvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQgbW9yZQordGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcyBpdHMKK3JpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvcD4KKworCisKKzwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9saWNlbnNlLmh0bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL2xpY2Vuc2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTU3OWE1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9saWNlbnNlLmh0bWwKQEAgLTAsMCArMSwxNjQgQEAKKzwhLS0/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8tLT4KKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9IkVOLVVTIj4KKzxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorPHA+RmVicnVhcnkgMSwgMjAxMTwvcD4KKworPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCis8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKyAgIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKKyAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCisgICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKworPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgorCis8cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UKKyBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIAorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAorICAgKCJFUEwiKS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvCisgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCisgICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKK2RvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiAKK3NvdXJjZSBjb2RlCisgICByZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgCithdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9wPgorCis8dWw+CisgICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byAKK2ZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCAKK21vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKKygiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuPC9saT4KKyAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJiM4NDgyOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuPC9saT4KKyAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciAKK0ZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSAKK3N1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIAorbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgCitvZiB0aGUgUGx1Zy1pbnMKKyAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgorICAgICAgIDxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgCitGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgCitsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Cis8L3VsPgorCis8cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIAorY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIAorY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCitJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAorKCJGZWF0dXJlIExpY2Vuc2VzIikuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55CisgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCitpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisKKzx1bD4KKyAgICAgICA8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKyAgICAgICA8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorICAgICAgIDxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKyAgICAgICA8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+CisgICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgorPC91bD4KKworPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgCitpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QKKyBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZQoraW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIAorRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCAKK2NvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgoraW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIAorZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiAKK2ZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCitTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIAordGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCAKK2dvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCit0aGF0IGRpcmVjdG9yeS48L3A+CisKKzxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgCitUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4KKyAgU09NRSBPRiBUSEVTRQorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CisKKzx1bD4KKyAgICAgICA8bGk+RWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWw8L2E+KTwvbGk+CisgICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KKyAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgorICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KKyAgICAgICA8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgorICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Cis8L3VsPgorCis8cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCAKK0NPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgCitvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKK2NvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyAKK2dvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+CisKKworPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CisKKzxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgCitleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKKyAgIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3IgdGhlIHB1cnBvc2Ugb2YgCithbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKKyAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIAorY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bworICAgaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQgCitwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+CisgICAoIlNwZWNpZmljYXRpb24iKS48L3A+CisKKzxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbAorIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQorICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvCisgYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIAorVGVjaG5vbG9neQorICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgCitUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIAordGhlCisgICBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZSAKK2FjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KKworPG9sPgorICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gCit3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5CisgICAgICAgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgCitleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAorICAgICAgIHByb2R1Y3QuPC9saT4KKyAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IAorbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCisgICAgICAgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KKyAgICAgICA8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgCit0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKKyAgICAgICBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoIEluc3RhbGxhYmxlIAorU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAorICAgICAgIE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIAorU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0CisgZ292ZXJuCisgICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIAordXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIAorVXBvbiBzdWNoCisgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSAKK3dpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgorPC9vbD4KKworPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisKKzxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZQorIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgCithbmQvb3IgcmUtZXhwb3J0IHRvCisgICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiAKK3NvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCitjb25jZXJuaW5nIHRoZSBpbXBvcnQsCisgICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIAordGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorCis8cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KKworCis8L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvbW9kZWwvUGVyc3BlY3RpdmVEc2wueGNvcmUgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL21vZGVsL1BlcnNwZWN0aXZlRHNsLnhjb3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNmFiY2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL21vZGVsL1BlcnNwZWN0aXZlRHNsLnhjb3JlCkBAIC0wLDAgKzEsMTQwIEBACitAR2VuTW9kZWwoZmlsZUV4dGVuc2lvbnM9InBlcnNwZWN0aXZlIikKK0BHZW5Nb2RlbChtb2RlbE5hbWU9IlBlcnNwZWN0aXZlRHNsIikKK0BHZW5Nb2RlbChwcmVmaXg9IlBlcnNwZWN0aXZlRHNsIikKK0BHZW5Nb2RlbCh1cGRhdGVDbGFzc3BhdGg9ImZhbHNlIikKK0BHZW5Nb2RlbChjb3B5cmlnaHRUZXh0PSJDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorCisgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgIAorIENvbnRyaWJ1dG9yc3sgIAorIAkJSm9lcmcgUmllZ2VsIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAiKQorQEVjb3JlKG5zVVJJPSJodHRwOi8vb3NicC5lY2xpcHNlLm9yZy94dGV4dC9wZXJzcGVjdGl2ZS9QZXJzcGVjdGl2ZURzbCIpCitARWNvcmUobnNQcmVmaXg9InBlcnNwZWN0aXZlZHNsIikKK0BFY29yZShyb290UGFja2FnZT0icGVyc3BlY3RpdmVkc2wiKQorcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kaWFsb2dkc2wuRGlhbG9nCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5vcmdhbml6YXRpb25kc2wuT3JnYW5pemF0aW9uCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC50YWJsZS5UYWJsZQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQudG9wb2xvZ3lkc2wuVG9wb2xvZ3kKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmFjdGlvbi5BY3Rpb25Ub29sYmFyCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bVR5cGVSZWZlcmVuY2UKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC54dGV4dC5sYXp5cmVzb2x2ZXIuYXBpLkVjb3JlVXRpbDMKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXMuTFBhY2thZ2UKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJsaXAuQmxpcAoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYmxpcC5CbGlwVXNlclRhc2sKKworY2xhc3MgUGVyc3BlY3RpdmVNb2RlbHsKKwljb250YWlucyBQZXJzcGVjdGl2ZVBhY2thZ2VbXSBwYWNrYWdlcworfQorCit0eXBlIEludGVybmFsRU9iamVjdCB3cmFwcyBJbnRlcm5hbEVPYmplY3QKKworY2xhc3MgUGVyc3BlY3RpdmVMYXp5UmVzb2x2ZXIgeworCW9wIEVPYmplY3QgZVJlc29sdmVQcm94eShJbnRlcm5hbEVPYmplY3QgcHJveHkpIHsKKwkJcmV0dXJuIEVjb3JlVXRpbDMucmVzb2x2ZShwcm94eSwgdGhpcy5lUmVzb3VyY2UoKS5yZXNvdXJjZVNldCk7CisJfQorfQorCitjbGFzcyBQZXJzcGVjdGl2ZVBhY2thZ2UgZXh0ZW5kcyBMUGFja2FnZXsKKwljb250YWlucyBQZXJzcGVjdGl2ZVtdIHBlcnNwZWN0aXZlcworfQorCitjbGFzcyBQZXJzcGVjdGl2ZUJhc2UgZXh0ZW5kcyBQZXJzcGVjdGl2ZUxhenlSZXNvbHZlcnsKKwlTdHJpbmcgbmFtZQorfQorCitjbGFzcyBQZXJzcGVjdGl2ZSBleHRlbmRzIFBlcnNwZWN0aXZlQmFzZXsKKwlib29sZWFuIGRlc2NyaXB0aW9uCisJU3RyaW5nIGRlc2NyaXB0aW9uVmFsdWUKKwlTdHJpbmcgaWNvblVSSQorCVN0cmluZyBhY2Nlc3NpYmlsaXR5UGhyYXNlCisJcmVmZXJzIEJsaXAgcHJvY2VzcworCXJlZmVycyBCbGlwVXNlclRhc2sgdXNlclRhc2sKKwlyZWZlcnMgQWN0aW9uVG9vbGJhciB0b29sYmFyCisJY29udGFpbnMgcmVzb2x2aW5nIHRyYW5zaWVudCBKdm1UeXBlUmVmZXJlbmNlIHRvb2xiYXJUeXBlSnZtCisJY29udGFpbnMgUGVyc3BlY3RpdmVFbGVtZW50W10gZWxlbWVudHMKK30KKworY2xhc3MgUGVyc3BlY3RpdmVFbGVtZW50IGV4dGVuZHMgUGVyc3BlY3RpdmVMYXp5UmVzb2x2ZXJ7CisJU3RyaW5nIGVsZW1lbnRJZAorCVN0cmluZyBhY2Nlc3NpYmlsaXR5UGhyYXNlCisJU3RyaW5nIGNvbnRhaW5lckRhdGEKKwljb250YWlucyBQZXJzcGVjdGl2ZUVsZW1lbnRbXSBlbGVtZW50cworfQorCitjbGFzcyBQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIgZXh0ZW5kcyBQZXJzcGVjdGl2ZUVsZW1lbnQgeworCVNhc2hPcmllbnRhdGlvbiBvcmllbnRhdGlvbgorCXJlZmVycyBQZXJzcGVjdGl2ZUVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50Cit9CisKK2NsYXNzIFBlcnNwZWN0aXZlUGFydCBleHRlbmRzIFBlcnNwZWN0aXZlRWxlbWVudCB7CisJYm9vbGVhbiBkZXNjcmlwdGlvbgorCVN0cmluZyBkZXNjcmlwdGlvblZhbHVlCisJU3RyaW5nIGljb25VUkkKKwljb250YWlucyBQZXJzcGVjdGl2ZVZpZXcgdmlldworCWJvb2xlYW4gaXNDbG9zYWJsZQorfQorCitjbGFzcyBQZXJzcGVjdGl2ZVBhcnRTdGFjayBleHRlbmRzIFBlcnNwZWN0aXZlRWxlbWVudCB7CisJcmVmZXJzIFBlcnNwZWN0aXZlUGFydCBzZWxlY3RlZEVsZW1lbnQKK30KKworaW50ZXJmYWNlIFBlcnNwZWN0aXZlVmlldyBleHRlbmRzIFBlcnNwZWN0aXZlTGF6eVJlc29sdmVyeworfQorCitjbGFzcyBQZXJzcGVjdGl2ZVNlbGVjdGlvbiBleHRlbmRzIFBlcnNwZWN0aXZlVmlldyB7CisJcmVmZXJzIFRhYmxlIHJlZgorCWNvbnRhaW5zIHJlc29sdmluZyB0cmFuc2llbnQgSnZtVHlwZVJlZmVyZW5jZSByZWZUeXBlSnZtCit9CisKK2NsYXNzIFBlcnNwZWN0aXZlVGFibGUgZXh0ZW5kcyBQZXJzcGVjdGl2ZVZpZXcgeworCXJlZmVycyBUYWJsZSByZWYKKwljb250YWlucyByZXNvbHZpbmcgdHJhbnNpZW50IEp2bVR5cGVSZWZlcmVuY2UgcmVmVHlwZUp2bQorfQorCitjbGFzcyBQZXJzcGVjdGl2ZUdyaWQgZXh0ZW5kcyBQZXJzcGVjdGl2ZVZpZXcgeworCXJlZmVycyBUYWJsZSByZWYKKwljb250YWlucyByZXNvbHZpbmcgdHJhbnNpZW50IEp2bVR5cGVSZWZlcmVuY2UgcmVmVHlwZUp2bQorfQorCitjbGFzcyBQZXJzcGVjdGl2ZUNoYXJ0IGV4dGVuZHMgUGVyc3BlY3RpdmVWaWV3IHsKKwlyZWZlcnMgQ2hhcnQgcmVmCisJY29udGFpbnMgcmVzb2x2aW5nIHRyYW5zaWVudCAgSnZtVHlwZVJlZmVyZW5jZSByZWZUeXBlSnZtCit9CisKK2NsYXNzIFBlcnNwZWN0aXZlUmVwb3J0IGV4dGVuZHMgUGVyc3BlY3RpdmVWaWV3IHsKKwlyZWZlcnMgUmVwb3J0IHJlZgorCWNvbnRhaW5zIHJlc29sdmluZyB0cmFuc2llbnQgSnZtVHlwZVJlZmVyZW5jZSByZWZUeXBlSnZtCit9CisKK2NsYXNzIFBlcnNwZWN0aXZlT3JnYW5pemF0aW9uIGV4dGVuZHMgUGVyc3BlY3RpdmVWaWV3IHsKKwlyZWZlcnMgT3JnYW5pemF0aW9uIHJlZgorfQorCitjbGFzcyBQZXJzcGVjdGl2ZVRvcG9sb2d5IGV4dGVuZHMgUGVyc3BlY3RpdmVWaWV3IHsKKwlyZWZlcnMgVG9wb2xvZ3kgcmVmCisJY29udGFpbnMgcmVzb2x2aW5nIHRyYW5zaWVudCBKdm1UeXBlUmVmZXJlbmNlIHJlZlR5cGVKdm0KK30KKworY2xhc3MgUGVyc3BlY3RpdmVEaWFsb2cgZXh0ZW5kcyBQZXJzcGVjdGl2ZVZpZXcgeworCXJlZmVycyBEaWFsb2cgcmVmCisJY29udGFpbnMgcmVzb2x2aW5nIHRyYW5zaWVudCBKdm1UeXBlUmVmZXJlbmNlIHJlZlR5cGVKdm0KK30KKworY2xhc3MgUGVyc3BlY3RpdmVCUE1OIGV4dGVuZHMgUGVyc3BlY3RpdmVWaWV3IHsKK30KKworZW51bSBTYXNoT3JpZW50YXRpb24geworCUhPUklaT05UQUwgYXMgJ2hvcml6b250YWwnCisJVkVSVElDQUwgYXMgJ3ZlcnRpY2FsJworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9wbHVnaW4ucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvcGx1Z2luLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEwZDBjMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvcGx1Z2luLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNCBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorIyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyMgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyMgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorIyAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisjIAorIyAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisjICAgCisjICBDb250cmlidXRvcnN7ICAKKyMgIAkJSm9lcmcgUmllZ2VsIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyMgIAorCitwbHVnaW5OYW1lID0gUGVyc3BlY3RpdmVEc2wgTW9kZWwKK3Byb3ZpZGVyTmFtZSA9IHd3dy5leGFtcGxlLm9yZwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9wbHVnaW4ueG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9wbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZWMyNzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3BsdWdpbi54bWwKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KKworPCEtLQorIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorIAorICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAgIAorICBDb250cmlidXRvcnM6ICAKKyAgCQlDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gIAorICAKKy0tPgorCis8cGx1Z2luPgorCisgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgorICAgICAgPCEtLSBAZ2VuZXJhdGVkIFBlcnNwZWN0aXZlRHNsIC0tPgorICAgICAgPHBhY2thZ2UKKyAgICAgICAgICAgIHVyaT0iaHR0cDovL29zYnAuZWNsaXBzZS5vcmcveHRleHQvcGVyc3BlY3RpdmUvUGVyc3BlY3RpdmVEc2wiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbFBhY2thZ2UiCisgICAgICAgICAgICBnZW5Nb2RlbD0ibW9kZWwvUGVyc3BlY3RpdmVEc2wueGNvcmUiLz4KKyAgIDwvZXh0ZW5zaW9uPgorCis8L3BsdWdpbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvcG9tLnhtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTkxMWRhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9wb20ueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorPCEtLSMgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgLS0+Cis8IS0tIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIC0tPgorPCEtLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIC0tPgorPCEtLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgLS0+Cis8IS0tIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAtLT4KKzwhLS0jIC0tPgorPCEtLSMgQ29udHJpYnV0b3JzOiAtLT4KKzwhLS0jICAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAtLT4KKzwhLS0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorCTxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKwk8cGFyZW50PgorCQk8Z3JvdXBJZD5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlPC9ncm91cElkPgorCQk8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmFnZ3JlZ2F0b3I8L2FydGlmYWN0SWQ+CisJCTx2ZXJzaW9uPjAuOS4wLVNOQVBTSE9UPC92ZXJzaW9uPgorCQk8cmVsYXRpdmVQYXRoPi4uPC9yZWxhdGl2ZVBhdGg+CisJPC9wYXJlbnQ+CisJPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZTwvYXJ0aWZhY3RJZD4KKwk8cGFja2FnaW5nPmVjbGlwc2UtcGx1Z2luPC9wYWNrYWdpbmc+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL0Fic3RyYWN0UGVyc3BlY3RpdmVEc2xSdW50aW1lTW9kdWxlLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9BYnN0cmFjdFBlcnNwZWN0aXZlRHNsUnVudGltZU1vZHVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZjEzMWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9BYnN0cmFjdFBlcnNwZWN0aXZlRHNsUnVudGltZU1vZHVsZS5qYXZhCkBAIC0wLDAgKzEsMzUyIEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5zZXJ2aWNlLkRlZmF1bHRSdW50aW1lTW9kdWxlOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuQmluZGVyOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0Lm5hbWUuTmFtZXM7CisKKy8qKgorICogTWFudWFsIG1vZGlmaWNhdGlvbnMgZ28gdG8ge29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2xSdW50aW1lTW9kdWxlfQorICovCisgQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQZXJzcGVjdGl2ZURzbFJ1bnRpbWVNb2R1bGUgZXh0ZW5kcyBEZWZhdWx0UnVudGltZU1vZHVsZSB7CisKKwlwcm90ZWN0ZWQgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbnVsbDsKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZShCaW5kZXIgYmluZGVyKSB7CisJCXByb3BlcnRpZXMgPSB0cnlCaW5kUHJvcGVydGllcyhiaW5kZXIsICJvcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL1BlcnNwZWN0aXZlRHNsLnByb3BlcnRpZXMiKTsKKwkJc3VwZXIuY29uZmlndXJlKGJpbmRlcik7CisJfQorCQorCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUxhbmd1YWdlTmFtZShCaW5kZXIgYmluZGVyKSB7CisJCWJpbmRlci5iaW5kKFN0cmluZy5jbGFzcykuYW5ub3RhdGVkV2l0aChOYW1lcy5uYW1lZChDb25zdGFudHMuTEFOR1VBR0VfTkFNRSkpLnRvSW5zdGFuY2UoIm9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2wiKTsKKwl9CisJCisJcHVibGljIHZvaWQgY29uZmlndXJlRmlsZUV4dGVuc2lvbnMoQmluZGVyIGJpbmRlcikgeworCQlpZiAocHJvcGVydGllcyA9PSBudWxsIHx8IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkZJTEVfRVhURU5TSU9OUykgPT0gbnVsbCkKKwkJCWJpbmRlci5iaW5kKFN0cmluZy5jbGFzcykuYW5ub3RhdGVkV2l0aChOYW1lcy5uYW1lZChDb25zdGFudHMuRklMRV9FWFRFTlNJT05TKSkudG9JbnN0YW5jZSgicGVyc3BlY3RpdmUiKTsKKwl9CisJCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnNlcmlhbGl6ZXIuU2VyaWFsaXplckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5zZXJpYWxpemVyLnNlcXVlbmNlci5JU2VtYW50aWNTZXF1ZW5jZXI+IGJpbmRJU2VtYW50aWNTZXF1ZW5jZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnNlcmlhbGl6ZXIuUGVyc3BlY3RpdmVEc2xTZW1hbnRpY1NlcXVlbmNlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3Iuc2VyaWFsaXplci5TZXJpYWxpemVyRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnNlcmlhbGl6ZXIuc2VxdWVuY2VyLklTeW50YWN0aWNTZXF1ZW5jZXI+IGJpbmRJU3ludGFjdGljU2VxdWVuY2VyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5zZXJpYWxpemVyLlBlcnNwZWN0aXZlRHNsU3ludGFjdGljU2VxdWVuY2VyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5zZXJpYWxpemVyLlNlcmlhbGl6ZXJGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQuc2VyaWFsaXplci5JU2VyaWFsaXplcj4gYmluZElTZXJpYWxpemVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQuc2VyaWFsaXplci5pbXBsLlNlcmlhbGl6ZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnBhcnNlci5hbnRsci5YdGV4dEFudGxyR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5JUGFyc2VyPiBiaW5kSVBhcnNlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUucGFyc2VyLmFudGxyLlBlcnNwZWN0aXZlRHNsUGFyc2VyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5wYXJzZXIuYW50bHIuWHRleHRBbnRsckdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuSVRva2VuVG9TdHJpbmdDb252ZXJ0ZXI+IGJpbmRJVG9rZW5Ub1N0cmluZ0NvbnZlcnRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5BbnRsclRva2VuVG9TdHJpbmdDb252ZXJ0ZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnBhcnNlci5hbnRsci5YdGV4dEFudGxyR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5JQW50bHJUb2tlbkZpbGVQcm92aWRlcj4gYmluZElBbnRsclRva2VuRmlsZVByb3ZpZGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5wYXJzZXIuYW50bHIuUGVyc3BlY3RpdmVEc2xBbnRsclRva2VuRmlsZVByb3ZpZGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5wYXJzZXIuYW50bHIuWHRleHRBbnRsckdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuTGV4ZXI+IGJpbmRMZXhlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUucGFyc2VyLmFudGxyLmludGVybmFsLkludGVybmFsUGVyc3BlY3RpdmVEc2xMZXhlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IucGFyc2VyLmFudGxyLlh0ZXh0QW50bHJHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjxvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnBhcnNlci5hbnRsci5pbnRlcm5hbC5JbnRlcm5hbFBlcnNwZWN0aXZlRHNsTGV4ZXI+IHByb3ZpZGVJbnRlcm5hbFBlcnNwZWN0aXZlRHNsTGV4ZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuTGV4ZXJQcm92aWRlci5jcmVhdGUob3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5wYXJzZXIuYW50bHIuaW50ZXJuYWwuSW50ZXJuYWxQZXJzcGVjdGl2ZURzbExleGVyLmNsYXNzKTsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IucGFyc2VyLmFudGxyLlh0ZXh0QW50bHJHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZVJ1bnRpbWVMZXhlcihjb20uZ29vZ2xlLmluamVjdC5CaW5kZXIgYmluZGVyKSB7CisJCWJpbmRlci5iaW5kKG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5MZXhlci5jbGFzcykuYW5ub3RhdGVkV2l0aChjb20uZ29vZ2xlLmluamVjdC5uYW1lLk5hbWVzLm5hbWVkKG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5MZXhlckJpbmRpbmdzLlJVTlRJTUUpKS50byhvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnBhcnNlci5hbnRsci5pbnRlcm5hbC5JbnRlcm5hbFBlcnNwZWN0aXZlRHNsTGV4ZXIuY2xhc3MpOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5wYXJzZXIuYW50bHIuWHRleHRBbnRsckdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuSVRva2VuRGVmUHJvdmlkZXI+IGJpbmRJVG9rZW5EZWZQcm92aWRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5BbnRsclRva2VuRGVmUHJvdmlkZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnBhcnNlci5hbnRsci5YdGV4dEFudGxyR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5JVW5vcmRlcmVkR3JvdXBIZWxwZXI+IGJpbmRJVW5vcmRlcmVkR3JvdXBIZWxwZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuVW5vcmRlcmVkR3JvdXBIZWxwZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnZhbGlkYXRpb24uVmFsaWRhdG9yRnJhZ21lbnQKKwlAb3JnLmVjbGlwc2UueHRleHQuc2VydmljZS5TaW5nbGV0b25CaW5kaW5nKGVhZ2VyPXRydWUpCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS52YWxpZGF0aW9uLlBlcnNwZWN0aXZlRHNsVmFsaWRhdG9yPiBiaW5kUGVyc3BlY3RpdmVEc2xWYWxpZGF0b3IoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnZhbGlkYXRpb24uUGVyc3BlY3RpdmVEc2xWYWxpZGF0b3IuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnNjb3BpbmcuQWJzdHJhY3RTY29waW5nRnJhZ21lbnQKKwlwdWJsaWMgdm9pZCBjb25maWd1cmVJZ25vcmVDYXNlTGlua2luZyhjb20uZ29vZ2xlLmluamVjdC5CaW5kZXIgYmluZGVyKSB7CisJCWJpbmRlci5iaW5kQ29uc3RhbnQoKS5hbm5vdGF0ZWRXaXRoKG9yZy5lY2xpcHNlLnh0ZXh0LnNjb3BpbmcuSWdub3JlQ2FzZUxpbmtpbmcuY2xhc3MpLnRvKGZhbHNlKTsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IuYnVpbGRlci5CdWlsZGVySW50ZWdyYXRpb25GcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuSUNvbnRhaW5lci5NYW5hZ2VyPiBiaW5kSUNvbnRhaW5lciRNYW5hZ2VyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuY29udGFpbmVycy5TdGF0ZUJhc2VkQ29udGFpbmVyTWFuYWdlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IuYnVpbGRlci5CdWlsZGVySW50ZWdyYXRpb25GcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuY29udGFpbmVycy5JQWxsQ29udGFpbmVyc1N0YXRlLlByb3ZpZGVyPiBiaW5kSUFsbENvbnRhaW5lcnNTdGF0ZSRQcm92aWRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLmNvbnRhaW5lcnMuUmVzb3VyY2VTZXRCYXNlZEFsbENvbnRhaW5lcnNTdGF0ZVByb3ZpZGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5idWlsZGVyLkJ1aWxkZXJJbnRlZ3JhdGlvbkZyYWdtZW50CisJcHVibGljIHZvaWQgY29uZmlndXJlSVJlc291cmNlRGVzY3JpcHRpb25zKGNvbS5nb29nbGUuaW5qZWN0LkJpbmRlciBiaW5kZXIpIHsKKwkJYmluZGVyLmJpbmQob3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuSVJlc291cmNlRGVzY3JpcHRpb25zLmNsYXNzKS50byhvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0QmFzZWRSZXNvdXJjZURlc2NyaXB0aW9ucy5jbGFzcyk7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLmJ1aWxkZXIuQnVpbGRlckludGVncmF0aW9uRnJhZ21lbnQKKwlwdWJsaWMgdm9pZCBjb25maWd1cmVJUmVzb3VyY2VEZXNjcmlwdGlvbnNQZXJzaXN0ZWQoY29tLmdvb2dsZS5pbmplY3QuQmluZGVyIGJpbmRlcikgeworCQliaW5kZXIuYmluZChvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5JUmVzb3VyY2VEZXNjcmlwdGlvbnMuY2xhc3MpLmFubm90YXRlZFdpdGgoY29tLmdvb2dsZS5pbmplY3QubmFtZS5OYW1lcy5uYW1lZChvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5pbXBsLlJlc291cmNlRGVzY3JpcHRpb25zUHJvdmlkZXIuUEVSU0lTVEVEX0RFU0NSSVBUSU9OUykpLnRvKG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRCYXNlZFJlc291cmNlRGVzY3JpcHRpb25zLmNsYXNzKTsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IuZm9ybWF0dGluZy5Gb3JtYXR0ZXJGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQuZm9ybWF0dGluZy5JRm9ybWF0dGVyPiBiaW5kSUZvcm1hdHRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuZm9ybWF0dGluZy5QZXJzcGVjdGl2ZURzbEZvcm1hdHRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IudHlwZXMuVHlwZXNHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuVHlwZXNGYWN0b3J5IGJpbmRUeXBlc0ZhY3RvcnlUb0luc3RhbmNlKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLlR5cGVzRmFjdG9yeS5lSU5TVEFOQ0U7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnR5cGVzLlR5cGVzR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy5hY2Nlc3MuSUp2bVR5cGVQcm92aWRlci5GYWN0b3J5PiBiaW5kSUp2bVR5cGVQcm92aWRlciRGYWN0b3J5KCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLmFjY2Vzcy5DbGFzc3BhdGhUeXBlUHJvdmlkZXJGYWN0b3J5LmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci50eXBlcy5UeXBlc0dlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMueHRleHQuQWJzdHJhY3RUeXBlU2NvcGVQcm92aWRlcj4gYmluZEFic3RyYWN0VHlwZVNjb3BlUHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMueHRleHQuQ2xhc3NwYXRoQmFzZWRUeXBlU2NvcGVQcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuaW50ZXJwcmV0ZXIuSUV2YWx1YXRpb25Db250ZXh0PiBiaW5kSUV2YWx1YXRpb25Db250ZXh0KCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UuaW50ZXJwcmV0ZXIuaW1wbC5EZWZhdWx0RXZhbHVhdGlvbkNvbnRleHQuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmludGVycHJldGVyLklFeHByZXNzaW9uSW50ZXJwcmV0ZXI+IGJpbmRJRXhwcmVzc2lvbkludGVycHJldGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UuaW50ZXJwcmV0ZXIuaW1wbC5YYmFzZUludGVycHJldGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5uYW1pbmcuSVF1YWxpZmllZE5hbWVDb252ZXJ0ZXI+IGJpbmRJUXVhbGlmaWVkTmFtZUNvbnZlcnRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhiYXNlUXVhbGlmaWVkTmFtZUNvbnZlcnRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQubmFtaW5nLklRdWFsaWZpZWROYW1lUHJvdmlkZXI+IGJpbmRJUXVhbGlmaWVkTmFtZVByb3ZpZGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2Uuc2NvcGluZy5YYmFzZVF1YWxpZmllZE5hbWVQcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQuY29udmVyc2lvbi5JVmFsdWVDb252ZXJ0ZXJTZXJ2aWNlPiBiaW5kSVZhbHVlQ29udmVydGVyU2VydmljZSgpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmNvbnZlcnNpb24uWGJhc2VWYWx1ZUNvbnZlcnRlclNlcnZpY2UuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnNjb3BpbmcuSVNjb3BlUHJvdmlkZXI+IGJpbmRJU2NvcGVQcm92aWRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnNjb3BpbmcuYmF0Y2guSUJhdGNoU2NvcGVQcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUxpbmtpbmdJU2NvcGVQcm92aWRlcihjb20uZ29vZ2xlLmluamVjdC5CaW5kZXIgYmluZGVyKSB7CisJCWJpbmRlci5iaW5kKG9yZy5lY2xpcHNlLnh0ZXh0LnNjb3BpbmcuSVNjb3BlUHJvdmlkZXIuY2xhc3MpLmFubm90YXRlZFdpdGgob3JnLmVjbGlwc2UueHRleHQubGlua2luZy5MaW5raW5nU2NvcGVQcm92aWRlckJpbmRpbmcuY2xhc3MpLnRvKG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnNjb3BpbmcuYmF0Y2guSUJhdGNoU2NvcGVQcm92aWRlci5jbGFzcyk7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgdm9pZCBjb25maWd1cmVTZXJpYWxpemVySVNjb3BlUHJvdmlkZXIoY29tLmdvb2dsZS5pbmplY3QuQmluZGVyIGJpbmRlcikgeworCQliaW5kZXIuYmluZChvcmcuZWNsaXBzZS54dGV4dC5zY29waW5nLklTY29wZVByb3ZpZGVyLmNsYXNzKS5hbm5vdGF0ZWRXaXRoKG9yZy5lY2xpcHNlLnh0ZXh0LnNlcmlhbGl6ZXIudG9rZW5zLlNlcmlhbGl6ZXJTY29wZVByb3ZpZGVyQmluZGluZy5jbGFzcykudG8ob3JnLmVjbGlwc2UueHRleHQueGJhc2Uuc2VyaWFsaXplci5TZXJpYWxpemVyU2NvcGVQcm92aWRlci5jbGFzcyk7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgdm9pZCBjb25maWd1cmVJU2NvcGVQcm92aWRlckRlbGVnYXRlKGNvbS5nb29nbGUuaW5qZWN0LkJpbmRlciBiaW5kZXIpIHsKKwkJYmluZGVyLmJpbmQob3JnLmVjbGlwc2UueHRleHQuc2NvcGluZy5JU2NvcGVQcm92aWRlci5jbGFzcykuYW5ub3RhdGVkV2l0aChOYW1lcy5uYW1lZChvcmcuZWNsaXBzZS54dGV4dC5zY29waW5nLmltcGwuQWJzdHJhY3REZWNsYXJhdGl2ZVNjb3BlUHJvdmlkZXIuTkFNRURfREVMRUdBVEUpKS50byhvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5zY29waW5nLlhiYXNlSW1wb3J0ZWROYW1lc3BhY2VTY29wZVByb3ZpZGVyLmNsYXNzKTsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQubGlua2luZy5JTGlua2VyPiBiaW5kSUxpbmtlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpbmtpbmcuWGJhc2VMYXp5TGlua2VyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5YdGV4dFJlc291cmNlPiBiaW5kWHRleHRSZXNvdXJjZSgpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnJlc291cmNlLkJhdGNoTGlua2FibGVSZXNvdXJjZS5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCUBvcmcuZWNsaXBzZS54dGV4dC5zZXJ2aWNlLlNpbmdsZXRvbkJpbmRpbmcoZWFnZXI9dHJ1ZSkJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS52YWxpZGF0aW9uLkp2bVR5cGVSZWZlcmVuY2VzVmFsaWRhdG9yPiBiaW5kSnZtVHlwZVJlZmVyZW5jZXNWYWxpZGF0b3IoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS52YWxpZGF0aW9uLkp2bVR5cGVSZWZlcmVuY2VzVmFsaWRhdG9yLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5mZWF0dXJlY2FsbHMuSWRlbnRpZmlhYmxlU2ltcGxlTmFtZVByb3ZpZGVyPiBiaW5kSWRlbnRpZmlhYmxlU2ltcGxlTmFtZVByb3ZpZGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UuZmVhdHVyZWNhbGxzLklkZW50aWZpYWJsZVNpbXBsZU5hbWVQcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuSURlcml2ZWRTdGF0ZUNvbXB1dGVyPiBiaW5kSURlcml2ZWRTdGF0ZUNvbXB1dGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UuanZtbW9kZWwuSnZtTW9kZWxBc3NvY2lhdG9yLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5JUmVzb3VyY2VEZXNjcmlwdGlvbi5NYW5hZ2VyPiBiaW5kSVJlc291cmNlRGVzY3JpcHRpb24kTWFuYWdlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLkRlcml2ZWRTdGF0ZUF3YXJlUmVzb3VyY2VEZXNjcmlwdGlvbk1hbmFnZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5JR2VuZXJhdG9yPiBiaW5kSUdlbmVyYXRvcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmNvbXBpbGVyLkp2bU1vZGVsR2VuZXJhdG9yLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIG9yZy5lY2xpcHNlLnh0ZXh0Lnh0eXBlLlh0eXBlRmFjdG9yeSBiaW5kWHR5cGVGYWN0b3J5VG9JbnN0YW5jZSgpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0Lnh0eXBlLlh0eXBlRmFjdG9yeS5lSU5TVEFOQ0U7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LmRlYnVnLklTdHJhdHVtQnJlYWtwb2ludFN1cHBvcnQ+IGJpbmRJU3RyYXR1bUJyZWFrcG9pbnRTdXBwb3J0KCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UuZGVidWcuWGJhc2VTdHJhdHVtQnJlYWtwb2ludFN1cHBvcnQuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5MaW5lU2VwYXJhdG9ySGFybW9uaXplcj4gYmluZExpbmVTZXBhcmF0b3JIYXJtb25pemVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UuY29tcGlsZXIub3V0cHV0LlRyYWNlQXdhcmVQb3N0UHJvY2Vzc29yLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5JRGVmYXVsdFJlc291cmNlRGVzY3JpcHRpb25TdHJhdGVneT4gYmluZElEZWZhdWx0UmVzb3VyY2VEZXNjcmlwdGlvblN0cmF0ZWd5KCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UucmVzb3VyY2UuWGJhc2VSZXNvdXJjZURlc2NyaXB0aW9uU3RyYXRlZ3kuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnZhbGlkYXRpb24uU2V2ZXJpdHlDb252ZXJ0ZXI+IGJpbmRTZXZlcml0eUNvbnZlcnRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnZhbGlkYXRpb24uWGJhc2VTZXZlcml0eUNvbnZlcnRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudmFsaWRhdGlvbi5Db25maWd1cmFibGVJc3N1ZUNvZGVzUHJvdmlkZXI+IGJpbmRDb25maWd1cmFibGVJc3N1ZUNvZGVzUHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS52YWxpZGF0aW9uLlhiYXNlQ29uZmlndXJhYmxlSXNzdWVDb2Rlcy5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuRU9iamVjdEF0T2Zmc2V0SGVscGVyPiBiaW5kRU9iamVjdEF0T2Zmc2V0SGVscGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGlua2luZy5Ccm9rZW5Db25zdHJ1Y3RvckNhbGxBd2FyZUVPYmplY3RBdE9mZnNldEhlbHBlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudmFsaWRhdGlvbi5DYW5jZWxhYmxlRGlhZ25vc3RpY2lhbj4gYmluZENhbmNlbGFibGVEaWFnbm9zdGljaWFuKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UudmFsaWRhdGlvbi5YYmFzZURpYWdub3N0aWNpYW4uY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnNjb3BpbmcuZmVhdHVyZWNhbGxzLlN0YXRpY0ltcGxpY2l0TWV0aG9kc0ZlYXR1cmVGb3JUeXBlUHJvdmlkZXIuRXh0ZW5zaW9uQ2xhc3NOYW1lUHJvdmlkZXI+IGJpbmRTdGF0aWNJbXBsaWNpdE1ldGhvZHNGZWF0dXJlRm9yVHlwZVByb3ZpZGVyJEV4dGVuc2lvbkNsYXNzTmFtZVByb3ZpZGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2Uuc2NvcGluZy5iYXRjaC5JbXBsaWNpdGx5SW1wb3J0ZWRUeXBlc0FkYXB0ZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5maWxlLk11dGFibGVGaWxlU3lzdGVtU3VwcG9ydD4gYmluZE11dGFibGVGaWxlU3lzdGVtU3VwcG9ydCgpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmZpbGUuSmF2YUlPRmlsZVN5c3RlbVN1cHBvcnQuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5maWxlLkZpbGVMb2NhdGlvbnM+IGJpbmRGaWxlTG9jYXRpb25zKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UuZmlsZS5GaWxlTG9jYXRpb25zSW1wbC5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI8b3JnLmVjbGlwc2UueHRleHQueGJhc2UuZmlsZS5Xb3Jrc3BhY2VDb25maWc+PiBwcm92aWRlV29ya3NwYWNlQ29uZmlnKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UuZmlsZS5SdW50aW1lV29ya3NwYWNlQ29uZmlnUHJvdmlkZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnR5cGVzeXN0ZW0uY29tcHV0YXRpb24uSVR5cGVDb21wdXRlcj4gYmluZElUeXBlQ29tcHV0ZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5hbm5vdGF0aW9ucy50eXBlc3lzdGVtLlhiYXNlV2l0aEFubm90YXRpb25zVHlwZUNvbXB1dGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5zY29waW5nLmJhdGNoLlhiYXNlQmF0Y2hTY29wZVByb3ZpZGVyPiBiaW5kWGJhc2VCYXRjaFNjb3BlUHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5hbm5vdGF0aW9ucy50eXBlc3lzdGVtLlhiYXNlV2l0aEFubm90YXRpb25zQmF0Y2hTY29wZVByb3ZpZGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5saW5raW5nLklMaW5raW5nRGlhZ25vc3RpY01lc3NhZ2VQcm92aWRlcj4gYmluZElMaW5raW5nRGlhZ25vc3RpY01lc3NhZ2VQcm92aWRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmFubm90YXRpb25zLnZhbGlkYXRpb24uVW5yZXNvbHZlZEFubm90YXRpb25UeXBlQXdhcmVNZXNzYWdlUHJvZHVjZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLklMb2NhdGlvbkluRmlsZVByb3ZpZGVyPiBiaW5kSUxvY2F0aW9uSW5GaWxlUHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5qdm1tb2RlbC5Kdm1Mb2NhdGlvbkluRmlsZVByb3ZpZGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5zY29waW5nLklHbG9iYWxTY29wZVByb3ZpZGVyPiBiaW5kSUdsb2JhbFNjb3BlUHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMueHRleHQuVHlwZXNBd2FyZURlZmF1bHRHbG9iYWxTY29wZVByb3ZpZGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS52YWxpZGF0aW9uLkZlYXR1cmVOYW1lVmFsaWRhdG9yPiBiaW5kRmVhdHVyZU5hbWVWYWxpZGF0b3IoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS52YWxpZGF0aW9uLkxvZ2ljYWxDb250YWluZXJBd2FyZUZlYXR1cmVOYW1lVmFsaWRhdG9yLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS50eXBlc3lzdGVtLmludGVybmFsLkRlZmF1bHRCYXRjaFR5cGVSZXNvbHZlcj4gYmluZERlZmF1bHRCYXRjaFR5cGVSZXNvbHZlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnR5cGVzeXN0ZW0uaW50ZXJuYWwuTG9naWNhbENvbnRhaW5lckF3YXJlQmF0Y2hUeXBlUmVzb2x2ZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnR5cGVzeXN0ZW0uaW50ZXJuYWwuRGVmYXVsdFJlZW50cmFudFR5cGVSZXNvbHZlcj4gYmluZERlZmF1bHRSZWVudHJhbnRUeXBlUmVzb2x2ZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS50eXBlc3lzdGVtLmludGVybmFsLkxvZ2ljYWxDb250YWluZXJBd2FyZVJlZW50cmFudFR5cGVSZXNvbHZlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudmFsaWRhdGlvbi5JUmVzb3VyY2VWYWxpZGF0b3I+IGJpbmRJUmVzb3VyY2VWYWxpZGF0b3IoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uLkRlcml2ZWRTdGF0ZUF3YXJlUmVzb3VyY2VWYWxpZGF0b3IuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmp2bW1vZGVsLklKdm1Nb2RlbEluZmVycmVyPiBiaW5kSUp2bU1vZGVsSW5mZXJyZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmp2bW1vZGVsLlBlcnNwZWN0aXZlRHNsSnZtTW9kZWxJbmZlcnJlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IuZ3JhbW1hckFjY2Vzcy5HcmFtbWFyQWNjZXNzRnJhZ21lbnQKKwlwdWJsaWMgamF2YS5sYW5nLkNsYXNzTG9hZGVyIGJpbmRDbGFzc0xvYWRlclRvSW5zdGFuY2UoKSB7CisJCXJldHVybiBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLmdyYW1tYXJBY2Nlc3MuR3JhbW1hckFjY2Vzc0ZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5JR3JhbW1hckFjY2Vzcz4gYmluZElHcmFtbWFyQWNjZXNzKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5zZXJ2aWNlcy5QZXJzcGVjdGl2ZURzbEdyYW1tYXJBY2Nlc3MuY2xhc3M7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9QZXJzcGVjdGl2ZURzbFN0YW5kYWxvbmVTZXR1cEdlbmVyYXRlZC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvUGVyc3BlY3RpdmVEc2xTdGFuZGFsb25lU2V0dXBHZW5lcmF0ZWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGEzZTY3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvUGVyc3BlY3RpdmVEc2xTdGFuZGFsb25lU2V0dXBHZW5lcmF0ZWQuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuSVNldHVwOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0Lkd1aWNlOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdG9yOworCisvKioKKyAqIEdlbmVyYXRlZCBmcm9tIFN0YW5kYWxvbmVTZXR1cC54cHQhCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIFBlcnNwZWN0aXZlRHNsU3RhbmRhbG9uZVNldHVwR2VuZXJhdGVkIGltcGxlbWVudHMgSVNldHVwIHsKKworCXB1YmxpYyBJbmplY3RvciBjcmVhdGVJbmplY3RvckFuZERvRU1GUmVnaXN0cmF0aW9uKCkgeworCQlvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5hbm5vdGF0aW9ucy5YYmFzZVdpdGhBbm5vdGF0aW9uc1N0YW5kYWxvbmVTZXR1cC5kb1NldHVwKCk7CisKKwkJSW5qZWN0b3IgaW5qZWN0b3IgPSBjcmVhdGVJbmplY3RvcigpOworCQlyZWdpc3RlcihpbmplY3Rvcik7CisJCXJldHVybiBpbmplY3RvcjsKKwl9CisJCisJcHVibGljIEluamVjdG9yIGNyZWF0ZUluamVjdG9yKCkgeworCQlyZXR1cm4gR3VpY2UuY3JlYXRlSW5qZWN0b3IobmV3IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2xSdW50aW1lTW9kdWxlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZWdpc3RlcihJbmplY3RvciBpbmplY3RvcikgeworCisJCW9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLklSZXNvdXJjZUZhY3RvcnkgcmVzb3VyY2VGYWN0b3J5ID0gaW5qZWN0b3IuZ2V0SW5zdGFuY2Uob3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuSVJlc291cmNlRmFjdG9yeS5jbGFzcyk7CisJCW9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLklSZXNvdXJjZVNlcnZpY2VQcm92aWRlciBzZXJ2aWNlUHJvdmlkZXIgPSBpbmplY3Rvci5nZXRJbnN0YW5jZShvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5JUmVzb3VyY2VTZXJ2aWNlUHJvdmlkZXIuY2xhc3MpOworCQlSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgicGVyc3BlY3RpdmUiLCByZXNvdXJjZUZhY3RvcnkpOworCQlvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5JUmVzb3VyY2VTZXJ2aWNlUHJvdmlkZXIuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCJwZXJzcGVjdGl2ZSIsIHNlcnZpY2VQcm92aWRlcik7CisJCQorCisKKworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9QZXJzcGVjdGl2ZURzbEFudGxyVG9rZW5GaWxlUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9QZXJzcGVjdGl2ZURzbEFudGxyVG9rZW5GaWxlUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzZlZjI4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL1BlcnNwZWN0aXZlRHNsQW50bHJUb2tlbkZpbGVQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5wYXJzZXIuYW50bHI7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5JQW50bHJUb2tlbkZpbGVQcm92aWRlcjsKKworcHVibGljIGNsYXNzIFBlcnNwZWN0aXZlRHNsQW50bHJUb2tlbkZpbGVQcm92aWRlciBpbXBsZW1lbnRzIElBbnRsclRva2VuRmlsZVByb3ZpZGVyIHsKKwkKKwlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0QW50bHJUb2tlbkZpbGUoKSB7CisJCUNsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOworICAgIAlyZXR1cm4gY2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbSgib3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC50b2tlbnMiKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvUGVyc3BlY3RpdmVEc2xQYXJzZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9QZXJzcGVjdGl2ZURzbFBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZmY0ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvUGVyc3BlY3RpdmVEc2xQYXJzZXIuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUucGFyc2VyLmFudGxyOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLlh0ZXh0VG9rZW5TdHJlYW07CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5zZXJ2aWNlcy5QZXJzcGVjdGl2ZURzbEdyYW1tYXJBY2Nlc3M7CisKK3B1YmxpYyBjbGFzcyBQZXJzcGVjdGl2ZURzbFBhcnNlciBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5BYnN0cmFjdEFudGxyUGFyc2VyIHsKKwkKKwlASW5qZWN0CisJcHJpdmF0ZSBQZXJzcGVjdGl2ZURzbEdyYW1tYXJBY2Nlc3MgZ3JhbW1hckFjY2VzczsKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRJbml0aWFsSGlkZGVuVG9rZW5zKFh0ZXh0VG9rZW5TdHJlYW0gdG9rZW5TdHJlYW0pIHsKKwkJdG9rZW5TdHJlYW0uc2V0SW5pdGlhbEhpZGRlblRva2VucygiUlVMRV9XUyIsICJSVUxFX01MX0NPTU1FTlQiLCAiUlVMRV9TTF9DT01NRU5UIik7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnBhcnNlci5hbnRsci5pbnRlcm5hbC5JbnRlcm5hbFBlcnNwZWN0aXZlRHNsUGFyc2VyIGNyZWF0ZVBhcnNlcihYdGV4dFRva2VuU3RyZWFtIHN0cmVhbSkgeworCQlyZXR1cm4gbmV3IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUucGFyc2VyLmFudGxyLmludGVybmFsLkludGVybmFsUGVyc3BlY3RpdmVEc2xQYXJzZXIoc3RyZWFtLCBnZXRHcmFtbWFyQWNjZXNzKCkpOworCX0KKwkKKwlAT3ZlcnJpZGUgCisJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0UnVsZU5hbWUoKSB7CisJCXJldHVybiAiUGVyc3BlY3RpdmVNb2RlbCI7CisJfQorCQorCXB1YmxpYyBQZXJzcGVjdGl2ZURzbEdyYW1tYXJBY2Nlc3MgZ2V0R3JhbW1hckFjY2VzcygpIHsKKwkJcmV0dXJuIHRoaXMuZ3JhbW1hckFjY2VzczsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0R3JhbW1hckFjY2VzcyhQZXJzcGVjdGl2ZURzbEdyYW1tYXJBY2Nlc3MgZ3JhbW1hckFjY2VzcykgeworCQl0aGlzLmdyYW1tYXJBY2Nlc3MgPSBncmFtbWFyQWNjZXNzOworCX0KKwkKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmcgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZTY2MTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nCkBAIC0wLDAgKzEsODI2NSBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLworZ3JhbW1hciBJbnRlcm5hbFBlcnNwZWN0aXZlRHNsOworCitvcHRpb25zIHsKKwlzdXBlckNsYXNzPUFic3RyYWN0SW50ZXJuYWxBbnRsclBhcnNlcjsKKwkKK30KKworQGxleGVyOjpoZWFkZXIgeworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnBhcnNlci5hbnRsci5pbnRlcm5hbDsKKworLy8gSGFjazogVXNlIG91ciBvd24gTGV4ZXIgc3VwZXJjbGFzcyBieSBtZWFucyBvZiBpbXBvcnQuIAorLy8gQ3VycmVudGx5IHRoZXJlIGlzIG5vIG90aGVyIHdheSB0byBzcGVjaWZ5IHRoZSBzdXBlcmNsYXNzIGZvciB0aGUgbGV4ZXIuCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLkxleGVyOworfQorCitAcGFyc2VyOjpoZWFkZXIgeworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnBhcnNlci5hbnRsci5pbnRlcm5hbDsgCisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5pbXBsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5BYnN0cmFjdEludGVybmFsQW50bHJQYXJzZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLlh0ZXh0VG9rZW5TdHJlYW07CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLlh0ZXh0VG9rZW5TdHJlYW0uSGlkZGVuVG9rZW5zOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5BbnRsckRhdGF0eXBlUnVsZVRva2VuOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuc2VydmljZXMuUGVyc3BlY3RpdmVEc2xHcmFtbWFyQWNjZXNzOworCit9CisKK0BwYXJzZXI6Om1lbWJlcnMgeworCisgCXByaXZhdGUgUGVyc3BlY3RpdmVEc2xHcmFtbWFyQWNjZXNzIGdyYW1tYXJBY2Nlc3M7CisgCQorICAgIHB1YmxpYyBJbnRlcm5hbFBlcnNwZWN0aXZlRHNsUGFyc2VyKFRva2VuU3RyZWFtIGlucHV0LCBQZXJzcGVjdGl2ZURzbEdyYW1tYXJBY2Nlc3MgZ3JhbW1hckFjY2VzcykgeworICAgICAgICB0aGlzKGlucHV0KTsKKyAgICAgICAgdGhpcy5ncmFtbWFyQWNjZXNzID0gZ3JhbW1hckFjY2VzczsKKyAgICAgICAgcmVnaXN0ZXJSdWxlcyhncmFtbWFyQWNjZXNzLmdldEdyYW1tYXIoKSk7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Rmlyc3RSdWxlTmFtZSgpIHsKKyAgICAJcmV0dXJuICJQZXJzcGVjdGl2ZU1vZGVsIjsJCisgICAJfQorICAgCQorICAgCUBPdmVycmlkZQorICAgCXByb3RlY3RlZCBQZXJzcGVjdGl2ZURzbEdyYW1tYXJBY2Nlc3MgZ2V0R3JhbW1hckFjY2VzcygpIHsKKyAgIAkJcmV0dXJuIGdyYW1tYXJBY2Nlc3M7CisgICAJfQorfQorCitAcnVsZWNhdGNoIHsgCisgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICB9IAorfQorCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVBlcnNwZWN0aXZlTW9kZWwKK2VudHJ5UnVsZVBlcnNwZWN0aXZlTW9kZWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZU1vZGVsUnVsZSgpKTsgfQorCSBpdl9ydWxlUGVyc3BlY3RpdmVNb2RlbD1ydWxlUGVyc3BlY3RpdmVNb2RlbCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVBlcnNwZWN0aXZlTW9kZWwuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFBlcnNwZWN0aXZlTW9kZWwKK3J1bGVQZXJzcGVjdGl2ZU1vZGVsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVNb2RlbEFjY2VzcygpLmdldFBhY2thZ2VzUGVyc3BlY3RpdmVQYWNrYWdlUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisJICAgIH0KKwkJbHZfcGFja2FnZXNfMF8wPXJ1bGVQZXJzcGVjdGl2ZVBhY2thZ2UJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVNb2RlbFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJwYWNrYWdlcyIsCisgICAgICAgIAkJbHZfcGFja2FnZXNfMF8wLCAKKyAgICAgICAgCQkiUGVyc3BlY3RpdmVQYWNrYWdlIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSoKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVBlcnNwZWN0aXZlUGFja2FnZQorZW50cnlSdWxlUGVyc3BlY3RpdmVQYWNrYWdlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYWNrYWdlUnVsZSgpKTsgfQorCSBpdl9ydWxlUGVyc3BlY3RpdmVQYWNrYWdlPXJ1bGVQZXJzcGVjdGl2ZVBhY2thZ2UgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVQZXJzcGVjdGl2ZVBhY2thZ2UuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFBlcnNwZWN0aXZlUGFja2FnZQorcnVsZVBlcnNwZWN0aXZlUGFja2FnZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFja2FnZUFjY2VzcygpLmdldFBlcnNwZWN0aXZlUGFja2FnZUFjdGlvbl8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKQlvdGhlcmx2XzE9J3BhY2thZ2UnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFja2FnZUFjY2VzcygpLmdldFBhY2thZ2VLZXl3b3JkXzEoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFja2FnZUFjY2VzcygpLmdldE5hbWVRdWFsaWZpZWROYW1lUGFyc2VyUnVsZUNhbGxfMl8wKCkpOyAKKwkgICAgfQorCQlsdl9uYW1lXzJfMD1ydWxlUXVhbGlmaWVkTmFtZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhY2thZ2VSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkibmFtZSIsCisgICAgICAgIAkJbHZfbmFtZV8yXzAsIAorICAgICAgICAJCSJRdWFsaWZpZWROYW1lIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgJb3RoZXJsdl8zPSd7JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMywgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhY2thZ2VBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8zXzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFja2FnZUFjY2VzcygpLmdldEltcG9ydHNQZXJzcGVjdGl2ZUltcG9ydFBhcnNlclJ1bGVDYWxsXzNfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9pbXBvcnRzXzRfMD1ydWxlUGVyc3BlY3RpdmVJbXBvcnQJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYWNrYWdlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImltcG9ydHMiLAorICAgICAgICAJCWx2X2ltcG9ydHNfNF8wLCAKKyAgICAgICAgCQkiUGVyc3BlY3RpdmVJbXBvcnQiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKigKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhY2thZ2VBY2Nlc3MoKS5nZXRQZXJzcGVjdGl2ZXNQZXJzcGVjdGl2ZVBhcnNlclJ1bGVDYWxsXzNfMl8wKCkpOyAKKwkgICAgfQorCQlsdl9wZXJzcGVjdGl2ZXNfNV8wPXJ1bGVQZXJzcGVjdGl2ZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhY2thZ2VSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkicGVyc3BlY3RpdmVzIiwKKyAgICAgICAgCQlsdl9wZXJzcGVjdGl2ZXNfNV8wLCAKKyAgICAgICAgCQkiUGVyc3BlY3RpdmUiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKglvdGhlcmx2XzY9J30nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl82LCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFja2FnZUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8zXzMoKSk7CisgICAgfQorKT8pCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVQZXJzcGVjdGl2ZUltcG9ydAorZW50cnlSdWxlUGVyc3BlY3RpdmVJbXBvcnQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUltcG9ydFJ1bGUoKSk7IH0KKwkgaXZfcnVsZVBlcnNwZWN0aXZlSW1wb3J0PXJ1bGVQZXJzcGVjdGl2ZUltcG9ydCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVBlcnNwZWN0aXZlSW1wb3J0LmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBQZXJzcGVjdGl2ZUltcG9ydAorcnVsZVBlcnNwZWN0aXZlSW1wb3J0IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCW90aGVybHZfMD0naW1wb3J0JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUltcG9ydEFjY2VzcygpLmdldEltcG9ydEtleXdvcmRfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVJbXBvcnRBY2Nlc3MoKS5nZXRJbXBvcnRlZE5hbWVzcGFjZVBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZFBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfaW1wb3J0ZWROYW1lc3BhY2VfMV8wPXJ1bGVQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVJbXBvcnRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiaW1wb3J0ZWROYW1lc3BhY2UiLAorICAgICAgICAJCWx2X2ltcG9ydGVkTmFtZXNwYWNlXzFfMCwgCisgICAgICAgIAkJIlBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVQZXJzcGVjdGl2ZQorZW50cnlSdWxlUGVyc3BlY3RpdmUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVJ1bGUoKSk7IH0KKwkgaXZfcnVsZVBlcnNwZWN0aXZlPXJ1bGVQZXJzcGVjdGl2ZSAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVBlcnNwZWN0aXZlLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBQZXJzcGVjdGl2ZQorcnVsZVBlcnNwZWN0aXZlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRQZXJzcGVjdGl2ZUFjdGlvbl8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKQlvdGhlcmx2XzE9J3BlcnNwZWN0aXZlJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldFBlcnNwZWN0aXZlS2V5d29yZF8xKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldE5hbWVUUkFOU0xBVEFCTEVJRFBhcnNlclJ1bGVDYWxsXzJfMCgpKTsgCisJICAgIH0KKwkJbHZfbmFtZV8yXzA9cnVsZVRSQU5TTEFUQUJMRUlECQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJIm5hbWUiLAorICAgICAgICAJCWx2X25hbWVfMl8wLCAKKyAgICAgICAgCQkiVFJBTlNMQVRBQkxFSUQiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKCgKKygKKwkJbHZfZGVzY3JpcHRpb25fM18wPQknZGVzY3JpYmVkIGJ5JyAKKyAgICB7CisgICAgICAgIG5ld0xlYWZOb2RlKGx2X2Rlc2NyaXB0aW9uXzNfMCwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldERlc2NyaXB0aW9uRGVzY3JpYmVkQnlLZXl3b3JkXzNfMF8wKCkpOworICAgIH0KKyAKKwkgICAgeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKCRjdXJyZW50LCAiZGVzY3JpcHRpb24iLCB0cnVlLCAiZGVzY3JpYmVkIGJ5Iik7CisJICAgIH0KKworKQorKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldERlc2NyaXB0aW9uVmFsdWVUUkFOU0xBVEFCTEVTVFJJTkdQYXJzZXJSdWxlQ2FsbF8zXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfZGVzY3JpcHRpb25WYWx1ZV80XzA9cnVsZVRSQU5TTEFUQUJMRVNUUklORwkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJkZXNjcmlwdGlvblZhbHVlIiwKKyAgICAgICAgCQlsdl9kZXNjcmlwdGlvblZhbHVlXzRfMCwgCisgICAgICAgIAkJIlRSQU5TTEFUQUJMRVNUUklORyIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpPygJb3RoZXJsdl81PSdwcm9jZXNzJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNSwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldFByb2Nlc3NLZXl3b3JkXzRfMCgpKTsKKyAgICB9CisoCisoCisJCXsKKwkJCWlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJb3RoZXJsdl82PVJVTEVfSUQKKwl7CisJCW5ld0xlYWZOb2RlKG90aGVybHZfNiwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldFByb2Nlc3NCbGlwQ3Jvc3NSZWZlcmVuY2VfNF8xXzAoKSk7IAorCX0KKworKQorKQlvdGhlcmx2Xzc9J3VzZXJ0YXNrJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNywgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldFVzZXJ0YXNrS2V5d29yZF80XzIoKSk7CisgICAgfQorKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCW90aGVybHZfOD1SVUxFX0lECisJeworCQluZXdMZWFmTm9kZShvdGhlcmx2XzgsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRVc2VyVGFza0JsaXBVc2VyVGFza0Nyb3NzUmVmZXJlbmNlXzRfM18wKCkpOyAKKwl9CisKKykKKykpPygKKworKAorCXsgCisJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmVudGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF81KCkpOworCX0KKwkoCisJCSgKKworCQkJKCAKKwkJCQl7Z2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzUoKSwgMCl9Pz0+KAorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNSgpLCAwKTsKKwkgCQkJCX0KKwkJCQkJKHt0cnVlfT89PigJb3RoZXJsdl8xMD0naWNvblVSSScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEwLCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQWNjZXNzKCkuZ2V0SWNvblVSSUtleXdvcmRfNV8wXzAoKSk7CisgICAgfQorKAorKAorCQlsdl9pY29uVVJJXzExXzA9UlVMRV9TVFJJTkcKKwkJeworCQkJbmV3TGVhZk5vZGUobHZfaWNvblVSSV8xMV8wLCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQWNjZXNzKCkuZ2V0SWNvblVSSVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfNV8wXzFfMCgpKTsgCisJCX0KKwkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiaWNvblVSSSIsCisgICAgICAgIAkJbHZfaWNvblVSSV8xMV8wLCAKKyAgICAgICAgCQkiU1RSSU5HIik7CisJICAgIH0KKworKQorKSkpCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNSgpKTsKKwkgCQkJCX0KKyAJCQkJKQorCQkJKSAgfAorCisJCQkoIAorCQkJCXtnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNSgpLCAxKX0/PT4oCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF81KCksIDEpOworCSAJCQkJfQorCQkJCQkoe3RydWV9Pz0+KAlvdGhlcmx2XzEyPSdhY2Nlc3NpYmlsaXR5JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTIsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRBY2Nlc3NpYmlsaXR5S2V5d29yZF81XzFfMCgpKTsKKyAgICB9CisoCisoCisJCWx2X2FjY2Vzc2liaWxpdHlQaHJhc2VfMTNfMD1SVUxFX1NUUklORworCQl7CisJCQluZXdMZWFmTm9kZShsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzEzXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRBY2Nlc3NpYmlsaXR5UGhyYXNlU1RSSU5HVGVybWluYWxSdWxlQ2FsbF81XzFfMV8wKCkpOyAKKwkJfQorCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJhY2Nlc3NpYmlsaXR5UGhyYXNlIiwKKyAgICAgICAgCQlsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzEzXzAsIAorICAgICAgICAJCSJTVFJJTkciKTsKKwkgICAgfQorCispCispKSkKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF81KCkpOworCSAJCQkJfQorIAkJCQkpCisJCQkpICB8CisKKwkJCSggCisJCQkJe2dldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF81KCksIDIpfT89PigKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzUoKSwgMik7CisJIAkJCQl9CisJCQkJCSh7dHJ1ZX0/PT4oCW90aGVybHZfMTQ9J3Rvb2xiYXInIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xNCwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldFRvb2xiYXJLZXl3b3JkXzVfMl8wKCkpOworICAgIH0KKygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwlvdGhlcmx2XzE1PVJVTEVfSUQKKwl7CisJCW5ld0xlYWZOb2RlKG90aGVybHZfMTUsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRUb29sYmFyQWN0aW9uVG9vbGJhckNyb3NzUmVmZXJlbmNlXzVfMl8xXzAoKSk7IAorCX0KKworKQorKSkpCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNSgpKTsKKwkgCQkJCX0KKyAJCQkJKQorCQkJKSAgCisKKwkJKSoJCisJKQorKQorCXsgCisJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmxlYXZlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF81KCkpOworCX0KKworKQlvdGhlcmx2XzE2PSd7JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTYsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF82KCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldEVsZW1lbnRzUGVyc3BlY3RpdmVFbGVtZW50UGFyc2VyUnVsZUNhbGxfN18wKCkpOyAKKwkgICAgfQorCQlsdl9lbGVtZW50c18xN18wPXJ1bGVQZXJzcGVjdGl2ZUVsZW1lbnQJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZWxlbWVudHMiLAorICAgICAgICAJCWx2X2VsZW1lbnRzXzE3XzAsIAorICAgICAgICAJCSJQZXJzcGVjdGl2ZUVsZW1lbnQiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKglvdGhlcmx2XzE4PSd9JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTgsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfOCgpKTsKKyAgICB9CispCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVQZXJzcGVjdGl2ZUVsZW1lbnQKK2VudHJ5UnVsZVBlcnNwZWN0aXZlRWxlbWVudCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlRWxlbWVudFJ1bGUoKSk7IH0KKwkgaXZfcnVsZVBlcnNwZWN0aXZlRWxlbWVudD1ydWxlUGVyc3BlY3RpdmVFbGVtZW50IAorCSB7ICRjdXJyZW50PSRpdl9ydWxlUGVyc3BlY3RpdmVFbGVtZW50LmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBQZXJzcGVjdGl2ZUVsZW1lbnQKK3J1bGVQZXJzcGVjdGl2ZUVsZW1lbnQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVFbGVtZW50QWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgfQorICAgIHRoaXNfUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyXzA9cnVsZVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lcgorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyXzAuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisKKyAgICB8CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlRWxlbWVudEFjY2VzcygpLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrUGFyc2VyUnVsZUNhbGxfMSgpKTsgCisgICAgfQorICAgIHRoaXNfUGVyc3BlY3RpdmVQYXJ0U3RhY2tfMT1ydWxlUGVyc3BlY3RpdmVQYXJ0U3RhY2sKKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1BlcnNwZWN0aXZlUGFydFN0YWNrXzEuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisKKyAgICB8CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlRWxlbWVudEFjY2VzcygpLmdldFBlcnNwZWN0aXZlUGFydFBhcnNlclJ1bGVDYWxsXzIoKSk7IAorICAgIH0KKyAgICB0aGlzX1BlcnNwZWN0aXZlUGFydF8yPXJ1bGVQZXJzcGVjdGl2ZVBhcnQKKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1BlcnNwZWN0aXZlUGFydF8yLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyCitlbnRyeVJ1bGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJSdWxlKCkpOyB9CisJIGl2X3J1bGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXI9cnVsZVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lciAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lci5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyCitydWxlUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyQWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispCW90aGVybHZfMT0nc2FzaENvbnRhaW5lcicgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyQWNjZXNzKCkuZ2V0U2FzaENvbnRhaW5lcktleXdvcmRfMSgpKTsKKyAgICB9CisoCisoCisJCWx2X2VsZW1lbnRJZF8yXzA9UlVMRV9JRAorCQl7CisJCQluZXdMZWFmTm9kZShsdl9lbGVtZW50SWRfMl8wLCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldEVsZW1lbnRJZElEVGVybWluYWxSdWxlQ2FsbF8yXzAoKSk7IAorCQl9CisJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJlbGVtZW50SWQiLAorICAgICAgICAJCWx2X2VsZW1lbnRJZF8yXzAsIAorICAgICAgICAJCSJJRCIpOworCSAgICB9CisKKykKKykoCisKKygKKwl7IAorCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5lbnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSk7CisJfQorCSgKKwkJKAorCisJCQkoIAorCQkJCXtnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMCl9Pz0+KAorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMCk7CisJIAkJCQl9CisJCQkJCSh7dHJ1ZX0/PT4oCW90aGVybHZfND0nb3JpZW50YXRpb24nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldE9yaWVudGF0aW9uS2V5d29yZF8zXzBfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyQWNjZXNzKCkuZ2V0T3JpZW50YXRpb25TYXNoT3JpZW50YXRpb25FbnVtUnVsZUNhbGxfM18wXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfb3JpZW50YXRpb25fNV8wPXJ1bGVTYXNoT3JpZW50YXRpb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJIm9yaWVudGF0aW9uIiwKKyAgICAgICAgCQlsdl9vcmllbnRhdGlvbl81XzAsIAorICAgICAgICAJCSJTYXNoT3JpZW50YXRpb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSkKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpKTsKKwkgCQkJCX0KKyAJCQkJKQorCQkJKSAgfAorCisJCQkoIAorCQkJCXtnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMSl9Pz0+KAorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMSk7CisJIAkJCQl9CisJCQkJCSh7dHJ1ZX0/PT4oCW90aGVybHZfNj0nc2VsZWN0ZWRFbGVtZW50JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNiwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRTZWxlY3RlZEVsZW1lbnRLZXl3b3JkXzNfMV8wKCkpOworICAgIH0KKygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJb3RoZXJsdl83PVJVTEVfSUQKKwl7CisJCW5ld0xlYWZOb2RlKG90aGVybHZfNywgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRTZWxlY3RlZEVsZW1lbnRQZXJzcGVjdGl2ZUVsZW1lbnRDcm9zc1JlZmVyZW5jZV8zXzFfMV8wKCkpOyAKKwl9CisKKykKKykpKQorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCkpOworCSAJCQkJfQorIAkJCQkpCisJCQkpICB8CisKKwkJCSggCisJCQkJe2dldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAyKX0/PT4oCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAyKTsKKwkgCQkJCX0KKwkJCQkJKHt0cnVlfT89PigJb3RoZXJsdl84PSdzcGFjZVZvbHVtZScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzgsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyQWNjZXNzKCkuZ2V0U3BhY2VWb2x1bWVLZXl3b3JkXzNfMl8wKCkpOworICAgIH0KKygKKygKKwkJbHZfY29udGFpbmVyRGF0YV85XzA9UlVMRV9TVFJJTkcKKwkJeworCQkJbmV3TGVhZk5vZGUobHZfY29udGFpbmVyRGF0YV85XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyQWNjZXNzKCkuZ2V0Q29udGFpbmVyRGF0YVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfM18yXzFfMCgpKTsgCisJCX0KKwkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImNvbnRhaW5lckRhdGEiLAorICAgICAgICAJCWx2X2NvbnRhaW5lckRhdGFfOV8wLCAKKyAgICAgICAgCQkiU1RSSU5HIik7CisJICAgIH0KKworKQorKSkpCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSk7CisJIAkJCQl9CisgCQkJCSkKKwkJCSkgIHwKKworCQkJKCAKKwkJCQl7Z2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDMpfT89PigKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDMpOworCSAJCQkJfQorCQkJCQkoe3RydWV9Pz0+KAlvdGhlcmx2XzEwPSdhY2Nlc3NpYmlsaXR5JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTAsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyQWNjZXNzKCkuZ2V0QWNjZXNzaWJpbGl0eUtleXdvcmRfM18zXzAoKSk7CisgICAgfQorKAorKAorCQlsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzExXzA9UlVMRV9TVFJJTkcKKwkJeworCQkJbmV3TGVhZk5vZGUobHZfYWNjZXNzaWJpbGl0eVBocmFzZV8xMV8wLCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldEFjY2Vzc2liaWxpdHlQaHJhc2VTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzNfM18xXzAoKSk7IAorCQl9CisJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJhY2Nlc3NpYmlsaXR5UGhyYXNlIiwKKyAgICAgICAgCQlsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzExXzAsIAorICAgICAgICAJCSJTVFJJTkciKTsKKwkgICAgfQorCispCispKSkKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpKTsKKwkgCQkJCX0KKyAJCQkJKQorCQkJKSAgCisKKwkJKSoJCisJKQorKQorCXsgCisJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmxlYXZlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpKTsKKwl9CisKKykJb3RoZXJsdl8xMj0neycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEyLCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzQoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldEVsZW1lbnRzUGVyc3BlY3RpdmVFbGVtZW50UGFyc2VyUnVsZUNhbGxfNV8wKCkpOyAKKwkgICAgfQorCQlsdl9lbGVtZW50c18xM18wPXJ1bGVQZXJzcGVjdGl2ZUVsZW1lbnQJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImVsZW1lbnRzIiwKKyAgICAgICAgCQlsdl9lbGVtZW50c18xM18wLCAKKyAgICAgICAgCQkiUGVyc3BlY3RpdmVFbGVtZW50Iik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSoJb3RoZXJsdl8xND0nfScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzE0LCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF82KCkpOworICAgIH0KKykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVBlcnNwZWN0aXZlUGFydFN0YWNrCitlbnRyeVJ1bGVQZXJzcGVjdGl2ZVBhcnRTdGFjayByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrUnVsZSgpKTsgfQorCSBpdl9ydWxlUGVyc3BlY3RpdmVQYXJ0U3RhY2s9cnVsZVBlcnNwZWN0aXZlUGFydFN0YWNrIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlUGVyc3BlY3RpdmVQYXJ0U3RhY2suY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFBlcnNwZWN0aXZlUGFydFN0YWNrCitydWxlUGVyc3BlY3RpdmVQYXJ0U3RhY2sgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja0FjY2VzcygpLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispCW90aGVybHZfMT0ncGFydFN0YWNrJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja0FjY2VzcygpLmdldFBhcnRTdGFja0tleXdvcmRfMSgpKTsKKyAgICB9CisoCisoCisJCWx2X2VsZW1lbnRJZF8yXzA9UlVMRV9JRAorCQl7CisJCQluZXdMZWFmTm9kZShsdl9lbGVtZW50SWRfMl8wLCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrQWNjZXNzKCkuZ2V0RWxlbWVudElkSURUZXJtaW5hbFJ1bGVDYWxsXzJfMCgpKTsgCisJCX0KKwkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja1J1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZWxlbWVudElkIiwKKyAgICAgICAgCQlsdl9lbGVtZW50SWRfMl8wLCAKKyAgICAgICAgCQkiSUQiKTsKKwkgICAgfQorCispCispKAorCisoCisJeyAKKwkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuZW50ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja0FjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSk7CisJfQorCSgKKwkJKAorCisJCQkoIAorCQkJCXtnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAwKX0/PT4oCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDApOworCSAJCQkJfQorCQkJCQkoe3RydWV9Pz0+KAlvdGhlcmx2XzQ9J3NlbGVjdGVkRWxlbWVudCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzQsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY2Nlc3MoKS5nZXRTZWxlY3RlZEVsZW1lbnRLZXl3b3JkXzNfMF8wKCkpOworICAgIH0KKygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja1J1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwlvdGhlcmx2XzU9UlVMRV9JRAorCXsKKwkJbmV3TGVhZk5vZGUob3RoZXJsdl81LCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrQWNjZXNzKCkuZ2V0U2VsZWN0ZWRFbGVtZW50UGVyc3BlY3RpdmVQYXJ0Q3Jvc3NSZWZlcmVuY2VfM18wXzFfMCgpKTsgCisJfQorCispCispKSkKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCkpOworCSAJCQkJfQorIAkJCQkpCisJCQkpICB8CisKKwkJCSggCisJCQkJe2dldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEpfT89PigKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja0FjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMSk7CisJIAkJCQl9CisJCQkJCSh7dHJ1ZX0/PT4oCW90aGVybHZfNj0nc3BhY2VWb2x1bWUnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl82LCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrQWNjZXNzKCkuZ2V0U3BhY2VWb2x1bWVLZXl3b3JkXzNfMV8wKCkpOworICAgIH0KKygKKygKKwkJbHZfY29udGFpbmVyRGF0YV83XzA9UlVMRV9TVFJJTkcKKwkJeworCQkJbmV3TGVhZk5vZGUobHZfY29udGFpbmVyRGF0YV83XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY2Nlc3MoKS5nZXRDb250YWluZXJEYXRhU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8zXzFfMV8wKCkpOyAKKwkJfQorCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJjb250YWluZXJEYXRhIiwKKyAgICAgICAgCQlsdl9jb250YWluZXJEYXRhXzdfMCwgCisgICAgICAgIAkJIlNUUklORyIpOworCSAgICB9CisKKykKKykpKQorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja0FjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSk7CisJIAkJCQl9CisgCQkJCSkKKwkJCSkgIHwKKworCQkJKCAKKwkJCQl7Z2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja0FjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMil9Pz0+KAorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAyKTsKKwkgCQkJCX0KKwkJCQkJKHt0cnVlfT89PigJb3RoZXJsdl84PSdhY2Nlc3NpYmlsaXR5JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfOCwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja0FjY2VzcygpLmdldEFjY2Vzc2liaWxpdHlLZXl3b3JkXzNfMl8wKCkpOworICAgIH0KKygKKygKKwkJbHZfYWNjZXNzaWJpbGl0eVBocmFzZV85XzA9UlVMRV9TVFJJTkcKKwkJeworCQkJbmV3TGVhZk5vZGUobHZfYWNjZXNzaWJpbGl0eVBocmFzZV85XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY2Nlc3MoKS5nZXRBY2Nlc3NpYmlsaXR5UGhyYXNlU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8zXzJfMV8wKCkpOyAKKwkJfQorCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJhY2Nlc3NpYmlsaXR5UGhyYXNlIiwKKyAgICAgICAgCQlsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzlfMCwgCisgICAgICAgIAkJIlNUUklORyIpOworCSAgICB9CisKKykKKykpKQorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja0FjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSk7CisJIAkJCQl9CisgCQkJCSkKKwkJCSkgIAorCisJCSkqCQorCSkKKykKKwl7IAorCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5sZWF2ZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpKTsKKwl9CisKKykJb3RoZXJsdl8xMD0neycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEwLCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfNCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY2Nlc3MoKS5nZXRFbGVtZW50c1BlcnNwZWN0aXZlRWxlbWVudFBhcnNlclJ1bGVDYWxsXzVfMCgpKTsgCisJICAgIH0KKwkJbHZfZWxlbWVudHNfMTFfMD1ydWxlUGVyc3BlY3RpdmVFbGVtZW50CQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImVsZW1lbnRzIiwKKyAgICAgICAgCQlsdl9lbGVtZW50c18xMV8wLCAKKyAgICAgICAgCQkiUGVyc3BlY3RpdmVFbGVtZW50Iik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSoJb3RoZXJsdl8xMj0nfScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEyLCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzYoKSk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlUGVyc3BlY3RpdmVQYXJ0CitlbnRyeVJ1bGVQZXJzcGVjdGl2ZVBhcnQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRSdWxlKCkpOyB9CisJIGl2X3J1bGVQZXJzcGVjdGl2ZVBhcnQ9cnVsZVBlcnNwZWN0aXZlUGFydCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVBlcnNwZWN0aXZlUGFydC5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgUGVyc3BlY3RpdmVQYXJ0CitydWxlUGVyc3BlY3RpdmVQYXJ0IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVQYXJ0QWN0aW9uXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispCW90aGVybHZfMT0ncGFydCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0UGFydEtleXdvcmRfMSgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0RWxlbWVudElkVFJBTlNMQVRBQkxFSURQYXJzZXJSdWxlQ2FsbF8yXzAoKSk7IAorCSAgICB9CisJCWx2X2VsZW1lbnRJZF8yXzA9cnVsZVRSQU5TTEFUQUJMRUlECQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJlbGVtZW50SWQiLAorICAgICAgICAJCWx2X2VsZW1lbnRJZF8yXzAsIAorICAgICAgICAJCSJUUkFOU0xBVEFCTEVJRCIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCisKKygKKwl7IAorCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5lbnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSk7CisJfQorCSgKKwkJKAorCisJCQkoIAorCQkJCXtnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMCl9Pz0+KAorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMCk7CisJIAkJCQl9CisJCQkJCSh7dHJ1ZX0/PT4oKAorKAorCQlsdl9kZXNjcmlwdGlvbl80XzA9CSdkZXNjcmliZWQgYnknIAorICAgIHsKKyAgICAgICAgbmV3TGVhZk5vZGUobHZfZGVzY3JpcHRpb25fNF8wLCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldERlc2NyaXB0aW9uRGVzY3JpYmVkQnlLZXl3b3JkXzNfMF8wXzAoKSk7CisgICAgfQorIAorCSAgICB7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKCRjdXJyZW50LCAiZGVzY3JpcHRpb24iLCB0cnVlLCAiZGVzY3JpYmVkIGJ5Iik7CisJICAgIH0KKworKQorKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXREZXNjcmlwdGlvblZhbHVlVFJBTlNMQVRBQkxFU1RSSU5HUGFyc2VyUnVsZUNhbGxfM18wXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfZGVzY3JpcHRpb25WYWx1ZV81XzA9cnVsZVRSQU5TTEFUQUJMRVNUUklORwkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZGVzY3JpcHRpb25WYWx1ZSIsCisgICAgICAgIAkJbHZfZGVzY3JpcHRpb25WYWx1ZV81XzAsIAorICAgICAgICAJCSJUUkFOU0xBVEFCTEVTVFJJTkciKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSkKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpKTsKKwkgCQkJCX0KKyAJCQkJKQorCQkJKSAgfAorCisJCQkoIAorCQkJCXtnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMSl9Pz0+KAorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMSk7CisJIAkJCQl9CisJCQkJCSh7dHJ1ZX0/PT4oCW90aGVybHZfNj0nc3BhY2VWb2x1bWUnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl82LCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldFNwYWNlVm9sdW1lS2V5d29yZF8zXzFfMCgpKTsKKyAgICB9CisoCisoCisJCWx2X2NvbnRhaW5lckRhdGFfN18wPVJVTEVfU1RSSU5HCisJCXsKKwkJCW5ld0xlYWZOb2RlKGx2X2NvbnRhaW5lckRhdGFfN18wLCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldENvbnRhaW5lckRhdGFTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzNfMV8xXzAoKSk7IAorCQl9CisJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJjb250YWluZXJEYXRhIiwKKyAgICAgICAgCQlsdl9jb250YWluZXJEYXRhXzdfMCwgCisgICAgICAgIAkJIlNUUklORyIpOworCSAgICB9CisKKykKKykpKQorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCkpOworCSAJCQkJfQorIAkJCQkpCisJCQkpICB8CisKKwkJCSggCisJCQkJe2dldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAyKX0/PT4oCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAyKTsKKwkgCQkJCX0KKwkJCQkJKHt0cnVlfT89PigJb3RoZXJsdl84PSdhY2Nlc3NpYmlsaXR5JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfOCwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRBY2Nlc3NpYmlsaXR5S2V5d29yZF8zXzJfMCgpKTsKKyAgICB9CisoCisoCisJCWx2X2FjY2Vzc2liaWxpdHlQaHJhc2VfOV8wPVJVTEVfU1RSSU5HCisJCXsKKwkJCW5ld0xlYWZOb2RlKGx2X2FjY2Vzc2liaWxpdHlQaHJhc2VfOV8wLCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldEFjY2Vzc2liaWxpdHlQaHJhc2VTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzNfMl8xXzAoKSk7IAorCQl9CisJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJhY2Nlc3NpYmlsaXR5UGhyYXNlIiwKKyAgICAgICAgCQlsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzlfMCwgCisgICAgICAgIAkJIlNUUklORyIpOworCSAgICB9CisKKykKKykpKQorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCkpOworCSAJCQkJfQorIAkJCQkpCisJCQkpICB8CisKKwkJCSggCisJCQkJe2dldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAzKX0/PT4oCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAzKTsKKwkgCQkJCX0KKwkJCQkJKHt0cnVlfT89PigJb3RoZXJsdl8xMD0naWNvblVSSScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEwLCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldEljb25VUklLZXl3b3JkXzNfM18wKCkpOworICAgIH0KKygKKygKKwkJbHZfaWNvblVSSV8xMV8wPVJVTEVfU1RSSU5HCisJCXsKKwkJCW5ld0xlYWZOb2RlKGx2X2ljb25VUklfMTFfMCwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRJY29uVVJJU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8zXzNfMV8wKCkpOyAKKwkJfQorCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiaWNvblVSSSIsCisgICAgICAgIAkJbHZfaWNvblVSSV8xMV8wLCAKKyAgICAgICAgCQkiU1RSSU5HIik7CisJICAgIH0KKworKQorKSkpCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSk7CisJIAkJCQl9CisgCQkJCSkKKwkJCSkgIHwKKworCQkJKCAKKwkJCQl7Z2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDQpfT89PigKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDQpOworCSAJCQkJfQorCQkJCQkoe3RydWV9Pz0+KAlvdGhlcmx2XzEyPSd2aWV3JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTIsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0Vmlld0tleXdvcmRfM180XzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldFZpZXdQZXJzcGVjdGl2ZVZpZXdQYXJzZXJSdWxlQ2FsbF8zXzRfMV8wKCkpOyAKKwkgICAgfQorCQlsdl92aWV3XzEzXzA9cnVsZVBlcnNwZWN0aXZlVmlldwkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkidmlldyIsCisgICAgICAgIAkJbHZfdmlld18xM18wLCAKKyAgICAgICAgCQkiUGVyc3BlY3RpdmVWaWV3Iik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkpCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSk7CisJIAkJCQl9CisgCQkJCSkKKwkJCSkgIHwKKworCQkJKCAKKwkJCQl7Z2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDUpfT89PigKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDUpOworCSAJCQkJfQorCQkJCQkoe3RydWV9Pz0+KAorKAorCQlsdl9pc0Nsb3NhYmxlXzE0XzA9CSdpc0Nsb3NhYmxlJyAKKyAgICB7CisgICAgICAgIG5ld0xlYWZOb2RlKGx2X2lzQ2xvc2FibGVfMTRfMCwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRJc0Nsb3NhYmxlSXNDbG9zYWJsZUtleXdvcmRfM181XzAoKSk7CisgICAgfQorIAorCSAgICB7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKCRjdXJyZW50LCAiaXNDbG9zYWJsZSIsIHRydWUsICJpc0Nsb3NhYmxlIik7CisJICAgIH0KKworKQorKSkKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpKTsKKwkgCQkJCX0KKyAJCQkJKQorCQkJKSAgCisKKwkJKSoJCisJKQorKQorCXsgCisJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmxlYXZlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpKTsKKwl9CisKKykpCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVQZXJzcGVjdGl2ZVZpZXcKK2VudHJ5UnVsZVBlcnNwZWN0aXZlVmlldyByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVmlld1J1bGUoKSk7IH0KKwkgaXZfcnVsZVBlcnNwZWN0aXZlVmlldz1ydWxlUGVyc3BlY3RpdmVWaWV3IAorCSB7ICRjdXJyZW50PSRpdl9ydWxlUGVyc3BlY3RpdmVWaWV3LmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBQZXJzcGVjdGl2ZVZpZXcKK3J1bGVQZXJzcGVjdGl2ZVZpZXcgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVWaWV3QWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVTZWxlY3Rpb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICB9CisgICAgdGhpc19QZXJzcGVjdGl2ZVNlbGVjdGlvbl8wPXJ1bGVQZXJzcGVjdGl2ZVNlbGVjdGlvbgorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfUGVyc3BlY3RpdmVTZWxlY3Rpb25fMC5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworICAgIHwKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVWaWV3QWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVUYWJsZVBhcnNlclJ1bGVDYWxsXzEoKSk7IAorICAgIH0KKyAgICB0aGlzX1BlcnNwZWN0aXZlVGFibGVfMT1ydWxlUGVyc3BlY3RpdmVUYWJsZQorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfUGVyc3BlY3RpdmVUYWJsZV8xLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorCisgICAgfAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVZpZXdBY2Nlc3MoKS5nZXRQZXJzcGVjdGl2ZUNoYXJ0UGFyc2VyUnVsZUNhbGxfMigpKTsgCisgICAgfQorICAgIHRoaXNfUGVyc3BlY3RpdmVDaGFydF8yPXJ1bGVQZXJzcGVjdGl2ZUNoYXJ0CisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19QZXJzcGVjdGl2ZUNoYXJ0XzIuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisKKyAgICB8CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVmlld0FjY2VzcygpLmdldFBlcnNwZWN0aXZlUmVwb3J0UGFyc2VyUnVsZUNhbGxfMygpKTsgCisgICAgfQorICAgIHRoaXNfUGVyc3BlY3RpdmVSZXBvcnRfMz1ydWxlUGVyc3BlY3RpdmVSZXBvcnQKKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1BlcnNwZWN0aXZlUmVwb3J0XzMuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisKKyAgICB8CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVmlld0FjY2VzcygpLmdldFBlcnNwZWN0aXZlT3JnYW5pemF0aW9uUGFyc2VyUnVsZUNhbGxfNCgpKTsgCisgICAgfQorICAgIHRoaXNfUGVyc3BlY3RpdmVPcmdhbml6YXRpb25fND1ydWxlUGVyc3BlY3RpdmVPcmdhbml6YXRpb24KKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1BlcnNwZWN0aXZlT3JnYW5pemF0aW9uXzQuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisKKyAgICB8CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVmlld0FjY2VzcygpLmdldFBlcnNwZWN0aXZlVG9wb2xvZ3lQYXJzZXJSdWxlQ2FsbF81KCkpOyAKKyAgICB9CisgICAgdGhpc19QZXJzcGVjdGl2ZVRvcG9sb2d5XzU9cnVsZVBlcnNwZWN0aXZlVG9wb2xvZ3kKKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1BlcnNwZWN0aXZlVG9wb2xvZ3lfNS5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworICAgIHwKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVWaWV3QWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVEaWFsb2dQYXJzZXJSdWxlQ2FsbF82KCkpOyAKKyAgICB9CisgICAgdGhpc19QZXJzcGVjdGl2ZURpYWxvZ182PXJ1bGVQZXJzcGVjdGl2ZURpYWxvZworICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfUGVyc3BlY3RpdmVEaWFsb2dfNi5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworICAgIHwKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVWaWV3QWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVCUE1OUGFyc2VyUnVsZUNhbGxfNygpKTsgCisgICAgfQorICAgIHRoaXNfUGVyc3BlY3RpdmVCUE1OXzc9cnVsZVBlcnNwZWN0aXZlQlBNTgorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfUGVyc3BlY3RpdmVCUE1OXzcuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisKKyAgICB8CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVmlld0FjY2VzcygpLmdldFBlcnNwZWN0aXZlR3JpZFBhcnNlclJ1bGVDYWxsXzgoKSk7IAorICAgIH0KKyAgICB0aGlzX1BlcnNwZWN0aXZlR3JpZF84PXJ1bGVQZXJzcGVjdGl2ZUdyaWQKKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1BlcnNwZWN0aXZlR3JpZF84LmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlUGVyc3BlY3RpdmVTZWxlY3Rpb24KK2VudHJ5UnVsZVBlcnNwZWN0aXZlU2VsZWN0aW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTZWxlY3Rpb25SdWxlKCkpOyB9CisJIGl2X3J1bGVQZXJzcGVjdGl2ZVNlbGVjdGlvbj1ydWxlUGVyc3BlY3RpdmVTZWxlY3Rpb24gCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVQZXJzcGVjdGl2ZVNlbGVjdGlvbi5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgUGVyc3BlY3RpdmVTZWxlY3Rpb24KK3J1bGVQZXJzcGVjdGl2ZVNlbGVjdGlvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2VsZWN0aW9uQWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVTZWxlY3Rpb25BY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPSdzZWxlY3QnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2VsZWN0aW9uQWNjZXNzKCkuZ2V0U2VsZWN0S2V5d29yZF8xKCkpOworICAgIH0KKygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNlbGVjdGlvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwlvdGhlcmx2XzI9UlVMRV9JRAorCXsKKwkJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2VsZWN0aW9uQWNjZXNzKCkuZ2V0UmVmVGFibGVDcm9zc1JlZmVyZW5jZV8yXzAoKSk7IAorCX0KKworKQorKSkKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVBlcnNwZWN0aXZlVGFibGUKK2VudHJ5UnVsZVBlcnNwZWN0aXZlVGFibGUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVRhYmxlUnVsZSgpKTsgfQorCSBpdl9ydWxlUGVyc3BlY3RpdmVUYWJsZT1ydWxlUGVyc3BlY3RpdmVUYWJsZSAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVBlcnNwZWN0aXZlVGFibGUuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFBlcnNwZWN0aXZlVGFibGUKK3J1bGVQZXJzcGVjdGl2ZVRhYmxlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVUYWJsZUFjY2VzcygpLmdldFBlcnNwZWN0aXZlVGFibGVBY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPSd0YWJsZScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVUYWJsZUFjY2VzcygpLmdldFRhYmxlS2V5d29yZF8xKCkpOworICAgIH0KKygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVRhYmxlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCW90aGVybHZfMj1SVUxFX0lECisJeworCQluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVUYWJsZUFjY2VzcygpLmdldFJlZlRhYmxlQ3Jvc3NSZWZlcmVuY2VfMl8wKCkpOyAKKwl9CisKKykKKykpCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVQZXJzcGVjdGl2ZUdyaWQKK2VudHJ5UnVsZVBlcnNwZWN0aXZlR3JpZCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlR3JpZFJ1bGUoKSk7IH0KKwkgaXZfcnVsZVBlcnNwZWN0aXZlR3JpZD1ydWxlUGVyc3BlY3RpdmVHcmlkIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlUGVyc3BlY3RpdmVHcmlkLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBQZXJzcGVjdGl2ZUdyaWQKK3J1bGVQZXJzcGVjdGl2ZUdyaWQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUdyaWRBY2Nlc3MoKS5nZXRQZXJzcGVjdGl2ZUdyaWRBY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPSdncmlkJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUdyaWRBY2Nlc3MoKS5nZXRHcmlkS2V5d29yZF8xKCkpOworICAgIH0KKygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUdyaWRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJb3RoZXJsdl8yPVJVTEVfSUQKKwl7CisJCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUdyaWRBY2Nlc3MoKS5nZXRSZWZUYWJsZUNyb3NzUmVmZXJlbmNlXzJfMCgpKTsgCisJfQorCispCispKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlUGVyc3BlY3RpdmVDaGFydAorZW50cnlSdWxlUGVyc3BlY3RpdmVDaGFydCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQ2hhcnRSdWxlKCkpOyB9CisJIGl2X3J1bGVQZXJzcGVjdGl2ZUNoYXJ0PXJ1bGVQZXJzcGVjdGl2ZUNoYXJ0IAorCSB7ICRjdXJyZW50PSRpdl9ydWxlUGVyc3BlY3RpdmVDaGFydC5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgUGVyc3BlY3RpdmVDaGFydAorcnVsZVBlcnNwZWN0aXZlQ2hhcnQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUNoYXJ0QWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVDaGFydEFjdGlvbl8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKQlvdGhlcmx2XzE9J2NoYXJ0JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUNoYXJ0QWNjZXNzKCkuZ2V0Q2hhcnRLZXl3b3JkXzEoKSk7CisgICAgfQorKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQ2hhcnRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJb3RoZXJsdl8yPVJVTEVfSUQKKwl7CisJCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUNoYXJ0QWNjZXNzKCkuZ2V0UmVmQ2hhcnRDcm9zc1JlZmVyZW5jZV8yXzAoKSk7IAorCX0KKworKQorKSkKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVBlcnNwZWN0aXZlUmVwb3J0CitlbnRyeVJ1bGVQZXJzcGVjdGl2ZVJlcG9ydCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUmVwb3J0UnVsZSgpKTsgfQorCSBpdl9ydWxlUGVyc3BlY3RpdmVSZXBvcnQ9cnVsZVBlcnNwZWN0aXZlUmVwb3J0IAorCSB7ICRjdXJyZW50PSRpdl9ydWxlUGVyc3BlY3RpdmVSZXBvcnQuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFBlcnNwZWN0aXZlUmVwb3J0CitydWxlUGVyc3BlY3RpdmVSZXBvcnQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVJlcG9ydEFjY2VzcygpLmdldFBlcnNwZWN0aXZlUmVwb3J0QWN0aW9uXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispCW90aGVybHZfMT0ncmVwb3J0JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVJlcG9ydEFjY2VzcygpLmdldFJlcG9ydEtleXdvcmRfMSgpKTsKKyAgICB9CisoCisoCisJCXsKKwkJCWlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVSZXBvcnRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJb3RoZXJsdl8yPVJVTEVfSUQKKwl7CisJCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVJlcG9ydEFjY2VzcygpLmdldFJlZlJlcG9ydENyb3NzUmVmZXJlbmNlXzJfMCgpKTsgCisJfQorCispCispKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlUGVyc3BlY3RpdmVPcmdhbml6YXRpb24KK2VudHJ5UnVsZVBlcnNwZWN0aXZlT3JnYW5pemF0aW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVPcmdhbml6YXRpb25SdWxlKCkpOyB9CisJIGl2X3J1bGVQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbj1ydWxlUGVyc3BlY3RpdmVPcmdhbml6YXRpb24gCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbi5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgUGVyc3BlY3RpdmVPcmdhbml6YXRpb24KK3J1bGVQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlT3JnYW5pemF0aW9uQWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVPcmdhbml6YXRpb25BY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPSdvcmdhbmlncmFtJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbkFjY2VzcygpLmdldE9yZ2FuaWdyYW1LZXl3b3JkXzEoKSk7CisgICAgfQorKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlT3JnYW5pemF0aW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCW90aGVybHZfMj1SVUxFX0lECisJeworCQluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVPcmdhbml6YXRpb25BY2Nlc3MoKS5nZXRSZWZPcmdhbml6YXRpb25Dcm9zc1JlZmVyZW5jZV8yXzAoKSk7IAorCX0KKworKQorKSkKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVBlcnNwZWN0aXZlVG9wb2xvZ3kKK2VudHJ5UnVsZVBlcnNwZWN0aXZlVG9wb2xvZ3kgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVRvcG9sb2d5UnVsZSgpKTsgfQorCSBpdl9ydWxlUGVyc3BlY3RpdmVUb3BvbG9neT1ydWxlUGVyc3BlY3RpdmVUb3BvbG9neSAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVBlcnNwZWN0aXZlVG9wb2xvZ3kuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFBlcnNwZWN0aXZlVG9wb2xvZ3kKK3J1bGVQZXJzcGVjdGl2ZVRvcG9sb2d5IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVUb3BvbG9neUFjY2VzcygpLmdldFBlcnNwZWN0aXZlVG9wb2xvZ3lBY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPSd0b3BvbG9neScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVUb3BvbG9neUFjY2VzcygpLmdldFRvcG9sb2d5S2V5d29yZF8xKCkpOworICAgIH0KKygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVRvcG9sb2d5UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCW90aGVybHZfMj1SVUxFX0lECisJeworCQluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVUb3BvbG9neUFjY2VzcygpLmdldFJlZlRvcG9sb2d5Q3Jvc3NSZWZlcmVuY2VfMl8wKCkpOyAKKwl9CisKKykKKykpCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVQZXJzcGVjdGl2ZURpYWxvZworZW50cnlSdWxlUGVyc3BlY3RpdmVEaWFsb2cgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZURpYWxvZ1J1bGUoKSk7IH0KKwkgaXZfcnVsZVBlcnNwZWN0aXZlRGlhbG9nPXJ1bGVQZXJzcGVjdGl2ZURpYWxvZyAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVBlcnNwZWN0aXZlRGlhbG9nLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBQZXJzcGVjdGl2ZURpYWxvZworcnVsZVBlcnNwZWN0aXZlRGlhbG9nIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVEaWFsb2dBY2Nlc3MoKS5nZXRQZXJzcGVjdGl2ZURpYWxvZ0FjdGlvbl8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKQlvdGhlcmx2XzE9J2RpYWxvZycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVEaWFsb2dBY2Nlc3MoKS5nZXREaWFsb2dLZXl3b3JkXzEoKSk7CisgICAgfQorKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlRGlhbG9nUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCW90aGVybHZfMj1SVUxFX0lECisJeworCQluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVEaWFsb2dBY2Nlc3MoKS5nZXRSZWZEaWFsb2dDcm9zc1JlZmVyZW5jZV8yXzAoKSk7IAorCX0KKworKQorKSkKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVBlcnNwZWN0aXZlQlBNTgorZW50cnlSdWxlUGVyc3BlY3RpdmVCUE1OIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVCUE1OUnVsZSgpKTsgfQorCSBpdl9ydWxlUGVyc3BlY3RpdmVCUE1OPXJ1bGVQZXJzcGVjdGl2ZUJQTU4gCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVQZXJzcGVjdGl2ZUJQTU4uY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFBlcnNwZWN0aXZlQlBNTgorcnVsZVBlcnNwZWN0aXZlQlBNTiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQlBNTkFjY2VzcygpLmdldFBlcnNwZWN0aXZlQlBNTkFjdGlvbl8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKQlvdGhlcmx2XzE9J2JwbW4nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQlBNTkFjY2VzcygpLmdldEJwbW5LZXl3b3JkXzEoKSk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlUGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkCitlbnRyeVJ1bGVQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQgcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZFJ1bGUoKSk7IH0gCisJIGl2X3J1bGVQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQ9cnVsZVBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZC5jdXJyZW50LmdldFRleHQoKTsgfSAgCisJIEVPRiAKKzsKKworLy8gUnVsZSBQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQKK3J1bGVQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkQWNjZXNzKCkuZ2V0UXVhbGlmaWVkTmFtZVBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgIH0KKyAgICB0aGlzX1F1YWxpZmllZE5hbWVfMD1ydWxlUXVhbGlmaWVkTmFtZSAgICB7CisJCSRjdXJyZW50Lm1lcmdlKHRoaXNfUXVhbGlmaWVkTmFtZV8wKTsKKyAgICB9CisKKyAgICB7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKAorCWt3PScuJyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkQWNjZXNzKCkuZ2V0RnVsbFN0b3BLZXl3b3JkXzFfMCgpKTsgCisgICAgfQorCisJa3c9JyonIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRBY2Nlc3MoKS5nZXRBc3Rlcmlza0tleXdvcmRfMV8xKCkpOyAKKyAgICB9CispPykKKyAgICA7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVRdWFsaWZpZWROYW1lCitlbnRyeVJ1bGVRdWFsaWZpZWROYW1lIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lUnVsZSgpKTsgfSAKKwkgaXZfcnVsZVF1YWxpZmllZE5hbWU9cnVsZVF1YWxpZmllZE5hbWUgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVRdWFsaWZpZWROYW1lLmN1cnJlbnQuZ2V0VGV4dCgpOyB9ICAKKwkgRU9GIAorOworCisvLyBSdWxlIFF1YWxpZmllZE5hbWUKK3J1bGVRdWFsaWZpZWROYW1lIHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVBY2Nlc3MoKS5nZXRWYWxpZElEUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgfQorICAgIHRoaXNfVmFsaWRJRF8wPXJ1bGVWYWxpZElEICAgIHsKKwkJJGN1cnJlbnQubWVyZ2UodGhpc19WYWxpZElEXzApOworICAgIH0KKworICAgIHsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisoKCgKKwknLicgCispPT4KKwlrdz0nLicgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVBY2Nlc3MoKS5nZXRGdWxsU3RvcEtleXdvcmRfMV8wKCkpOyAKKyAgICB9CispCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVBY2Nlc3MoKS5nZXRWYWxpZElEUGFyc2VyUnVsZUNhbGxfMV8xKCkpOyAKKyAgICB9CisgICAgdGhpc19WYWxpZElEXzI9cnVsZVZhbGlkSUQgICAgeworCQkkY3VycmVudC5tZXJnZSh0aGlzX1ZhbGlkSURfMik7CisgICAgfQorCisgICAgeyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKykqKQorICAgIDsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVZhbGlkSUQKK2VudHJ5UnVsZVZhbGlkSUQgcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFZhbGlkSURSdWxlKCkpOyB9IAorCSBpdl9ydWxlVmFsaWRJRD1ydWxlVmFsaWRJRCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVZhbGlkSUQuY3VycmVudC5nZXRUZXh0KCk7IH0gIAorCSBFT0YgCis7CisKKy8vIFJ1bGUgVmFsaWRJRAorcnVsZVZhbGlkSUQgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKyAgICB0aGlzX0lEXzA9UlVMRV9JRCAgICB7CisJCSRjdXJyZW50Lm1lcmdlKHRoaXNfSURfMCk7CisgICAgfQorCisgICAgeyAKKyAgICBuZXdMZWFmTm9kZSh0aGlzX0lEXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0VmFsaWRJREFjY2VzcygpLmdldElEVGVybWluYWxSdWxlQ2FsbCgpKTsgCisgICAgfQorCisgICAgOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlVFJBTlNMQVRBQkxFSUQKK2VudHJ5UnVsZVRSQU5TTEFUQUJMRUlEIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRUUkFOU0xBVEFCTEVJRFJ1bGUoKSk7IH0gCisJIGl2X3J1bGVUUkFOU0xBVEFCTEVJRD1ydWxlVFJBTlNMQVRBQkxFSUQgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVUUkFOU0xBVEFCTEVJRC5jdXJyZW50LmdldFRleHQoKTsgfSAgCisJIEVPRiAKKzsKKworLy8gUnVsZSBUUkFOU0xBVEFCTEVJRAorcnVsZVRSQU5TTEFUQUJMRUlEIHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisgICAgdGhpc19JRF8wPVJVTEVfSUQgICAgeworCQkkY3VycmVudC5tZXJnZSh0aGlzX0lEXzApOworICAgIH0KKworICAgIHsgCisgICAgbmV3TGVhZk5vZGUodGhpc19JRF8wLCBncmFtbWFyQWNjZXNzLmdldFRSQU5TTEFUQUJMRUlEQWNjZXNzKCkuZ2V0SURUZXJtaW5hbFJ1bGVDYWxsKCkpOyAKKyAgICB9CisKKyAgICA7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcKK2VudHJ5UnVsZVRSQU5TTEFUQUJMRVNUUklORyByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0VFJBTlNMQVRBQkxFU1RSSU5HUnVsZSgpKTsgfSAKKwkgaXZfcnVsZVRSQU5TTEFUQUJMRVNUUklORz1ydWxlVFJBTlNMQVRBQkxFU1RSSU5HIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlVFJBTlNMQVRBQkxFU1RSSU5HLmN1cnJlbnQuZ2V0VGV4dCgpOyB9ICAKKwkgRU9GIAorOworCisvLyBSdWxlIFRSQU5TTEFUQUJMRVNUUklORworcnVsZVRSQU5TTEFUQUJMRVNUUklORyByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorICAgIHRoaXNfU1RSSU5HXzA9UlVMRV9TVFJJTkcgICAgeworCQkkY3VycmVudC5tZXJnZSh0aGlzX1NUUklOR18wKTsKKyAgICB9CisKKyAgICB7IAorICAgIG5ld0xlYWZOb2RlKHRoaXNfU1RSSU5HXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0VFJBTlNMQVRBQkxFU1RSSU5HQWNjZXNzKCkuZ2V0U1RSSU5HVGVybWluYWxSdWxlQ2FsbCgpKTsgCisgICAgfQorCisgICAgOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWEFubm90YXRpb24KK2VudHJ5UnVsZVhBbm5vdGF0aW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25SdWxlKCkpOyB9CisJIGl2X3J1bGVYQW5ub3RhdGlvbj1ydWxlWEFubm90YXRpb24gCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYQW5ub3RhdGlvbi5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWEFubm90YXRpb24KK3J1bGVYQW5ub3RhdGlvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0WEFubm90YXRpb25BY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPSdAJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldENvbW1lcmNpYWxBdEtleXdvcmRfMSgpKTsKKyAgICB9CisoCisoCisJCXsKKwkJCWlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRBbm5vdGF0aW9uVHlwZUp2bUFubm90YXRpb25UeXBlQ3Jvc3NSZWZlcmVuY2VfMl8wKCkpOyAKKwkgICAgfQorCQlydWxlUXVhbGlmaWVkTmFtZQkJeyAKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKCgoCScoJyAKKyk9PglvdGhlcmx2XzM9JygnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8zXzAoKSk7CisgICAgfQorKSgoKCgoKAorKAorCQlydWxlVmFsaWRJRAorKQorKQknPScgCispKT0+CisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRFbGVtZW50VmFsdWVQYWlyc1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpclBhcnNlclJ1bGVDYWxsXzNfMV8wXzBfMCgpKTsgCisJICAgIH0KKwkJbHZfZWxlbWVudFZhbHVlUGFpcnNfNF8wPXJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZWxlbWVudFZhbHVlUGFpcnMiLAorICAgICAgICAJCWx2X2VsZW1lbnRWYWx1ZVBhaXJzXzRfMCwgCisgICAgICAgIAkJIlhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCW90aGVybHZfNT0nLCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzUsIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfM18xXzBfMV8wKCkpOworICAgIH0KKygoKCgKKygKKwkJcnVsZVZhbGlkSUQKKykKKykJJz0nIAorKSk9PgorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0RWxlbWVudFZhbHVlUGFpcnNYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJQYXJzZXJSdWxlQ2FsbF8zXzFfMF8xXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfZWxlbWVudFZhbHVlUGFpcnNfNl8wPXJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZWxlbWVudFZhbHVlUGFpcnMiLAorICAgICAgICAJCWx2X2VsZW1lbnRWYWx1ZVBhaXJzXzZfMCwgCisgICAgICAgIAkJIlhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKikKKyAgICB8KAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0VmFsdWVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UGFyc2VyUnVsZUNhbGxfM18xXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfdmFsdWVfN18wPXJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0CQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInZhbHVlIiwKKyAgICAgICAgCQlsdl92YWx1ZV83XzAsIAorICAgICAgICAJCSJYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0Iik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSk/CW90aGVybHZfOD0nKScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzgsIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF8zXzIoKSk7CisgICAgfQorKT8pCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIKK2VudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpclJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcj1ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIKK3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoKCgoCisoCisJCXJ1bGVWYWxpZElECispCispCSc9JyAKKykpPT4oKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpclJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKS5nZXRFbGVtZW50SnZtT3BlcmF0aW9uQ3Jvc3NSZWZlcmVuY2VfMF8wXzBfMCgpKTsgCisJICAgIH0KKwkJcnVsZVZhbGlkSUQJCXsgCisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKQlvdGhlcmx2XzE9Jz0nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpLmdldEVxdWFsc1NpZ25LZXl3b3JkXzBfMF8xKCkpOworICAgIH0KKykpKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpLmdldFZhbHVlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IAorCSAgICB9CisJCWx2X3ZhbHVlXzJfMD1ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInZhbHVlIiwKKyAgICAgICAgCQlsdl92YWx1ZV8yXzAsIAorICAgICAgICAJCSJYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0CitlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3Q9cnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0LmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0CitydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgoKCgoCispCScjJyAKKwknWycgCispKT0+KCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxBY3Rpb25fMF8wXzBfMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPScjJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0TnVtYmVyU2lnbktleXdvcmRfMF8wXzBfMSgpKTsKKyAgICB9CisJb3RoZXJsdl8yPSdbJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0TGVmdFNxdWFyZUJyYWNrZXRLZXl3b3JkXzBfMF8wXzIoKSk7CisgICAgfQorKSkoKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRFbGVtZW50c1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMF8xXzBfMCgpKTsgCisJICAgIH0KKwkJbHZfZWxlbWVudHNfM18wPXJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImVsZW1lbnRzIiwKKyAgICAgICAgCQlsdl9lbGVtZW50c18zXzAsIAorICAgICAgICAJCSJYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCW90aGVybHZfND0nLCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzQsIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldENvbW1hS2V5d29yZF8wXzFfMV8wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0RWxlbWVudHNYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzBfMV8xXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfZWxlbWVudHNfNV8wPXJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImVsZW1lbnRzIiwKKyAgICAgICAgCQlsdl9lbGVtZW50c181XzAsIAorICAgICAgICAJCSJYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKik/CW90aGVybHZfNj0nXScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzYsIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFJpZ2h0U3F1YXJlQnJhY2tldEtleXdvcmRfMF8yKCkpOworICAgIH0KKykKKyAgICB8KAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IAorICAgIH0KKyAgICB0aGlzX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uXzc9cnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl83LmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnRBbmRBZGQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykoCW90aGVybHZfOT0nLCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzksIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldENvbW1hS2V5d29yZF8xXzFfMV8wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0RWxlbWVudHNYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMV8xXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfZWxlbWVudHNfMTBfMD1ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJlbGVtZW50cyIsCisgICAgICAgIAkJbHZfZWxlbWVudHNfMTBfMCwgCisgICAgICAgIAkJIlhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkrKT8pKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUKK2VudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkpOyB9CisJIGl2X3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZT1ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZS5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWEFubm90YXRpb25FbGVtZW50VmFsdWUKK3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgoKCgoCispCScjJyAKKwknWycgCispKT0+KCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsQWN0aW9uXzBfMF8wXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispCW90aGVybHZfMT0nIycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXROdW1iZXJTaWduS2V5d29yZF8wXzBfMF8xKCkpOworICAgIH0KKwlvdGhlcmx2XzI9J1snIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0TGVmdFNxdWFyZUJyYWNrZXRLZXl3b3JkXzBfMF8wXzIoKSk7CisgICAgfQorKSkoKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0RWxlbWVudHNYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzBfMV8wXzAoKSk7IAorCSAgICB9CisJCWx2X2VsZW1lbnRzXzNfMD1ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZWxlbWVudHMiLAorICAgICAgICAJCWx2X2VsZW1lbnRzXzNfMCwgCisgICAgICAgIAkJIlhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgJb3RoZXJsdl80PScsJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNCwgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldENvbW1hS2V5d29yZF8wXzFfMV8wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEVsZW1lbnRzWEFubm90YXRpb25PckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8wXzFfMV8xXzAoKSk7IAorCSAgICB9CisJCWx2X2VsZW1lbnRzXzVfMD1ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZWxlbWVudHMiLAorICAgICAgICAJCWx2X2VsZW1lbnRzXzVfMCwgCisgICAgICAgIAkJIlhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkqKT8Jb3RoZXJsdl82PSddJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNiwgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldFJpZ2h0U3F1YXJlQnJhY2tldEtleXdvcmRfMF8yKCkpOworICAgIH0KKykKKyAgICB8CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xKCkpOyAKKyAgICB9CisgICAgdGhpc19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl83PXJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbgorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfWEFubm90YXRpb25PckV4cHJlc3Npb25fNy5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uCitlbnRyeVJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBpdl9ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb249cnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24uY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uCitydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQW5ub3RhdGlvblBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgIH0KKyAgICB0aGlzX1hBbm5vdGF0aW9uXzA9cnVsZVhBbm5vdGF0aW9uCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YQW5ub3RhdGlvbl8wLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorCisgICAgfAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMSgpKTsgCisgICAgfQorICAgIHRoaXNfWEV4cHJlc3Npb25fMT1ydWxlWEV4cHJlc3Npb24KKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1hFeHByZXNzaW9uXzEuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CispCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYRXhwcmVzc2lvbgorZW50cnlSdWxlWEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhFeHByZXNzaW9uPXJ1bGVYRXhwcmVzc2lvbiAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhFeHByZXNzaW9uLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYRXhwcmVzc2lvbgorcnVsZVhFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQXNzaWdubWVudFBhcnNlclJ1bGVDYWxsKCkpOyAKKyAgICB9CisgICAgdGhpc19YQXNzaWdubWVudF8wPXJ1bGVYQXNzaWdubWVudAorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfWEFzc2lnbm1lbnRfMC5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWEFzc2lnbm1lbnQKK2VudHJ5UnVsZVhBc3NpZ25tZW50IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkpOyB9CisJIGl2X3J1bGVYQXNzaWdubWVudD1ydWxlWEFzc2lnbm1lbnQgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYQXNzaWdubWVudC5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWEFzc2lnbm1lbnQKK3J1bGVYQXNzaWdubWVudCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhBc3NpZ25tZW50QWN0aW9uXzBfMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykoCisoCisJCXsKKwkJCWlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudENyb3NzUmVmZXJlbmNlXzBfMV8wKCkpOyAKKwkgICAgfQorCQlydWxlRmVhdHVyZUNhbGxJRAkJeyAKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0T3BTaW5nbGVBc3NpZ25QYXJzZXJSdWxlQ2FsbF8wXzIoKSk7IAorICAgIH0KK3J1bGVPcFNpbmdsZUFzc2lnbgorICAgIHsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRWYWx1ZVhBc3NpZ25tZW50UGFyc2VyUnVsZUNhbGxfMF8zXzAoKSk7IAorCSAgICB9CisJCWx2X3ZhbHVlXzNfMD1ydWxlWEFzc2lnbm1lbnQJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkidmFsdWUiLAorICAgICAgICAJCWx2X3ZhbHVlXzNfMCwgCisgICAgICAgIAkJIlhBc3NpZ25tZW50Iik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkKKyAgICB8KAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhPckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IAorICAgIH0KKyAgICB0aGlzX1hPckV4cHJlc3Npb25fND1ydWxlWE9yRXhwcmVzc2lvbgorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfWE9yRXhwcmVzc2lvbl80LmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKCgoKCgKKykoCisoCisJCXJ1bGVPcE11bHRpQXNzaWduCispCispKSk9PigoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50QW5kU2V0KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRDcm9zc1JlZmVyZW5jZV8xXzFfMF8wXzFfMCgpKTsgCisJICAgIH0KKwkJcnVsZU9wTXVsdGlBc3NpZ24JCXsgCisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkpKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kWEFzc2lnbm1lbnRQYXJzZXJSdWxlQ2FsbF8xXzFfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9yaWdodE9wZXJhbmRfN18wPXJ1bGVYQXNzaWdubWVudAkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJyaWdodE9wZXJhbmQiLAorICAgICAgICAJCWx2X3JpZ2h0T3BlcmFuZF83XzAsIAorICAgICAgICAJCSJYQXNzaWdubWVudCIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpPykpCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVPcFNpbmdsZUFzc2lnbgorZW50cnlSdWxlT3BTaW5nbGVBc3NpZ24gcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE9wU2luZ2xlQXNzaWduUnVsZSgpKTsgfSAKKwkgaXZfcnVsZU9wU2luZ2xlQXNzaWduPXJ1bGVPcFNpbmdsZUFzc2lnbiAKKwkgeyAkY3VycmVudD0kaXZfcnVsZU9wU2luZ2xlQXNzaWduLmN1cnJlbnQuZ2V0VGV4dCgpOyB9ICAKKwkgRU9GIAorOworCisvLyBSdWxlIE9wU2luZ2xlQXNzaWduCitydWxlT3BTaW5nbGVBc3NpZ24gcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKworCWt3PSc9JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BTaW5nbGVBc3NpZ25BY2Nlc3MoKS5nZXRFcXVhbHNTaWduS2V5d29yZCgpKTsgCisgICAgfQorCisgICAgOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlT3BNdWx0aUFzc2lnbgorZW50cnlSdWxlT3BNdWx0aUFzc2lnbiByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnblJ1bGUoKSk7IH0gCisJIGl2X3J1bGVPcE11bHRpQXNzaWduPXJ1bGVPcE11bHRpQXNzaWduIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlT3BNdWx0aUFzc2lnbi5jdXJyZW50LmdldFRleHQoKTsgfSAgCisJIEVPRiAKKzsKKworLy8gUnVsZSBPcE11bHRpQXNzaWduCitydWxlT3BNdWx0aUFzc2lnbiByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAorCWt3PScrPScgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRQbHVzU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzAoKSk7IAorICAgIH0KKworICAgIHwKKwlrdz0nLT0nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0SHlwaGVuTWludXNFcXVhbHNTaWduS2V5d29yZF8xKCkpOyAKKyAgICB9CisKKyAgICB8CisJa3c9Jyo9JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEFzdGVyaXNrRXF1YWxzU2lnbktleXdvcmRfMigpKTsgCisgICAgfQorCisgICAgfAorCWt3PScvPScgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRTb2xpZHVzRXF1YWxzU2lnbktleXdvcmRfMygpKTsgCisgICAgfQorCisgICAgfAorCWt3PSclPScgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRQZXJjZW50U2lnbkVxdWFsc1NpZ25LZXl3b3JkXzQoKSk7IAorICAgIH0KKworICAgIHwoCisJa3c9JzwnIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF81XzAoKSk7IAorICAgIH0KKworCWt3PSc8JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfNV8xKCkpOyAKKyAgICB9CisKKwlrdz0nPScgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRFcXVhbHNTaWduS2V5d29yZF81XzIoKSk7IAorICAgIH0KKykKKyAgICB8KAorCWt3PSc+JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNl8wKCkpOyAKKyAgICB9CisoCisJa3c9Jz4nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF82XzEoKSk7IAorICAgIH0KKyk/CisJa3c9Jz49JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzZfMigpKTsgCisgICAgfQorKSkKKyAgICA7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYT3JFeHByZXNzaW9uCitlbnRyeVJ1bGVYT3JFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhPckV4cHJlc3Npb249cnVsZVhPckV4cHJlc3Npb24gCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYT3JFeHByZXNzaW9uLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYT3JFeHByZXNzaW9uCitydWxlWE9yRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEFuZEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICB9CisgICAgdGhpc19YQW5kRXhwcmVzc2lvbl8wPXJ1bGVYQW5kRXhwcmVzc2lvbgorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfWEFuZEV4cHJlc3Npb25fMC5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKygoKCgoCispKAorKAorCQlydWxlT3BPcgorKQorKSkpPT4oKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudEFuZFNldCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKSgKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudENyb3NzUmVmZXJlbmNlXzFfMF8wXzFfMCgpKTsgCisJICAgIH0KKwkJcnVsZU9wT3IJCXsgCisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkpKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRYQW5kRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9yaWdodE9wZXJhbmRfM18wPXJ1bGVYQW5kRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInJpZ2h0T3BlcmFuZCIsCisgICAgICAgIAkJbHZfcmlnaHRPcGVyYW5kXzNfMCwgCisgICAgICAgIAkJIlhBbmRFeHByZXNzaW9uIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkqKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlT3BPcgorZW50cnlSdWxlT3BPciByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPclJ1bGUoKSk7IH0gCisJIGl2X3J1bGVPcE9yPXJ1bGVPcE9yIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlT3BPci5jdXJyZW50LmdldFRleHQoKTsgfSAgCisJIEVPRiAKKzsKKworLy8gUnVsZSBPcE9yCitydWxlT3BPciByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorCisJa3c9J3x8JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPckFjY2VzcygpLmdldFZlcnRpY2FsTGluZVZlcnRpY2FsTGluZUtleXdvcmQoKSk7IAorICAgIH0KKworICAgIDsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhBbmRFeHByZXNzaW9uCitlbnRyeVJ1bGVYQW5kRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBpdl9ydWxlWEFuZEV4cHJlc3Npb249cnVsZVhBbmRFeHByZXNzaW9uIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWEFuZEV4cHJlc3Npb24uY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhBbmRFeHByZXNzaW9uCitydWxlWEFuZEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgfQorICAgIHRoaXNfWEVxdWFsaXR5RXhwcmVzc2lvbl8wPXJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YRXF1YWxpdHlFeHByZXNzaW9uXzAuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisoKCgoKAorKSgKKygKKwkJcnVsZU9wQW5kCispCispKSk9PigoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50QW5kU2V0KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKSgKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMV8wXzBfMV8wKCkpOyAKKwkgICAgfQorCQlydWxlT3BBbmQJCXsgCisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkpKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kWEVxdWFsaXR5RXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9yaWdodE9wZXJhbmRfM18wPXJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInJpZ2h0T3BlcmFuZCIsCisgICAgICAgIAkJbHZfcmlnaHRPcGVyYW5kXzNfMCwgCisgICAgICAgIAkJIlhFcXVhbGl0eUV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSopCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVPcEFuZAorZW50cnlSdWxlT3BBbmQgcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE9wQW5kUnVsZSgpKTsgfSAKKwkgaXZfcnVsZU9wQW5kPXJ1bGVPcEFuZCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZU9wQW5kLmN1cnJlbnQuZ2V0VGV4dCgpOyB9ICAKKwkgRU9GIAorOworCisvLyBSdWxlIE9wQW5kCitydWxlT3BBbmQgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKworCWt3PScmJicgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wQW5kQWNjZXNzKCkuZ2V0QW1wZXJzYW5kQW1wZXJzYW5kS2V5d29yZCgpKTsgCisgICAgfQorCisgICAgOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWEVxdWFsaXR5RXhwcmVzc2lvbgorZW50cnlSdWxlWEVxdWFsaXR5RXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkpOyB9CisJIGl2X3J1bGVYRXF1YWxpdHlFeHByZXNzaW9uPXJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWEVxdWFsaXR5RXhwcmVzc2lvbi5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWEVxdWFsaXR5RXhwcmVzc2lvbgorcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgIH0KKyAgICB0aGlzX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl8wPXJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24KKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl8wLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKCgoKCgKKykoCisoCisJCXJ1bGVPcEVxdWFsaXR5CispCispKSk9PigoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50QW5kU2V0KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMV8wXzBfMV8wKCkpOyAKKwkgICAgfQorCQlydWxlT3BFcXVhbGl0eQkJeyAKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSkoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZFhSZWxhdGlvbmFsRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9yaWdodE9wZXJhbmRfM18wPXJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJyaWdodE9wZXJhbmQiLAorICAgICAgICAJCWx2X3JpZ2h0T3BlcmFuZF8zXzAsIAorICAgICAgICAJCSJYUmVsYXRpb25hbEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSopCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVPcEVxdWFsaXR5CitlbnRyeVJ1bGVPcEVxdWFsaXR5IHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5UnVsZSgpKTsgfSAKKwkgaXZfcnVsZU9wRXF1YWxpdHk9cnVsZU9wRXF1YWxpdHkgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVPcEVxdWFsaXR5LmN1cnJlbnQuZ2V0VGV4dCgpOyB9ICAKKwkgRU9GIAorOworCisvLyBSdWxlIE9wRXF1YWxpdHkKK3J1bGVPcEVxdWFsaXR5IHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisJa3c9Jz09JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BFcXVhbGl0eUFjY2VzcygpLmdldEVxdWFsc1NpZ25FcXVhbHNTaWduS2V5d29yZF8wKCkpOyAKKyAgICB9CisKKyAgICB8CisJa3c9JyE9JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BFcXVhbGl0eUFjY2VzcygpLmdldEV4Y2xhbWF0aW9uTWFya0VxdWFsc1NpZ25LZXl3b3JkXzEoKSk7IAorICAgIH0KKworICAgIHwKKwlrdz0nPT09JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BFcXVhbGl0eUFjY2VzcygpLmdldEVxdWFsc1NpZ25FcXVhbHNTaWduRXF1YWxzU2lnbktleXdvcmRfMigpKTsgCisgICAgfQorCisgICAgfAorCWt3PSchPT0nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5QWNjZXNzKCkuZ2V0RXhjbGFtYXRpb25NYXJrRXF1YWxzU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzMoKSk7IAorICAgIH0KKykKKyAgICA7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24KK2VudHJ5UnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbj1ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYUmVsYXRpb25hbEV4cHJlc3Npb24KK3J1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgfQorICAgIHRoaXNfWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uXzA9cnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbgorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uXzAuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisoKCgoKCgKKykJJ2luc3RhbmNlb2YnIAorKSk9PigoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50QW5kU2V0KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8yPSdpbnN0YW5jZW9mJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRJbnN0YW5jZW9mS2V5d29yZF8xXzBfMF8wXzEoKSk7CisgICAgfQorKSkoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0VHlwZUp2bVR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xXzBfMV8wKCkpOyAKKwkgICAgfQorCQlsdl90eXBlXzNfMD1ydWxlSnZtVHlwZVJlZmVyZW5jZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkidHlwZSIsCisgICAgICAgIAkJbHZfdHlwZV8zXzAsIAorICAgICAgICAJCSJKdm1UeXBlUmVmZXJlbmNlIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkKKyAgICB8KCgoKCgKKykoCisoCisJCXJ1bGVPcENvbXBhcmUKKykKKykpKT0+KCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnRBbmRTZXQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudENyb3NzUmVmZXJlbmNlXzFfMV8wXzBfMV8wKCkpOyAKKwkgICAgfQorCQlydWxlT3BDb21wYXJlCQl7IAorCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xXzFfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9yaWdodE9wZXJhbmRfNl8wPXJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInJpZ2h0T3BlcmFuZCIsCisgICAgICAgIAkJbHZfcmlnaHRPcGVyYW5kXzZfMCwgCisgICAgICAgIAkJIlhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKSopCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVPcENvbXBhcmUKK2VudHJ5UnVsZU9wQ29tcGFyZSByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlUnVsZSgpKTsgfSAKKwkgaXZfcnVsZU9wQ29tcGFyZT1ydWxlT3BDb21wYXJlIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlT3BDb21wYXJlLmN1cnJlbnQuZ2V0VGV4dCgpOyB9ICAKKwkgRU9GIAorOworCisvLyBSdWxlIE9wQ29tcGFyZQorcnVsZU9wQ29tcGFyZSByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAorCWt3PSc+PScgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZUFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzAoKSk7IAorICAgIH0KKworICAgIHwoCisJa3c9JzwnIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzFfMCgpKTsgCisgICAgfQorCisJa3c9Jz0nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRFcXVhbHNTaWduS2V5d29yZF8xXzEoKSk7IAorICAgIH0KKykKKyAgICB8CisJa3c9Jz4nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzIoKSk7IAorICAgIH0KKworICAgIHwKKwlrdz0nPCcgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZUFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfMygpKTsgCisgICAgfQorKQorICAgIDsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbgorZW50cnlSdWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBpdl9ydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uPXJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24uY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbgorcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgfQorICAgIHRoaXNfWEFkZGl0aXZlRXhwcmVzc2lvbl8wPXJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YQWRkaXRpdmVFeHByZXNzaW9uXzAuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisoKCgoKAorKSgKKygKKwkJcnVsZU9wT3RoZXIKKykKKykpKT0+KCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnRBbmRTZXQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKSgKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRDcm9zc1JlZmVyZW5jZV8xXzBfMF8xXzAoKSk7IAorCSAgICB9CisJCXJ1bGVPcE90aGVyCQl7IAorCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRYQWRkaXRpdmVFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8xXzAoKSk7IAorCSAgICB9CisJCWx2X3JpZ2h0T3BlcmFuZF8zXzA9cnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInJpZ2h0T3BlcmFuZCIsCisgICAgICAgIAkJbHZfcmlnaHRPcGVyYW5kXzNfMCwgCisgICAgICAgIAkJIlhBZGRpdGl2ZUV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSopCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVPcE90aGVyCitlbnRyeVJ1bGVPcE90aGVyIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyUnVsZSgpKTsgfSAKKwkgaXZfcnVsZU9wT3RoZXI9cnVsZU9wT3RoZXIgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVPcE90aGVyLmN1cnJlbnQuZ2V0VGV4dCgpOyB9ICAKKwkgRU9GIAorOworCisvLyBSdWxlIE9wT3RoZXIKK3J1bGVPcE90aGVyIHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisJa3c9Jy0+JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEh5cGhlbk1pbnVzR3JlYXRlclRoYW5TaWduS2V5d29yZF8wKCkpOyAKKyAgICB9CisKKyAgICB8CisJa3c9Jy4uPCcgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRGdWxsU3RvcEZ1bGxTdG9wTGVzc1RoYW5TaWduS2V5d29yZF8xKCkpOyAKKyAgICB9CisKKyAgICB8KAorCWt3PSc+JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfMl8wKCkpOyAKKyAgICB9CisKKwlrdz0nLi4nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0RnVsbFN0b3BGdWxsU3RvcEtleXdvcmRfMl8xKCkpOyAKKyAgICB9CispCisgICAgfAorCWt3PScuLicgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRGdWxsU3RvcEZ1bGxTdG9wS2V5d29yZF8zKCkpOyAKKyAgICB9CisKKyAgICB8CisJa3c9Jz0+JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEVxdWFsc1NpZ25HcmVhdGVyVGhhblNpZ25LZXl3b3JkXzQoKSk7IAorICAgIH0KKworICAgIHwoCisJa3c9Jz4nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF81XzAoKSk7IAorICAgIH0KKygoKCgKKwknPicgCisKKwknPicgCispKT0+KAorCWt3PSc+JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNV8xXzBfMF8wKCkpOyAKKyAgICB9CisKKwlrdz0nPicgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzVfMV8wXzBfMSgpKTsgCisgICAgfQorKSkKKyAgICB8CisJa3c9Jz4nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF81XzFfMSgpKTsgCisgICAgfQorKSkKKyAgICB8KAorCWt3PSc8JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfNl8wKCkpOyAKKyAgICB9CisoKCgoCisJJzwnIAorCisJJzwnIAorKSk9PigKKwlrdz0nPCcgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzZfMV8wXzBfMCgpKTsgCisgICAgfQorCisJa3c9JzwnIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF82XzFfMF8wXzEoKSk7IAorICAgIH0KKykpCisgICAgfAorCWt3PSc8JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfNl8xXzEoKSk7IAorICAgIH0KKworICAgIHwKKwlrdz0nPT4nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0RXF1YWxzU2lnbkdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNl8xXzIoKSk7IAorICAgIH0KKykpCisgICAgfAorCWt3PSc8PicgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25HcmVhdGVyVGhhblNpZ25LZXl3b3JkXzcoKSk7IAorICAgIH0KKworICAgIHwKKwlrdz0nPzonIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0UXVlc3Rpb25NYXJrQ29sb25LZXl3b3JkXzgoKSk7IAorICAgIH0KKykKKyAgICA7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uCitlbnRyeVJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb249cnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYQWRkaXRpdmVFeHByZXNzaW9uLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQWRkaXRpdmVFeHByZXNzaW9uCitydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgIH0KKyAgICB0aGlzX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fMD1ydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbgorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl8wLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKCgoKCgKKykoCisoCisJCXJ1bGVPcEFkZAorKQorKSkpPT4oKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudEFuZFNldCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKSgKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudENyb3NzUmVmZXJlbmNlXzFfMF8wXzFfMCgpKTsgCisJICAgIH0KKwkJcnVsZU9wQWRkCQl7IAorCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9yaWdodE9wZXJhbmRfM18wPXJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkicmlnaHRPcGVyYW5kIiwKKyAgICAgICAgCQlsdl9yaWdodE9wZXJhbmRfM18wLCAKKyAgICAgICAgCQkiWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKikKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZU9wQWRkCitlbnRyeVJ1bGVPcEFkZCByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBZGRSdWxlKCkpOyB9IAorCSBpdl9ydWxlT3BBZGQ9cnVsZU9wQWRkIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlT3BBZGQuY3VycmVudC5nZXRUZXh0KCk7IH0gIAorCSBFT0YgCis7CisKKy8vIFJ1bGUgT3BBZGQKK3J1bGVPcEFkZCByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAorCWt3PScrJyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BBZGRBY2Nlc3MoKS5nZXRQbHVzU2lnbktleXdvcmRfMCgpKTsgCisgICAgfQorCisgICAgfAorCWt3PSctJyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BBZGRBY2Nlc3MoKS5nZXRIeXBoZW5NaW51c0tleXdvcmRfMSgpKTsgCisgICAgfQorKQorICAgIDsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24KK2VudHJ5UnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBpdl9ydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbj1ydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24uY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24KK3J1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYVW5hcnlPcGVyYXRpb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICB9CisgICAgdGhpc19YVW5hcnlPcGVyYXRpb25fMD1ydWxlWFVuYXJ5T3BlcmF0aW9uCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YVW5hcnlPcGVyYXRpb25fMC5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKygoKCgoCispKAorKAorCQlydWxlT3BNdWx0aQorKQorKSkpPT4oKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudEFuZFNldCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKSgKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudENyb3NzUmVmZXJlbmNlXzFfMF8wXzFfMCgpKTsgCisJICAgIH0KKwkJcnVsZU9wTXVsdGkJCXsgCisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkpKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRYVW5hcnlPcGVyYXRpb25QYXJzZXJSdWxlQ2FsbF8xXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfcmlnaHRPcGVyYW5kXzNfMD1ydWxlWFVuYXJ5T3BlcmF0aW9uCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkicmlnaHRPcGVyYW5kIiwKKyAgICAgICAgCQlsdl9yaWdodE9wZXJhbmRfM18wLCAKKyAgICAgICAgCQkiWFVuYXJ5T3BlcmF0aW9uIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkqKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlT3BNdWx0aQorZW50cnlSdWxlT3BNdWx0aSByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aVJ1bGUoKSk7IH0gCisJIGl2X3J1bGVPcE11bHRpPXJ1bGVPcE11bHRpIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlT3BNdWx0aS5jdXJyZW50LmdldFRleHQoKTsgfSAgCisJIEVPRiAKKzsKKworLy8gUnVsZSBPcE11bHRpCitydWxlT3BNdWx0aSByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAorCWt3PScqJyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFjY2VzcygpLmdldEFzdGVyaXNrS2V5d29yZF8wKCkpOyAKKyAgICB9CisKKyAgICB8CisJa3c9JyoqJyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFjY2VzcygpLmdldEFzdGVyaXNrQXN0ZXJpc2tLZXl3b3JkXzEoKSk7IAorICAgIH0KKworICAgIHwKKwlrdz0nLycgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBY2Nlc3MoKS5nZXRTb2xpZHVzS2V5d29yZF8yKCkpOyAKKyAgICB9CisKKyAgICB8CisJa3c9JyUnIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQWNjZXNzKCkuZ2V0UGVyY2VudFNpZ25LZXl3b3JkXzMoKSk7IAorICAgIH0KKykKKyAgICA7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYVW5hcnlPcGVyYXRpb24KK2VudHJ5UnVsZVhVbmFyeU9wZXJhdGlvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhVbmFyeU9wZXJhdGlvbj1ydWxlWFVuYXJ5T3BlcmF0aW9uIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWFVuYXJ5T3BlcmF0aW9uLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYVW5hcnlPcGVyYXRpb24KK3J1bGVYVW5hcnlPcGVyYXRpb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFVuYXJ5T3BlcmF0aW9uQWN0aW9uXzBfMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykoCisoCisJCXsKKwkJCWlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvbkFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMF8xXzAoKSk7IAorCSAgICB9CisJCXJ1bGVPcFVuYXJ5CQl7IAorCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uQWNjZXNzKCkuZ2V0T3BlcmFuZFhVbmFyeU9wZXJhdGlvblBhcnNlclJ1bGVDYWxsXzBfMl8wKCkpOyAKKwkgICAgfQorCQlsdl9vcGVyYW5kXzJfMD1ydWxlWFVuYXJ5T3BlcmF0aW9uCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJvcGVyYW5kIiwKKyAgICAgICAgCQlsdl9vcGVyYW5kXzJfMCwgCisgICAgICAgIAkJIlhVbmFyeU9wZXJhdGlvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpCisgICAgfAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEoKSk7IAorICAgIH0KKyAgICB0aGlzX1hDYXN0ZWRFeHByZXNzaW9uXzM9cnVsZVhDYXN0ZWRFeHByZXNzaW9uCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YQ2FzdGVkRXhwcmVzc2lvbl8zLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlT3BVbmFyeQorZW50cnlSdWxlT3BVbmFyeSByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BVbmFyeVJ1bGUoKSk7IH0gCisJIGl2X3J1bGVPcFVuYXJ5PXJ1bGVPcFVuYXJ5IAorCSB7ICRjdXJyZW50PSRpdl9ydWxlT3BVbmFyeS5jdXJyZW50LmdldFRleHQoKTsgfSAgCisJIEVPRiAKKzsKKworLy8gUnVsZSBPcFVuYXJ5CitydWxlT3BVbmFyeSByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAorCWt3PSchJyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BVbmFyeUFjY2VzcygpLmdldEV4Y2xhbWF0aW9uTWFya0tleXdvcmRfMCgpKTsgCisgICAgfQorCisgICAgfAorCWt3PSctJyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BVbmFyeUFjY2VzcygpLmdldEh5cGhlbk1pbnVzS2V5d29yZF8xKCkpOyAKKyAgICB9CisKKyAgICB8CisJa3c9JysnIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcFVuYXJ5QWNjZXNzKCkuZ2V0UGx1c1NpZ25LZXl3b3JkXzIoKSk7IAorICAgIH0KKykKKyAgICA7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQ2FzdGVkRXhwcmVzc2lvbgorZW50cnlSdWxlWENhc3RlZEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhDYXN0ZWRFeHByZXNzaW9uPXJ1bGVYQ2FzdGVkRXhwcmVzc2lvbiAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhDYXN0ZWRFeHByZXNzaW9uLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQ2FzdGVkRXhwcmVzc2lvbgorcnVsZVhDYXN0ZWRFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICB9CisgICAgdGhpc19YUG9zdGZpeE9wZXJhdGlvbl8wPXJ1bGVYUG9zdGZpeE9wZXJhdGlvbgorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfWFBvc3RmaXhPcGVyYXRpb25fMC5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKygoKCgoCispCSdhcycgCispKT0+KCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnRBbmRTZXQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8yPSdhcycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRBc0tleXdvcmRfMV8wXzBfMSgpKTsKKyAgICB9CispKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFR5cGVKdm1UeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMV8xXzAoKSk7IAorCSAgICB9CisJCWx2X3R5cGVfM18wPXJ1bGVKdm1UeXBlUmVmZXJlbmNlCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInR5cGUiLAorICAgICAgICAJCWx2X3R5cGVfM18wLCAKKyAgICAgICAgCQkiSnZtVHlwZVJlZmVyZW5jZSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKikKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhQb3N0Zml4T3BlcmF0aW9uCitlbnRyeVJ1bGVYUG9zdGZpeE9wZXJhdGlvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpKTsgfQorCSBpdl9ydWxlWFBvc3RmaXhPcGVyYXRpb249cnVsZVhQb3N0Zml4T3BlcmF0aW9uIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWFBvc3RmaXhPcGVyYXRpb24uY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhQb3N0Zml4T3BlcmF0aW9uCitydWxlWFBvc3RmaXhPcGVyYXRpb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxQYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICB9CisgICAgdGhpc19YTWVtYmVyRmVhdHVyZUNhbGxfMD1ydWxlWE1lbWJlckZlYXR1cmVDYWxsCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YTWVtYmVyRmVhdHVyZUNhbGxfMC5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKygoKCgKKykoCisoCisJCXJ1bGVPcFBvc3RmaXgKKykKKykpKT0+KCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnRBbmRTZXQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKSgKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMV8wXzFfMCgpKTsgCisJICAgIH0KKwkJcnVsZU9wUG9zdGZpeAkJeyAKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSk/KQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlT3BQb3N0Zml4CitlbnRyeVJ1bGVPcFBvc3RmaXggcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE9wUG9zdGZpeFJ1bGUoKSk7IH0gCisJIGl2X3J1bGVPcFBvc3RmaXg9cnVsZU9wUG9zdGZpeCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZU9wUG9zdGZpeC5jdXJyZW50LmdldFRleHQoKTsgfSAgCisJIEVPRiAKKzsKKworLy8gUnVsZSBPcFBvc3RmaXgKK3J1bGVPcFBvc3RmaXggcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKwlrdz0nKysnIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcFBvc3RmaXhBY2Nlc3MoKS5nZXRQbHVzU2lnblBsdXNTaWduS2V5d29yZF8wKCkpOyAKKyAgICB9CisKKyAgICB8CisJa3c9Jy0tJyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BQb3N0Zml4QWNjZXNzKCkuZ2V0SHlwaGVuTWludXNIeXBoZW5NaW51c0tleXdvcmRfMSgpKTsgCisgICAgfQorKQorICAgIDsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhNZW1iZXJGZWF0dXJlQ2FsbAorZW50cnlSdWxlWE1lbWJlckZlYXR1cmVDYWxsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpKTsgfQorCSBpdl9ydWxlWE1lbWJlckZlYXR1cmVDYWxsPXJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYTWVtYmVyRmVhdHVyZUNhbGwuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhNZW1iZXJGZWF0dXJlQ2FsbAorcnVsZVhNZW1iZXJGZWF0dXJlQ2FsbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYUHJpbWFyeUV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICB9CisgICAgdGhpc19YUHJpbWFyeUV4cHJlc3Npb25fMD1ydWxlWFByaW1hcnlFeHByZXNzaW9uCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YUHJpbWFyeUV4cHJlc3Npb25fMC5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKygoKCgoKAorKSgJJy4nIAorCisgICAgfCgKKygKKwknOjonIAorIAorCispCispKSgKKygKKwkJcnVsZUZlYXR1cmVDYWxsSUQKKykKKykJcnVsZU9wU2luZ2xlQXNzaWduKSk9PigoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50QW5kU2V0KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKSgJb3RoZXJsdl8yPScuJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRGdWxsU3RvcEtleXdvcmRfMV8wXzBfMF8xXzAoKSk7CisgICAgfQorCisgICAgfCgKKygKKwkJbHZfZXhwbGljaXRTdGF0aWNfM18wPQknOjonIAorICAgIHsKKyAgICAgICAgbmV3TGVhZk5vZGUobHZfZXhwbGljaXRTdGF0aWNfM18wLCBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0U3RhdGljQ29sb25Db2xvbktleXdvcmRfMV8wXzBfMF8xXzFfMCgpKTsKKyAgICB9CisgCisJICAgIHsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoJGN1cnJlbnQsICJleHBsaWNpdFN0YXRpYyIsIHRydWUsICI6OiIpOworCSAgICB9CisKKykKKykpKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudENyb3NzUmVmZXJlbmNlXzFfMF8wXzBfMl8wKCkpOyAKKwkgICAgfQorCQlydWxlRmVhdHVyZUNhbGxJRAkJeyAKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldE9wU2luZ2xlQXNzaWduUGFyc2VyUnVsZUNhbGxfMV8wXzBfMF8zKCkpOyAKKyAgICB9CitydWxlT3BTaW5nbGVBc3NpZ24KKyAgICB7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKSkoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0VmFsdWVYQXNzaWdubWVudFBhcnNlclJ1bGVDYWxsXzFfMF8xXzAoKSk7IAorCSAgICB9CisJCWx2X3ZhbHVlXzZfMD1ydWxlWEFzc2lnbm1lbnQJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInZhbHVlIiwKKyAgICAgICAgCQlsdl92YWx1ZV82XzAsIAorICAgICAgICAJCSJYQXNzaWdubWVudCIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpCisgICAgfCgoKCgoCispKAknLicgCisKKyAgICB8KAorKAorCSc/LicgCisgCisKKykKKykKKyAgICB8KAorKAorCSc6OicgCisgCisKKykKKykpKSk9PigoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50QW5kU2V0KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykoCW90aGVybHZfOD0nLicgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzgsIGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RnVsbFN0b3BLZXl3b3JkXzFfMV8wXzBfMV8wKCkpOworICAgIH0KKworICAgIHwoCisoCisJCWx2X251bGxTYWZlXzlfMD0JJz8uJyAKKyAgICB7CisgICAgICAgIG5ld0xlYWZOb2RlKGx2X251bGxTYWZlXzlfMCwgZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXROdWxsU2FmZVF1ZXN0aW9uTWFya0Z1bGxTdG9wS2V5d29yZF8xXzFfMF8wXzFfMV8wKCkpOworICAgIH0KKyAKKwkgICAgeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgkY3VycmVudCwgIm51bGxTYWZlIiwgdHJ1ZSwgIj8uIik7CisJICAgIH0KKworKQorKQorICAgIHwoCisoCisJCWx2X2V4cGxpY2l0U3RhdGljXzEwXzA9CSc6OicgCisgICAgeworICAgICAgICBuZXdMZWFmTm9kZShsdl9leHBsaWNpdFN0YXRpY18xMF8wLCBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0U3RhdGljQ29sb25Db2xvbktleXdvcmRfMV8xXzBfMF8xXzJfMCgpKTsKKyAgICB9CisgCisJICAgIHsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoJGN1cnJlbnQsICJleHBsaWNpdFN0YXRpYyIsIHRydWUsICI6OiIpOworCSAgICB9CisKKykKKykpKSkoCW90aGVybHZfMTE9JzwnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xMSwgZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzFfMV8xXzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFR5cGVBcmd1bWVudHNKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xXzFfMV8xXzAoKSk7IAorCSAgICB9CisJCWx2X3R5cGVBcmd1bWVudHNfMTJfMD1ydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJ0eXBlQXJndW1lbnRzIiwKKyAgICAgICAgCQlsdl90eXBlQXJndW1lbnRzXzEyXzAsIAorICAgICAgICAJCSJKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKAlvdGhlcmx2XzEzPScsJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTMsIGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzFfMV8xXzJfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0VHlwZUFyZ3VtZW50c0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzFfMV8xXzJfMV8wKCkpOyAKKwkgICAgfQorCQlsdl90eXBlQXJndW1lbnRzXzE0XzA9cnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkidHlwZUFyZ3VtZW50cyIsCisgICAgICAgIAkJbHZfdHlwZUFyZ3VtZW50c18xNF8wLCAKKyAgICAgICAgCQkiSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkqCW90aGVybHZfMTU9Jz4nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xNSwgZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzFfMV8xXzMoKSk7CisgICAgfQorKT8oCisoCisJCXsKKwkJCWlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMV8xXzJfMCgpKTsgCisJICAgIH0KKwkJcnVsZUlkT3JTdXBlcgkJeyAKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKCgoCisoCisJJygnIAorIAorCispCispPT4KKygKKwkJbHZfZXhwbGljaXRPcGVyYXRpb25DYWxsXzE3XzA9CScoJyAKKyAgICB7CisgICAgICAgIG5ld0xlYWZOb2RlKGx2X2V4cGxpY2l0T3BlcmF0aW9uQ2FsbF8xN18wLCBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0T3BlcmF0aW9uQ2FsbExlZnRQYXJlbnRoZXNpc0tleXdvcmRfMV8xXzNfMF8wKCkpOworICAgIH0KKyAKKwkgICAgeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgkY3VycmVudCwgImV4cGxpY2l0T3BlcmF0aW9uQ2FsbCIsIHRydWUsICIoIik7CisJICAgIH0KKworKQorKSgoKCgoCispKCgKKygKK3J1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIKKykKKykoCScsJyAKKygKKygKK3J1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIKKykKKykpKik/KAorKAorCSd8JyAKKyAKKworKQorKSkpPT4KKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRNZW1iZXJDYWxsQXJndW1lbnRzWFNob3J0Q2xvc3VyZVBhcnNlclJ1bGVDYWxsXzFfMV8zXzFfMF8wKCkpOyAKKwkgICAgfQorCQlsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzE4XzA9cnVsZVhTaG9ydENsb3N1cmUJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJIm1lbWJlckNhbGxBcmd1bWVudHMiLAorICAgICAgICAJCWx2X21lbWJlckNhbGxBcmd1bWVudHNfMThfMCwgCisgICAgICAgIAkJIlhTaG9ydENsb3N1cmUiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispCisgICAgfCgoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0TWVtYmVyQ2FsbEFyZ3VtZW50c1hFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8xXzNfMV8xXzBfMCgpKTsgCisJICAgIH0KKwkJbHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18xOV8wPXJ1bGVYRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkibWVtYmVyQ2FsbEFyZ3VtZW50cyIsCisgICAgICAgIAkJbHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18xOV8wLCAKKyAgICAgICAgCQkiWEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKAlvdGhlcmx2XzIwPScsJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMjAsIGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzFfMV8zXzFfMV8xXzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldE1lbWJlckNhbGxBcmd1bWVudHNYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMV8zXzFfMV8xXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18yMV8wPXJ1bGVYRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkibWVtYmVyQ2FsbEFyZ3VtZW50cyIsCisgICAgICAgIAkJbHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18yMV8wLCAKKyAgICAgICAgCQkiWEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSopKT8Jb3RoZXJsdl8yMj0nKScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIyLCBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzFfMV8zXzIoKSk7CisgICAgfQorKT8oKCgoCispCSdbJyAKKykpPT4KKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRNZW1iZXJDYWxsQXJndW1lbnRzWENsb3N1cmVQYXJzZXJSdWxlQ2FsbF8xXzFfNF8wKCkpOyAKKwkgICAgfQorCQlsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzIzXzA9cnVsZVhDbG9zdXJlCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJtZW1iZXJDYWxsQXJndW1lbnRzIiwKKyAgICAgICAgCQlsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzIzXzAsIAorICAgICAgICAJCSJYQ2xvc3VyZSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKyk/KSkqKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWFByaW1hcnlFeHByZXNzaW9uCitlbnRyeVJ1bGVYUHJpbWFyeUV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkpOyB9CisJIGl2X3J1bGVYUHJpbWFyeUV4cHJlc3Npb249cnVsZVhQcmltYXJ5RXhwcmVzc2lvbiAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhQcmltYXJ5RXhwcmVzc2lvbi5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWFByaW1hcnlFeHByZXNzaW9uCitydWxlWFByaW1hcnlFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhDb25zdHJ1Y3RvckNhbGxQYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICB9CisgICAgdGhpc19YQ29uc3RydWN0b3JDYWxsXzA9cnVsZVhDb25zdHJ1Y3RvckNhbGwKKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1hDb25zdHJ1Y3RvckNhbGxfMC5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworICAgIHwKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJsb2NrRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEoKSk7IAorICAgIH0KKyAgICB0aGlzX1hCbG9ja0V4cHJlc3Npb25fMT1ydWxlWEJsb2NrRXhwcmVzc2lvbgorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfWEJsb2NrRXhwcmVzc2lvbl8xLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorCisgICAgfAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYU3dpdGNoRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzIoKSk7IAorICAgIH0KKyAgICB0aGlzX1hTd2l0Y2hFeHByZXNzaW9uXzI9cnVsZVhTd2l0Y2hFeHByZXNzaW9uCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YU3dpdGNoRXhwcmVzc2lvbl8yLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorCisgICAgfCgoKCgKKykJJ3N5bmNocm9uaXplZCcgCisJJygnIAorKSk9PgorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzMoKSk7IAorICAgIH0KKyAgICB0aGlzX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uXzM9cnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YU3luY2hyb25pemVkRXhwcmVzc2lvbl8zLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKQorICAgIHwKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEZlYXR1cmVDYWxsUGFyc2VyUnVsZUNhbGxfNCgpKTsgCisgICAgfQorICAgIHRoaXNfWEZlYXR1cmVDYWxsXzQ9cnVsZVhGZWF0dXJlQ2FsbAorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfWEZlYXR1cmVDYWxsXzQuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisKKyAgICB8CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhMaXRlcmFsUGFyc2VyUnVsZUNhbGxfNSgpKTsgCisgICAgfQorICAgIHRoaXNfWExpdGVyYWxfNT1ydWxlWExpdGVyYWwKKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1hMaXRlcmFsXzUuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisKKyAgICB8CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhJZkV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF82KCkpOyAKKyAgICB9CisgICAgdGhpc19YSWZFeHByZXNzaW9uXzY9cnVsZVhJZkV4cHJlc3Npb24KKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1hJZkV4cHJlc3Npb25fNi5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworICAgIHwoKCgoCispCSdmb3InIAorCScoJyAKKygKKygKK3J1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIKKykKKykJJzonIAorKSk9PgorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYRm9yTG9vcEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF83KCkpOyAKKyAgICB9CisgICAgdGhpc19YRm9yTG9vcEV4cHJlc3Npb25fNz1ydWxlWEZvckxvb3BFeHByZXNzaW9uCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YRm9yTG9vcEV4cHJlc3Npb25fNy5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKykKKyAgICB8CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfOCgpKTsgCisgICAgfQorICAgIHRoaXNfWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fOD1ydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24KKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uXzguY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisKKyAgICB8CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhXaGlsZUV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF85KCkpOyAKKyAgICB9CisgICAgdGhpc19YV2hpbGVFeHByZXNzaW9uXzk9cnVsZVhXaGlsZUV4cHJlc3Npb24KKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1hXaGlsZUV4cHJlc3Npb25fOS5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworICAgIHwKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WERvV2hpbGVFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMTAoKSk7IAorICAgIH0KKyAgICB0aGlzX1hEb1doaWxlRXhwcmVzc2lvbl8xMD1ydWxlWERvV2hpbGVFeHByZXNzaW9uCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YRG9XaGlsZUV4cHJlc3Npb25fMTAuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisKKyAgICB8CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhUaHJvd0V4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xMSgpKTsgCisgICAgfQorICAgIHRoaXNfWFRocm93RXhwcmVzc2lvbl8xMT1ydWxlWFRocm93RXhwcmVzc2lvbgorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfWFRocm93RXhwcmVzc2lvbl8xMS5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworICAgIHwKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFJldHVybkV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xMigpKTsgCisgICAgfQorICAgIHRoaXNfWFJldHVybkV4cHJlc3Npb25fMTI9cnVsZVhSZXR1cm5FeHByZXNzaW9uCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YUmV0dXJuRXhwcmVzc2lvbl8xMi5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworICAgIHwKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xMygpKTsgCisgICAgfQorICAgIHRoaXNfWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fMTM9cnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl8xMy5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworICAgIHwKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMTQoKSk7IAorICAgIH0KKyAgICB0aGlzX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl8xND1ydWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fMTQuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CispCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYTGl0ZXJhbAorZW50cnlSdWxlWExpdGVyYWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbFJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhMaXRlcmFsPXJ1bGVYTGl0ZXJhbCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhMaXRlcmFsLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYTGl0ZXJhbAorcnVsZVhMaXRlcmFsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsQWNjZXNzKCkuZ2V0WENvbGxlY3Rpb25MaXRlcmFsUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgfQorICAgIHRoaXNfWENvbGxlY3Rpb25MaXRlcmFsXzA9cnVsZVhDb2xsZWN0aW9uTGl0ZXJhbAorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfWENvbGxlY3Rpb25MaXRlcmFsXzAuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisKKyAgICB8KCgoKAorKQknWycgCispKT0+CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsQWNjZXNzKCkuZ2V0WENsb3N1cmVQYXJzZXJSdWxlQ2FsbF8xKCkpOyAKKyAgICB9CisgICAgdGhpc19YQ2xvc3VyZV8xPXJ1bGVYQ2xvc3VyZQorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfWENsb3N1cmVfMS5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKykKKyAgICB8CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsQWNjZXNzKCkuZ2V0WEJvb2xlYW5MaXRlcmFsUGFyc2VyUnVsZUNhbGxfMigpKTsgCisgICAgfQorICAgIHRoaXNfWEJvb2xlYW5MaXRlcmFsXzI9cnVsZVhCb29sZWFuTGl0ZXJhbAorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfWEJvb2xlYW5MaXRlcmFsXzIuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisKKyAgICB8CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsQWNjZXNzKCkuZ2V0WE51bWJlckxpdGVyYWxQYXJzZXJSdWxlQ2FsbF8zKCkpOyAKKyAgICB9CisgICAgdGhpc19YTnVtYmVyTGl0ZXJhbF8zPXJ1bGVYTnVtYmVyTGl0ZXJhbAorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfWE51bWJlckxpdGVyYWxfMy5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworICAgIHwKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxBY2Nlc3MoKS5nZXRYTnVsbExpdGVyYWxQYXJzZXJSdWxlQ2FsbF80KCkpOyAKKyAgICB9CisgICAgdGhpc19YTnVsbExpdGVyYWxfND1ydWxlWE51bGxMaXRlcmFsCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YTnVsbExpdGVyYWxfNC5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworICAgIHwKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxBY2Nlc3MoKS5nZXRYU3RyaW5nTGl0ZXJhbFBhcnNlclJ1bGVDYWxsXzUoKSk7IAorICAgIH0KKyAgICB0aGlzX1hTdHJpbmdMaXRlcmFsXzU9cnVsZVhTdHJpbmdMaXRlcmFsCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YU3RyaW5nTGl0ZXJhbF81LmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorCisgICAgfAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbEFjY2VzcygpLmdldFhUeXBlTGl0ZXJhbFBhcnNlclJ1bGVDYWxsXzYoKSk7IAorICAgIH0KKyAgICB0aGlzX1hUeXBlTGl0ZXJhbF82PXJ1bGVYVHlwZUxpdGVyYWwKKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1hUeXBlTGl0ZXJhbF82LmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWENvbGxlY3Rpb25MaXRlcmFsCitlbnRyeVJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29sbGVjdGlvbkxpdGVyYWxSdWxlKCkpOyB9CisJIGl2X3J1bGVYQ29sbGVjdGlvbkxpdGVyYWw9cnVsZVhDb2xsZWN0aW9uTGl0ZXJhbCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhDb2xsZWN0aW9uTGl0ZXJhbC5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWENvbGxlY3Rpb25MaXRlcmFsCitydWxlWENvbGxlY3Rpb25MaXRlcmFsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhDb2xsZWN0aW9uTGl0ZXJhbEFjY2VzcygpLmdldFhTZXRMaXRlcmFsUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgfQorICAgIHRoaXNfWFNldExpdGVyYWxfMD1ydWxlWFNldExpdGVyYWwKKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1hTZXRMaXRlcmFsXzAuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisKKyAgICB8CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhDb2xsZWN0aW9uTGl0ZXJhbEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbFBhcnNlclJ1bGVDYWxsXzEoKSk7IAorICAgIH0KKyAgICB0aGlzX1hMaXN0TGl0ZXJhbF8xPXJ1bGVYTGlzdExpdGVyYWwKKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1hMaXN0TGl0ZXJhbF8xLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWFNldExpdGVyYWwKK2VudHJ5UnVsZVhTZXRMaXRlcmFsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxSdWxlKCkpOyB9CisJIGl2X3J1bGVYU2V0TGl0ZXJhbD1ydWxlWFNldExpdGVyYWwgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYU2V0TGl0ZXJhbC5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWFNldExpdGVyYWwKK3J1bGVYU2V0TGl0ZXJhbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhTZXRMaXRlcmFsQWNjZXNzKCkuZ2V0WFNldExpdGVyYWxBY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPScjJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbEFjY2VzcygpLmdldE51bWJlclNpZ25LZXl3b3JkXzEoKSk7CisgICAgfQorCW90aGVybHZfMj0neycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yKCkpOworICAgIH0KKygoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxBY2Nlc3MoKS5nZXRFbGVtZW50c1hFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfM18wXzAoKSk7IAorCSAgICB9CisJCWx2X2VsZW1lbnRzXzNfMD1ydWxlWEV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZWxlbWVudHMiLAorICAgICAgICAJCWx2X2VsZW1lbnRzXzNfMCwgCisgICAgICAgIAkJIlhFeHByZXNzaW9uIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgJb3RoZXJsdl80PScsJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNCwgZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbEFjY2VzcygpLmdldENvbW1hS2V5d29yZF8zXzFfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxBY2Nlc3MoKS5nZXRFbGVtZW50c1hFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfM18xXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfZWxlbWVudHNfNV8wPXJ1bGVYRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJlbGVtZW50cyIsCisgICAgICAgIAkJbHZfZWxlbWVudHNfNV8wLCAKKyAgICAgICAgCQkiWEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSopPwlvdGhlcmx2XzY9J30nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl82LCBncmFtbWFyQWNjZXNzLmdldFhTZXRMaXRlcmFsQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzQoKSk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWExpc3RMaXRlcmFsCitlbnRyeVJ1bGVYTGlzdExpdGVyYWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYTGlzdExpdGVyYWxSdWxlKCkpOyB9CisJIGl2X3J1bGVYTGlzdExpdGVyYWw9cnVsZVhMaXN0TGl0ZXJhbCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhMaXN0TGl0ZXJhbC5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWExpc3RMaXRlcmFsCitydWxlWExpc3RMaXRlcmFsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsQWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispCW90aGVybHZfMT0nIycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsQWNjZXNzKCkuZ2V0TnVtYmVyU2lnbktleXdvcmRfMSgpKTsKKyAgICB9CisJb3RoZXJsdl8yPSdbJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRYTGlzdExpdGVyYWxBY2Nlc3MoKS5nZXRMZWZ0U3F1YXJlQnJhY2tldEtleXdvcmRfMigpKTsKKyAgICB9CisoKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbEFjY2VzcygpLmdldEVsZW1lbnRzWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8zXzBfMCgpKTsgCisJICAgIH0KKwkJbHZfZWxlbWVudHNfM18wPXJ1bGVYRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYTGlzdExpdGVyYWxSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZWxlbWVudHMiLAorICAgICAgICAJCWx2X2VsZW1lbnRzXzNfMCwgCisgICAgICAgIAkJIlhFeHByZXNzaW9uIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgJb3RoZXJsdl80PScsJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNCwgZ3JhbW1hckFjY2Vzcy5nZXRYTGlzdExpdGVyYWxBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfM18xXzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbEFjY2VzcygpLmdldEVsZW1lbnRzWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8zXzFfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9lbGVtZW50c181XzA9cnVsZVhFeHByZXNzaW9uCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJlbGVtZW50cyIsCisgICAgICAgIAkJbHZfZWxlbWVudHNfNV8wLCAKKyAgICAgICAgCQkiWEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSopPwlvdGhlcmx2XzY9J10nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl82LCBncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbEFjY2VzcygpLmdldFJpZ2h0U3F1YXJlQnJhY2tldEtleXdvcmRfNCgpKTsKKyAgICB9CispCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQ2xvc3VyZQorZW50cnlSdWxlWENsb3N1cmUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZVJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhDbG9zdXJlPXJ1bGVYQ2xvc3VyZSAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhDbG9zdXJlLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQ2xvc3VyZQorcnVsZVhDbG9zdXJlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKCgoKAorKQknWycgCispKT0+KCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0WENsb3N1cmVBY3Rpb25fMF8wXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispCW90aGVybHZfMT0nWycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRMZWZ0U3F1YXJlQnJhY2tldEtleXdvcmRfMF8wXzEoKSk7CisgICAgfQorKSkoKCgoKAorKAorcnVsZUp2bUZvcm1hbFBhcmFtZXRlcgorKQorKSgJJywnIAorKAorKAorcnVsZUp2bUZvcm1hbFBhcmFtZXRlcgorKQorKSkqKT8oCisoCisJJ3wnIAorIAorCispCispKSk9PigoKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0RGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzSnZtRm9ybWFsUGFyYW1ldGVyUGFyc2VyUnVsZUNhbGxfMV8wXzBfMF8wKCkpOyAKKwkgICAgfQorCQlsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfMl8wPXJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzIiwKKyAgICAgICAgCQlsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfMl8wLCAKKyAgICAgICAgCQkiSnZtRm9ybWFsUGFyYW1ldGVyIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgJb3RoZXJsdl8zPScsJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMywgZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZUFjY2VzcygpLmdldENvbW1hS2V5d29yZF8xXzBfMF8xXzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0RGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzSnZtRm9ybWFsUGFyYW1ldGVyUGFyc2VyUnVsZUNhbGxfMV8wXzBfMV8xXzAoKSk7IAorCSAgICB9CisJCWx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc180XzA9cnVsZUp2bUZvcm1hbFBhcmFtZXRlcgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJkZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnMiLAorICAgICAgICAJCWx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc180XzAsIAorICAgICAgICAJCSJKdm1Gb3JtYWxQYXJhbWV0ZXIiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSopPygKKygKKwkJbHZfZXhwbGljaXRTeW50YXhfNV8wPQknfCcgCisgICAgeworICAgICAgICBuZXdMZWFmTm9kZShsdl9leHBsaWNpdFN5bnRheF81XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRFeHBsaWNpdFN5bnRheFZlcnRpY2FsTGluZUtleXdvcmRfMV8wXzFfMCgpKTsKKyAgICB9CisgCisJICAgIHsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgkY3VycmVudCwgImV4cGxpY2l0U3ludGF4IiwgdHJ1ZSwgInwiKTsKKwkgICAgfQorCispCispKSk/KAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0RXhwcmVzc2lvblhFeHByZXNzaW9uSW5DbG9zdXJlUGFyc2VyUnVsZUNhbGxfMl8wKCkpOyAKKwkgICAgfQorCQlsdl9leHByZXNzaW9uXzZfMD1ydWxlWEV4cHJlc3Npb25JbkNsb3N1cmUJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZXhwcmVzc2lvbiIsCisgICAgICAgIAkJbHZfZXhwcmVzc2lvbl82XzAsIAorICAgICAgICAJCSJYRXhwcmVzc2lvbkluQ2xvc3VyZSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykJb3RoZXJsdl83PSddJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNywgZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZUFjY2VzcygpLmdldFJpZ2h0U3F1YXJlQnJhY2tldEtleXdvcmRfMygpKTsKKyAgICB9CispCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZQorZW50cnlSdWxlWEV4cHJlc3Npb25JbkNsb3N1cmUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbkluQ2xvc3VyZVJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlPXJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYRXhwcmVzc2lvbkluQ2xvc3VyZQorcnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25JbkNsb3N1cmVBY2Nlc3MoKS5nZXRYQmxvY2tFeHByZXNzaW9uQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispKCgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbkluQ2xvc3VyZUFjY2VzcygpLmdldEV4cHJlc3Npb25zWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUGFyc2VyUnVsZUNhbGxfMV8wXzAoKSk7IAorCSAgICB9CisJCWx2X2V4cHJlc3Npb25zXzFfMD1ydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uSW5DbG9zdXJlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImV4cHJlc3Npb25zIiwKKyAgICAgICAgCQlsdl9leHByZXNzaW9uc18xXzAsIAorICAgICAgICAJCSJYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKAlvdGhlcmx2XzI9JzsnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uSW5DbG9zdXJlQWNjZXNzKCkuZ2V0U2VtaWNvbG9uS2V5d29yZF8xXzEoKSk7CisgICAgfQorKT8pKikKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhTaG9ydENsb3N1cmUKK2VudHJ5UnVsZVhTaG9ydENsb3N1cmUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlUnVsZSgpKTsgfQorCSBpdl9ydWxlWFNob3J0Q2xvc3VyZT1ydWxlWFNob3J0Q2xvc3VyZSAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhTaG9ydENsb3N1cmUuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhTaG9ydENsb3N1cmUKK3J1bGVYU2hvcnRDbG9zdXJlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKCgoKAorKSgoCisoCitydWxlSnZtRm9ybWFsUGFyYW1ldGVyCispCispKAknLCcgCisoCisoCitydWxlSnZtRm9ybWFsUGFyYW1ldGVyCispCispKSopPygKKygKKwknfCcgCisgCisKKykKKykpKT0+KCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXRYQ2xvc3VyZUFjdGlvbl8wXzBfMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykoKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXREZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNKdm1Gb3JtYWxQYXJhbWV0ZXJQYXJzZXJSdWxlQ2FsbF8wXzBfMV8wXzAoKSk7IAorCSAgICB9CisJCWx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18xXzA9cnVsZUp2bUZvcm1hbFBhcmFtZXRlcgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImRlY2xhcmVkRm9ybWFsUGFyYW1ldGVycyIsCisgICAgICAgIAkJbHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzFfMCwgCisgICAgICAgIAkJIkp2bUZvcm1hbFBhcmFtZXRlciIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCW90aGVybHZfMj0nLCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpLmdldENvbW1hS2V5d29yZF8wXzBfMV8xXzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXREZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNKdm1Gb3JtYWxQYXJhbWV0ZXJQYXJzZXJSdWxlQ2FsbF8wXzBfMV8xXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzNfMD1ydWxlSnZtRm9ybWFsUGFyYW1ldGVyCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzIiwKKyAgICAgICAgCQlsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfM18wLCAKKyAgICAgICAgCQkiSnZtRm9ybWFsUGFyYW1ldGVyIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkqKT8oCisoCisJCWx2X2V4cGxpY2l0U3ludGF4XzRfMD0JJ3wnIAorICAgIHsKKyAgICAgICAgbmV3TGVhZk5vZGUobHZfZXhwbGljaXRTeW50YXhfNF8wLCBncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXRFeHBsaWNpdFN5bnRheFZlcnRpY2FsTGluZUtleXdvcmRfMF8wXzJfMCgpKTsKKyAgICB9CisgCisJICAgIHsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKCRjdXJyZW50LCAiZXhwbGljaXRTeW50YXgiLCB0cnVlLCAifCIpOworCSAgICB9CisKKykKKykpKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlQWNjZXNzKCkuZ2V0RXhwcmVzc2lvblhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9leHByZXNzaW9uXzVfMD1ydWxlWEV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJleHByZXNzaW9uIiwKKyAgICAgICAgCQlsdl9leHByZXNzaW9uXzVfMCwgCisgICAgICAgIAkJIlhFeHByZXNzaW9uIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbgorZW50cnlSdWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBpdl9ydWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uPXJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24gCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24uY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbgorcnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAlvdGhlcmx2XzA9JygnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8wLCBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldExlZnRQYXJlbnRoZXNpc0tleXdvcmRfMCgpKTsKKyAgICB9CisKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xKCkpOyAKKyAgICB9CisgICAgdGhpc19YRXhwcmVzc2lvbl8xPXJ1bGVYRXhwcmVzc2lvbgorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfWEV4cHJlc3Npb25fMS5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKwlvdGhlcmx2XzI9JyknIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzIoKSk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWElmRXhwcmVzc2lvbgorZW50cnlSdWxlWElmRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25SdWxlKCkpOyB9CisJIGl2X3J1bGVYSWZFeHByZXNzaW9uPXJ1bGVYSWZFeHByZXNzaW9uIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWElmRXhwcmVzc2lvbi5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWElmRXhwcmVzc2lvbgorcnVsZVhJZkV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WElmRXhwcmVzc2lvbkFjdGlvbl8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKQlvdGhlcmx2XzE9J2lmJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkuZ2V0SWZLZXl3b3JkXzEoKSk7CisgICAgfQorCW90aGVybHZfMj0nKCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0WElmRXhwcmVzc2lvbkFjY2VzcygpLmdldExlZnRQYXJlbnRoZXNpc0tleXdvcmRfMigpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WElmRXhwcmVzc2lvbkFjY2VzcygpLmdldElmWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8zXzAoKSk7IAorCSAgICB9CisJCWx2X2lmXzNfMD1ydWxlWEV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WElmRXhwcmVzc2lvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJpZiIsCisgICAgICAgIAkJbHZfaWZfM18wLCAKKyAgICAgICAgCQkiWEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispCW90aGVybHZfND0nKScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzQsIGdyYW1tYXJBY2Nlc3MuZ2V0WElmRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzQoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRUaGVuWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF81XzAoKSk7IAorCSAgICB9CisJCWx2X3RoZW5fNV8wPXJ1bGVYRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInRoZW4iLAorICAgICAgICAJCWx2X3RoZW5fNV8wLCAKKyAgICAgICAgCQkiWEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKCgoCSdlbHNlJyAKKyk9PglvdGhlcmx2XzY9J2Vsc2UnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl82LCBncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRFbHNlS2V5d29yZF82XzAoKSk7CisgICAgfQorKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RWxzZVhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfNl8xXzAoKSk7IAorCSAgICB9CisJCWx2X2Vsc2VfN18wPXJ1bGVYRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImVsc2UiLAorICAgICAgICAJCWx2X2Vsc2VfN18wLCAKKyAgICAgICAgCQkiWEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKT8pCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYU3dpdGNoRXhwcmVzc2lvbgorZW50cnlSdWxlWFN3aXRjaEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhTd2l0Y2hFeHByZXNzaW9uPXJ1bGVYU3dpdGNoRXhwcmVzc2lvbiAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhTd2l0Y2hFeHByZXNzaW9uLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYU3dpdGNoRXhwcmVzc2lvbgorcnVsZVhTd2l0Y2hFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjdGlvbl8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKQlvdGhlcmx2XzE9J3N3aXRjaCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRTd2l0Y2hLZXl3b3JkXzEoKSk7CisgICAgfQorKCgoKCgJJygnIAorKAorKAorcnVsZUp2bUZvcm1hbFBhcmFtZXRlcgorKQorKQknOicgCispKT0+KAlvdGhlcmx2XzI9JygnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8yXzBfMF8wXzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RGVjbGFyZWRQYXJhbUp2bUZvcm1hbFBhcmFtZXRlclBhcnNlclJ1bGVDYWxsXzJfMF8wXzBfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9kZWNsYXJlZFBhcmFtXzNfMD1ydWxlSnZtRm9ybWFsUGFyYW1ldGVyCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImRlY2xhcmVkUGFyYW0iLAorICAgICAgICAJCWx2X2RlY2xhcmVkUGFyYW1fM18wLCAKKyAgICAgICAgCQkiSnZtRm9ybWFsUGFyYW1ldGVyIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKQlvdGhlcmx2XzQ9JzonIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Q29sb25LZXl3b3JkXzJfMF8wXzBfMigpKTsKKyAgICB9CispKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldFN3aXRjaFhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMl8wXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfc3dpdGNoXzVfMD1ydWxlWEV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkic3dpdGNoIiwKKyAgICAgICAgCQlsdl9zd2l0Y2hfNV8wLCAKKyAgICAgICAgCQkiWEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispCW90aGVybHZfNj0nKScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzYsIGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF8yXzBfMigpKTsKKyAgICB9CispCisgICAgfCgoKCgoCisoCitydWxlSnZtRm9ybWFsUGFyYW1ldGVyCispCispCSc6JyAKKykpPT4oKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RGVjbGFyZWRQYXJhbUp2bUZvcm1hbFBhcmFtZXRlclBhcnNlclJ1bGVDYWxsXzJfMV8wXzBfMF8wKCkpOyAKKwkgICAgfQorCQlsdl9kZWNsYXJlZFBhcmFtXzdfMD1ydWxlSnZtRm9ybWFsUGFyYW1ldGVyCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImRlY2xhcmVkUGFyYW0iLAorICAgICAgICAJCWx2X2RlY2xhcmVkUGFyYW1fN18wLCAKKyAgICAgICAgCQkiSnZtRm9ybWFsUGFyYW1ldGVyIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKQlvdGhlcmx2Xzg9JzonIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl84LCBncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Q29sb25LZXl3b3JkXzJfMV8wXzBfMSgpKTsKKyAgICB9CispKT8oCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRTd2l0Y2hYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzJfMV8xXzAoKSk7IAorCSAgICB9CisJCWx2X3N3aXRjaF85XzA9cnVsZVhFeHByZXNzaW9uCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInN3aXRjaCIsCisgICAgICAgIAkJbHZfc3dpdGNoXzlfMCwgCisgICAgICAgIAkJIlhFeHByZXNzaW9uIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkpCW90aGVybHZfMTA9J3snIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xMCwgZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzMoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Q2FzZXNYQ2FzZVBhcnRQYXJzZXJSdWxlQ2FsbF80XzAoKSk7IAorCSAgICB9CisJCWx2X2Nhc2VzXzExXzA9cnVsZVhDYXNlUGFydAkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJjYXNlcyIsCisgICAgICAgIAkJbHZfY2FzZXNfMTFfMCwgCisgICAgICAgIAkJIlhDYXNlUGFydCIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykqKAlvdGhlcmx2XzEyPSdkZWZhdWx0JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTIsIGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXREZWZhdWx0S2V5d29yZF81XzAoKSk7CisgICAgfQorCW90aGVybHZfMTM9JzonIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xMywgZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldENvbG9uS2V5d29yZF81XzEoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RGVmYXVsdFhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfNV8yXzAoKSk7IAorCSAgICB9CisJCWx2X2RlZmF1bHRfMTRfMD1ydWxlWEV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZGVmYXVsdCIsCisgICAgICAgIAkJbHZfZGVmYXVsdF8xNF8wLCAKKyAgICAgICAgCQkiWEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKT8Jb3RoZXJsdl8xNT0nfScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzE1LCBncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzYoKSk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWENhc2VQYXJ0CitlbnRyeVJ1bGVYQ2FzZVBhcnQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRSdWxlKCkpOyB9CisJIGl2X3J1bGVYQ2FzZVBhcnQ9cnVsZVhDYXNlUGFydCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhDYXNlUGFydC5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWENhc2VQYXJ0CitydWxlWENhc2VQYXJ0IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0QWNjZXNzKCkuZ2V0WENhc2VQYXJ0QWN0aW9uXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldFR5cGVHdWFyZEp2bVR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IAorCSAgICB9CisJCWx2X3R5cGVHdWFyZF8xXzA9cnVsZUp2bVR5cGVSZWZlcmVuY2UJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInR5cGVHdWFyZCIsCisgICAgICAgIAkJbHZfdHlwZUd1YXJkXzFfMCwgCisgICAgICAgIAkJIkp2bVR5cGVSZWZlcmVuY2UiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispPygJb3RoZXJsdl8yPSdjYXNlJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRDYXNlS2V5d29yZF8yXzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldENhc2VYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzJfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9jYXNlXzNfMD1ydWxlWEV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImNhc2UiLAorICAgICAgICAJCWx2X2Nhc2VfM18wLCAKKyAgICAgICAgCQkiWEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKT8oKAlvdGhlcmx2XzQ9JzonIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldENvbG9uS2V5d29yZF8zXzBfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0QWNjZXNzKCkuZ2V0VGhlblhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfM18wXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfdGhlbl81XzA9cnVsZVhFeHByZXNzaW9uCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJ0aGVuIiwKKyAgICAgICAgCQlsdl90aGVuXzVfMCwgCisgICAgICAgIAkJIlhFeHByZXNzaW9uIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkKKyAgICB8KAorKAorCQlsdl9mYWxsVGhyb3VnaF82XzA9CScsJyAKKyAgICB7CisgICAgICAgIG5ld0xlYWZOb2RlKGx2X2ZhbGxUaHJvdWdoXzZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRGYWxsVGhyb3VnaENvbW1hS2V5d29yZF8zXzFfMCgpKTsKKyAgICB9CisgCisJICAgIHsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoJGN1cnJlbnQsICJmYWxsVGhyb3VnaCIsIHRydWUsICIsIik7CisJICAgIH0KKworKQorKSkpCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYRm9yTG9vcEV4cHJlc3Npb24KK2VudHJ5UnVsZVhGb3JMb29wRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhGb3JMb29wRXhwcmVzc2lvbj1ydWxlWEZvckxvb3BFeHByZXNzaW9uIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWEZvckxvb3BFeHByZXNzaW9uLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYRm9yTG9vcEV4cHJlc3Npb24KK3J1bGVYRm9yTG9vcEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoKCgoCispCSdmb3InIAorCScoJyAKKygKKygKK3J1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIKKykKKykJJzonIAorKSk9PigoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYRm9yTG9vcEV4cHJlc3Npb25BY3Rpb25fMF8wXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispCW90aGVybHZfMT0nZm9yJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGb3JLZXl3b3JkXzBfMF8xKCkpOworICAgIH0KKwlvdGhlcmx2XzI9JygnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldExlZnRQYXJlbnRoZXNpc0tleXdvcmRfMF8wXzIoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldERlY2xhcmVkUGFyYW1Kdm1Gb3JtYWxQYXJhbWV0ZXJQYXJzZXJSdWxlQ2FsbF8wXzBfM18wKCkpOyAKKwkgICAgfQorCQlsdl9kZWNsYXJlZFBhcmFtXzNfMD1ydWxlSnZtRm9ybWFsUGFyYW1ldGVyCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJkZWNsYXJlZFBhcmFtIiwKKyAgICAgICAgCQlsdl9kZWNsYXJlZFBhcmFtXzNfMCwgCisgICAgICAgIAkJIkp2bUZvcm1hbFBhcmFtZXRlciIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykJb3RoZXJsdl80PSc6JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNCwgZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRDb2xvbktleXdvcmRfMF8wXzQoKSk7CisgICAgfQorKSkoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Rm9yRXhwcmVzc2lvblhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9mb3JFeHByZXNzaW9uXzVfMD1ydWxlWEV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImZvckV4cHJlc3Npb24iLAorICAgICAgICAJCWx2X2ZvckV4cHJlc3Npb25fNV8wLCAKKyAgICAgICAgCQkiWEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispCW90aGVybHZfNj0nKScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzYsIGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfMigpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RWFjaEV4cHJlc3Npb25YRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzNfMCgpKTsgCisJICAgIH0KKwkJbHZfZWFjaEV4cHJlc3Npb25fN18wPXJ1bGVYRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZWFjaEV4cHJlc3Npb24iLAorICAgICAgICAJCWx2X2VhY2hFeHByZXNzaW9uXzdfMCwgCisgICAgICAgIAkJIlhFeHByZXNzaW9uIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhCYXNpY0Zvckxvb3BFeHByZXNzaW9uCitlbnRyeVJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBpdl9ydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb249cnVsZVhCYXNpY0Zvckxvb3BFeHByZXNzaW9uIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24uY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uCitydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispCW90aGVybHZfMT0nZm9yJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEZvcktleXdvcmRfMSgpKTsKKyAgICB9CisJb3RoZXJsdl8yPScoJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldExlZnRQYXJlbnRoZXNpc0tleXdvcmRfMigpKTsKKyAgICB9CisoKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0SW5pdEV4cHJlc3Npb25zWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUGFyc2VyUnVsZUNhbGxfM18wXzAoKSk7IAorCSAgICB9CisJCWx2X2luaXRFeHByZXNzaW9uc18zXzA9cnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJpbml0RXhwcmVzc2lvbnMiLAorICAgICAgICAJCWx2X2luaXRFeHByZXNzaW9uc18zXzAsIAorICAgICAgICAJCSJYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKAlvdGhlcmx2XzQ9JywnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzNfMV8wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEluaXRFeHByZXNzaW9uc1hFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblBhcnNlclJ1bGVDYWxsXzNfMV8xXzAoKSk7IAorCSAgICB9CisJCWx2X2luaXRFeHByZXNzaW9uc181XzA9cnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJpbml0RXhwcmVzc2lvbnMiLAorICAgICAgICAJCWx2X2luaXRFeHByZXNzaW9uc181XzAsIAorICAgICAgICAJCSJYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSopPwlvdGhlcmx2XzY9JzsnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl82LCBncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0U2VtaWNvbG9uS2V5d29yZF80KCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEV4cHJlc3Npb25YRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzVfMCgpKTsgCisJICAgIH0KKwkJbHZfZXhwcmVzc2lvbl83XzA9cnVsZVhFeHByZXNzaW9uCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImV4cHJlc3Npb24iLAorICAgICAgICAJCWx2X2V4cHJlc3Npb25fN18wLCAKKyAgICAgICAgCQkiWEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispPwlvdGhlcmx2Xzg9JzsnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl84LCBncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0U2VtaWNvbG9uS2V5d29yZF82KCkpOworICAgIH0KKygoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRVcGRhdGVFeHByZXNzaW9uc1hFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfN18wXzAoKSk7IAorCSAgICB9CisJCWx2X3VwZGF0ZUV4cHJlc3Npb25zXzlfMD1ydWxlWEV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkidXBkYXRlRXhwcmVzc2lvbnMiLAorICAgICAgICAJCWx2X3VwZGF0ZUV4cHJlc3Npb25zXzlfMCwgCisgICAgICAgIAkJIlhFeHByZXNzaW9uIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgJb3RoZXJsdl8xMD0nLCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEwLCBncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzdfMV8wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldFVwZGF0ZUV4cHJlc3Npb25zWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF83XzFfMV8wKCkpOyAKKwkgICAgfQorCQlsdl91cGRhdGVFeHByZXNzaW9uc18xMV8wPXJ1bGVYRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJ1cGRhdGVFeHByZXNzaW9ucyIsCisgICAgICAgIAkJbHZfdXBkYXRlRXhwcmVzc2lvbnNfMTFfMCwgCisgICAgICAgIAkJIlhFeHByZXNzaW9uIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkqKT8Jb3RoZXJsdl8xMj0nKScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEyLCBncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfOCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRFYWNoRXhwcmVzc2lvblhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfOV8wKCkpOyAKKwkgICAgfQorCQlsdl9lYWNoRXhwcmVzc2lvbl8xM18wPXJ1bGVYRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJlYWNoRXhwcmVzc2lvbiIsCisgICAgICAgIAkJbHZfZWFjaEV4cHJlc3Npb25fMTNfMCwgCisgICAgICAgIAkJIlhFeHByZXNzaW9uIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhXaGlsZUV4cHJlc3Npb24KK2VudHJ5UnVsZVhXaGlsZUV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYV2hpbGVFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBpdl9ydWxlWFdoaWxlRXhwcmVzc2lvbj1ydWxlWFdoaWxlRXhwcmVzc2lvbiAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhXaGlsZUV4cHJlc3Npb24uY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhXaGlsZUV4cHJlc3Npb24KK3J1bGVYV2hpbGVFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WFdoaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhXaGlsZUV4cHJlc3Npb25BY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPSd3aGlsZScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0WFdoaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldFdoaWxlS2V5d29yZF8xKCkpOworICAgIH0KKwlvdGhlcmx2XzI9JygnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldFhXaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzIoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhXaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRQcmVkaWNhdGVYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzNfMCgpKTsgCisJICAgIH0KKwkJbHZfcHJlZGljYXRlXzNfMD1ydWxlWEV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WFdoaWxlRXhwcmVzc2lvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJwcmVkaWNhdGUiLAorICAgICAgICAJCWx2X3ByZWRpY2F0ZV8zXzAsIAorICAgICAgICAJCSJYRXhwcmVzc2lvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykJb3RoZXJsdl80PScpJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNCwgZ3JhbW1hckFjY2Vzcy5nZXRYV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfNCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFdoaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldEJvZHlYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzVfMCgpKTsgCisJICAgIH0KKwkJbHZfYm9keV81XzA9cnVsZVhFeHByZXNzaW9uCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhXaGlsZUV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiYm9keSIsCisgICAgICAgIAkJbHZfYm9keV81XzAsIAorICAgICAgICAJCSJYRXhwcmVzc2lvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYRG9XaGlsZUV4cHJlc3Npb24KK2VudHJ5UnVsZVhEb1doaWxlRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhEb1doaWxlRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhEb1doaWxlRXhwcmVzc2lvbj1ydWxlWERvV2hpbGVFeHByZXNzaW9uIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWERvV2hpbGVFeHByZXNzaW9uLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYRG9XaGlsZUV4cHJlc3Npb24KK3J1bGVYRG9XaGlsZUV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYRG9XaGlsZUV4cHJlc3Npb25BY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPSdkbycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0WERvV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RG9LZXl3b3JkXzEoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhEb1doaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldEJvZHlYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzJfMCgpKTsgCisJICAgIH0KKwkJbHZfYm9keV8yXzA9cnVsZVhFeHByZXNzaW9uCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhEb1doaWxlRXhwcmVzc2lvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJib2R5IiwKKyAgICAgICAgCQlsdl9ib2R5XzJfMCwgCisgICAgICAgIAkJIlhFeHByZXNzaW9uIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKQlvdGhlcmx2XzM9J3doaWxlJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMywgZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRXaGlsZUtleXdvcmRfMygpKTsKKyAgICB9CisJb3RoZXJsdl80PScoJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNCwgZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzQoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhEb1doaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldFByZWRpY2F0ZVhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfNV8wKCkpOyAKKwkgICAgfQorCQlsdl9wcmVkaWNhdGVfNV8wPXJ1bGVYRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkicHJlZGljYXRlIiwKKyAgICAgICAgCQlsdl9wcmVkaWNhdGVfNV8wLCAKKyAgICAgICAgCQkiWEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispCW90aGVybHZfNj0nKScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzYsIGdyYW1tYXJBY2Nlc3MuZ2V0WERvV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfNigpKTsKKyAgICB9CispCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQmxvY2tFeHByZXNzaW9uCitlbnRyeVJ1bGVYQmxvY2tFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJsb2NrRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhCbG9ja0V4cHJlc3Npb249cnVsZVhCbG9ja0V4cHJlc3Npb24gCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYQmxvY2tFeHByZXNzaW9uLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQmxvY2tFeHByZXNzaW9uCitydWxlWEJsb2NrRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhCbG9ja0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmxvY2tFeHByZXNzaW9uQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispCW90aGVybHZfMT0neycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0WEJsb2NrRXhwcmVzc2lvbkFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzEoKSk7CisgICAgfQorKCgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQmxvY2tFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RXhwcmVzc2lvbnNYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25QYXJzZXJSdWxlQ2FsbF8yXzBfMCgpKTsgCisJICAgIH0KKwkJbHZfZXhwcmVzc2lvbnNfMl8wPXJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEJsb2NrRXhwcmVzc2lvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJleHByZXNzaW9ucyIsCisgICAgICAgIAkJbHZfZXhwcmVzc2lvbnNfMl8wLCAKKyAgICAgICAgCQkiWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgJb3RoZXJsdl8zPSc7JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMywgZ3JhbW1hckFjY2Vzcy5nZXRYQmxvY2tFeHByZXNzaW9uQWNjZXNzKCkuZ2V0U2VtaWNvbG9uS2V5d29yZF8yXzEoKSk7CisgICAgfQorKT8pKglvdGhlcmx2XzQ9J30nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldFhCbG9ja0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMygpKTsKKyAgICB9CispCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24KK2VudHJ5UnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbj1ydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24KK3J1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICB9CisgICAgdGhpc19YVmFyaWFibGVEZWNsYXJhdGlvbl8wPXJ1bGVYVmFyaWFibGVEZWNsYXJhdGlvbgorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfWFZhcmlhYmxlRGVjbGFyYXRpb25fMC5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworICAgIHwKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0WEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xKCkpOyAKKyAgICB9CisgICAgdGhpc19YRXhwcmVzc2lvbl8xPXJ1bGVYRXhwcmVzc2lvbgorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfWEV4cHJlc3Npb25fMS5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uCitlbnRyeVJ1bGVYVmFyaWFibGVEZWNsYXJhdGlvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uUnVsZSgpKTsgfQorCSBpdl9ydWxlWFZhcmlhYmxlRGVjbGFyYXRpb249cnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWFZhcmlhYmxlRGVjbGFyYXRpb24uY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhWYXJpYWJsZURlY2xhcmF0aW9uCitydWxlWFZhcmlhYmxlRGVjbGFyYXRpb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispKCgKKygKKwkJbHZfd3JpdGVhYmxlXzFfMD0JJ3ZhcicgCisgICAgeworICAgICAgICBuZXdMZWFmTm9kZShsdl93cml0ZWFibGVfMV8wLCBncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0V3JpdGVhYmxlVmFyS2V5d29yZF8xXzBfMCgpKTsKKyAgICB9CisgCisJICAgIHsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgkY3VycmVudCwgIndyaXRlYWJsZSIsIHRydWUsICJ2YXIiKTsKKwkgICAgfQorCispCispCisgICAgfAlvdGhlcmx2XzI9J3ZhbCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRWYWxLZXl3b3JkXzFfMSgpKTsKKyAgICB9CispKCgoKCgKKygKK3J1bGVKdm1UeXBlUmVmZXJlbmNlCispCispKAorKAorcnVsZVZhbGlkSUQKKykKKykpKT0+KCgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldFR5cGVKdm1UeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMl8wXzBfMF8wKCkpOyAKKwkgICAgfQorCQlsdl90eXBlXzNfMD1ydWxlSnZtVHlwZVJlZmVyZW5jZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJ0eXBlIiwKKyAgICAgICAgCQlsdl90eXBlXzNfMCwgCisgICAgICAgIAkJIkp2bVR5cGVSZWZlcmVuY2UiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0TmFtZVZhbGlkSURQYXJzZXJSdWxlQ2FsbF8yXzBfMF8xXzAoKSk7IAorCSAgICB9CisJCWx2X25hbWVfNF8wPXJ1bGVWYWxpZElECQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJIm5hbWUiLAorICAgICAgICAJCWx2X25hbWVfNF8wLCAKKyAgICAgICAgCQkiVmFsaWRJRCIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKQorICAgIHwoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXROYW1lVmFsaWRJRFBhcnNlclJ1bGVDYWxsXzJfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9uYW1lXzVfMD1ydWxlVmFsaWRJRAkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJuYW1lIiwKKyAgICAgICAgCQlsdl9uYW1lXzVfMCwgCisgICAgICAgIAkJIlZhbGlkSUQiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSgJb3RoZXJsdl82PSc9JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNiwgZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldEVxdWFsc1NpZ25LZXl3b3JkXzNfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRSaWdodFhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfM18xXzAoKSk7IAorCSAgICB9CisJCWx2X3JpZ2h0XzdfMD1ydWxlWEV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkicmlnaHQiLAorICAgICAgICAJCWx2X3JpZ2h0XzdfMCwgCisgICAgICAgIAkJIlhFeHByZXNzaW9uIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSk/KQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlSnZtRm9ybWFsUGFyYW1ldGVyCitlbnRyeVJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Gb3JtYWxQYXJhbWV0ZXJSdWxlKCkpOyB9CisJIGl2X3J1bGVKdm1Gb3JtYWxQYXJhbWV0ZXI9cnVsZUp2bUZvcm1hbFBhcmFtZXRlciAKKwkgeyAkY3VycmVudD0kaXZfcnVsZUp2bUZvcm1hbFBhcmFtZXRlci5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgSnZtRm9ybWFsUGFyYW1ldGVyCitydWxlSnZtRm9ybWFsUGFyYW1ldGVyIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEp2bUZvcm1hbFBhcmFtZXRlckFjY2VzcygpLmdldFBhcmFtZXRlclR5cGVKdm1UeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMF8wKCkpOyAKKwkgICAgfQorCQlsdl9wYXJhbWV0ZXJUeXBlXzBfMD1ydWxlSnZtVHlwZVJlZmVyZW5jZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Gb3JtYWxQYXJhbWV0ZXJSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkicGFyYW1ldGVyVHlwZSIsCisgICAgICAgIAkJbHZfcGFyYW1ldGVyVHlwZV8wXzAsIAorICAgICAgICAJCSJKdm1UeXBlUmVmZXJlbmNlIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKT8oCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCkuZ2V0TmFtZVZhbGlkSURQYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IAorCSAgICB9CisJCWx2X25hbWVfMV8wPXJ1bGVWYWxpZElECQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldEp2bUZvcm1hbFBhcmFtZXRlclJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJuYW1lIiwKKyAgICAgICAgCQlsdl9uYW1lXzFfMCwgCisgICAgICAgIAkJIlZhbGlkSUQiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlcgorZW50cnlSdWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlciByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJSdWxlKCkpOyB9CisJIGl2X3J1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyPXJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlci5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgRnVsbEp2bUZvcm1hbFBhcmFtZXRlcgorcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RnVsbEp2bUZvcm1hbFBhcmFtZXRlckFjY2VzcygpLmdldFBhcmFtZXRlclR5cGVKdm1UeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMF8wKCkpOyAKKwkgICAgfQorCQlsdl9wYXJhbWV0ZXJUeXBlXzBfMD1ydWxlSnZtVHlwZVJlZmVyZW5jZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRGdWxsSnZtRm9ybWFsUGFyYW1ldGVyUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInBhcmFtZXRlclR5cGUiLAorICAgICAgICAJCWx2X3BhcmFtZXRlclR5cGVfMF8wLCAKKyAgICAgICAgCQkiSnZtVHlwZVJlZmVyZW5jZSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RnVsbEp2bUZvcm1hbFBhcmFtZXRlckFjY2VzcygpLmdldE5hbWVWYWxpZElEUGFyc2VyUnVsZUNhbGxfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9uYW1lXzFfMD1ydWxlVmFsaWRJRAkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRGdWxsSnZtRm9ybWFsUGFyYW1ldGVyUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJIm5hbWUiLAorICAgICAgICAJCWx2X25hbWVfMV8wLCAKKyAgICAgICAgCQkiVmFsaWRJRCIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYRmVhdHVyZUNhbGwKK2VudHJ5UnVsZVhGZWF0dXJlQ2FsbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbFJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhGZWF0dXJlQ2FsbD1ydWxlWEZlYXR1cmVDYWxsIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWEZlYXR1cmVDYWxsLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYRmVhdHVyZUNhbGwKK3J1bGVYRmVhdHVyZUNhbGwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYRmVhdHVyZUNhbGxBY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykoCW90aGVybHZfMT0nPCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF8xXzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFR5cGVBcmd1bWVudHNKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfdHlwZUFyZ3VtZW50c18yXzA9cnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkidHlwZUFyZ3VtZW50cyIsCisgICAgICAgIAkJbHZfdHlwZUFyZ3VtZW50c18yXzAsIAorICAgICAgICAJCSJKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKAlvdGhlcmx2XzM9JywnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldENvbW1hS2V5d29yZF8xXzJfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0VHlwZUFyZ3VtZW50c0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzFfMl8xXzAoKSk7IAorCSAgICB9CisJCWx2X3R5cGVBcmd1bWVudHNfNF8wPXJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInR5cGVBcmd1bWVudHMiLAorICAgICAgICAJCWx2X3R5cGVBcmd1bWVudHNfNF8wLCAKKyAgICAgICAgCQkiSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkqCW90aGVybHZfNT0nPicgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzUsIGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF8xXzMoKSk7CisgICAgfQorKT8oCisoCisJCXsKKwkJCWlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMl8wKCkpOyAKKwkgICAgfQorCQlydWxlSWRPclN1cGVyCQl7IAorCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoKCgKKygKKwknKCcgCisgCisKKykKKyk9PgorKAorCQlsdl9leHBsaWNpdE9wZXJhdGlvbkNhbGxfN18wPQknKCcgCisgICAgeworICAgICAgICBuZXdMZWFmTm9kZShsdl9leHBsaWNpdE9wZXJhdGlvbkNhbGxfN18wLCBncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0T3BlcmF0aW9uQ2FsbExlZnRQYXJlbnRoZXNpc0tleXdvcmRfM18wXzAoKSk7CisgICAgfQorIAorCSAgICB7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKCRjdXJyZW50LCAiZXhwbGljaXRPcGVyYXRpb25DYWxsIiwgdHJ1ZSwgIigiKTsKKwkgICAgfQorCispCispKCgoKCgKKykoKAorKAorcnVsZUp2bUZvcm1hbFBhcmFtZXRlcgorKQorKSgJJywnIAorKAorKAorcnVsZUp2bUZvcm1hbFBhcmFtZXRlcgorKQorKSkqKT8oCisoCisJJ3wnIAorIAorCispCispKSk9PgorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZlYXR1cmVDYWxsQXJndW1lbnRzWFNob3J0Q2xvc3VyZVBhcnNlclJ1bGVDYWxsXzNfMV8wXzAoKSk7IAorCSAgICB9CisJCWx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzhfMD1ydWxlWFNob3J0Q2xvc3VyZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZmVhdHVyZUNhbGxBcmd1bWVudHMiLAorICAgICAgICAJCWx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzhfMCwgCisgICAgICAgIAkJIlhTaG9ydENsb3N1cmUiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispCisgICAgfCgoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RmVhdHVyZUNhbGxBcmd1bWVudHNYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzNfMV8xXzBfMCgpKTsgCisJICAgIH0KKwkJbHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfOV8wPXJ1bGVYRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZmVhdHVyZUNhbGxBcmd1bWVudHMiLAorICAgICAgICAJCWx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzlfMCwgCisgICAgICAgIAkJIlhFeHByZXNzaW9uIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgJb3RoZXJsdl8xMD0nLCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEwLCBncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldENvbW1hS2V5d29yZF8zXzFfMV8xXzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZlYXR1cmVDYWxsQXJndW1lbnRzWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8zXzFfMV8xXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfMTFfMD1ydWxlWEV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImZlYXR1cmVDYWxsQXJndW1lbnRzIiwKKyAgICAgICAgCQlsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c18xMV8wLCAKKyAgICAgICAgCQkiWEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSopKT8Jb3RoZXJsdl8xMj0nKScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEyLCBncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzNfMigpKTsKKyAgICB9CispPygoKCgKKykJJ1snIAorKSk9PgorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZlYXR1cmVDYWxsQXJndW1lbnRzWENsb3N1cmVQYXJzZXJSdWxlQ2FsbF80XzAoKSk7IAorCSAgICB9CisJCWx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzEzXzA9cnVsZVhDbG9zdXJlCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJmZWF0dXJlQ2FsbEFyZ3VtZW50cyIsCisgICAgICAgIAkJbHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfMTNfMCwgCisgICAgICAgIAkJIlhDbG9zdXJlIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKT8pCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVGZWF0dXJlQ2FsbElECitlbnRyeVJ1bGVGZWF0dXJlQ2FsbElEIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRGZWF0dXJlQ2FsbElEUnVsZSgpKTsgfSAKKwkgaXZfcnVsZUZlYXR1cmVDYWxsSUQ9cnVsZUZlYXR1cmVDYWxsSUQgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVGZWF0dXJlQ2FsbElELmN1cnJlbnQuZ2V0VGV4dCgpOyB9ICAKKwkgRU9GIAorOworCisvLyBSdWxlIEZlYXR1cmVDYWxsSUQKK3J1bGVGZWF0dXJlQ2FsbElEIHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEZlYXR1cmVDYWxsSURBY2Nlc3MoKS5nZXRWYWxpZElEUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgfQorICAgIHRoaXNfVmFsaWRJRF8wPXJ1bGVWYWxpZElEICAgIHsKKwkJJGN1cnJlbnQubWVyZ2UodGhpc19WYWxpZElEXzApOworICAgIH0KKworICAgIHsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisKKyAgICB8CisJa3c9J2V4dGVuZHMnIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRGZWF0dXJlQ2FsbElEQWNjZXNzKCkuZ2V0RXh0ZW5kc0tleXdvcmRfMSgpKTsgCisgICAgfQorCisgICAgfAorCWt3PSdzdGF0aWMnIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRGZWF0dXJlQ2FsbElEQWNjZXNzKCkuZ2V0U3RhdGljS2V5d29yZF8yKCkpOyAKKyAgICB9CisKKyAgICB8CisJa3c9J2ltcG9ydCcgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldEZlYXR1cmVDYWxsSURBY2Nlc3MoKS5nZXRJbXBvcnRLZXl3b3JkXzMoKSk7IAorICAgIH0KKworICAgIHwKKwlrdz0nZXh0ZW5zaW9uJyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0RmVhdHVyZUNhbGxJREFjY2VzcygpLmdldEV4dGVuc2lvbktleXdvcmRfNCgpKTsgCisgICAgfQorKQorICAgIDsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUlkT3JTdXBlcgorZW50cnlSdWxlSWRPclN1cGVyIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRJZE9yU3VwZXJSdWxlKCkpOyB9IAorCSBpdl9ydWxlSWRPclN1cGVyPXJ1bGVJZE9yU3VwZXIgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVJZE9yU3VwZXIuY3VycmVudC5nZXRUZXh0KCk7IH0gIAorCSBFT0YgCis7CisKKy8vIFJ1bGUgSWRPclN1cGVyCitydWxlSWRPclN1cGVyIHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldElkT3JTdXBlckFjY2VzcygpLmdldEZlYXR1cmVDYWxsSURQYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICB9CisgICAgdGhpc19GZWF0dXJlQ2FsbElEXzA9cnVsZUZlYXR1cmVDYWxsSUQgICAgeworCQkkY3VycmVudC5tZXJnZSh0aGlzX0ZlYXR1cmVDYWxsSURfMCk7CisgICAgfQorCisgICAgeyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworICAgIHwKKwlrdz0nc3VwZXInIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRJZE9yU3VwZXJBY2Nlc3MoKS5nZXRTdXBlcktleXdvcmRfMSgpKTsgCisgICAgfQorKQorICAgIDsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhDb25zdHJ1Y3RvckNhbGwKK2VudHJ5UnVsZVhDb25zdHJ1Y3RvckNhbGwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsUnVsZSgpKTsgfQorCSBpdl9ydWxlWENvbnN0cnVjdG9yQ2FsbD1ydWxlWENvbnN0cnVjdG9yQ2FsbCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhDb25zdHJ1Y3RvckNhbGwuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhDb25zdHJ1Y3RvckNhbGwKK3J1bGVYQ29uc3RydWN0b3JDYWxsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldFhDb25zdHJ1Y3RvckNhbGxBY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPSduZXcnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXROZXdLZXl3b3JkXzEoKSk7CisgICAgfQorKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldENvbnN0cnVjdG9ySnZtQ29uc3RydWN0b3JDcm9zc1JlZmVyZW5jZV8yXzAoKSk7IAorCSAgICB9CisJCXJ1bGVRdWFsaWZpZWROYW1lCQl7IAorCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoKCgJJzwnIAorKT0+CW90aGVybHZfMz0nPCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzMsIGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfM18wKCkpOworICAgIH0KKykoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldFR5cGVBcmd1bWVudHNKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8zXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfdHlwZUFyZ3VtZW50c180XzA9cnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInR5cGVBcmd1bWVudHMiLAorICAgICAgICAJCWx2X3R5cGVBcmd1bWVudHNfNF8wLCAKKyAgICAgICAgCQkiSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgJb3RoZXJsdl81PScsJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNSwgZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzNfMl8wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0VHlwZUFyZ3VtZW50c0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzNfMl8xXzAoKSk7IAorCSAgICB9CisJCWx2X3R5cGVBcmd1bWVudHNfNl8wPXJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJ0eXBlQXJndW1lbnRzIiwKKyAgICAgICAgCQlsdl90eXBlQXJndW1lbnRzXzZfMCwgCisgICAgICAgIAkJIkp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKglvdGhlcmx2Xzc9Jz4nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl83LCBncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzNfMygpKTsKKyAgICB9CispPygoKAorKAorCScoJyAKKyAKKworKQorKT0+CisoCisJCWx2X2V4cGxpY2l0Q29uc3RydWN0b3JDYWxsXzhfMD0JJygnIAorICAgIHsKKyAgICAgICAgbmV3TGVhZk5vZGUobHZfZXhwbGljaXRDb25zdHJ1Y3RvckNhbGxfOF8wLCBncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbExlZnRQYXJlbnRoZXNpc0tleXdvcmRfNF8wXzAoKSk7CisgICAgfQorIAorCSAgICB7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgkY3VycmVudCwgImV4cGxpY2l0Q29uc3RydWN0b3JDYWxsIiwgdHJ1ZSwgIigiKTsKKwkgICAgfQorCispCispKCgoKCgKKykoKAorKAorcnVsZUp2bUZvcm1hbFBhcmFtZXRlcgorKQorKSgJJywnIAorKAorKAorcnVsZUp2bUZvcm1hbFBhcmFtZXRlcgorKQorKSkqKT8oCisoCisJJ3wnIAorIAorCispCispKSk9PgorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRBcmd1bWVudHNYU2hvcnRDbG9zdXJlUGFyc2VyUnVsZUNhbGxfNF8xXzBfMCgpKTsgCisJICAgIH0KKwkJbHZfYXJndW1lbnRzXzlfMD1ydWxlWFNob3J0Q2xvc3VyZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImFyZ3VtZW50cyIsCisgICAgICAgIAkJbHZfYXJndW1lbnRzXzlfMCwgCisgICAgICAgIAkJIlhTaG9ydENsb3N1cmUiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispCisgICAgfCgoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEFyZ3VtZW50c1hFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfNF8xXzFfMF8wKCkpOyAKKwkgICAgfQorCQlsdl9hcmd1bWVudHNfMTBfMD1ydWxlWEV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJhcmd1bWVudHMiLAorICAgICAgICAJCWx2X2FyZ3VtZW50c18xMF8wLCAKKyAgICAgICAgCQkiWEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKAlvdGhlcmx2XzExPScsJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTEsIGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldENvbW1hS2V5d29yZF80XzFfMV8xXzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRBcmd1bWVudHNYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzRfMV8xXzFfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9hcmd1bWVudHNfMTJfMD1ydWxlWEV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJhcmd1bWVudHMiLAorICAgICAgICAJCWx2X2FyZ3VtZW50c18xMl8wLCAKKyAgICAgICAgCQkiWEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSopKT8Jb3RoZXJsdl8xMz0nKScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEzLCBncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF80XzIoKSk7CisgICAgfQorKT8oKCgoCispCSdbJyAKKykpPT4KKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0QXJndW1lbnRzWENsb3N1cmVQYXJzZXJSdWxlQ2FsbF81XzAoKSk7IAorCSAgICB9CisJCWx2X2FyZ3VtZW50c18xNF8wPXJ1bGVYQ2xvc3VyZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImFyZ3VtZW50cyIsCisgICAgICAgIAkJbHZfYXJndW1lbnRzXzE0XzAsIAorICAgICAgICAJCSJYQ2xvc3VyZSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKyk/KQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWEJvb2xlYW5MaXRlcmFsCitlbnRyeVJ1bGVYQm9vbGVhbkxpdGVyYWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQm9vbGVhbkxpdGVyYWxSdWxlKCkpOyB9CisJIGl2X3J1bGVYQm9vbGVhbkxpdGVyYWw9cnVsZVhCb29sZWFuTGl0ZXJhbCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhCb29sZWFuTGl0ZXJhbC5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWEJvb2xlYW5MaXRlcmFsCitydWxlWEJvb2xlYW5MaXRlcmFsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WEJvb2xlYW5MaXRlcmFsQWNjZXNzKCkuZ2V0WEJvb2xlYW5MaXRlcmFsQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispKAlvdGhlcmx2XzE9J2ZhbHNlJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRYQm9vbGVhbkxpdGVyYWxBY2Nlc3MoKS5nZXRGYWxzZUtleXdvcmRfMV8wKCkpOworICAgIH0KKworICAgIHwoCisoCisJCWx2X2lzVHJ1ZV8yXzA9CSd0cnVlJyAKKyAgICB7CisgICAgICAgIG5ld0xlYWZOb2RlKGx2X2lzVHJ1ZV8yXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0WEJvb2xlYW5MaXRlcmFsQWNjZXNzKCkuZ2V0SXNUcnVlVHJ1ZUtleXdvcmRfMV8xXzAoKSk7CisgICAgfQorIAorCSAgICB7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFhCb29sZWFuTGl0ZXJhbFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKCRjdXJyZW50LCAiaXNUcnVlIiwgdHJ1ZSwgInRydWUiKTsKKwkgICAgfQorCispCispKSkKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhOdWxsTGl0ZXJhbAorZW50cnlSdWxlWE51bGxMaXRlcmFsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE51bGxMaXRlcmFsUnVsZSgpKTsgfQorCSBpdl9ydWxlWE51bGxMaXRlcmFsPXJ1bGVYTnVsbExpdGVyYWwgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYTnVsbExpdGVyYWwuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhOdWxsTGl0ZXJhbAorcnVsZVhOdWxsTGl0ZXJhbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhOdWxsTGl0ZXJhbEFjY2VzcygpLmdldFhOdWxsTGl0ZXJhbEFjdGlvbl8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKQlvdGhlcmx2XzE9J251bGwnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFhOdWxsTGl0ZXJhbEFjY2VzcygpLmdldE51bGxLZXl3b3JkXzEoKSk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWE51bWJlckxpdGVyYWwKK2VudHJ5UnVsZVhOdW1iZXJMaXRlcmFsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE51bWJlckxpdGVyYWxSdWxlKCkpOyB9CisJIGl2X3J1bGVYTnVtYmVyTGl0ZXJhbD1ydWxlWE51bWJlckxpdGVyYWwgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYTnVtYmVyTGl0ZXJhbC5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWE51bWJlckxpdGVyYWwKK3J1bGVYTnVtYmVyTGl0ZXJhbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhOdW1iZXJMaXRlcmFsQWNjZXNzKCkuZ2V0WE51bWJlckxpdGVyYWxBY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE51bWJlckxpdGVyYWxBY2Nlc3MoKS5nZXRWYWx1ZU51bWJlclBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfdmFsdWVfMV8wPXJ1bGVOdW1iZXIJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WE51bWJlckxpdGVyYWxSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkidmFsdWUiLAorICAgICAgICAJCWx2X3ZhbHVlXzFfMCwgCisgICAgICAgIAkJIk51bWJlciIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYU3RyaW5nTGl0ZXJhbAorZW50cnlSdWxlWFN0cmluZ0xpdGVyYWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYU3RyaW5nTGl0ZXJhbFJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhTdHJpbmdMaXRlcmFsPXJ1bGVYU3RyaW5nTGl0ZXJhbCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhTdHJpbmdMaXRlcmFsLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYU3RyaW5nTGl0ZXJhbAorcnVsZVhTdHJpbmdMaXRlcmFsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WFN0cmluZ0xpdGVyYWxBY2Nlc3MoKS5nZXRYU3RyaW5nTGl0ZXJhbEFjdGlvbl8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKSgKKygKKwkJbHZfdmFsdWVfMV8wPVJVTEVfU1RSSU5HCisJCXsKKwkJCW5ld0xlYWZOb2RlKGx2X3ZhbHVlXzFfMCwgZ3JhbW1hckFjY2Vzcy5nZXRYU3RyaW5nTGl0ZXJhbEFjY2VzcygpLmdldFZhbHVlU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8xXzAoKSk7IAorCQl9CisJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WFN0cmluZ0xpdGVyYWxSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInZhbHVlIiwKKyAgICAgICAgCQlsdl92YWx1ZV8xXzAsIAorICAgICAgICAJCSJTVFJJTkciKTsKKwkgICAgfQorCispCispKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWFR5cGVMaXRlcmFsCitlbnRyeVJ1bGVYVHlwZUxpdGVyYWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYVHlwZUxpdGVyYWxSdWxlKCkpOyB9CisJIGl2X3J1bGVYVHlwZUxpdGVyYWw9cnVsZVhUeXBlTGl0ZXJhbCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhUeXBlTGl0ZXJhbC5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWFR5cGVMaXRlcmFsCitydWxlWFR5cGVMaXRlcmFsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsQWNjZXNzKCkuZ2V0WFR5cGVMaXRlcmFsQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispCW90aGVybHZfMT0ndHlwZW9mJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRYVHlwZUxpdGVyYWxBY2Nlc3MoKS5nZXRUeXBlb2ZLZXl3b3JkXzEoKSk7CisgICAgfQorCW90aGVybHZfMj0nKCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8yKCkpOworICAgIH0KKygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYVHlwZUxpdGVyYWxSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsQWNjZXNzKCkuZ2V0VHlwZUp2bVR5cGVDcm9zc1JlZmVyZW5jZV8zXzAoKSk7IAorCSAgICB9CisJCXJ1bGVRdWFsaWZpZWROYW1lCQl7IAorCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsQWNjZXNzKCkuZ2V0QXJyYXlEaW1lbnNpb25zQXJyYXlCcmFja2V0c1BhcnNlclJ1bGVDYWxsXzRfMCgpKTsgCisJICAgIH0KKwkJbHZfYXJyYXlEaW1lbnNpb25zXzRfMD1ydWxlQXJyYXlCcmFja2V0cwkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYVHlwZUxpdGVyYWxSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiYXJyYXlEaW1lbnNpb25zIiwKKyAgICAgICAgCQlsdl9hcnJheURpbWVuc2lvbnNfNF8wLCAKKyAgICAgICAgCQkiQXJyYXlCcmFja2V0cyIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykqCW90aGVybHZfNT0nKScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzUsIGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfNSgpKTsKKyAgICB9CispCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYVGhyb3dFeHByZXNzaW9uCitlbnRyeVJ1bGVYVGhyb3dFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFRocm93RXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhUaHJvd0V4cHJlc3Npb249cnVsZVhUaHJvd0V4cHJlc3Npb24gCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYVGhyb3dFeHByZXNzaW9uLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYVGhyb3dFeHByZXNzaW9uCitydWxlWFRocm93RXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhUaHJvd0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRYVGhyb3dFeHByZXNzaW9uQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispCW90aGVybHZfMT0ndGhyb3cnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFhUaHJvd0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRUaHJvd0tleXdvcmRfMSgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFRocm93RXhwcmVzc2lvbkFjY2VzcygpLmdldEV4cHJlc3Npb25YRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzJfMCgpKTsgCisJICAgIH0KKwkJbHZfZXhwcmVzc2lvbl8yXzA9cnVsZVhFeHByZXNzaW9uCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhUaHJvd0V4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZXhwcmVzc2lvbiIsCisgICAgICAgIAkJbHZfZXhwcmVzc2lvbl8yXzAsIAorICAgICAgICAJCSJYRXhwcmVzc2lvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYUmV0dXJuRXhwcmVzc2lvbgorZW50cnlSdWxlWFJldHVybkV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYUmV0dXJuRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhSZXR1cm5FeHByZXNzaW9uPXJ1bGVYUmV0dXJuRXhwcmVzc2lvbiAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhSZXR1cm5FeHByZXNzaW9uLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYUmV0dXJuRXhwcmVzc2lvbgorcnVsZVhSZXR1cm5FeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WFJldHVybkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYUmV0dXJuRXhwcmVzc2lvbkFjdGlvbl8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKQlvdGhlcmx2XzE9J3JldHVybicgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0WFJldHVybkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSZXR1cm5LZXl3b3JkXzEoKSk7CisgICAgfQorKCgJJ2V4dGVuZHMnIAorIHwgCSdzdGF0aWMnIAorIHwgCSdpbXBvcnQnIAorIHwgCSdleHRlbnNpb24nIAorIHwgCSchJyAKKyB8IAknLScgCisgfCAJJysnIAorIHwgCSduZXcnIAorIHwgCSd7JyAKKyB8IAknc3dpdGNoJyAKKyB8IAknc3luY2hyb25pemVkJyAKKyB8IAknPCcgCisgfCAJJ3N1cGVyJyAKKyB8IAknIycgCisgfCAJJ1snIAorIHwgCSdmYWxzZScgCisgfCAJJ3RydWUnIAorIHwgCSdudWxsJyAKKyB8IAkndHlwZW9mJyAKKyB8IAknaWYnIAorIHwgCSdmb3InIAorIHwgCSd3aGlsZScgCisgfCAJJ2RvJyAKKyB8IAkndGhyb3cnIAorIHwgCSdyZXR1cm4nIAorIHwgCSd0cnknIAorIHwgCScoJyAKKyB8IAlSVUxFX0lEIHwgCVJVTEVfSEVYIHwgCVJVTEVfSU5UIHwgCVJVTEVfREVDSU1BTCB8IAlSVUxFX1NUUklORyk9PgorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhSZXR1cm5FeHByZXNzaW9uQWNjZXNzKCkuZ2V0RXhwcmVzc2lvblhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMl8wKCkpOyAKKwkgICAgfQorCQlsdl9leHByZXNzaW9uXzJfMD1ydWxlWEV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WFJldHVybkV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZXhwcmVzc2lvbiIsCisgICAgICAgIAkJbHZfZXhwcmVzc2lvbl8yXzAsIAorICAgICAgICAJCSJYRXhwcmVzc2lvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKyk/KQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24KK2VudHJ5UnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25SdWxlKCkpOyB9CisJIGl2X3J1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbj1ydWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24gCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbi5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24KK3J1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPSd0cnknIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0VHJ5S2V5d29yZF8xKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldEV4cHJlc3Npb25YRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzJfMCgpKTsgCisJICAgIH0KKwkJbHZfZXhwcmVzc2lvbl8yXzA9cnVsZVhFeHByZXNzaW9uCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImV4cHJlc3Npb24iLAorICAgICAgICAJCWx2X2V4cHJlc3Npb25fMl8wLCAKKyAgICAgICAgCQkiWEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKCgoKAknY2F0Y2gnIAorKT0+CisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRDYXRjaENsYXVzZXNYQ2F0Y2hDbGF1c2VQYXJzZXJSdWxlQ2FsbF8zXzBfMF8wKCkpOyAKKwkgICAgfQorCQlsdl9jYXRjaENsYXVzZXNfM18wPXJ1bGVYQ2F0Y2hDbGF1c2UJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiY2F0Y2hDbGF1c2VzIiwKKyAgICAgICAgCQlsdl9jYXRjaENsYXVzZXNfM18wLCAKKyAgICAgICAgCQkiWENhdGNoQ2xhdXNlIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSsoKCgJJ2ZpbmFsbHknIAorKT0+CW90aGVybHZfND0nZmluYWxseScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzQsIGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGaW5hbGx5S2V5d29yZF8zXzBfMV8wKCkpOworICAgIH0KKykoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGaW5hbGx5RXhwcmVzc2lvblhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfM18wXzFfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9maW5hbGx5RXhwcmVzc2lvbl81XzA9cnVsZVhFeHByZXNzaW9uCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImZpbmFsbHlFeHByZXNzaW9uIiwKKyAgICAgICAgCQlsdl9maW5hbGx5RXhwcmVzc2lvbl81XzAsIAorICAgICAgICAJCSJYRXhwcmVzc2lvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpPykKKyAgICB8KAlvdGhlcmx2XzY9J2ZpbmFsbHknIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl82LCBncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmluYWxseUtleXdvcmRfM18xXzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmluYWxseUV4cHJlc3Npb25YRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzNfMV8xXzAoKSk7IAorCSAgICB9CisJCWx2X2ZpbmFsbHlFeHByZXNzaW9uXzdfMD1ydWxlWEV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZmluYWxseUV4cHJlc3Npb24iLAorICAgICAgICAJCWx2X2ZpbmFsbHlFeHByZXNzaW9uXzdfMCwgCisgICAgICAgIAkJIlhFeHByZXNzaW9uIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkpKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24KK2VudHJ5UnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25SdWxlKCkpOyB9CisJIGl2X3J1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbj1ydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24gCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbi5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWFN5bmNocm9uaXplZEV4cHJlc3Npb24KK3J1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgoKCgKKykJJ3N5bmNocm9uaXplZCcgCisJJygnIAorKSk9PigoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uQWN0aW9uXzBfMF8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKQlvdGhlcmx2XzE9J3N5bmNocm9uaXplZCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRTeW5jaHJvbml6ZWRLZXl3b3JkXzBfMF8xKCkpOworICAgIH0KKwlvdGhlcmx2XzI9JygnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8wXzBfMigpKTsKKyAgICB9CispKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFBhcmFtWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IAorCSAgICB9CisJCWx2X3BhcmFtXzNfMD1ydWxlWEV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkicGFyYW0iLAorICAgICAgICAJCWx2X3BhcmFtXzNfMCwgCisgICAgICAgIAkJIlhFeHByZXNzaW9uIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKQlvdGhlcmx2XzQ9JyknIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfMigpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRFeHByZXNzaW9uWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8zXzAoKSk7IAorCSAgICB9CisJCWx2X2V4cHJlc3Npb25fNV8wPXJ1bGVYRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJleHByZXNzaW9uIiwKKyAgICAgICAgCQlsdl9leHByZXNzaW9uXzVfMCwgCisgICAgICAgIAkJIlhFeHByZXNzaW9uIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhDYXRjaENsYXVzZQorZW50cnlSdWxlWENhdGNoQ2xhdXNlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhdGNoQ2xhdXNlUnVsZSgpKTsgfQorCSBpdl9ydWxlWENhdGNoQ2xhdXNlPXJ1bGVYQ2F0Y2hDbGF1c2UgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYQ2F0Y2hDbGF1c2UuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhDYXRjaENsYXVzZQorcnVsZVhDYXRjaENsYXVzZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgoCSdjYXRjaCcgCispPT4Jb3RoZXJsdl8wPSdjYXRjaCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0WENhdGNoQ2xhdXNlQWNjZXNzKCkuZ2V0Q2F0Y2hLZXl3b3JkXzAoKSk7CisgICAgfQorKQlvdGhlcmx2XzE9JygnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFhDYXRjaENsYXVzZUFjY2VzcygpLmdldExlZnRQYXJlbnRoZXNpc0tleXdvcmRfMSgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhdGNoQ2xhdXNlQWNjZXNzKCkuZ2V0RGVjbGFyZWRQYXJhbUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJQYXJzZXJSdWxlQ2FsbF8yXzAoKSk7IAorCSAgICB9CisJCWx2X2RlY2xhcmVkUGFyYW1fMl8wPXJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhDYXRjaENsYXVzZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJkZWNsYXJlZFBhcmFtIiwKKyAgICAgICAgCQlsdl9kZWNsYXJlZFBhcmFtXzJfMCwgCisgICAgICAgIAkJIkZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispCW90aGVybHZfMz0nKScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzMsIGdyYW1tYXJBY2Nlc3MuZ2V0WENhdGNoQ2xhdXNlQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfMygpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhdGNoQ2xhdXNlQWNjZXNzKCkuZ2V0RXhwcmVzc2lvblhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfNF8wKCkpOyAKKwkgICAgfQorCQlsdl9leHByZXNzaW9uXzRfMD1ydWxlWEV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WENhdGNoQ2xhdXNlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImV4cHJlc3Npb24iLAorICAgICAgICAJCWx2X2V4cHJlc3Npb25fNF8wLCAKKyAgICAgICAgCQkiWEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlTnVtYmVyCitlbnRyeVJ1bGVOdW1iZXIgcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gCisJQGluaXQgeyAKKwkJSGlkZGVuVG9rZW5zIG15SGlkZGVuVG9rZW5TdGF0ZSA9ICgoWHRleHRUb2tlblN0cmVhbSlpbnB1dCkuc2V0SGlkZGVuVG9rZW5zKCk7CisJfQorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJSdWxlKCkpOyB9IAorCSBpdl9ydWxlTnVtYmVyPXJ1bGVOdW1iZXIgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVOdW1iZXIuY3VycmVudC5nZXRUZXh0KCk7IH0gIAorCSBFT0YgCis7CitmaW5hbGx5IHsKKwlteUhpZGRlblRva2VuU3RhdGUucmVzdG9yZSgpOworfQorCisvLyBSdWxlIE51bWJlcgorcnVsZU51bWJlciByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisJCUhpZGRlblRva2VucyBteUhpZGRlblRva2VuU3RhdGUgPSAoKFh0ZXh0VG9rZW5TdHJlYW0paW5wdXQpLnNldEhpZGRlblRva2VucygpOworICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKyggICAgdGhpc19IRVhfMD1SVUxFX0hFWCAgICB7CisJCSRjdXJyZW50Lm1lcmdlKHRoaXNfSEVYXzApOworICAgIH0KKworICAgIHsgCisgICAgbmV3TGVhZk5vZGUodGhpc19IRVhfMCwgZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJBY2Nlc3MoKS5nZXRIRVhUZXJtaW5hbFJ1bGVDYWxsXzAoKSk7IAorICAgIH0KKworICAgIHwoKCAgICB0aGlzX0lOVF8xPVJVTEVfSU5UICAgIHsKKwkJJGN1cnJlbnQubWVyZ2UodGhpc19JTlRfMSk7CisgICAgfQorCisgICAgeyAKKyAgICBuZXdMZWFmTm9kZSh0aGlzX0lOVF8xLCBncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldElOVFRlcm1pbmFsUnVsZUNhbGxfMV8wXzAoKSk7IAorICAgIH0KKworICAgIHwgICAgdGhpc19ERUNJTUFMXzI9UlVMRV9ERUNJTUFMICAgIHsKKwkJJGN1cnJlbnQubWVyZ2UodGhpc19ERUNJTUFMXzIpOworICAgIH0KKworICAgIHsgCisgICAgbmV3TGVhZk5vZGUodGhpc19ERUNJTUFMXzIsIGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0REVDSU1BTFRlcm1pbmFsUnVsZUNhbGxfMV8wXzEoKSk7IAorICAgIH0KKykoCisJa3c9Jy4nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJBY2Nlc3MoKS5nZXRGdWxsU3RvcEtleXdvcmRfMV8xXzAoKSk7IAorICAgIH0KKyggICAgdGhpc19JTlRfND1SVUxFX0lOVCAgICB7CisJCSRjdXJyZW50Lm1lcmdlKHRoaXNfSU5UXzQpOworICAgIH0KKworICAgIHsgCisgICAgbmV3TGVhZk5vZGUodGhpc19JTlRfNCwgZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJBY2Nlc3MoKS5nZXRJTlRUZXJtaW5hbFJ1bGVDYWxsXzFfMV8xXzAoKSk7IAorICAgIH0KKworICAgIHwgICAgdGhpc19ERUNJTUFMXzU9UlVMRV9ERUNJTUFMICAgIHsKKwkJJGN1cnJlbnQubWVyZ2UodGhpc19ERUNJTUFMXzUpOworICAgIH0KKworICAgIHsgCisgICAgbmV3TGVhZk5vZGUodGhpc19ERUNJTUFMXzUsIGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0REVDSU1BTFRlcm1pbmFsUnVsZUNhbGxfMV8xXzFfMSgpKTsgCisgICAgfQorKSk/KSkKKyAgICA7CitmaW5hbGx5IHsKKwlteUhpZGRlblRva2VuU3RhdGUucmVzdG9yZSgpOworfQorCisKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUp2bVR5cGVSZWZlcmVuY2UKK2VudHJ5UnVsZUp2bVR5cGVSZWZlcmVuY2UgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUmVmZXJlbmNlUnVsZSgpKTsgfQorCSBpdl9ydWxlSnZtVHlwZVJlZmVyZW5jZT1ydWxlSnZtVHlwZVJlZmVyZW5jZSAKKwkgeyAkY3VycmVudD0kaXZfcnVsZUp2bVR5cGVSZWZlcmVuY2UuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIEp2bVR5cGVSZWZlcmVuY2UKK3J1bGVKdm1UeXBlUmVmZXJlbmNlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8wXzAoKSk7IAorICAgIH0KKyAgICB0aGlzX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlXzA9cnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV8wLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKCgoKAorKQlydWxlQXJyYXlCcmFja2V0cykpPT4oKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudEFuZFNldCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEp2bUdlbmVyaWNBcnJheVR5cGVSZWZlcmVuY2VDb21wb25lbnRUeXBlQWN0aW9uXzBfMV8wXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRBcnJheUJyYWNrZXRzUGFyc2VyUnVsZUNhbGxfMF8xXzBfMSgpKTsgCisgICAgfQorcnVsZUFycmF5QnJhY2tldHMKKyAgICB7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKSkqKQorICAgIHwKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldFhGdW5jdGlvblR5cGVSZWZQYXJzZXJSdWxlQ2FsbF8xKCkpOyAKKyAgICB9CisgICAgdGhpc19YRnVuY3Rpb25UeXBlUmVmXzM9cnVsZVhGdW5jdGlvblR5cGVSZWYKKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1hGdW5jdGlvblR5cGVSZWZfMy5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUFycmF5QnJhY2tldHMKK2VudHJ5UnVsZUFycmF5QnJhY2tldHMgcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEFycmF5QnJhY2tldHNSdWxlKCkpOyB9IAorCSBpdl9ydWxlQXJyYXlCcmFja2V0cz1ydWxlQXJyYXlCcmFja2V0cyAKKwkgeyAkY3VycmVudD0kaXZfcnVsZUFycmF5QnJhY2tldHMuY3VycmVudC5nZXRUZXh0KCk7IH0gIAorCSBFT0YgCis7CisKKy8vIFJ1bGUgQXJyYXlCcmFja2V0cworcnVsZUFycmF5QnJhY2tldHMgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKwlrdz0nWycgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldEFycmF5QnJhY2tldHNBY2Nlc3MoKS5nZXRMZWZ0U3F1YXJlQnJhY2tldEtleXdvcmRfMCgpKTsgCisgICAgfQorCisJa3c9J10nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRBcnJheUJyYWNrZXRzQWNjZXNzKCkuZ2V0UmlnaHRTcXVhcmVCcmFja2V0S2V5d29yZF8xKCkpOyAKKyAgICB9CispCisgICAgOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWEZ1bmN0aW9uVHlwZVJlZgorZW50cnlSdWxlWEZ1bmN0aW9uVHlwZVJlZiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZSdWxlKCkpOyB9CisJIGl2X3J1bGVYRnVuY3Rpb25UeXBlUmVmPXJ1bGVYRnVuY3Rpb25UeXBlUmVmIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWEZ1bmN0aW9uVHlwZVJlZi5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWEZ1bmN0aW9uVHlwZVJlZgorcnVsZVhGdW5jdGlvblR5cGVSZWYgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCW90aGVybHZfMD0nKCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldExlZnRQYXJlbnRoZXNpc0tleXdvcmRfMF8wKCkpOworICAgIH0KKygoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldFBhcmFtVHlwZXNKdm1UeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMF8xXzBfMCgpKTsgCisJICAgIH0KKwkJbHZfcGFyYW1UeXBlc18xXzA9cnVsZUp2bVR5cGVSZWZlcmVuY2UJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZlJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJwYXJhbVR5cGVzIiwKKyAgICAgICAgCQlsdl9wYXJhbVR5cGVzXzFfMCwgCisgICAgICAgIAkJIkp2bVR5cGVSZWZlcmVuY2UiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKAlvdGhlcmx2XzI9JywnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfMF8xXzFfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldFBhcmFtVHlwZXNKdm1UeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMF8xXzFfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9wYXJhbVR5cGVzXzNfMD1ydWxlSnZtVHlwZVJlZmVyZW5jZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInBhcmFtVHlwZXMiLAorICAgICAgICAJCWx2X3BhcmFtVHlwZXNfM18wLCAKKyAgICAgICAgCQkiSnZtVHlwZVJlZmVyZW5jZSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKik/CW90aGVybHZfND0nKScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzQsIGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzBfMigpKTsKKyAgICB9CispPwlvdGhlcmx2XzU9Jz0+JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNSwgZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0RXF1YWxzU2lnbkdyZWF0ZXJUaGFuU2lnbktleXdvcmRfMSgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldFJldHVyblR5cGVKdm1UeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMl8wKCkpOyAKKwkgICAgfQorCQlsdl9yZXR1cm5UeXBlXzZfMD1ydWxlSnZtVHlwZVJlZmVyZW5jZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInJldHVyblR5cGUiLAorICAgICAgICAJCWx2X3JldHVyblR5cGVfNl8wLCAKKyAgICAgICAgCQkiSnZtVHlwZVJlZmVyZW5jZSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZQorZW50cnlSdWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZVJ1bGUoKSk7IH0KKwkgaXZfcnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlPXJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSAKKwkgeyAkY3VycmVudD0kaXZfcnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZQorcnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0VHlwZUp2bVR5cGVDcm9zc1JlZmVyZW5jZV8wXzAoKSk7IAorCSAgICB9CisJCXJ1bGVRdWFsaWZpZWROYW1lCQl7IAorCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoKCgJJzwnIAorKT0+CW90aGVybHZfMT0nPCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzFfMCgpKTsKKyAgICB9CispKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0QXJndW1lbnRzSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMV8xXzAoKSk7IAorCSAgICB9CisJCWx2X2FyZ3VtZW50c18yXzA9cnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJhcmd1bWVudHMiLAorICAgICAgICAJCWx2X2FyZ3VtZW50c18yXzAsIAorICAgICAgICAJCSJKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKAlvdGhlcmx2XzM9JywnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzFfMl8wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFyZ3VtZW50c0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzFfMl8xXzAoKSk7IAorCSAgICB9CisJCWx2X2FyZ3VtZW50c180XzA9cnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJhcmd1bWVudHMiLAorICAgICAgICAJCWx2X2FyZ3VtZW50c180XzAsIAorICAgICAgICAJCSJKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSoJb3RoZXJsdl81PSc+JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNSwgZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfMV8zKCkpOworICAgIH0KKygoKCgoCispCScuJyAKKykpPT4oKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudEFuZFNldCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRKdm1Jbm5lclR5cGVSZWZlcmVuY2VPdXRlckFjdGlvbl8xXzRfMF8wXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispCW90aGVybHZfNz0nLicgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzcsIGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRGdWxsU3RvcEtleXdvcmRfMV80XzBfMF8xKCkpOworICAgIH0KKykpKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0VHlwZUp2bVR5cGVDcm9zc1JlZmVyZW5jZV8xXzRfMV8wKCkpOyAKKwkgICAgfQorCQlydWxlVmFsaWRJRAkJeyAKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKCgoCSc8JyAKKyk9PglvdGhlcmx2Xzk9JzwnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl85LCBncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF8xXzRfMl8wKCkpOworICAgIH0KKykoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRBcmd1bWVudHNKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xXzRfMl8xXzAoKSk7IAorCSAgICB9CisJCWx2X2FyZ3VtZW50c18xMF8wPXJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiYXJndW1lbnRzIiwKKyAgICAgICAgCQlsdl9hcmd1bWVudHNfMTBfMCwgCisgICAgICAgIAkJIkp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCW90aGVybHZfMTE9JywnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xMSwgZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldENvbW1hS2V5d29yZF8xXzRfMl8yXzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0QXJndW1lbnRzSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMV80XzJfMl8xXzAoKSk7IAorCSAgICB9CisJCWx2X2FyZ3VtZW50c18xMl8wPXJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiYXJndW1lbnRzIiwKKyAgICAgICAgCQlsdl9hcmd1bWVudHNfMTJfMCwgCisgICAgICAgIAkJIkp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKglvdGhlcmx2XzEzPSc+JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTMsIGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzFfNF8yXzMoKSk7CisgICAgfQorKT8pKik/KQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCitlbnRyeVJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VSdWxlKCkpOyB9CisJIGl2X3J1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2U9cnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSAKKwkgeyAkY3VycmVudD0kaXZfcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZS5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCitydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEp2bVR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICB9CisgICAgdGhpc19Kdm1UeXBlUmVmZXJlbmNlXzA9cnVsZUp2bVR5cGVSZWZlcmVuY2UKKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX0p2bVR5cGVSZWZlcmVuY2VfMC5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworICAgIHwKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMSgpKTsgCisgICAgfQorICAgIHRoaXNfSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlXzE9cnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZQorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlXzEuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CispCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UKK2VudHJ5UnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZVJ1bGUoKSk7IH0KKwkgaXZfcnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZT1ydWxlSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UKK3J1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPSc/JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRRdWVzdGlvbk1hcmtLZXl3b3JkXzEoKSk7CisgICAgfQorKCgoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0Q29uc3RyYWludHNKdm1VcHBlckJvdW5kUGFyc2VyUnVsZUNhbGxfMl8wXzBfMCgpKTsgCisJICAgIH0KKwkJbHZfY29uc3RyYWludHNfMl8wPXJ1bGVKdm1VcHBlckJvdW5kCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJjb25zdHJhaW50cyIsCisgICAgICAgIAkJbHZfY29uc3RyYWludHNfMl8wLCAKKyAgICAgICAgCQkiSnZtVXBwZXJCb3VuZCIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0Q29uc3RyYWludHNKdm1VcHBlckJvdW5kQW5kZWRQYXJzZXJSdWxlQ2FsbF8yXzBfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9jb25zdHJhaW50c18zXzA9cnVsZUp2bVVwcGVyQm91bmRBbmRlZAkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiY29uc3RyYWludHMiLAorICAgICAgICAJCWx2X2NvbnN0cmFpbnRzXzNfMCwgCisgICAgICAgIAkJIkp2bVVwcGVyQm91bmRBbmRlZCIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykqKQorICAgIHwoKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldENvbnN0cmFpbnRzSnZtTG93ZXJCb3VuZFBhcnNlclJ1bGVDYWxsXzJfMV8wXzAoKSk7IAorCSAgICB9CisJCWx2X2NvbnN0cmFpbnRzXzRfMD1ydWxlSnZtTG93ZXJCb3VuZAkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiY29uc3RyYWludHMiLAorICAgICAgICAJCWx2X2NvbnN0cmFpbnRzXzRfMCwgCisgICAgICAgIAkJIkp2bUxvd2VyQm91bmQiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldENvbnN0cmFpbnRzSnZtTG93ZXJCb3VuZEFuZGVkUGFyc2VyUnVsZUNhbGxfMl8xXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfY29uc3RyYWludHNfNV8wPXJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImNvbnN0cmFpbnRzIiwKKyAgICAgICAgCQlsdl9jb25zdHJhaW50c181XzAsIAorICAgICAgICAJCSJKdm1Mb3dlckJvdW5kQW5kZWQiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKikpPykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUp2bVVwcGVyQm91bmQKK2VudHJ5UnVsZUp2bVVwcGVyQm91bmQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kUnVsZSgpKTsgfQorCSBpdl9ydWxlSnZtVXBwZXJCb3VuZD1ydWxlSnZtVXBwZXJCb3VuZCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZUp2bVVwcGVyQm91bmQuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIEp2bVVwcGVyQm91bmQKK3J1bGVKdm1VcHBlckJvdW5kIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCW90aGVybHZfMD0nZXh0ZW5kcycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZEFjY2VzcygpLmdldEV4dGVuZHNLZXl3b3JkXzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRBY2Nlc3MoKS5nZXRUeXBlUmVmZXJlbmNlSnZtVHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfdHlwZVJlZmVyZW5jZV8xXzA9cnVsZUp2bVR5cGVSZWZlcmVuY2UJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJ0eXBlUmVmZXJlbmNlIiwKKyAgICAgICAgCQlsdl90eXBlUmVmZXJlbmNlXzFfMCwgCisgICAgICAgIAkJIkp2bVR5cGVSZWZlcmVuY2UiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlSnZtVXBwZXJCb3VuZEFuZGVkCitlbnRyeVJ1bGVKdm1VcHBlckJvdW5kQW5kZWQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kQW5kZWRSdWxlKCkpOyB9CisJIGl2X3J1bGVKdm1VcHBlckJvdW5kQW5kZWQ9cnVsZUp2bVVwcGVyQm91bmRBbmRlZCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZUp2bVVwcGVyQm91bmRBbmRlZC5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgSnZtVXBwZXJCb3VuZEFuZGVkCitydWxlSnZtVXBwZXJCb3VuZEFuZGVkIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCW90aGVybHZfMD0nJicgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZEFuZGVkQWNjZXNzKCkuZ2V0QW1wZXJzYW5kS2V5d29yZF8wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kQW5kZWRBY2Nlc3MoKS5nZXRUeXBlUmVmZXJlbmNlSnZtVHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfdHlwZVJlZmVyZW5jZV8xXzA9cnVsZUp2bVR5cGVSZWZlcmVuY2UJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZEFuZGVkUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInR5cGVSZWZlcmVuY2UiLAorICAgICAgICAJCWx2X3R5cGVSZWZlcmVuY2VfMV8wLCAKKyAgICAgICAgCQkiSnZtVHlwZVJlZmVyZW5jZSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVKdm1Mb3dlckJvdW5kCitlbnRyeVJ1bGVKdm1Mb3dlckJvdW5kIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZFJ1bGUoKSk7IH0KKwkgaXZfcnVsZUp2bUxvd2VyQm91bmQ9cnVsZUp2bUxvd2VyQm91bmQgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVKdm1Mb3dlckJvdW5kLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBKdm1Mb3dlckJvdW5kCitydWxlSnZtTG93ZXJCb3VuZCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAlvdGhlcmx2XzA9J3N1cGVyJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRKdm1Mb3dlckJvdW5kQWNjZXNzKCkuZ2V0U3VwZXJLZXl3b3JkXzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRBY2Nlc3MoKS5nZXRUeXBlUmVmZXJlbmNlSnZtVHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfdHlwZVJlZmVyZW5jZV8xXzA9cnVsZUp2bVR5cGVSZWZlcmVuY2UJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJ0eXBlUmVmZXJlbmNlIiwKKyAgICAgICAgCQlsdl90eXBlUmVmZXJlbmNlXzFfMCwgCisgICAgICAgIAkJIkp2bVR5cGVSZWZlcmVuY2UiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlSnZtTG93ZXJCb3VuZEFuZGVkCitlbnRyeVJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Mb3dlckJvdW5kQW5kZWRSdWxlKCkpOyB9CisJIGl2X3J1bGVKdm1Mb3dlckJvdW5kQW5kZWQ9cnVsZUp2bUxvd2VyQm91bmRBbmRlZCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZUp2bUxvd2VyQm91bmRBbmRlZC5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgSnZtTG93ZXJCb3VuZEFuZGVkCitydWxlSnZtTG93ZXJCb3VuZEFuZGVkIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCW90aGVybHZfMD0nJicgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFuZGVkQWNjZXNzKCkuZ2V0QW1wZXJzYW5kS2V5d29yZF8wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Mb3dlckJvdW5kQW5kZWRBY2Nlc3MoKS5nZXRUeXBlUmVmZXJlbmNlSnZtVHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfdHlwZVJlZmVyZW5jZV8xXzA9cnVsZUp2bVR5cGVSZWZlcmVuY2UJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFuZGVkUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInR5cGVSZWZlcmVuY2UiLAorICAgICAgICAJCWx2X3R5cGVSZWZlcmVuY2VfMV8wLCAKKyAgICAgICAgCQkiSnZtVHlwZVJlZmVyZW5jZSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpCis7CisKKworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZAorZW50cnlSdWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZFJ1bGUoKSk7IH0gCisJIGl2X3J1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkPXJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZC5jdXJyZW50LmdldFRleHQoKTsgfSAgCisJIEVPRiAKKzsKKworLy8gUnVsZSBRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkCitydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkQWNjZXNzKCkuZ2V0UXVhbGlmaWVkTmFtZVBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgIH0KKyAgICB0aGlzX1F1YWxpZmllZE5hbWVfMD1ydWxlUXVhbGlmaWVkTmFtZSAgICB7CisJCSRjdXJyZW50Lm1lcmdlKHRoaXNfUXVhbGlmaWVkTmFtZV8wKTsKKyAgICB9CisKKyAgICB7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorCisJa3c9Jy4nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkQWNjZXNzKCkuZ2V0RnVsbFN0b3BLZXl3b3JkXzEoKSk7IAorICAgIH0KKworCWt3PScqJyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZEFjY2VzcygpLmdldEFzdGVyaXNrS2V5d29yZF8yKCkpOyAKKyAgICB9CispCisgICAgOworCisKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhJbXBvcnREZWNsYXJhdGlvbgorZW50cnlSdWxlWEltcG9ydERlY2xhcmF0aW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uUnVsZSgpKTsgfQorCSBpdl9ydWxlWEltcG9ydERlY2xhcmF0aW9uPXJ1bGVYSW1wb3J0RGVjbGFyYXRpb24gCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYSW1wb3J0RGVjbGFyYXRpb24uY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhJbXBvcnREZWNsYXJhdGlvbgorcnVsZVhJbXBvcnREZWNsYXJhdGlvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAlvdGhlcmx2XzA9J2ltcG9ydCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0SW1wb3J0S2V5d29yZF8wKCkpOworICAgIH0KKygoKAorKAorCQlsdl9zdGF0aWNfMV8wPQknc3RhdGljJyAKKyAgICB7CisgICAgICAgIG5ld0xlYWZOb2RlKGx2X3N0YXRpY18xXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0U3RhdGljU3RhdGljS2V5d29yZF8xXzBfMF8wKCkpOworICAgIH0KKyAKKwkgICAgeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgkY3VycmVudCwgInN0YXRpYyIsIHRydWUsICJzdGF0aWMiKTsKKwkgICAgfQorCispCispKAorKAorCQlsdl9leHRlbnNpb25fMl8wPQknZXh0ZW5zaW9uJyAKKyAgICB7CisgICAgICAgIG5ld0xlYWZOb2RlKGx2X2V4dGVuc2lvbl8yXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0RXh0ZW5zaW9uRXh0ZW5zaW9uS2V5d29yZF8xXzBfMV8wKCkpOworICAgIH0KKyAKKwkgICAgeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgkY3VycmVudCwgImV4dGVuc2lvbiIsIHRydWUsICJleHRlbnNpb24iKTsKKwkgICAgfQorCispCispPygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0SW1wb3J0ZWRUeXBlSnZtRGVjbGFyZWRUeXBlQ3Jvc3NSZWZlcmVuY2VfMV8wXzJfMCgpKTsgCisJICAgIH0KKwkJcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydAkJeyAKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKCgKKygKKwkJbHZfd2lsZGNhcmRfNF8wPQknKicgCisgICAgeworICAgICAgICBuZXdMZWFmTm9kZShsdl93aWxkY2FyZF80XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0V2lsZGNhcmRBc3Rlcmlza0tleXdvcmRfMV8wXzNfMF8wKCkpOworICAgIH0KKyAKKwkgICAgeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgkY3VycmVudCwgIndpbGRjYXJkIiwgdHJ1ZSwgIioiKTsKKwkgICAgfQorCispCispCisgICAgfCgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRNZW1iZXJOYW1lVmFsaWRJRFBhcnNlclJ1bGVDYWxsXzFfMF8zXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfbWVtYmVyTmFtZV81XzA9cnVsZVZhbGlkSUQJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJIm1lbWJlck5hbWUiLAorICAgICAgICAJCWx2X21lbWJlck5hbWVfNV8wLCAKKyAgICAgICAgCQkiVmFsaWRJRCIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKQorICAgIHwoCisoCisJCXsKKwkJCWlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEltcG9ydGVkVHlwZUp2bURlY2xhcmVkVHlwZUNyb3NzUmVmZXJlbmNlXzFfMV8wKCkpOyAKKwkgICAgfQorCQlydWxlUXVhbGlmaWVkTmFtZQkJeyAKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispCisgICAgfCgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRJbXBvcnRlZE5hbWVzcGFjZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRQYXJzZXJSdWxlQ2FsbF8xXzJfMCgpKTsgCisJICAgIH0KKwkJbHZfaW1wb3J0ZWROYW1lc3BhY2VfN18wPXJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJpbXBvcnRlZE5hbWVzcGFjZSIsCisgICAgICAgIAkJbHZfaW1wb3J0ZWROYW1lc3BhY2VfN18wLCAKKyAgICAgICAgCQkiUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKAlvdGhlcmx2Xzg9JzsnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl84LCBncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldFNlbWljb2xvbktleXdvcmRfMigpKTsKKyAgICB9CispPykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydAorZW50cnlSdWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0IHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRSdWxlKCkpOyB9IAorCSBpdl9ydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0PXJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQuY3VycmVudC5nZXRUZXh0KCk7IH0gIAorCSBFT0YgCis7CisKKy8vIFJ1bGUgUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0CitydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0IHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydEFjY2VzcygpLmdldFZhbGlkSURQYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICB9CisgICAgdGhpc19WYWxpZElEXzA9cnVsZVZhbGlkSUQgICAgeworCQkkY3VycmVudC5tZXJnZSh0aGlzX1ZhbGlkSURfMCk7CisgICAgfQorCisgICAgeyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworCWt3PScuJyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0QWNjZXNzKCkuZ2V0RnVsbFN0b3BLZXl3b3JkXzEoKSk7IAorICAgIH0KKykrCisgICAgOworCisKKworCisKKy8vIFJ1bGUgU2FzaE9yaWVudGF0aW9uCitydWxlU2FzaE9yaWVudGF0aW9uIHJldHVybnMgW0VudW1lcmF0b3IgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAllbnVtTGl0ZXJhbF8wPSdob3Jpem9udGFsJyAKKwl7CisgICAgICAgICRjdXJyZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRTYXNoT3JpZW50YXRpb25BY2Nlc3MoKS5nZXRIT1JJWk9OVEFMRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCkuZ2V0RW51bUxpdGVyYWwoKS5nZXRJbnN0YW5jZSgpOworICAgICAgICBuZXdMZWFmTm9kZShlbnVtTGl0ZXJhbF8wLCBncmFtbWFyQWNjZXNzLmdldFNhc2hPcmllbnRhdGlvbkFjY2VzcygpLmdldEhPUklaT05UQUxFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKSk7IAorICAgIH0KKykKKyAgICB8KAllbnVtTGl0ZXJhbF8xPSd2ZXJ0aWNhbCcgCisJeworICAgICAgICAkY3VycmVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0U2FzaE9yaWVudGF0aW9uQWNjZXNzKCkuZ2V0VkVSVElDQUxFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKS5nZXRFbnVtTGl0ZXJhbCgpLmdldEluc3RhbmNlKCk7CisgICAgICAgIG5ld0xlYWZOb2RlKGVudW1MaXRlcmFsXzEsIGdyYW1tYXJBY2Nlc3MuZ2V0U2FzaE9yaWVudGF0aW9uQWNjZXNzKCkuZ2V0VkVSVElDQUxFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSk7IAorICAgIH0KKykpOworCisKKworUlVMRV9IRVggOiAoJzB4J3wnMFgnKSAoJzAnLi4nOSd8J2EnLi4nZid8J0EnLi4nRid8J18nKSsgKCcjJyAoKCdiJ3wnQicpICgnaSd8J0knKXwoJ2wnfCdMJykpKT87CisKK1JVTEVfSU5UIDogJzAnLi4nOScgKCcwJy4uJzknfCdfJykqOworCitSVUxFX0RFQ0lNQUwgOiBSVUxFX0lOVCAoKCdlJ3wnRScpICgnKyd8Jy0nKT8gUlVMRV9JTlQpPyAoKCdiJ3wnQicpICgnaSd8J0knfCdkJ3wnRCcpfCgnbCd8J0wnfCdkJ3wnRCd8J2YnfCdGJykpPzsKKworUlVMRV9JRCA6ICdeJz8gKCdhJy4uJ3onfCdBJy4uJ1onfCckJ3wnXycpICgnYScuLid6J3wnQScuLidaJ3wnJCd8J18nfCcwJy4uJzknKSo7CisKK1JVTEVfU1RSSU5HIDogKCciJyAoJ1xcJyAufH4oKCdcXCd8JyInKSkpKiAnIic/fCdcJycgKCdcXCcgLnx+KCgnXFwnfCdcJycpKSkqICdcJyc/KTsKKworUlVMRV9NTF9DT01NRU5UIDogJy8qJyAoIG9wdGlvbnMge2dyZWVkeT1mYWxzZTt9IDogLiApKicqLyc7CisKK1JVTEVfU0xfQ09NTUVOVCA6ICcvLycgfigoJ1xuJ3wnXHInKSkqICgnXHInPyAnXG4nKT87CisKK1JVTEVfV1MgOiAoJyAnfCdcdCd8J1xyJ3wnXG4nKSs7CisKK1JVTEVfQU5ZX09USEVSIDogLjsKKworCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC50b2tlbnMgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC50b2tlbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY4OGE3MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLnRva2VucwpAQCAtMCwwICsxLDIxMyBAQAorJyEnPTc3CisnIT0nPTYyCisnIT09Jz02NAorJyMnPTQ4CisnJSc9NzYKKyclPSc9NTUKKycmJic9NjAKKycmJz0xMTIKKycoJz00NAorJyknPTQ2CisnKic9NDIKKycqKic9NzQKKycqPSc9NTMKKycrJz03MgorJysrJz03OQorJys9Jz01MQorJywnPTQ1CisnLSc9NzMKKyctLSc9ODAKKyctPSc9NTIKKyctPic9NjYKKycuJz00MQorJy4uJz02OAorJy4uPCc9NjcKKycvJz03NQorJy89Jz01NAorJzonPTg4CisnOjonPTgxCisnOyc9ODQKKyc8Jz01NgorJzw+Jz03MAorJz0nPTQ3CisnPT0nPTYxCisnPT09Jz02MworJz0+Jz02OQorJz4nPTU3CisnPj0nPTU4CisnPyc9MTExCisnPy4nPTgyCisnPzonPTcxCisnQCc9NDMKKydbJz00OQorJ10nPTUwCisnYWNjZXNzaWJpbGl0eSc9MjIKKydhcyc9NzgKKydicG1uJz00MAorJ2Nhc2UnPTkwCisnY2F0Y2gnPTExMAorJ2NoYXJ0Jz0zNQorJ2RlZmF1bHQnPTg5CisnZGVzY3JpYmVkIGJ5Jz0xOAorJ2RpYWxvZyc9MzkKKydkbyc9OTMKKydlbHNlJz04NgorJ2V4dGVuZHMnPTk2CisnZXh0ZW5zaW9uJz05OAorJ2ZhbHNlJz0xMDEKKydmaW5hbGx5Jz0xMDgKKydmb3InPTkxCisnZ3JpZCc9MzQKKydob3Jpem9udGFsJz0xMTMKKydpY29uVVJJJz0yMQorJ2lmJz04NQorJ2ltcG9ydCc9MTYKKydpbnN0YW5jZW9mJz02NQorJ2lzQ2xvc2FibGUnPTMxCisnbmV3Jz0xMDAKKydudWxsJz0xMDMKKydvcmdhbmlncmFtJz0zNworJ29yaWVudGF0aW9uJz0yNQorJ3BhY2thZ2UnPTEzCisncGFydCc9MjkKKydwYXJ0U3RhY2snPTI4CisncGVyc3BlY3RpdmUnPTE3CisncHJvY2Vzcyc9MTkKKydyZXBvcnQnPTM2CisncmV0dXJuJz0xMDYKKydzYXNoQ29udGFpbmVyJz0yNAorJ3NlbGVjdCc9MzIKKydzZWxlY3RlZEVsZW1lbnQnPTI2Cisnc3BhY2VWb2x1bWUnPTI3Cisnc3RhdGljJz05NworJ3N1cGVyJz05OQorJ3N3aXRjaCc9ODcKKydzeW5jaHJvbml6ZWQnPTEwOQorJ3RhYmxlJz0zMworJ3Rocm93Jz0xMDUKKyd0b29sYmFyJz0yMworJ3RvcG9sb2d5Jz0zOAorJ3RydWUnPTEwMgorJ3RyeSc9MTA3CisndHlwZW9mJz0xMDQKKyd1c2VydGFzayc9MjAKKyd2YWwnPTk1CisndmFyJz05NAorJ3ZlcnRpY2FsJz0xMTQKKyd2aWV3Jz0zMAorJ3doaWxlJz05MgorJ3snPTE0CisnfCc9ODMKKyd8fCc9NTkKKyd9Jz0xNQorUlVMRV9BTllfT1RIRVI9MTIKK1JVTEVfREVDSU1BTD04CitSVUxFX0hFWD02CitSVUxFX0lEPTQKK1JVTEVfSU5UPTcKK1JVTEVfTUxfQ09NTUVOVD05CitSVUxFX1NMX0NPTU1FTlQ9MTAKK1JVTEVfU1RSSU5HPTUKK1JVTEVfV1M9MTEKK1RfXzEwMD0xMDAKK1RfXzEwMT0xMDEKK1RfXzEwMj0xMDIKK1RfXzEwMz0xMDMKK1RfXzEwND0xMDQKK1RfXzEwNT0xMDUKK1RfXzEwNj0xMDYKK1RfXzEwNz0xMDcKK1RfXzEwOD0xMDgKK1RfXzEwOT0xMDkKK1RfXzExMD0xMTAKK1RfXzExMT0xMTEKK1RfXzExMj0xMTIKK1RfXzExMz0xMTMKK1RfXzExND0xMTQKK1RfXzEzPTEzCitUX18xND0xNAorVF9fMTU9MTUKK1RfXzE2PTE2CitUX18xNz0xNworVF9fMTg9MTgKK1RfXzE5PTE5CitUX18yMD0yMAorVF9fMjE9MjEKK1RfXzIyPTIyCitUX18yMz0yMworVF9fMjQ9MjQKK1RfXzI1PTI1CitUX18yNj0yNgorVF9fMjc9MjcKK1RfXzI4PTI4CitUX18yOT0yOQorVF9fMzA9MzAKK1RfXzMxPTMxCitUX18zMj0zMgorVF9fMzM9MzMKK1RfXzM0PTM0CitUX18zNT0zNQorVF9fMzY9MzYKK1RfXzM3PTM3CitUX18zOD0zOAorVF9fMzk9MzkKK1RfXzQwPTQwCitUX180MT00MQorVF9fNDI9NDIKK1RfXzQzPTQzCitUX180ND00NAorVF9fNDU9NDUKK1RfXzQ2PTQ2CitUX180Nz00NworVF9fNDg9NDgKK1RfXzQ5PTQ5CitUX181MD01MAorVF9fNTE9NTEKK1RfXzUyPTUyCitUX181Mz01MworVF9fNTQ9NTQKK1RfXzU1PTU1CitUX181Nj01NgorVF9fNTc9NTcKK1RfXzU4PTU4CitUX181OT01OQorVF9fNjA9NjAKK1RfXzYxPTYxCitUX182Mj02MgorVF9fNjM9NjMKK1RfXzY0PTY0CitUX182NT02NQorVF9fNjY9NjYKK1RfXzY3PTY3CitUX182OD02OAorVF9fNjk9NjkKK1RfXzcwPTcwCitUX183MT03MQorVF9fNzI9NzIKK1RfXzczPTczCitUX183ND03NAorVF9fNzU9NzUKK1RfXzc2PTc2CitUX183Nz03NworVF9fNzg9NzgKK1RfXzc5PTc5CitUX184MD04MAorVF9fODE9ODEKK1RfXzgyPTgyCitUX184Mz04MworVF9fODQ9ODQKK1RfXzg1PTg1CitUX184Nj04NgorVF9fODc9ODcKK1RfXzg4PTg4CitUX184OT04OQorVF9fOTA9OTAKK1RfXzkxPTkxCitUX185Mj05MgorVF9fOTM9OTMKK1RfXzk0PTk0CitUX185NT05NQorVF9fOTY9OTYKK1RfXzk3PTk3CitUX185OD05OAorVF9fOTk9OTkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsTGV4ZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsTGV4ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2NlNjczCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2xMZXhlci5qYXZhCkBAIC0wLDAgKzEsNDY5NCBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnBhcnNlci5hbnRsci5pbnRlcm5hbDsKKworLy8gSGFjazogVXNlIG91ciBvd24gTGV4ZXIgc3VwZXJjbGFzcyBieSBtZWFucyBvZiBpbXBvcnQuIAorLy8gQ3VycmVudGx5IHRoZXJlIGlzIG5vIG90aGVyIHdheSB0byBzcGVjaWZ5IHRoZSBzdXBlcmNsYXNzIGZvciB0aGUgbGV4ZXIuCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLkxleGVyOworCisKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS4qOworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBJbnRlcm5hbFBlcnNwZWN0aXZlRHNsTGV4ZXIgZXh0ZW5kcyBMZXhlciB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9IRVg9NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181MD01MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181OT01OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181NT01NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181Nj01NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181Nz01NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181OD01ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181MT01MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181Mj01MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181Mz01MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181ND01NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182MD02MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182MT02MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX0lEPTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9JTlQ9NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182Nj02NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX01MX0NPTU1FTlQ9OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182Nz02NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182OD02ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182OT02OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182Mj02MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182Mz02MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182ND02NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182NT02NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zNz0zNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zOD0zODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zOT0zOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zMz0zMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zND0zNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zNT0zNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zNj0zNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zMD0zMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zMT0zMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zMj0zMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180OD00ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180OT00OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180ND00NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180NT00NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180Nj00NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180Nz00NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180MD00MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180MT00MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180Mj00MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180Mz00MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185MT05MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDA9MTAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzkyPTkyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzkzPTkzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwMj0xMDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTQ9OTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTAxPTEwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185MD05MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xOT0xOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNT0xNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNj0xNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNz0xNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xOD0xODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185OT05OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMz0xMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xND0xNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185NT05NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185Nj05NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185Nz05NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185OD05ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX0RFQ0lNQUw9ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNj0yNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNz0yNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yOD0yODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yOT0yOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMj0yMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMz0yMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yND0yNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNT0yNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMD0yMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMT0yMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183MD03MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183MT03MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183Mj03MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX1NUUklORz01OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfU0xfQ09NTUVOVD0xMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183Nz03NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183OD03ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183OT03OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183Mz03MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFT0Y9LTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzQ9NzQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTE0PTExNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183NT03NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183Nj03NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184MD04MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMTE9MTExOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzgxPTgxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExMD0xMTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODI9ODI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTEzPTExMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184Mz04MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMTI9MTEyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfV1M9MTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9BTllfT1RIRVI9MTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODg9ODg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTA4PTEwODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184OT04OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDc9MTA3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwOT0xMDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODQ9ODQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTA0PTEwNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184NT04NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDM9MTAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzg2PTg2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwNj0xMDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODc9ODc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTA1PTEwNTsKKworICAgIC8vIGRlbGVnYXRlcworICAgIC8vIGRlbGVnYXRvcnMKKworICAgIHB1YmxpYyBJbnRlcm5hbFBlcnNwZWN0aXZlRHNsTGV4ZXIoKSB7O30gCisgICAgcHVibGljIEludGVybmFsUGVyc3BlY3RpdmVEc2xMZXhlcihDaGFyU3RyZWFtIGlucHV0KSB7CisgICAgICAgIHRoaXMoaW5wdXQsIG5ldyBSZWNvZ25pemVyU2hhcmVkU3RhdGUoKSk7CisgICAgfQorICAgIHB1YmxpYyBJbnRlcm5hbFBlcnNwZWN0aXZlRHNsTGV4ZXIoQ2hhclN0cmVhbSBpbnB1dCwgUmVjb2duaXplclNoYXJlZFN0YXRlIHN0YXRlKSB7CisgICAgICAgIHN1cGVyKGlucHV0LHN0YXRlKTsKKworICAgIH0KKyAgICBwdWJsaWMgU3RyaW5nIGdldEdyYW1tYXJGaWxlTmFtZSgpIHsgcmV0dXJuICIuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nIjsgfQorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjExOjc6ICggJ3BhY2thZ2UnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTE6OTogJ3BhY2thZ2UnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicGFja2FnZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMjo3OiAoICd7JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEyOjk6ICd7JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJ3snKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEzOjc6ICggJ30nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTM6OTogJ30nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnfScpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTQ6NzogKCAnaW1wb3J0JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE0Ojk6ICdpbXBvcnQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiaW1wb3J0Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE2IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTc7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE1Ojc6ICggJ3BlcnNwZWN0aXZlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE1Ojk6ICdwZXJzcGVjdGl2ZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJwZXJzcGVjdGl2ZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNjo3OiAoICdkZXNjcmliZWQgYnknICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTY6OTogJ2Rlc2NyaWJlZCBieScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJkZXNjcmliZWQgYnkiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xOSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xOTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTc6NzogKCAncHJvY2VzcycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNzo5OiAncHJvY2VzcycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJwcm9jZXNzIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yMCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE4Ojc6ICggJ3VzZXJ0YXNrJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE4Ojk6ICd1c2VydGFzaycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ1c2VydGFzayIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOTo3OiAoICdpY29uVVJJJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE5Ojk6ICdpY29uVVJJJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImljb25VUkkiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjA6NzogKCAnYWNjZXNzaWJpbGl0eScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMDo5OiAnYWNjZXNzaWJpbGl0eScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJhY2Nlc3NpYmlsaXR5Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzIyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yMyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIxOjc6ICggJ3Rvb2xiYXInICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjE6OTogJ3Rvb2xiYXInCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidG9vbGJhciIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzI0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzI0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMjo3OiAoICdzYXNoQ29udGFpbmVyJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIyOjk6ICdzYXNoQ29udGFpbmVyJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInNhc2hDb250YWluZXIiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzI1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yNTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjM6NzogKCAnb3JpZW50YXRpb24nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjM6OTogJ29yaWVudGF0aW9uJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIm9yaWVudGF0aW9uIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzI1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yNiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI0Ojc6ICggJ3NlbGVjdGVkRWxlbWVudCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNDo5OiAnc2VsZWN0ZWRFbGVtZW50JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInNlbGVjdGVkRWxlbWVudCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yNiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzI3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzI3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNTo3OiAoICdzcGFjZVZvbHVtZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNTo5OiAnc3BhY2VWb2x1bWUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgic3BhY2VWb2x1bWUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzI4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yOCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjY6NzogKCAncGFydFN0YWNrJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2Ojk6ICdwYXJ0U3RhY2snCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicGFydFN0YWNrIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzI4IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yOSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjk7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI3Ojc6ICggJ3BhcnQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjc6OTogJ3BhcnQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicGFydCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yOSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMzAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzMwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzMwOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyODo3OiAoICd2aWV3JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI4Ojk6ICd2aWV3JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInZpZXciKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMzAiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzMxIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18zMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18zMTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjk6NzogKCAnaXNDbG9zYWJsZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyOTo5OiAnaXNDbG9zYWJsZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJpc0Nsb3NhYmxlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzMxIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18zMiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMzI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMwOjc6ICggJ3NlbGVjdCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMDo5OiAnc2VsZWN0JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInNlbGVjdCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18zMiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMzMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzMzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzMzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMTo3OiAoICd0YWJsZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMTo5OiAndGFibGUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidGFibGUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMzMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzM0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18zNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18zNDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzI6NzogKCAnZ3JpZCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMjo5OiAnZ3JpZCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJncmlkIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzM0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18zNSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMzUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMzU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMzOjc6ICggJ2NoYXJ0JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMzOjk6ICdjaGFydCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJjaGFydCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18zNSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMzYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzM2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzM2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozNDo3OiAoICdyZXBvcnQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzQ6OTogJ3JlcG9ydCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJyZXBvcnQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMzYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzM3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18zNygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18zNzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzU6NzogKCAnb3JnYW5pZ3JhbScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozNTo5OiAnb3JnYW5pZ3JhbScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJvcmdhbmlncmFtIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzM3IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18zOCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMzgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMzg7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjM2Ojc6ICggJ3RvcG9sb2d5JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjM2Ojk6ICd0b3BvbG9neScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ0b3BvbG9neSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18zOCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMzkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzM5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzM5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozNzo3OiAoICdkaWFsb2cnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mzc6OTogJ2RpYWxvZycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJkaWFsb2ciKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMzkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzQwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX180MCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX180MDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mzg6NzogKCAnYnBtbicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozODo5OiAnYnBtbicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJicG1uIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzQwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX180MSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNDEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNDE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjM5Ojc6ICggJy4nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mzk6OTogJy4nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnLicpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNDEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzQyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX180MigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX180MjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NDA6NzogKCAnKicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo0MDo5OiAnKicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCcqJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX180MiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNDMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzQzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzQzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo0MTo3OiAoICdAJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQxOjk6ICdAJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJ0AnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzQzIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX180NCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNDQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNDQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQyOjc6ICggJygnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NDI6OTogJygnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnKCcpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNDQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzQ1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX180NSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX180NTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NDM6NzogKCAnLCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo0Mzo5OiAnLCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCcsJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX180NSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNDYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzQ2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzQ2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo0NDo3OiAoICcpJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQ0Ojk6ICcpJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJyknKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzQ2IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX180NyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNDcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNDc7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQ1Ojc6ICggJz0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NDU6OTogJz0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnPScpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNDciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzQ4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX180OCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX180ODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NDY6NzogKCAnIycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo0Njo5OiAnIycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCcjJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX180OCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNDkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzQ5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzQ5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo0Nzo3OiAoICdbJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQ3Ojk6ICdbJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJ1snKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzQ5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX181MCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNTAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNTA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQ4Ojc6ICggJ10nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NDg6OTogJ10nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnXScpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNTAiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzUxIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX181MSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX181MTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NDk6NzogKCAnKz0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NDk6OTogJys9JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIis9Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzUxIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX181MiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNTIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNTI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjUwOjc6ICggJy09JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjUwOjk6ICctPScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCItPSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181MiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNTMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzUzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzUzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo1MTo3OiAoICcqPScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo1MTo5OiAnKj0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiKj0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNTMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzU0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX181NCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX181NDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTI6NzogKCAnLz0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTI6OTogJy89JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIi89Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzU0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX181NSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNTUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNTU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjUzOjc6ICggJyU9JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjUzOjk6ICclPScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIlPSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181NSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNTYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzU2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzU2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo1NDo3OiAoICc8JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjU0Ojk6ICc8JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJzwnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzU2IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX181NyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNTcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNTc7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjU1Ojc6ICggJz4nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTU6OTogJz4nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnPicpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNTciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzU4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX181OCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX181ODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTY6NzogKCAnPj0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTY6OTogJz49JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIj49Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzU4IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX181OSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNTkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNTk7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjU3Ojc6ICggJ3x8JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjU3Ojk6ICd8fCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ8fCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181OSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNjAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzYwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzYwOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo1ODo3OiAoICcmJicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo1ODo5OiAnJiYnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiJiYiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNjAiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzYxIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX182MSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182MTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTk6NzogKCAnPT0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTk6OTogJz09JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIj09Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzYxIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX182MiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNjIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNjI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjYwOjc6ICggJyE9JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjYwOjk6ICchPScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIhPSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX182MiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNjMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzYzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzYzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo2MTo3OiAoICc9PT0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjE6OTogJz09PScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCI9PT0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNjMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzY0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX182NCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182NDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjI6NzogKCAnIT09JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjYyOjk6ICchPT0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiIT09Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzY0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX182NSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNjUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNjU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjYzOjc6ICggJ2luc3RhbmNlb2YnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjM6OTogJ2luc3RhbmNlb2YnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiaW5zdGFuY2VvZiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX182NSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNjYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzY2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzY2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo2NDo3OiAoICctPicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo2NDo5OiAnLT4nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiLT4iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNjYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzY3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX182NygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182NzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjU6NzogKCAnLi48JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjY1Ojk6ICcuLjwnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiLi48Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzY3IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX182OCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNjgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNjg7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjY2Ojc6ICggJy4uJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjY2Ojk6ICcuLicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIuLiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX182OCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNjkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzY5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzY5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo2Nzo3OiAoICc9PicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo2Nzo5OiAnPT4nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiPT4iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNjkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzcwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX183MCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183MDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Njg6NzogKCAnPD4nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Njg6OTogJzw+JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIjw+Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzcwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX183MSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNzE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjY5Ojc6ICggJz86JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjY5Ojk6ICc/OicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCI/OiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX183MSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNzIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzcyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzcyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo3MDo3OiAoICcrJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjcwOjk6ICcrJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJysnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzcyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX183MyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNzM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjcxOjc6ICggJy0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NzE6OTogJy0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnLScpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNzMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzc0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX183NCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183NDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NzI6NzogKCAnKionICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NzI6OTogJyoqJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIioqIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzc0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX183NSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNzUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNzU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjczOjc6ICggJy8nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NzM6OTogJy8nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnLycpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNzUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzc2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX183NigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183NjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NzQ6NzogKCAnJScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo3NDo5OiAnJScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCclJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX183NiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNzciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzc3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzc3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo3NTo3OiAoICchJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjc1Ojk6ICchJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJyEnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzc3IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX183OCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNzgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNzg7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjc2Ojc6ICggJ2FzJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjc2Ojk6ICdhcycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJhcyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX183OCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNzkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzc5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzc5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo3Nzo3OiAoICcrKycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo3Nzo5OiAnKysnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiKysiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNzkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzgwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX184MCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184MDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Nzg6NzogKCAnLS0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Nzg6OTogJy0tJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIi0tIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzgwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX184MSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fODEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjc5Ojc6ICggJzo6JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjc5Ojk6ICc6OicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCI6OiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX184MSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fODIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzgyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzgyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4MDo3OiAoICc/LicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4MDo5OiAnPy4nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiPy4iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fODIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzgzIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX184MygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184MzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODE6NzogKCAnfCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4MTo5OiAnfCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCd8Jyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX184MyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fODQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzg0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzg0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4Mjo3OiAoICc7JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgyOjk6ICc7JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJzsnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzg0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX184NSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fODUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgzOjc6ICggJ2lmJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgzOjk6ICdpZicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJpZiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX184NSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fODYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzg2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzg2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4NDo3OiAoICdlbHNlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjg0Ojk6ICdlbHNlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImVsc2UiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fODYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzg3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX184NygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184NzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODU6NzogKCAnc3dpdGNoJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjg1Ojk6ICdzd2l0Y2gnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgic3dpdGNoIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzg3IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX184OCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fODgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODg7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjg2Ojc6ICggJzonICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODY6OTogJzonCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnOicpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fODgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzg5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX184OSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184OTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODc6NzogKCAnZGVmYXVsdCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4Nzo5OiAnZGVmYXVsdCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJkZWZhdWx0Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzg5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX185MCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fOTAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjg4Ojc6ICggJ2Nhc2UnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODg6OTogJ2Nhc2UnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiY2FzZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX185MCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fOTEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzkxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzkxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4OTo3OiAoICdmb3InICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODk6OTogJ2ZvcicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJmb3IiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fOTEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzkyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX185MigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX185MjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6OTA6NzogKCAnd2hpbGUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6OTA6OTogJ3doaWxlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIndoaWxlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzkyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX185MyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fOTMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjkxOjc6ICggJ2RvJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjkxOjk6ICdkbycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJkbyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX185MyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fOTQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzk0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzk0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo5Mjo3OiAoICd2YXInICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6OTI6OTogJ3ZhcicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ2YXIiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fOTQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzk1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX185NSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX185NTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6OTM6NzogKCAndmFsJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjkzOjk6ICd2YWwnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidmFsIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzk1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX185NiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fOTYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjk0Ojc6ICggJ2V4dGVuZHMnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6OTQ6OTogJ2V4dGVuZHMnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZXh0ZW5kcyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX185NiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fOTciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzk3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzk3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo5NTo3OiAoICdzdGF0aWMnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6OTU6OTogJ3N0YXRpYycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJzdGF0aWMiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fOTciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzk4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX185OCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX185ODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6OTY6NzogKCAnZXh0ZW5zaW9uJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjk2Ojk6ICdleHRlbnNpb24nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZXh0ZW5zaW9uIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzk4IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX185OSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fOTkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTk7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjk3Ojc6ICggJ3N1cGVyJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjk3Ojk6ICdzdXBlcicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJzdXBlciIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX185OSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTAwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMDAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTAwOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo5ODo4OiAoICduZXcnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6OTg6MTA6ICduZXcnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgibmV3Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEwMCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTAxIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMDEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTAxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo5OTo4OiAoICdmYWxzZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo5OToxMDogJ2ZhbHNlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImZhbHNlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEwMSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTAyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMDIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTAyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDA6ODogKCAndHJ1ZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDA6MTA6ICd0cnVlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInRydWUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTAyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMDMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEwMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwMTo4OiAoICdudWxsJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwMToxMDogJ251bGwnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgibnVsbCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMDMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEwNCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTA0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEwNDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTAyOjg6ICggJ3R5cGVvZicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDI6MTA6ICd0eXBlb2YnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidHlwZW9mIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEwNCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTA1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMDUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTA1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDM6ODogKCAndGhyb3cnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTAzOjEwOiAndGhyb3cnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidGhyb3ciKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTA1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMDYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEwNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwNDo4OiAoICdyZXR1cm4nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTA0OjEwOiAncmV0dXJuJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInJldHVybiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMDYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEwNyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTA3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEwNzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTA1Ojg6ICggJ3RyeScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDU6MTA6ICd0cnknCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidHJ5Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEwNyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTA4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMDgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTA4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDY6ODogKCAnZmluYWxseScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDY6MTA6ICdmaW5hbGx5JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImZpbmFsbHkiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTA4IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMDkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEwOSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDk7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwNzo4OiAoICdzeW5jaHJvbml6ZWQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTA3OjEwOiAnc3luY2hyb25pemVkJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInN5bmNocm9uaXplZCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMDkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzExMCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTEwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzExMDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTA4Ojg6ICggJ2NhdGNoJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwODoxMDogJ2NhdGNoJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImNhdGNoIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzExMCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTExIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMTEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTExOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDk6ODogKCAnPycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDk6MTA6ICc/JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJz8nKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzExMSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTEyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMTIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTEyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMTA6ODogKCAnJicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMTA6MTA6ICcmJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJyYnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzExMiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTEzIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMTMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTEzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMTE6ODogKCAnaG9yaXpvbnRhbCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMTE6MTA6ICdob3Jpem9udGFsJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImhvcml6b250YWwiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTEzIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMTQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzExNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMTQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjExMjo4OiAoICd2ZXJ0aWNhbCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMTI6MTA6ICd2ZXJ0aWNhbCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ2ZXJ0aWNhbCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMTQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlJVTEVfSEVYIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1SVUxFX0hFWCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX0hFWDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODIzNzoxMDogKCAoICcweCcgfCAnMFgnICkgKCAnMCcgLi4gJzknIHwgJ2EnIC4uICdmJyB8ICdBJyAuLiAnRicgfCAnXycgKSsgKCAnIycgKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkgfCAoICdsJyB8ICdMJyApICkgKT8gKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4MjM3OjEyOiAoICcweCcgfCAnMFgnICkgKCAnMCcgLi4gJzknIHwgJ2EnIC4uICdmJyB8ICdBJyAuLiAnRicgfCAnXycgKSsgKCAnIycgKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkgfCAoICdsJyB8ICdMJyApICkgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODIzNzoxMjogKCAnMHgnIHwgJzBYJyApCisgICAgICAgICAgICBpbnQgYWx0MT0yOworICAgICAgICAgICAgaW50IExBMV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBMV8wPT0nMCcpICkgeworICAgICAgICAgICAgICAgIGludCBMQTFfMSA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEExXzE9PSd4JykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDE9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTFfMT09J1gnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MT0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDEsIDEsIGlucHV0KTsKKworICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDEsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDEpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgyMzc6MTM6ICcweCcKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXRjaCgiMHgiKTsgCisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODIzNzoxODogJzBYJworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoKCIwWCIpOyAKKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4MjM3OjI0OiAoICcwJyAuLiAnOScgfCAnYScgLi4gJ2YnIHwgJ0EnIC4uICdGJyB8ICdfJyApKworICAgICAgICAgICAgaW50IGNudDI9MDsKKyAgICAgICAgICAgIGxvb3AyOgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQyPTI7CisgICAgICAgICAgICAgICAgaW50IExBMl8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoICgoTEEyXzA+PScwJyAmJiBMQTJfMDw9JzknKXx8KExBMl8wPj0nQScgJiYgTEEyXzA8PSdGJyl8fExBMl8wPT0nXyd8fChMQTJfMD49J2EnICYmIExBMl8wPD0nZicpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0Mj0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQyKSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIChpbnB1dC5MQSgxKT49JzAnICYmIGlucHV0LkxBKDEpPD0nOScpfHwoaW5wdXQuTEEoMSk+PSdBJyAmJiBpbnB1dC5MQSgxKTw9J0YnKXx8aW5wdXQuTEEoMSk9PSdfJ3x8KGlucHV0LkxBKDEpPj0nYScgJiYgaW5wdXQuTEEoMSk8PSdmJykgKSB7CisgICAgICAgICAgICAJICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBlbHNlIHsKKyAgICAgICAgICAgIAkgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAJICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBtc2U7fQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBpZiAoIGNudDIgPj0gMSApIGJyZWFrIGxvb3AyOworICAgICAgICAgICAgICAgICAgICAgICAgRWFybHlFeGl0RXhjZXB0aW9uIGVlZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVhcmx5RXhpdEV4Y2VwdGlvbigyLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlZWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNudDIrKzsKKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgyMzc6NTg6ICggJyMnICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyApIHwgKCAnbCcgfCAnTCcgKSApICk/CisgICAgICAgICAgICBpbnQgYWx0ND0yOworICAgICAgICAgICAgaW50IExBNF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBNF8wPT0nIycpICkgeworICAgICAgICAgICAgICAgIGFsdDQ9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NCkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODIzNzo1OTogJyMnICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyApIHwgKCAnbCcgfCAnTCcgKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goJyMnKTsgCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODIzNzo2MzogKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkgfCAoICdsJyB8ICdMJyApICkKKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdDM9MjsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBM18wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEEzXzA9PSdCJ3x8TEEzXzA9PSdiJykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTNfMD09J0wnfHxMQTNfMD09J2wnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM9MjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMywgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgyMzc6NjQ6ICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGlucHV0LkxBKDEpPT0nQid8fGlucHV0LkxBKDEpPT0nYicgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBtc2U7fQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbnB1dC5MQSgxKT09J0knfHxpbnB1dC5MQSgxKT09J2knICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbXNlO30KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgyMzc6ODQ6ICggJ2wnIHwgJ0wnICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbnB1dC5MQSgxKT09J0wnfHxpbnB1dC5MQSgxKT09J2wnICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbXNlO30KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJSVUxFX0hFWCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiUlVMRV9JTlQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVJVTEVfSU5UKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFJVTEVfSU5UOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4MjM5OjEwOiAoICcwJyAuLiAnOScgKCAnMCcgLi4gJzknIHwgJ18nICkqICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODIzOToxMjogJzAnIC4uICc5JyAoICcwJyAuLiAnOScgfCAnXycgKSoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoUmFuZ2UoJzAnLCc5Jyk7IAorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4MjM5OjIxOiAoICcwJyAuLiAnOScgfCAnXycgKSoKKyAgICAgICAgICAgIGxvb3A1OgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQ1PTI7CisgICAgICAgICAgICAgICAgaW50IExBNV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoICgoTEE1XzA+PScwJyAmJiBMQTVfMDw9JzknKXx8TEE1XzA9PSdfJykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDU9MTsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NSkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6CisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAoaW5wdXQuTEEoMSk+PScwJyAmJiBpbnB1dC5MQSgxKTw9JzknKXx8aW5wdXQuTEEoMSk9PSdfJyApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGVsc2UgeworICAgICAgICAgICAgCSAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgIAkgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG1zZTt9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3A1OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlJVTEVfSU5UIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJSVUxFX0RFQ0lNQUwiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVJVTEVfREVDSU1BTCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX0RFQ0lNQUw7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgyNDE6MTQ6ICggUlVMRV9JTlQgKCAoICdlJyB8ICdFJyApICggJysnIHwgJy0nICk/IFJVTEVfSU5UICk/ICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyB8ICdkJyB8ICdEJyApIHwgKCAnbCcgfCAnTCcgfCAnZCcgfCAnRCcgfCAnZicgfCAnRicgKSApPyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgyNDE6MTY6IFJVTEVfSU5UICggKCAnZScgfCAnRScgKSAoICcrJyB8ICctJyApPyBSVUxFX0lOVCApPyAoICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgfCAnZCcgfCAnRCcgKSB8ICggJ2wnIHwgJ0wnIHwgJ2QnIHwgJ0QnIHwgJ2YnIHwgJ0YnICkgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1SVUxFX0lOVCgpOyAKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODI0MToyNTogKCAoICdlJyB8ICdFJyApICggJysnIHwgJy0nICk/IFJVTEVfSU5UICk/CisgICAgICAgICAgICBpbnQgYWx0Nz0yOworICAgICAgICAgICAgaW50IExBN18wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBN18wPT0nRSd8fExBN18wPT0nZScpICkgeworICAgICAgICAgICAgICAgIGFsdDc9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NykgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODI0MToyNjogKCAnZScgfCAnRScgKSAoICcrJyB8ICctJyApPyBSVUxFX0lOVAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggaW5wdXQuTEEoMSk9PSdFJ3x8aW5wdXQuTEEoMSk9PSdlJyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG1zZTt9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4MjQxOjM2OiAoICcrJyB8ICctJyApPworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0Nj0yOworICAgICAgICAgICAgICAgICAgICBpbnQgTEE2XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTZfMD09JysnfHxMQTZfMD09Jy0nKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbnB1dC5MQSgxKT09JysnfHxpbnB1dC5MQSgxKT09Jy0nICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbXNlO30KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBtUlVMRV9JTlQoKTsgCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgyNDE6NTg6ICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyB8ICdkJyB8ICdEJyApIHwgKCAnbCcgfCAnTCcgfCAnZCcgfCAnRCcgfCAnZicgfCAnRicgKSApPworICAgICAgICAgICAgaW50IGFsdDg9MzsKKyAgICAgICAgICAgIGludCBMQThfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQThfMD09J0InfHxMQThfMD09J2InKSApIHsKKyAgICAgICAgICAgICAgICBhbHQ4PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggKExBOF8wPT0nRCd8fExBOF8wPT0nRid8fExBOF8wPT0nTCd8fExBOF8wPT0nZCd8fExBOF8wPT0nZid8fExBOF8wPT0nbCcpICkgeworICAgICAgICAgICAgICAgIGFsdDg9MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0OCkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODI0MTo1OTogKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyB8ICdkJyB8ICdEJyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBpbnB1dC5MQSgxKT09J0InfHxpbnB1dC5MQSgxKT09J2InICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbXNlO30KKworICAgICAgICAgICAgICAgICAgICBpZiAoIGlucHV0LkxBKDEpPT0nRCd8fGlucHV0LkxBKDEpPT0nSSd8fGlucHV0LkxBKDEpPT0nZCd8fGlucHV0LkxBKDEpPT0naScgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBtc2U7fQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgyNDE6ODc6ICggJ2wnIHwgJ0wnIHwgJ2QnIHwgJ0QnIHwgJ2YnIHwgJ0YnICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIGlucHV0LkxBKDEpPT0nRCd8fGlucHV0LkxBKDEpPT0nRid8fGlucHV0LkxBKDEpPT0nTCd8fGlucHV0LkxBKDEpPT0nZCd8fGlucHV0LkxBKDEpPT0nZid8fGlucHV0LkxBKDEpPT0nbCcgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBtc2U7fQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlJVTEVfREVDSU1BTCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiUlVMRV9JRCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtUlVMRV9JRCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX0lEOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4MjQzOjk6ICggKCAnXicgKT8gKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICckJyB8ICdfJyApICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnJCcgfCAnXycgfCAnMCcgLi4gJzknICkqICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODI0MzoxMTogKCAnXicgKT8gKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICckJyB8ICdfJyApICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnJCcgfCAnXycgfCAnMCcgLi4gJzknICkqCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgyNDM6MTE6ICggJ14nICk/CisgICAgICAgICAgICBpbnQgYWx0OT0yOworICAgICAgICAgICAgaW50IExBOV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBOV8wPT0nXicpICkgeworICAgICAgICAgICAgICAgIGFsdDk9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0OSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODI0MzoxMTogJ14nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goJ14nKTsgCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGlucHV0LkxBKDEpPT0nJCd8fChpbnB1dC5MQSgxKT49J0EnICYmIGlucHV0LkxBKDEpPD0nWicpfHxpbnB1dC5MQSgxKT09J18nfHwoaW5wdXQuTEEoMSk+PSdhJyAmJiBpbnB1dC5MQSgxKTw9J3onKSApIHsKKyAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgICAgIHRocm93IG1zZTt9CisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODI0Mzo0NDogKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICckJyB8ICdfJyB8ICcwJyAuLiAnOScgKSoKKyAgICAgICAgICAgIGxvb3AxMDoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTA9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExMF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTEwXzA9PSckJ3x8KExBMTBfMD49JzAnICYmIExBMTBfMDw9JzknKXx8KExBMTBfMD49J0EnICYmIExBMTBfMDw9J1onKXx8TEExMF8wPT0nXyd8fChMQTEwXzA+PSdhJyAmJiBMQTEwXzA8PSd6JykpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxMD0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMCkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6CisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBpbnB1dC5MQSgxKT09JyQnfHwoaW5wdXQuTEEoMSk+PScwJyAmJiBpbnB1dC5MQSgxKTw9JzknKXx8KGlucHV0LkxBKDEpPj0nQScgJiYgaW5wdXQuTEEoMSk8PSdaJyl8fGlucHV0LkxBKDEpPT0nXyd8fChpbnB1dC5MQSgxKT49J2EnICYmIGlucHV0LkxBKDEpPD0neicpICkgeworICAgICAgICAgICAgCSAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgZWxzZSB7CisgICAgICAgICAgICAJICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgCSAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbXNlO30KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDEwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlJVTEVfSUQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlJVTEVfU1RSSU5HIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1SVUxFX1NUUklORygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX1NUUklORzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODI0NToxMzogKCAoICdcIicgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcIicgKSApICkqICggJ1wiJyApPyB8ICdcXCcnICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkgKSogKCAnXFwnJyApPyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODI0NToxNTogKCAnXCInICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXCInICkgKSApKiAoICdcIicgKT8gfCAnXFwnJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1xcJycgKSApICkqICggJ1xcJycgKT8gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4MjQ1OjE1OiAoICdcIicgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcIicgKSApICkqICggJ1wiJyApPyB8ICdcXCcnICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkgKSogKCAnXFwnJyApPyApCisgICAgICAgICAgICBpbnQgYWx0MTU9MjsKKyAgICAgICAgICAgIGludCBMQTE1XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoTEExNV8wPT0nXCInKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxNT0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIChMQTE1XzA9PSdcJycpICkgeworICAgICAgICAgICAgICAgIGFsdDE1PTI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxNSwgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgyNDU6MTY6ICdcIicgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcIicgKSApICkqICggJ1wiJyApPworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoKCdcIicpOyAKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4MjQ1OjIwOiAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1wiJyApICkgKSoKKyAgICAgICAgICAgICAgICAgICAgbG9vcDExOgorICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTE9MzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTExXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExMV8wPT0nXFwnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQxMT0xOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoTEExMV8wPj0nXHUwMDAwJyAmJiBMQTExXzA8PSchJyl8fChMQTExXzA+PScjJyAmJiBMQTExXzA8PSdbJyl8fChMQTExXzA+PSddJyAmJiBMQTExXzA8PSdcdUZGRkYnKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTE9MjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDExKSB7CisgICAgICAgICAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODI0NToyMTogJ1xcXFwnIC4KKyAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgbWF0Y2goJ1xcJyk7IAorICAgICAgICAgICAgICAgICAgICAJICAgIG1hdGNoQW55KCk7IAorCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAJY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgyNDU6Mjg6IH4gKCAoICdcXFxcJyB8ICdcIicgKSApCisgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggKGlucHV0LkxBKDEpPj0nXHUwMDAwJyAmJiBpbnB1dC5MQSgxKTw9JyEnKXx8KGlucHV0LkxBKDEpPj0nIycgJiYgaW5wdXQuTEEoMSk8PSdbJyl8fChpbnB1dC5MQSgxKT49J10nICYmIGlucHV0LkxBKDEpPD0nXHVGRkZGJykgKSB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCSAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgICAgICAgICAJICAgICAgICB0aHJvdyBtc2U7fQorCisKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4MjQ1OjQ0OiAoICdcIicgKT8KKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdDEyPTI7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTEyXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTEyXzA9PSdcIicpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTI9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODI0NTo0NDogJ1wiJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCgnXCInKTsgCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgyNDU6NDk6ICdcXCcnICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkgKSogKCAnXFwnJyApPworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoKCdcJycpOyAKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4MjQ1OjU0OiAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1xcJycgKSApICkqCisgICAgICAgICAgICAgICAgICAgIGxvb3AxMzoKKyAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDEzPTM7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExM18wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBMTNfMD09J1xcJykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTM9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBMTNfMD49J1x1MDAwMCcgJiYgTEExM18wPD0nJicpfHwoTEExM18wPj0nKCcgJiYgTEExM18wPD0nWycpfHwoTEExM18wPj0nXScgJiYgTEExM18wPD0nXHVGRkZGJykpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDEzPTI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMykgeworICAgICAgICAgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgyNDU6NTU6ICdcXFxcJyAuCisgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAJICAgIG1hdGNoKCdcXCcpOyAKKyAgICAgICAgICAgICAgICAgICAgCSAgICBtYXRjaEFueSgpOyAKKworICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCWNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4MjQ1OjYyOiB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCAoaW5wdXQuTEEoMSk+PSdcdTAwMDAnICYmIGlucHV0LkxBKDEpPD0nJicpfHwoaW5wdXQuTEEoMSk+PScoJyAmJiBpbnB1dC5MQSgxKTw9J1snKXx8KGlucHV0LkxBKDEpPj0nXScgJiYgaW5wdXQuTEEoMSk8PSdcdUZGRkYnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAJICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAJICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIHRocm93IG1zZTt9CisKKworICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDEzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgyNDU6Nzk6ICggJ1xcJycgKT8KKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdDE0PTI7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTE0XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTE0XzA9PSdcJycpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTQ9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODI0NTo3OTogJ1xcJycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2goJ1wnJyk7IAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJSVUxFX1NUUklORyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiUlVMRV9NTF9DT01NRU5UIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1SVUxFX01MX0NPTU1FTlQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9NTF9DT01NRU5UOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4MjQ3OjE3OiAoICcvKicgKCBvcHRpb25zIHtncmVlZHk9ZmFsc2U7IH0gOiAuICkqICcqLycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4MjQ3OjE5OiAnLyonICggb3B0aW9ucyB7Z3JlZWR5PWZhbHNlOyB9IDogLiApKiAnKi8nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiLyoiKTsgCisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODI0NzoyNDogKCBvcHRpb25zIHtncmVlZHk9ZmFsc2U7IH0gOiAuICkqCisgICAgICAgICAgICBsb29wMTY6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDE2PTI7CisgICAgICAgICAgICAgICAgaW50IExBMTZfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEExNl8wPT0nKicpICkgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEExNl8xID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExNl8xPT0nLycpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTY9MjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKChMQTE2XzE+PSdcdTAwMDAnICYmIExBMTZfMTw9Jy4nKXx8KExBMTZfMT49JzAnICYmIExBMTZfMTw9J1x1RkZGRicpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDE2PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBMTZfMD49J1x1MDAwMCcgJiYgTEExNl8wPD0nKScpfHwoTEExNl8wPj0nKycgJiYgTEExNl8wPD0nXHVGRkZGJykpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxNj0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNikgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODI0Nzo1MjogLgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIG1hdGNoQW55KCk7IAorCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDE2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICBtYXRjaCgiKi8iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiUlVMRV9NTF9DT01NRU5UIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJSVUxFX1NMX0NPTU1FTlQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVJVTEVfU0xfQ09NTUVOVCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX1NMX0NPTU1FTlQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgyNDk6MTc6ICggJy8vJyAofiAoICggJ1xcbicgfCAnXFxyJyApICkgKSogKCAoICdcXHInICk/ICdcXG4nICk/ICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODI0OToxOTogJy8vJyAofiAoICggJ1xcbicgfCAnXFxyJyApICkgKSogKCAoICdcXHInICk/ICdcXG4nICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiLy8iKTsgCisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODI0OToyNDogKH4gKCAoICdcXG4nIHwgJ1xccicgKSApICkqCisgICAgICAgICAgICBsb29wMTc6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDE3PTI7CisgICAgICAgICAgICAgICAgaW50IExBMTdfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgaWYgKCAoKExBMTdfMD49J1x1MDAwMCcgJiYgTEExN18wPD0nXHQnKXx8KExBMTdfMD49J1x1MDAwQicgJiYgTEExN18wPD0nXGYnKXx8KExBMTdfMD49J1x1MDAwRScgJiYgTEExN18wPD0nXHVGRkZGJykpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxNz0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNykgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODI0OToyNDogfiAoICggJ1xcbicgfCAnXFxyJyApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIChpbnB1dC5MQSgxKT49J1x1MDAwMCcgJiYgaW5wdXQuTEEoMSk8PSdcdCcpfHwoaW5wdXQuTEEoMSk+PSdcdTAwMEInICYmIGlucHV0LkxBKDEpPD0nXGYnKXx8KGlucHV0LkxBKDEpPj0nXHUwMDBFJyAmJiBpbnB1dC5MQSgxKTw9J1x1RkZGRicpICkgeworICAgICAgICAgICAgCSAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgZWxzZSB7CisgICAgICAgICAgICAJICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgCSAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbXNlO30KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDE3OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgyNDk6NDA6ICggKCAnXFxyJyApPyAnXFxuJyApPworICAgICAgICAgICAgaW50IGFsdDE5PTI7CisgICAgICAgICAgICBpbnQgTEExOV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBMTlfMD09J1xuJ3x8TEExOV8wPT0nXHInKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxOT0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQxOSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODI0OTo0MTogKCAnXFxyJyApPyAnXFxuJworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODI0OTo0MTogKCAnXFxyJyApPworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTg9MjsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBMThfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKExBMThfMD09J1xyJykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQxOD0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4MjQ5OjQxOiAnXFxyJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCgnXHInKTsgCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG1hdGNoKCdcbicpOyAKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiUlVMRV9TTF9DT01NRU5UIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJSVUxFX1dTIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1SVUxFX1dTKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFJVTEVfV1M7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgyNTE6OTogKCAoICcgJyB8ICdcXHQnIHwgJ1xccicgfCAnXFxuJyApKyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgyNTE6MTE6ICggJyAnIHwgJ1xcdCcgfCAnXFxyJyB8ICdcXG4nICkrCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgyNTE6MTE6ICggJyAnIHwgJ1xcdCcgfCAnXFxyJyB8ICdcXG4nICkrCisgICAgICAgICAgICBpbnQgY250MjA9MDsKKyAgICAgICAgICAgIGxvb3AyMDoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MjA9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEEyMF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoICgoTEEyMF8wPj0nXHQnICYmIExBMjBfMDw9J1xuJyl8fExBMjBfMD09J1xyJ3x8TEEyMF8wPT0nICcpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQyMD0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQyMCkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6CisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAoaW5wdXQuTEEoMSk+PSdcdCcgJiYgaW5wdXQuTEEoMSk8PSdcbicpfHxpbnB1dC5MQSgxKT09J1xyJ3x8aW5wdXQuTEEoMSk9PScgJyApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGVsc2UgeworICAgICAgICAgICAgCSAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgIAkgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG1zZTt9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGlmICggY250MjAgPj0gMSApIGJyZWFrIGxvb3AyMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVhcmx5RXhpdEV4Y2VwdGlvbiBlZWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFYXJseUV4aXRFeGNlcHRpb24oMjAsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVlZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY250MjArKzsKKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlJVTEVfV1MiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlJVTEVfQU5ZX09USEVSIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1SVUxFX0FOWV9PVEhFUigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX0FOWV9PVEhFUjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODI1MzoxNjogKCAuICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODI1MzoxODogLgorICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2hBbnkoKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlJVTEVfQU5ZX09USEVSIgorCisgICAgcHVibGljIHZvaWQgbVRva2VucygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTo4OiAoIFRfXzEzIHwgVF9fMTQgfCBUX18xNSB8IFRfXzE2IHwgVF9fMTcgfCBUX18xOCB8IFRfXzE5IHwgVF9fMjAgfCBUX18yMSB8IFRfXzIyIHwgVF9fMjMgfCBUX18yNCB8IFRfXzI1IHwgVF9fMjYgfCBUX18yNyB8IFRfXzI4IHwgVF9fMjkgfCBUX18zMCB8IFRfXzMxIHwgVF9fMzIgfCBUX18zMyB8IFRfXzM0IHwgVF9fMzUgfCBUX18zNiB8IFRfXzM3IHwgVF9fMzggfCBUX18zOSB8IFRfXzQwIHwgVF9fNDEgfCBUX180MiB8IFRfXzQzIHwgVF9fNDQgfCBUX180NSB8IFRfXzQ2IHwgVF9fNDcgfCBUX180OCB8IFRfXzQ5IHwgVF9fNTAgfCBUX181MSB8IFRfXzUyIHwgVF9fNTMgfCBUX181NCB8IFRfXzU1IHwgVF9fNTYgfCBUX181NyB8IFRfXzU4IHwgVF9fNTkgfCBUX182MCB8IFRfXzYxIHwgVF9fNjIgfCBUX182MyB8IFRfXzY0IHwgVF9fNjUgfCBUX182NiB8IFRfXzY3IHwgVF9fNjggfCBUX182OSB8IFRfXzcwIHwgVF9fNzEgfCBUX183MiB8IFRfXzczIHwgVF9fNzQgfCBUX183NSB8IFRfXzc2IHwgVF9fNzcgfCBUX183OCB8IFRfXzc5IHwgVF9fODAgfCBUX184MSB8IFRfXzgyIHwgVF9fODMgfCBUX184NCB8IFRfXzg1IHwgVF9fODYgfCBUX184NyB8IFRfXzg4IHwgVF9fODkgfCBUX185MCB8IFRfXzkxIHwgVF9fOTIgfCBUX185MyB8IFRfXzk0IHwgVF9fOTUgfCBUX185NiB8IFRfXzk3IHwgVF9fOTggfCBUX185OSB8IFRfXzEwMCB8IFRfXzEwMSB8IFRfXzEwMiB8IFRfXzEwMyB8IFRfXzEwNCB8IFRfXzEwNSB8IFRfXzEwNiB8IFRfXzEwNyB8IFRfXzEwOCB8IFRfXzEwOSB8IFRfXzExMCB8IFRfXzExMSB8IFRfXzExMiB8IFRfXzExMyB8IFRfXzExNCB8IFJVTEVfSEVYIHwgUlVMRV9JTlQgfCBSVUxFX0RFQ0lNQUwgfCBSVUxFX0lEIHwgUlVMRV9TVFJJTkcgfCBSVUxFX01MX0NPTU1FTlQgfCBSVUxFX1NMX0NPTU1FTlQgfCBSVUxFX1dTIHwgUlVMRV9BTllfT1RIRVIgKQorICAgICAgICBpbnQgYWx0MjE9MTExOworICAgICAgICBhbHQyMSA9IGRmYTIxLnByZWRpY3QoaW5wdXQpOworICAgICAgICBzd2l0Y2ggKGFsdDIxKSB7CisgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MToxMDogVF9fMTMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MTY6IFRfXzE0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjIyOiBUX18xNQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MToyODogVF9fMTYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MzQ6IFRfXzE3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjQwOiBUX18xOAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTo0NjogVF9fMTkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NTI6IFRfXzIwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjU4OiBUX18yMQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NjQ6IFRfXzIyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTo3MDogVF9fMjMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjc2OiBUX18yNAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6ODI6IFRfXzI1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yNSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTo4ODogVF9fMjYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzI2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjk0OiBUX18yNworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MTAwOiBUX18yOAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MTA2OiBUX18yOQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MTEyOiBUX18zMAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMzAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MTE4OiBUX18zMQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMzEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MTI0OiBUX18zMgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMzIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MTMwOiBUX18zMworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMzMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MTM2OiBUX18zNAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMzQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MTQyOiBUX18zNQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMzUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MTQ4OiBUX18zNgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMzYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MTU0OiBUX18zNworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMzcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MTYwOiBUX18zOAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMzgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MTY2OiBUX18zOQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMzkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MTcyOiBUX180MAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNDAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MTc4OiBUX180MQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNDEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MTg0OiBUX180MgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNDIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MTkwOiBUX180MworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNDMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MTk2OiBUX180NAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNDQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MjAyOiBUX180NQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNDUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MjA4OiBUX180NgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNDYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MjE0OiBUX180NworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNDcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MjIwOiBUX180OAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNDgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MjI2OiBUX180OQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNDkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MjMyOiBUX181MAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNTAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MjM4OiBUX181MQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNTEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MjQ0OiBUX181MgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNTIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MjUwOiBUX181MworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNTMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MjU2OiBUX181NAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNTQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MjYyOiBUX181NQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNTUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MjY4OiBUX181NgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNTYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6Mjc0OiBUX181NworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNTcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MjgwOiBUX181OAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNTgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6Mjg2OiBUX181OQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNTkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MjkyOiBUX182MAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNjAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6Mjk4OiBUX182MQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNjEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDUwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MzA0OiBUX182MgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNjIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDUxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MzEwOiBUX182MworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNjMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDUyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MzE2OiBUX182NAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNjQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDUzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MzIyOiBUX182NQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNjUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MzI4OiBUX182NgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNjYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MzM0OiBUX182NworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNjcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MzQwOiBUX182OAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNjgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MzQ2OiBUX182OQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNjkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MzUyOiBUX183MAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNzAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MzU4OiBUX183MQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNzEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDYwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MzY0OiBUX183MgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNzIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDYxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MzcwOiBUX183MworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNzMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDYyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6Mzc2OiBUX183NAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNzQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDYzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6MzgyOiBUX183NQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNzUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6Mzg4OiBUX183NgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNzYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6Mzk0OiBUX183NworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNzcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NDAwOiBUX183OAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNzgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NDA2OiBUX183OQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNzkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NDEyOiBUX184MAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fODAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NDE4OiBUX184MQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fODEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDcwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NDI0OiBUX184MgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fODIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDcxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NDMwOiBUX184MworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fODMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDcyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NDM2OiBUX184NAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fODQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDczIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NDQyOiBUX184NQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fODUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NDQ4OiBUX184NgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fODYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NDU0OiBUX184NworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fODcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NDYwOiBUX184OAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fODgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NDY2OiBUX184OQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fODkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NDcyOiBUX185MAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fOTAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NDc4OiBUX185MQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fOTEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDgwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NDg0OiBUX185MgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fOTIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDgxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NDkwOiBUX185MworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fOTMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDgyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NDk2OiBUX185NAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fOTQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDgzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NTAyOiBUX185NQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fOTUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDg0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NTA4OiBUX185NgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fOTYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDg1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NTE0OiBUX185NworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fOTcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDg2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NTIwOiBUX185OAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fOTgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDg3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NTI2OiBUX185OQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fOTkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDg4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NTMyOiBUX18xMDAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEwMCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTo1Mzk6IFRfXzEwMQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTAxKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA5MCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjU0NjogVF9fMTAyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMDIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDkxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NTUzOiBUX18xMDMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEwMygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTo1NjA6IFRfXzEwNAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTA0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA5MyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjU2NzogVF9fMTA1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMDUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDk0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NTc0OiBUX18xMDYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEwNigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTo1ODE6IFRfXzEwNworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTA3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA5NiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjU4ODogVF9fMTA4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMDgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDk3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NTk1OiBUX18xMDkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEwOSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTo2MDI6IFRfXzExMAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTEwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA5OSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjYwOTogVF9fMTExCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMTEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwMCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjYxNjogVF9fMTEyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMTIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwMSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjYyMzogVF9fMTEzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMTMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwMiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjYzMDogVF9fMTE0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMTQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwMyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOjYzNzogUlVMRV9IRVgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfSEVYKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTo2NDY6IFJVTEVfSU5UCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1SVUxFX0lOVCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTA1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NjU1OiBSVUxFX0RFQ0lNQUwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfREVDSU1BTCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTA2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NjY4OiBSVUxFX0lECisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1SVUxFX0lEKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTo2NzY6IFJVTEVfU1RSSU5HCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1SVUxFX1NUUklORygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTA4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6Njg4OiBSVUxFX01MX0NPTU1FTlQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfTUxfQ09NTUVOVCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTA5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NzA0OiBSVUxFX1NMX0NPTU1FTlQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfU0xfQ09NTUVOVCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTEwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE6NzIwOiBSVUxFX1dTCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1SVUxFX1dTKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMTEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTo3Mjg6IFJVTEVfQU5ZX09USEVSCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1SVUxFX0FOWV9PVEhFUigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICB9CisKKyAgICB9CisKKworICAgIHByb3RlY3RlZCBERkEyMSBkZmEyMSA9IG5ldyBERkEyMSh0aGlzKTsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIxX2VvdFMgPQorICAgICAgICAiXDFcdWZmZmZcMVw2NlwyXHVmZmZmXDE0XDY2XDFcMTMyXDFcMTM1XDRcdWZmZmZcMVwxNDRcM1x1ZmZmZlwxIisKKyAgICAgICAgIlwxNTJcMVwxNTZcMVwxNjJcMVwxNjRcMVwxNjZcMVwxNzBcMVwxNzJcMVwxNzRcMVwxNzZcMVx1MDA4MVwxXHUwMDgzIisKKyAgICAgICAgIlwxXHVmZmZmXDVcNjZcMlx1MDA5MFwxXDYyXDVcdWZmZmZcM1w2NlwzXHVmZmZmXDRcNjZcMVx1MDA5Y1wyXDY2IisKKyAgICAgICAgIlwxXHUwMGEwXDJcNjZcMVx1MDBhM1wyNVw2NlwxXHUwMGMwXDEwXHVmZmZmXDFcdTAwYzJcMzJcdWZmZmZcMSIrCisgICAgICAgICJcdTAwYzRcN1x1ZmZmZlwxMVw2NlwxXHVmZmZmXDFcdTAwOTBcNFx1ZmZmZlwxMFw2NlwxXHVmZmZmXDNcNjYiKworICAgICAgICAiXDFcdWZmZmZcMlw2NlwxXHVmZmZmXDRcNjZcMVx1MDBkZlwxNFw2NlwxXHUwMGVjXDFcdTAwZWRcMTBcNjZcNiIrCisgICAgICAgICJcdWZmZmZcMlw2NlwxXHUwMGY4XDNcNjZcMVx1MDBmY1wzXDY2XDFcdTAxMDFcMTZcNjZcMVx1MDExMFwxXHVmZmZmIisKKyAgICAgICAgIlwxM1w2NlwxXHUwMTFjXDJcdWZmZmZcMVw2NlwxXHUwMTFlXDFcNjZcMVx1MDEyMFwzXDY2XDFcdTAxMjRcMSIrCisgICAgICAgICJcdTAxMjVcMVw2NlwxXHVmZmZmXDNcNjZcMVx1ZmZmZlwxXHUwMTJhXDNcNjZcMVx1ZmZmZlwxNVw2NlwxXHUwMTNiIisKKyAgICAgICAgIlwxXHVmZmZmXDFcNjZcMVx1MDEzZFw1XDY2XDFcdTAxNDNcM1w2NlwxXHVmZmZmXDFcNjZcMVx1ZmZmZlwxXHUwMTQ4IisKKyAgICAgICAgIlwxXHVmZmZmXDFcdTAxNDlcMlw2NlwyXHVmZmZmXDFcNjZcMVx1MDE0ZVwxXDY2XDFcdTAxNTBcMVx1ZmZmZiIrCisgICAgICAgICJcNVw2NlwxXHUwMTU2XDVcNjZcMVx1MDE1Y1w0XDY2XDFcdWZmZmZcMVx1MDE2MVwxXHVmZmZmXDFcNjZcMVx1MDE2NCIrCisgICAgICAgICJcMVw2NlwxXHUwMTY2XDFcdTAxNjdcMVx1ZmZmZlw0XDY2XDJcdWZmZmZcMVx1MDE2Y1wxXHUwMTZkXDJcNjYiKworICAgICAgICAiXDFcdWZmZmZcMVw2NlwxXHVmZmZmXDFcNjZcMVx1MDE3MlwyXDY2XDFcdTAxNzVcMVx1ZmZmZlwxXHUwMTc2IisKKyAgICAgICAgIlwzXDY2XDFcdTAxN2FcMVx1ZmZmZlwyXDY2XDFcdTAxN2RcMVw2NlwxXHVmZmZmXDJcNjZcMVx1ZmZmZlwxXDY2IisKKyAgICAgICAgIlwyXHVmZmZmXDRcNjZcMlx1ZmZmZlwxXHUwMTg2XDFcNjZcMVx1MDE4OFwxXDY2XDFcdWZmZmZcMlw2NlwyXHVmZmZmIisKKyAgICAgICAgIlwzXDY2XDFcdWZmZmZcMVx1MDE4ZlwxXDY2XDFcdWZmZmZcMVx1MDE5MVw2XDY2XDFcdTAxOThcMVx1ZmZmZiIrCisgICAgICAgICJcMVw2NlwxXHVmZmZmXDFcNjZcMVx1MDE5Ylw0XDY2XDFcdWZmZmZcMVw2NlwxXHVmZmZmXDZcNjZcMVx1ZmZmZiIrCisgICAgICAgICJcMVx1MDFhN1wxXDY2XDFcdWZmZmZcMVw2NlwxXHUwMWFhXDFcdTAxYWJcMVx1ZmZmZlw2XDY2XDFcdTAxYjIiKworICAgICAgICAiXDFcdWZmZmZcMVx1MDFiM1wxXHUwMWI0XDJcdWZmZmZcM1w2NlwxXHUwMWI4XDFcNjZcMVx1MDFiYVwzXHVmZmZmIisKKyAgICAgICAgIlwzXDY2XDFcdWZmZmZcMVx1MDFiZVwxXHVmZmZmXDFcdTAxYmZcMVx1MDFjMFwxXDY2XDNcdWZmZmZcMVw2NiIrCisgICAgICAgICJcMVx1MDFjM1wxXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIxX2VvZlMgPQorICAgICAgICAiXHUwMWM0XHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIxX21pblMgPQorICAgICAgICAiXDFcMFwxXDE0MVwyXHVmZmZmXDFcMTQzXDFcMTQ1XDFcMTYzXDFcMTQzXDJcMTQxXDFcMTYyXDFcMTQxXDEiKworICAgICAgICAiXDE2MlwxXDE0MVwxXDE0NVwxXDE2MFwxXDU2XDFcNTJcNFx1ZmZmZlwxXDc1XDNcdWZmZmZcMVw1M1wxXDU1IisKKyAgICAgICAgIlwxXDUyXDFcNzVcMVw3NlwxXDc1XDFcMTc0XDFcNDZcMVw3NVwxXDU2XDFcNzJcMVx1ZmZmZlwxXDE1NFwxXDE0MSIrCisgICAgICAgICJcMVwxNTBcMVwxNDVcMVwxNTdcMlw2MFwxXDQ0XDVcdWZmZmZcMVwxNDNcMVwxNjJcMVwxNTdcM1x1ZmZmZlwxIisKKyAgICAgICAgIlwxNjBcMVwxNTdcMVwxMDNcMVwxNjNcMVw0NFwxXDE0NlwxXDE0MVwxXDQ0XDFcMTQ1XDFcMTQzXDFcNDRcMSIrCisgICAgICAgICJcMTU3XDFcMTQyXDFcMTY1XDFcMTYwXDFcMTYyXDFcMTYzXDFcMTU0XDFcMTQxXDFcMTUxXDFcMTQxXDFcMTYwIisKKyAgICAgICAgIlwxXDE1NlwxXDE0N1wxXDE0NVwxXDE1NFwxXDE2MlwxXDE1MVwxXDE0MVwxXDE2M1wxXDE2MFwxXDE1NVwxXDc0IisKKyAgICAgICAgIlwxMFx1ZmZmZlwxXDc1XDMyXHVmZmZmXDFcNzVcN1x1ZmZmZlwxXDE2M1wxXDE2NFwxXDE2MlwxXDE1NFwxXDE1NiIrCisgICAgICAgICJcMVwxNTFcMVwxNjdcMVwxNTRcMVwxNjJcMVx1ZmZmZlwxXDYwXDRcdWZmZmZcMVwxNTNcMVwxNjRcMVwxNjMiKworICAgICAgICAiXDFcMTQzXDFcMTU3XDFcMTU2XDFcMTU0XDFcMTY0XDFcdWZmZmZcMVwxNDNcMVwxNDFcMVwxNTRcMVx1ZmZmZiIrCisgICAgICAgICJcMVwxNjJcMVwxNDVcMVx1ZmZmZlwxXDE1NFwxXDE1N1wxXDE1NFwxXDE0NVwxXDQ0XDFcMTQ1XDFcMTU3XDEiKworICAgICAgICAiXDE1MFwxXDE0NVwxXDE0M1wyXDE2NFwxXDE0NVwxXDE0M1wxXDE0NVwxXDE0MVwxXDE2N1wyXDQ0XDFcMTY0IisKKyAgICAgICAgIlwxXDE0NFwxXDE2MlwxXDE0NVwxXDE0M1wxXDE1N1wxXDE2NVwxXDE1Nlw2XHVmZmZmXDJcMTQ1XDFcNDRcMSIrCisgICAgICAgICJcMTYzXDFcMTQxXDFcMTU0XDFcNDRcMVwxNTRcMVwxNTFcMVwxNDFcMVw0NFwxXDE2MFwxXDE0NVwxXDE2MlwxIisKKyAgICAgICAgIlwxMjVcMVwxNTdcMVwxNDFcMVwxNjJcMVwxNjVcMVwxNTdcMVwxNjRcMVwxNjNcMVwxNDJcMVwxNTRcMVwxNDUiKworICAgICAgICAiXDFcNDRcMVx1ZmZmZlwxXDE1N1wxXDE2N1wxXDEwM1wxXDE0M1wxXDE0NVwxXDE0M1wxXDE1MVwxXDE2MlwxIisKKyAgICAgICAgIlwxNTBcMlwxNTZcMVw0NFwyXHVmZmZmXDFcMTUxXDFcNDRcMVwxNjRcMVw0NFwxXDE1MFwyXDE2MlwyXDQ0XDEiKworICAgICAgICAiXDE1NlwxXHVmZmZmXDFcMTQ1XDFcMTU0XDFcMTQ1XDFcdWZmZmZcMVw0NFwxXDE3MlwxXDE0N1wxXDE2NFwxIisKKyAgICAgICAgIlx1ZmZmZlwxXDE0NVwxXDE2M1wxXDE2NFwxXDEyMlwxXDE2M1wxXDE1NlwxXDE1MVwxXDE1NFwxXDE0N1wxXDE0MSIrCisgICAgICAgICJcMVwxNjNcMVwxNDFcMVwxNTdcMVw0NFwxXHVmZmZmXDFcMTQ2XDFcNDRcMVwxNTdcMVwxNjRcMVwxMjZcMVwxNTAiKworICAgICAgICAiXDFcMTQzXDFcNDRcMVwxNjJcMVwxNjRcMVwxNTFcMVx1ZmZmZlwxXDE0M1wxXHVmZmZmXDFcNDRcMVx1ZmZmZiIrCisgICAgICAgICJcMVw0NFwxXDE2NFwxXDE1NlwyXHVmZmZmXDFcMTQ0XDFcNDRcMVwxNTRcMVw0NFwxXHVmZmZmXDFcMTU3XDEiKworICAgICAgICAiXDE0NVwxXDE0MVwxXDE0M1wxXDE2M1wxXDQ0XDFcMTExXDFcMTQxXDFcMTQzXDFcMTQyXDFcMTY0XDFcNDRcMSIrCisgICAgICAgICJcMTYzXDFcMTUxXDFcMTYyXDFcMTQ3XDFcdWZmZmZcMVw0NFwxXHVmZmZmXDFcMTU2XDFcNDRcMVwxNTdcMlw0NCIrCisgICAgICAgICJcMVx1ZmZmZlwxXDE1N1wxXDE0MVwxXDE0N1wxXDE0MVwyXHVmZmZmXDJcNDRcMVwxNjNcMVwxNTFcMVx1ZmZmZiIrCisgICAgICAgICJcMVwxNzFcMVx1ZmZmZlwxXDE1NlwxXDQ0XDFcMTQzXDFcMTY0XDFcNDRcMVx1ZmZmZlwxXDQ0XDFcMTQyXDIiKworICAgICAgICAiXDE0NVwxXDQ0XDFcdWZmZmZcMVwxNTNcMVwxNDJcMVw0NFwxXDE3MVwxXHVmZmZmXDFcMTY0XDFcMTQ0XDFcdWZmZmYiKworICAgICAgICAiXDFcMTU0XDJcdWZmZmZcMVwxNTZcMVwxNjRcMVwxNjJcMVwxNTRcMlx1ZmZmZlwxXDQ0XDFcMTU3XDFcNDRcMSIrCisgICAgICAgICJcMTY0XDFcdWZmZmZcMVwxNTNcMVwxNTFcMlx1ZmZmZlwxXDE1NFwxXDE1N1wxXDE0NFwxXHVmZmZmXDFcNDQiKworICAgICAgICAiXDFcMTUxXDFcdWZmZmZcMVw0NFwxXDE0MVwxXDEwNVwxXDE2NVwyXDE1MVwxXDE0MVwxXDQ0XDFcdWZmZmZcMSIrCisgICAgICAgICJcMTU2XDFcdWZmZmZcMVwxNDFcMVw0NFwxXDE2NlwxXDE0NVwxXDE0NlwxXDQwXDFcdWZmZmZcMVwxNTRcMVx1ZmZmZiIrCisgICAgICAgICJcMVwxNTFcMVwxNTRcMVwxNTVcMVwxNzJcMVwxNTdcMVwxNTVcMVx1ZmZmZlwxXDQ0XDFcMTU0XDFcdWZmZmYiKworICAgICAgICAiXDFcMTQ1XDJcNDRcMVx1ZmZmZlwxXDE1MVwxXDE1NlwzXDE0NVwxXDE1NlwxXDQ0XDFcdWZmZmZcMlw0NFwyIisKKyAgICAgICAgIlx1ZmZmZlwxXDE2NFwxXDE0NVwxXDE1NVwxXDQ0XDFcMTQ0XDFcNDRcM1x1ZmZmZlwxXDE3MVwxXDE2MlwxXDE0NSIrCisgICAgICAgICJcMVx1ZmZmZlwxXDQ0XDFcdWZmZmZcMlw0NFwxXDE1NlwzXHVmZmZmXDFcMTY0XDFcNDRcMVx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMV9tYXhTID0KKyAgICAgICAgIlwxXHVmZmZmXDFcMTYyXDJcdWZmZmZcMVwxNjNcMVwxNTdcMlwxNjNcMlwxNzFcMVwxNjJcMVwxNTFcMVwxNjIiKworICAgICAgICAiXDFcMTUwXDFcMTQ1XDFcMTYwXDFcNTZcMVw3NVw0XHVmZmZmXDFcNzZcM1x1ZmZmZlwxXDc1XDFcNzZcMlw3NSIrCisgICAgICAgICJcMVw3NlwxXDc1XDFcMTc0XDFcNDZcMVw3NVwyXDcyXDFcdWZmZmZcMVwxNzBcMVwxNTdcMVwxNTBcMVwxNjUiKworICAgICAgICAiXDFcMTU3XDFcMTcwXDFcMTU0XDFcMTcyXDVcdWZmZmZcMlwxNjJcMVwxNTdcM1x1ZmZmZlwxXDE2MFwxXDE1NyIrCisgICAgICAgICJcMVwxMDNcMVwxNjNcMVwxNzJcMVwxNjNcMVwxNDFcMVwxNzJcMVwxNDVcMVwxNDNcMVwxNzJcMVwxNjBcMVwxNDIiKworICAgICAgICAiXDFcMTcxXDFcMTYwXDFcMTYyXDFcMTYzXDFcMTU0XDFcMTQxXDFcMTUxXDFcMTQxXDFcMTYwXDFcMTU2XDFcMTUxIisKKyAgICAgICAgIlwxXDE0NVwyXDE2MlwxXDE1MVwxXDE0MVwyXDE2NFwxXDE1NVwxXDc0XDEwXHVmZmZmXDFcNzVcMzJcdWZmZmYiKworICAgICAgICAiXDFcNzVcN1x1ZmZmZlwxXDE2M1wxXDE2NFwxXDE2MlwxXDE1NFwxXDE1NlwxXDE1MVwxXDE2N1wxXDE1NFwxIisKKyAgICAgICAgIlwxNjJcMVx1ZmZmZlwxXDE1NFw0XHVmZmZmXDFcMTUzXDFcMTY0XDFcMTYzXDFcMTQzXDFcMTU3XDFcMTU2XDEiKworICAgICAgICAiXDE1NFwxXDE2NFwxXHVmZmZmXDFcMTQzXDFcMTQxXDFcMTU0XDFcdWZmZmZcMVwxNjJcMVwxNDVcMVx1ZmZmZiIrCisgICAgICAgICJcMVwxNTRcMVwxNTdcMVwxNTRcMVwxNDVcMVwxNzJcMVwxNDVcMVwxNTdcMVwxNTBcMVwxNDVcMVwxNDNcMlwxNjQiKworICAgICAgICAiXDFcMTQ1XDFcMTQzXDFcMTQ1XDFcMTQxXDFcMTY3XDJcMTcyXDFcMTY0XDFcMTQ0XDFcMTYyXDFcMTQ1XDFcMTQzIisKKyAgICAgICAgIlwxXDE1N1wxXDE2NVwxXDE1Nlw2XHVmZmZmXDJcMTQ1XDFcMTcyXDFcMTYzXDFcMTQxXDFcMTU0XDFcMTcyXDEiKworICAgICAgICAiXDE1NFwxXDE1MVwxXDE0MVwxXDE3MlwxXDE2MFwxXDE0NVwxXDE2MlwxXDEyNVwxXDE1N1wxXDE0MVwxXDE2MiIrCisgICAgICAgICJcMVwxNjVcMVwxNTdcMVwxNjRcMVwxNjNcMVwxNDJcMVwxNTRcMVwxNDVcMVwxNzJcMVx1ZmZmZlwxXDE1N1wxIisKKyAgICAgICAgIlwxNjdcMVwxMDNcMVwxNDNcMVwxNDVcMVwxNDNcMVwxNTFcMVwxNjJcMVwxNTBcMlwxNTZcMVwxNzJcMlx1ZmZmZiIrCisgICAgICAgICJcMVwxNTFcMVwxNzJcMVwxNjRcMVwxNzJcMVwxNTBcMlwxNjJcMlwxNzJcMVwxNTZcMVx1ZmZmZlwxXDE0NVwxIisKKyAgICAgICAgIlwxNTRcMVwxNDVcMVx1ZmZmZlwyXDE3MlwxXDE0N1wxXDE2NFwxXHVmZmZmXDFcMTQ1XDFcMTYzXDFcMTY0XDEiKworICAgICAgICAiXDEyMlwxXDE2M1wxXDE1NlwxXDE1MVwxXDE1NFwxXDE0N1wxXDE0MVwxXDE2M1wxXDE0MVwxXDE1N1wxXDE3MiIrCisgICAgICAgICJcMVx1ZmZmZlwxXDE0NlwxXDE3MlwxXDE1N1wxXDE2NFwxXDEyNlwxXDE1MFwxXDE0M1wxXDE3MlwxXDE2MlwxIisKKyAgICAgICAgIlwxNjRcMVwxNTFcMVx1ZmZmZlwxXDE0M1wxXHVmZmZmXDFcMTcyXDFcdWZmZmZcMVwxNzJcMVwxNjRcMVwxNTYiKworICAgICAgICAiXDJcdWZmZmZcMVwxNjNcMVwxNzJcMVwxNTRcMVwxNzJcMVx1ZmZmZlwxXDE1N1wxXDE0NVwxXDE0MVwxXDE0MyIrCisgICAgICAgICJcMVwxNjNcMVwxNzJcMVwxMTFcMVwxNDFcMVwxNDNcMVwxNDJcMVwxNjRcMVwxNzJcMVwxNjNcMVwxNTFcMVwxNjIiKworICAgICAgICAiXDFcMTQ3XDFcdWZmZmZcMVwxNzJcMVx1ZmZmZlwxXDE1NlwxXDE3MlwxXDE1N1wyXDE3MlwxXHVmZmZmXDFcMTU3IisKKyAgICAgICAgIlwxXDE0MVwxXDE0N1wxXDE0MVwyXHVmZmZmXDJcMTcyXDFcMTYzXDFcMTUxXDFcdWZmZmZcMVwxNzFcMVx1ZmZmZiIrCisgICAgICAgICJcMVwxNTZcMVwxNzJcMVwxNDNcMVwxNjRcMVwxNzJcMVx1ZmZmZlwxXDE3MlwxXDE0MlwyXDE0NVwxXDE3MlwxIisKKyAgICAgICAgIlx1ZmZmZlwxXDE1M1wxXDE0MlwxXDE3MlwxXDE3MVwxXHVmZmZmXDFcMTY0XDFcMTQ0XDFcdWZmZmZcMVwxNTQiKworICAgICAgICAiXDJcdWZmZmZcMVwxNTZcMVwxNjRcMVwxNjJcMVwxNTRcMlx1ZmZmZlwxXDE3MlwxXDE1N1wxXDE3MlwxXDE2NCIrCisgICAgICAgICJcMVx1ZmZmZlwxXDE1M1wxXDE1MVwyXHVmZmZmXDFcMTU0XDFcMTU3XDFcMTQ0XDFcdWZmZmZcMVwxNzJcMVwxNTEiKworICAgICAgICAiXDFcdWZmZmZcMVwxNzJcMVwxNDFcMVwxMDVcMVwxNjVcMlwxNTFcMVwxNDFcMVwxNzJcMVx1ZmZmZlwxXDE1NiIrCisgICAgICAgICJcMVx1ZmZmZlwxXDE0MVwxXDE3MlwxXDE2NlwxXDE0NVwxXDE0NlwxXDQwXDFcdWZmZmZcMVwxNTRcMVx1ZmZmZiIrCisgICAgICAgICJcMVwxNTFcMVwxNTRcMVwxNTVcMVwxNzJcMVwxNTdcMVwxNTVcMVx1ZmZmZlwxXDE3MlwxXDE1NFwxXHVmZmZmIisKKyAgICAgICAgIlwxXDE0NVwyXDE3MlwxXHVmZmZmXDFcMTUxXDFcMTU2XDNcMTQ1XDFcMTU2XDFcMTcyXDFcdWZmZmZcMlwxNzIiKworICAgICAgICAiXDJcdWZmZmZcMVwxNjRcMVwxNDVcMVwxNTVcMVwxNzJcMVwxNDRcMVwxNzJcM1x1ZmZmZlwxXDE3MVwxXDE2MiIrCisgICAgICAgICJcMVwxNDVcMVx1ZmZmZlwxXDE3MlwxXHVmZmZmXDJcMTcyXDFcMTU2XDNcdWZmZmZcMVwxNjRcMVwxNzJcMVx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMV9hY2NlcHRTID0KKyAgICAgICAgIlwyXHVmZmZmXDFcMlwxXDNcMTZcdWZmZmZcMVwzN1wxXDQwXDFcNDFcMVw0MlwxXHVmZmZmXDFcNDRcMVw0NSIrCisgICAgICAgICJcMVw0NlwxM1x1ZmZmZlwxXDExMFwxMFx1ZmZmZlwxXDE1MlwyXDE1M1wxXDE1NlwxXDE1N1wzXHVmZmZmXDEiKworICAgICAgICAiXDE1MlwxXDJcMVwzXDQxXHVmZmZmXDFcMzVcMVw1MVwxXDc2XDFcMzZcMVwzN1wxXDQwXDFcNDFcMVw0MlwxIisKKyAgICAgICAgIlx1ZmZmZlwxXDcxXDFcNDNcMVw0NFwxXDQ1XDFcNDZcMVw0N1wxXDEwM1wxXDc0XDFcNTBcMVw2NlwxXDEwNCIrCisgICAgICAgICJcMVw3NVwxXDUyXDFcMTU0XDFcMTU1XDFcNzdcMVw1M1wxXDEwMFwxXDcyXDFcNTRcMVw1NlwxXDU1XDFcNTciKworICAgICAgICAiXDFcMTA3XDFcNjBcMVwxNDRcMVx1ZmZmZlwxXDEwMVwxXDczXDFcMTA2XDFcMTQzXDFcMTA1XDFcMTE0XDFcMTEwIisKKyAgICAgICAgIlwxMVx1ZmZmZlwxXDE0N1wxXHVmZmZmXDFcMTUwXDFcMTUxXDFcMTUzXDFcMTU2XDEwXHVmZmZmXDFcMTExXDMiKworICAgICAgICAiXHVmZmZmXDFcMTIxXDJcdWZmZmZcMVwxMDJcMzNcdWZmZmZcMVw2N1wxXDcwXDFcNjNcMVw2MVwxXDY0XDFcNjIiKworICAgICAgICAiXDMyXHVmZmZmXDFcMTM3XDE0XHVmZmZmXDFcMTIyXDFcMTIzXDEyXHVmZmZmXDFcMTE3XDNcdWZmZmZcMVwxMzAiKworICAgICAgICAiXDRcdWZmZmZcMVwyMVwxNlx1ZmZmZlwxXDEzMlwxM1x1ZmZmZlwxXDIyXDFcdWZmZmZcMVwyNlwxXHVmZmZmIisKKyAgICAgICAgIlwxXDExNlwzXHVmZmZmXDFcMzRcMVwxMTJcNFx1ZmZmZlwxXDEzM1wyMFx1ZmZmZlwxXDI1XDFcdWZmZmZcMSIrCisgICAgICAgICJcMTM1XDVcdWZmZmZcMVwxMjdcNFx1ZmZmZlwxXDI3XDFcMTQyXDRcdWZmZmZcMVwxMzFcMVx1ZmZmZlwxXDEyMCIrCisgICAgICAgICJcNVx1ZmZmZlwxXDRcNVx1ZmZmZlwxXDMzXDRcdWZmZmZcMVwxMzRcMlx1ZmZmZlwxXDI0XDFcdWZmZmZcMVwxMTMiKworICAgICAgICAiXDFcMTI1XDRcdWZmZmZcMVwzMFwxXDEzNlw0XHVmZmZmXDFcMVwyXHVmZmZmXDFcN1wxXDExXDNcdWZmZmZcMSIrCisgICAgICAgICJcMTE1XDJcdWZmZmZcMVwxM1wxMFx1ZmZmZlwxXDEyNFwxXHVmZmZmXDFcMTQwXDZcdWZmZmZcMVwxMFwxXHVmZmZmIisKKyAgICAgICAgIlwxXDMyXDZcdWZmZmZcMVwxNDZcMlx1ZmZmZlwxXDIwXDNcdWZmZmZcMVw2XDdcdWZmZmZcMVwxMjZcMlx1ZmZmZiIrCisgICAgICAgICJcMVwyM1wxXDY1XDZcdWZmZmZcMVwzMVwxXDE0NVwxXDVcM1x1ZmZmZlwxXDE3XDFcdWZmZmZcMVwxNVwzXHVmZmZmIisKKyAgICAgICAgIlwxXDE0MVwxXDEyXDFcMTRcMlx1ZmZmZlwxXDE2IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIxX3NwZWNpYWxTID0KKyAgICAgICAgIlwxXDBcdTAxYzNcdWZmZmZ9PiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERGQTIxX3RyYW5zaXRpb25TID0geworICAgICAgICAgICAgIlwxMVw2MlwyXDYxXDJcNjJcMVw2MVwyMlw2MlwxXDYxXDFcNDJcMVw1N1wxXDI3XDFcNTZcMVwzNVwxIisKKyAgICAgICAgICAgICJcNDFcMVw2MFwxXDIzXDFcMjVcMVwyMVwxXDMyXDFcMjRcMVwzM1wxXDIwXDFcMzRcMVw1M1wxMVw1NCIrCisgICAgICAgICAgICAiXDFcNDRcMVw0NVwxXDM2XDFcMjZcMVwzN1wxXDQzXDFcMjJcMzJcNTZcMVwzMFwxXDYyXDFcMzFcMVw1NSIrCisgICAgICAgICAgICAiXDFcNTZcMVw2MlwxXDdcMVwxN1wxXDE1XDFcNVwxXDQ2XDFcNDdcMVwxNFwxXDUyXDFcNFw0XDU2XDEiKworICAgICAgICAgICAgIlw1MVwxXDEyXDFcMVwxXDU2XDFcMTZcMVwxMVwxXDEwXDFcNlwxXDEzXDFcNTBcM1w1NlwxXDJcMVw0MCIrCisgICAgICAgICAgICAiXDFcM1x1ZmY4Mlw2MiIsCisgICAgICAgICAgICAiXDFcNjNcM1x1ZmZmZlwxXDY0XDE0XHVmZmZmXDFcNjUiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw3MlwyXHVmZmZmXDFcNzVcNlx1ZmZmZlwxXDcxXDFcNzRcNFx1ZmZmZlwxXDczIiwKKyAgICAgICAgICAgICJcMVw3NlwzXHVmZmZmXDFcNzdcNVx1ZmZmZlwxXDEwMCIsCisgICAgICAgICAgICAiXDFcMTAxIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTdcdWZmZmZcMVwxMDMiLAorICAgICAgICAgICAgIlwxXDEwNVw2XHVmZmZmXDFcMTEwXDZcdWZmZmZcMVwxMDRcMlx1ZmZmZlwxXDEwNlw2XHVmZmZmXDEiKworICAgICAgICAgICAgIlwxMDciLAorICAgICAgICAgICAgIlwxXDExMVwzXHVmZmZmXDFcMTEyXDEyXHVmZmZmXDFcMTEzXDNcdWZmZmZcMVwxMTVcMVwxMTZcMSIrCisgICAgICAgICAgICAiXHVmZmZmXDFcMTE0XDFcdWZmZmZcMVwxMTciLAorICAgICAgICAgICAgIlwxXDEyMCIsCisgICAgICAgICAgICAiXDFcMTIyXDNcdWZmZmZcMVwxMjNcM1x1ZmZmZlwxXDEyMSIsCisgICAgICAgICAgICAiXDFcMTI0IiwKKyAgICAgICAgICAgICJcMVwxMjZcNlx1ZmZmZlwxXDEyNSIsCisgICAgICAgICAgICAiXDFcMTI3IiwKKyAgICAgICAgICAgICJcMVwxMzAiLAorICAgICAgICAgICAgIlwxXDEzMSIsCisgICAgICAgICAgICAiXDFcMTM0XDIyXHVmZmZmXDFcMTMzIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDE0MlwxXDE0MyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTUxXDIxXHVmZmZmXDFcMTUwIiwKKyAgICAgICAgICAgICJcMVwxNTVcMTdcdWZmZmZcMVwxNTNcMVwxNTQiLAorICAgICAgICAgICAgIlwxXDE2MFw0XHVmZmZmXDFcMTYxXDE1XHVmZmZmXDFcMTU3IiwKKyAgICAgICAgICAgICJcMVwxNjMiLAorICAgICAgICAgICAgIlwxXDE2NSIsCisgICAgICAgICAgICAiXDFcMTY3IiwKKyAgICAgICAgICAgICJcMVwxNzEiLAorICAgICAgICAgICAgIlwxXDE3MyIsCisgICAgICAgICAgICAiXDFcMTc1IiwKKyAgICAgICAgICAgICJcMVx1MDA4MFwxM1x1ZmZmZlwxXDE3NyIsCisgICAgICAgICAgICAiXDFcdTAwODIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAwODVcMTNcdWZmZmZcMVx1MDA4NiIsCisgICAgICAgICAgICAiXDFcdTAwODhcN1x1ZmZmZlwxXHUwMDg5XDVcdWZmZmZcMVx1MDA4NyIsCisgICAgICAgICAgICAiXDFcdTAwOGEiLAorICAgICAgICAgICAgIlwxXHUwMDhiXDE3XHVmZmZmXDFcdTAwOGMiLAorICAgICAgICAgICAgIlwxXHUwMDhkIiwKKyAgICAgICAgICAgICJcMTJcdTAwOGZcMTBcdWZmZmZcMVx1MDA5MVwxXHVmZmZmXDNcdTAwOTFcNVx1ZmZmZlwxXHUwMDkxIisKKyAgICAgICAgICAgICJcMTNcdWZmZmZcMVx1MDA4ZVw2XHVmZmZmXDFcdTAwOGZcMlx1ZmZmZlwxXHUwMDkxXDFcdWZmZmZcMyIrCisgICAgICAgICAgICAiXHUwMDkxXDVcdWZmZmZcMVx1MDA5MVwxM1x1ZmZmZlwxXHUwMDhlIiwKKyAgICAgICAgICAgICJcMTJcdTAwOGZcMTBcdWZmZmZcMVx1MDA5MVwxXHVmZmZmXDNcdTAwOTFcNVx1ZmZmZlwxXHUwMDkxIisKKyAgICAgICAgICAgICJcMjJcdWZmZmZcMVx1MDA4ZlwyXHVmZmZmXDFcdTAwOTFcMVx1ZmZmZlwzXHUwMDkxXDVcdWZmZmZcMSIrCisgICAgICAgICAgICAiXHUwMDkxIiwKKyAgICAgICAgICAgICJcMVw2NlwzNFx1ZmZmZlwzMlw2Nlw0XHVmZmZmXDFcNjZcMVx1ZmZmZlwzMlw2NiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMDk0XDE2XHVmZmZmXDFcdTAwOTUiLAorICAgICAgICAgICAgIlwxXHUwMDk2IiwKKyAgICAgICAgICAgICJcMVx1MDA5NyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAwOTgiLAorICAgICAgICAgICAgIlwxXHUwMDk5IiwKKyAgICAgICAgICAgICJcMVx1MDA5YSIsCisgICAgICAgICAgICAiXDFcdTAwOWIiLAorICAgICAgICAgICAgIlwxXDY2XDEzXHVmZmZmXDEyXDY2XDdcdWZmZmZcMzJcNjZcNFx1ZmZmZlwxXDY2XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw2NiIsCisgICAgICAgICAgICAiXDFcdTAwOWVcMTRcdWZmZmZcMVx1MDA5ZCIsCisgICAgICAgICAgICAiXDFcdTAwOWYiLAorICAgICAgICAgICAgIlwxXDY2XDEzXHVmZmZmXDEyXDY2XDdcdWZmZmZcMzJcNjZcNFx1ZmZmZlwxXDY2XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw2NiIsCisgICAgICAgICAgICAiXDFcdTAwYTEiLAorICAgICAgICAgICAgIlwxXHUwMGEyIiwKKyAgICAgICAgICAgICJcMVw2NlwxM1x1ZmZmZlwxMlw2Nlw3XHVmZmZmXDMyXDY2XDRcdWZmZmZcMVw2NlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjYiLAorICAgICAgICAgICAgIlwxXHUwMGE0XDFcdTAwYTUiLAorICAgICAgICAgICAgIlwxXHUwMGE2IiwKKyAgICAgICAgICAgICJcMVx1MDBhN1wzXHVmZmZmXDFcdTAwYTgiLAorICAgICAgICAgICAgIlwxXHUwMGE5IiwKKyAgICAgICAgICAgICJcMVx1MDBhYSIsCisgICAgICAgICAgICAiXDFcdTAwYWIiLAorICAgICAgICAgICAgIlwxXHUwMGFjIiwKKyAgICAgICAgICAgICJcMVx1MDBhZCIsCisgICAgICAgICAgICAiXDFcdTAwYWUiLAorICAgICAgICAgICAgIlwxXHUwMGFmIiwKKyAgICAgICAgICAgICJcMVx1MDBiMCIsCisgICAgICAgICAgICAiXDFcdTAwYjEiLAorICAgICAgICAgICAgIlwxXHUwMGIzXDFcdWZmZmZcMVx1MDBiMiIsCisgICAgICAgICAgICAiXDFcdTAwYjQiLAorICAgICAgICAgICAgIlwxXHUwMGI2XDVcdWZmZmZcMVx1MDBiNSIsCisgICAgICAgICAgICAiXDFcdTAwYjciLAorICAgICAgICAgICAgIlwxXHUwMGI4IiwKKyAgICAgICAgICAgICJcMVx1MDBiOSIsCisgICAgICAgICAgICAiXDFcdTAwYmFcMVx1MDBiYiIsCisgICAgICAgICAgICAiXDFcdTAwYmNcM1x1ZmZmZlwxXHUwMGJkIiwKKyAgICAgICAgICAgICJcMVx1MDBiZSIsCisgICAgICAgICAgICAiXDFcdTAwYmYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDBjMSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMGMzIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMGM1IiwKKyAgICAgICAgICAgICJcMVx1MDBjNiIsCisgICAgICAgICAgICAiXDFcdTAwYzciLAorICAgICAgICAgICAgIlwxXHUwMGM4IiwKKyAgICAgICAgICAgICJcMVx1MDBjOSIsCisgICAgICAgICAgICAiXDFcdTAwY2EiLAorICAgICAgICAgICAgIlwxXHUwMGNiIiwKKyAgICAgICAgICAgICJcMVx1MDBjYyIsCisgICAgICAgICAgICAiXDFcdTAwY2QiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDEyXHUwMDhmXDEwXHVmZmZmXDFcdTAwOTFcMVx1ZmZmZlwzXHUwMDkxXDVcdWZmZmZcMVx1MDA5MSIrCisgICAgICAgICAgICAiXDIyXHVmZmZmXDFcdTAwOGZcMlx1ZmZmZlwxXHUwMDkxXDFcdWZmZmZcM1x1MDA5MVw1XHVmZmZmXDEiKworICAgICAgICAgICAgIlx1MDA5MSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDBjZSIsCisgICAgICAgICAgICAiXDFcdTAwY2YiLAorICAgICAgICAgICAgIlwxXHUwMGQwIiwKKyAgICAgICAgICAgICJcMVx1MDBkMSIsCisgICAgICAgICAgICAiXDFcdTAwZDIiLAorICAgICAgICAgICAgIlwxXHUwMGQzIiwKKyAgICAgICAgICAgICJcMVx1MDBkNCIsCisgICAgICAgICAgICAiXDFcdTAwZDUiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAwZDYiLAorICAgICAgICAgICAgIlwxXHUwMGQ3IiwKKyAgICAgICAgICAgICJcMVx1MDBkOCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDBkOSIsCisgICAgICAgICAgICAiXDFcdTAwZGEiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAwZGIiLAorICAgICAgICAgICAgIlwxXHUwMGRjIiwKKyAgICAgICAgICAgICJcMVx1MDBkZCIsCisgICAgICAgICAgICAiXDFcdTAwZGUiLAorICAgICAgICAgICAgIlwxXDY2XDEzXHVmZmZmXDEyXDY2XDdcdWZmZmZcMzJcNjZcNFx1ZmZmZlwxXDY2XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw2NiIsCisgICAgICAgICAgICAiXDFcdTAwZTAiLAorICAgICAgICAgICAgIlwxXHUwMGUxIiwKKyAgICAgICAgICAgICJcMVx1MDBlMiIsCisgICAgICAgICAgICAiXDFcdTAwZTMiLAorICAgICAgICAgICAgIlwxXHUwMGU0IiwKKyAgICAgICAgICAgICJcMVx1MDBlNSIsCisgICAgICAgICAgICAiXDFcdTAwZTYiLAorICAgICAgICAgICAgIlwxXHUwMGU3IiwKKyAgICAgICAgICAgICJcMVx1MDBlOCIsCisgICAgICAgICAgICAiXDFcdTAwZTkiLAorICAgICAgICAgICAgIlwxXHUwMGVhIiwKKyAgICAgICAgICAgICJcMVx1MDBlYiIsCisgICAgICAgICAgICAiXDFcNjZcMTNcdWZmZmZcMTJcNjZcN1x1ZmZmZlwzMlw2Nlw0XHVmZmZmXDFcNjZcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDY2IiwKKyAgICAgICAgICAgICJcMVw2NlwxM1x1ZmZmZlwxMlw2Nlw3XHVmZmZmXDMyXDY2XDRcdWZmZmZcMVw2NlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjYiLAorICAgICAgICAgICAgIlwxXHUwMGVlIiwKKyAgICAgICAgICAgICJcMVx1MDBlZiIsCisgICAgICAgICAgICAiXDFcdTAwZjAiLAorICAgICAgICAgICAgIlwxXHUwMGYxIiwKKyAgICAgICAgICAgICJcMVx1MDBmMiIsCisgICAgICAgICAgICAiXDFcdTAwZjMiLAorICAgICAgICAgICAgIlwxXHUwMGY0IiwKKyAgICAgICAgICAgICJcMVx1MDBmNSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAwZjYiLAorICAgICAgICAgICAgIlwxXHUwMGY3IiwKKyAgICAgICAgICAgICJcMVw2NlwxM1x1ZmZmZlwxMlw2Nlw3XHVmZmZmXDMyXDY2XDRcdWZmZmZcMVw2NlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjYiLAorICAgICAgICAgICAgIlwxXHUwMGY5IiwKKyAgICAgICAgICAgICJcMVx1MDBmYSIsCisgICAgICAgICAgICAiXDFcdTAwZmIiLAorICAgICAgICAgICAgIlwxXDY2XDEzXHVmZmZmXDEyXDY2XDdcdWZmZmZcMzJcNjZcNFx1ZmZmZlwxXDY2XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw2NiIsCisgICAgICAgICAgICAiXDFcdTAwZmQiLAorICAgICAgICAgICAgIlwxXHUwMGZlIiwKKyAgICAgICAgICAgICJcMVx1MDBmZiIsCisgICAgICAgICAgICAiXDFcNjZcMTNcdWZmZmZcMTJcNjZcN1x1ZmZmZlwyMlw2NlwxXHUwMTAwXDdcNjZcNFx1ZmZmZlwxIisKKyAgICAgICAgICAgICJcNjZcMVx1ZmZmZlwzMlw2NiIsCisgICAgICAgICAgICAiXDFcdTAxMDIiLAorICAgICAgICAgICAgIlwxXHUwMTAzIiwKKyAgICAgICAgICAgICJcMVx1MDEwNCIsCisgICAgICAgICAgICAiXDFcdTAxMDUiLAorICAgICAgICAgICAgIlwxXHUwMTA2IiwKKyAgICAgICAgICAgICJcMVx1MDEwNyIsCisgICAgICAgICAgICAiXDFcdTAxMDgiLAorICAgICAgICAgICAgIlwxXHUwMTA5IiwKKyAgICAgICAgICAgICJcMVx1MDEwYSIsCisgICAgICAgICAgICAiXDFcdTAxMGIiLAorICAgICAgICAgICAgIlwxXHUwMTBjIiwKKyAgICAgICAgICAgICJcMVx1MDEwZCIsCisgICAgICAgICAgICAiXDFcdTAxMGUiLAorICAgICAgICAgICAgIlwxXHUwMTBmIiwKKyAgICAgICAgICAgICJcMVw2NlwxM1x1ZmZmZlwxMlw2Nlw3XHVmZmZmXDMyXDY2XDRcdWZmZmZcMVw2NlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxMTEiLAorICAgICAgICAgICAgIlwxXHUwMTEyIiwKKyAgICAgICAgICAgICJcMVx1MDExMyIsCisgICAgICAgICAgICAiXDFcdTAxMTQiLAorICAgICAgICAgICAgIlwxXHUwMTE1IiwKKyAgICAgICAgICAgICJcMVx1MDExNiIsCisgICAgICAgICAgICAiXDFcdTAxMTciLAorICAgICAgICAgICAgIlwxXHUwMTE4IiwKKyAgICAgICAgICAgICJcMVx1MDExOSIsCisgICAgICAgICAgICAiXDFcdTAxMWEiLAorICAgICAgICAgICAgIlwxXHUwMTFiIiwKKyAgICAgICAgICAgICJcMVw2NlwxM1x1ZmZmZlwxMlw2Nlw3XHVmZmZmXDMyXDY2XDRcdWZmZmZcMVw2NlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDExZCIsCisgICAgICAgICAgICAiXDFcNjZcMTNcdWZmZmZcMTJcNjZcN1x1ZmZmZlwzMlw2Nlw0XHVmZmZmXDFcNjZcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDY2IiwKKyAgICAgICAgICAgICJcMVx1MDExZiIsCisgICAgICAgICAgICAiXDFcNjZcMTNcdWZmZmZcMTJcNjZcN1x1ZmZmZlwzMlw2Nlw0XHVmZmZmXDFcNjZcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDY2IiwKKyAgICAgICAgICAgICJcMVx1MDEyMSIsCisgICAgICAgICAgICAiXDFcdTAxMjIiLAorICAgICAgICAgICAgIlwxXHUwMTIzIiwKKyAgICAgICAgICAgICJcMVw2NlwxM1x1ZmZmZlwxMlw2Nlw3XHVmZmZmXDMyXDY2XDRcdWZmZmZcMVw2NlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjYiLAorICAgICAgICAgICAgIlwxXDY2XDEzXHVmZmZmXDEyXDY2XDdcdWZmZmZcMzJcNjZcNFx1ZmZmZlwxXDY2XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw2NiIsCisgICAgICAgICAgICAiXDFcdTAxMjYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxMjciLAorICAgICAgICAgICAgIlwxXHUwMTI4IiwKKyAgICAgICAgICAgICJcMVx1MDEyOSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw2NlwxM1x1ZmZmZlwxMlw2Nlw3XHVmZmZmXDMyXDY2XDRcdWZmZmZcMVw2NlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjYiLAorICAgICAgICAgICAgIlwxXHUwMTJiIiwKKyAgICAgICAgICAgICJcMVx1MDEyYyIsCisgICAgICAgICAgICAiXDFcdTAxMmQiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxMmUiLAorICAgICAgICAgICAgIlwxXHUwMTJmIiwKKyAgICAgICAgICAgICJcMVx1MDEzMCIsCisgICAgICAgICAgICAiXDFcdTAxMzEiLAorICAgICAgICAgICAgIlwxXHUwMTMyIiwKKyAgICAgICAgICAgICJcMVx1MDEzMyIsCisgICAgICAgICAgICAiXDFcdTAxMzQiLAorICAgICAgICAgICAgIlwxXHUwMTM1IiwKKyAgICAgICAgICAgICJcMVx1MDEzNiIsCisgICAgICAgICAgICAiXDFcdTAxMzciLAorICAgICAgICAgICAgIlwxXHUwMTM4IiwKKyAgICAgICAgICAgICJcMVx1MDEzOSIsCisgICAgICAgICAgICAiXDFcdTAxM2EiLAorICAgICAgICAgICAgIlwxXDY2XDEzXHVmZmZmXDEyXDY2XDdcdWZmZmZcMzJcNjZcNFx1ZmZmZlwxXDY2XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw2NiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDEzYyIsCisgICAgICAgICAgICAiXDFcNjZcMTNcdWZmZmZcMTJcNjZcN1x1ZmZmZlwzMlw2Nlw0XHVmZmZmXDFcNjZcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDY2IiwKKyAgICAgICAgICAgICJcMVx1MDEzZSIsCisgICAgICAgICAgICAiXDFcdTAxM2YiLAorICAgICAgICAgICAgIlwxXHUwMTQwIiwKKyAgICAgICAgICAgICJcMVx1MDE0MSIsCisgICAgICAgICAgICAiXDFcdTAxNDIiLAorICAgICAgICAgICAgIlwxXDY2XDEzXHVmZmZmXDEyXDY2XDdcdWZmZmZcMzJcNjZcNFx1ZmZmZlwxXDY2XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw2NiIsCisgICAgICAgICAgICAiXDFcdTAxNDQiLAorICAgICAgICAgICAgIlwxXHUwMTQ1IiwKKyAgICAgICAgICAgICJcMVx1MDE0NiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDE0NyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw2NlwxM1x1ZmZmZlwxMlw2Nlw3XHVmZmZmXDMyXDY2XDRcdWZmZmZcMVw2NlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcNjZcMTNcdWZmZmZcMTJcNjZcN1x1ZmZmZlwzMlw2Nlw0XHVmZmZmXDFcNjZcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDY2IiwKKyAgICAgICAgICAgICJcMVx1MDE0YSIsCisgICAgICAgICAgICAiXDFcdTAxNGIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDE0Y1wxNlx1ZmZmZlwxXHUwMTRkIiwKKyAgICAgICAgICAgICJcMVw2NlwxM1x1ZmZmZlwxMlw2Nlw3XHVmZmZmXDMyXDY2XDRcdWZmZmZcMVw2NlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjYiLAorICAgICAgICAgICAgIlwxXHUwMTRmIiwKKyAgICAgICAgICAgICJcMVw2NlwxM1x1ZmZmZlwxMlw2Nlw3XHVmZmZmXDMyXDY2XDRcdWZmZmZcMVw2NlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxNTEiLAorICAgICAgICAgICAgIlwxXHUwMTUyIiwKKyAgICAgICAgICAgICJcMVx1MDE1MyIsCisgICAgICAgICAgICAiXDFcdTAxNTQiLAorICAgICAgICAgICAgIlwxXHUwMTU1IiwKKyAgICAgICAgICAgICJcMVw2NlwxM1x1ZmZmZlwxMlw2Nlw3XHVmZmZmXDMyXDY2XDRcdWZmZmZcMVw2NlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjYiLAorICAgICAgICAgICAgIlwxXHUwMTU3IiwKKyAgICAgICAgICAgICJcMVx1MDE1OCIsCisgICAgICAgICAgICAiXDFcdTAxNTkiLAorICAgICAgICAgICAgIlwxXHUwMTVhIiwKKyAgICAgICAgICAgICJcMVx1MDE1YiIsCisgICAgICAgICAgICAiXDFcNjZcMTNcdWZmZmZcMTJcNjZcN1x1ZmZmZlwzMlw2Nlw0XHVmZmZmXDFcNjZcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDY2IiwKKyAgICAgICAgICAgICJcMVx1MDE1ZCIsCisgICAgICAgICAgICAiXDFcdTAxNWUiLAorICAgICAgICAgICAgIlwxXHUwMTVmIiwKKyAgICAgICAgICAgICJcMVx1MDE2MCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw2NlwxM1x1ZmZmZlwxMlw2Nlw3XHVmZmZmXDMyXDY2XDRcdWZmZmZcMVw2NlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxNjIiLAorICAgICAgICAgICAgIlwxXDY2XDEzXHVmZmZmXDEyXDY2XDdcdWZmZmZcMzJcNjZcNFx1ZmZmZlwxXDY2XDFcdWZmZmZcNCIrCisgICAgICAgICAgICAiXDY2XDFcdTAxNjNcMjVcNjYiLAorICAgICAgICAgICAgIlwxXHUwMTY1IiwKKyAgICAgICAgICAgICJcMVw2NlwxM1x1ZmZmZlwxMlw2Nlw3XHVmZmZmXDMyXDY2XDRcdWZmZmZcMVw2NlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjYiLAorICAgICAgICAgICAgIlwxXDY2XDEzXHVmZmZmXDEyXDY2XDdcdWZmZmZcMzJcNjZcNFx1ZmZmZlwxXDY2XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw2NiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDE2OCIsCisgICAgICAgICAgICAiXDFcdTAxNjkiLAorICAgICAgICAgICAgIlwxXHUwMTZhIiwKKyAgICAgICAgICAgICJcMVx1MDE2YiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDY2XDEzXHVmZmZmXDEyXDY2XDdcdWZmZmZcMzJcNjZcNFx1ZmZmZlwxXDY2XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw2NiIsCisgICAgICAgICAgICAiXDFcNjZcMTNcdWZmZmZcMTJcNjZcN1x1ZmZmZlwzMlw2Nlw0XHVmZmZmXDFcNjZcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDY2IiwKKyAgICAgICAgICAgICJcMVx1MDE2ZSIsCisgICAgICAgICAgICAiXDFcdTAxNmYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxNzAiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxNzEiLAorICAgICAgICAgICAgIlwxXDY2XDEzXHVmZmZmXDEyXDY2XDdcdWZmZmZcMzJcNjZcNFx1ZmZmZlwxXDY2XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw2NiIsCisgICAgICAgICAgICAiXDFcdTAxNzMiLAorICAgICAgICAgICAgIlwxXHUwMTc0IiwKKyAgICAgICAgICAgICJcMVw2NlwxM1x1ZmZmZlwxMlw2Nlw3XHVmZmZmXDMyXDY2XDRcdWZmZmZcMVw2NlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcNjZcMTNcdWZmZmZcMTJcNjZcN1x1ZmZmZlwzMlw2Nlw0XHVmZmZmXDFcNjZcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDY2IiwKKyAgICAgICAgICAgICJcMVx1MDE3NyIsCisgICAgICAgICAgICAiXDFcdTAxNzgiLAorICAgICAgICAgICAgIlwxXHUwMTc5IiwKKyAgICAgICAgICAgICJcMVw2NlwxM1x1ZmZmZlwxMlw2Nlw3XHVmZmZmXDMyXDY2XDRcdWZmZmZcMVw2NlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxN2IiLAorICAgICAgICAgICAgIlwxXHUwMTdjIiwKKyAgICAgICAgICAgICJcMVw2NlwxM1x1ZmZmZlwxMlw2Nlw3XHVmZmZmXDMyXDY2XDRcdWZmZmZcMVw2NlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjYiLAorICAgICAgICAgICAgIlwxXHUwMTdlIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMTdmIiwKKyAgICAgICAgICAgICJcMVx1MDE4MCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDE4MSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMTgyIiwKKyAgICAgICAgICAgICJcMVx1MDE4MyIsCisgICAgICAgICAgICAiXDFcdTAxODQiLAorICAgICAgICAgICAgIlwxXHUwMTg1IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcNjZcMTNcdWZmZmZcMTJcNjZcN1x1ZmZmZlwzMlw2Nlw0XHVmZmZmXDFcNjZcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDY2IiwKKyAgICAgICAgICAgICJcMVx1MDE4NyIsCisgICAgICAgICAgICAiXDFcNjZcMTNcdWZmZmZcMTJcNjZcN1x1ZmZmZlwzMlw2Nlw0XHVmZmZmXDFcNjZcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDY2IiwKKyAgICAgICAgICAgICJcMVx1MDE4OSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDE4YSIsCisgICAgICAgICAgICAiXDFcdTAxOGIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDE4YyIsCisgICAgICAgICAgICAiXDFcdTAxOGQiLAorICAgICAgICAgICAgIlwxXHUwMThlIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDY2XDEzXHVmZmZmXDEyXDY2XDdcdWZmZmZcMzJcNjZcNFx1ZmZmZlwxXDY2XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw2NiIsCisgICAgICAgICAgICAiXDFcdTAxOTAiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcNjZcMTNcdWZmZmZcMTJcNjZcN1x1ZmZmZlwzMlw2Nlw0XHVmZmZmXDFcNjZcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDY2IiwKKyAgICAgICAgICAgICJcMVx1MDE5MiIsCisgICAgICAgICAgICAiXDFcdTAxOTMiLAorICAgICAgICAgICAgIlwxXHUwMTk0IiwKKyAgICAgICAgICAgICJcMVx1MDE5NSIsCisgICAgICAgICAgICAiXDFcdTAxOTYiLAorICAgICAgICAgICAgIlwxXHUwMTk3IiwKKyAgICAgICAgICAgICJcMVw2NlwxM1x1ZmZmZlwxMlw2Nlw3XHVmZmZmXDMyXDY2XDRcdWZmZmZcMVw2NlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxOTkiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxOWEiLAorICAgICAgICAgICAgIlwxXDY2XDEzXHVmZmZmXDEyXDY2XDdcdWZmZmZcMzJcNjZcNFx1ZmZmZlwxXDY2XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw2NiIsCisgICAgICAgICAgICAiXDFcdTAxOWMiLAorICAgICAgICAgICAgIlwxXHUwMTlkIiwKKyAgICAgICAgICAgICJcMVx1MDE5ZSIsCisgICAgICAgICAgICAiXDFcdTAxOWYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxYTAiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxYTEiLAorICAgICAgICAgICAgIlwxXHUwMWEyIiwKKyAgICAgICAgICAgICJcMVx1MDFhMyIsCisgICAgICAgICAgICAiXDFcdTAxYTQiLAorICAgICAgICAgICAgIlwxXHUwMWE1IiwKKyAgICAgICAgICAgICJcMVx1MDFhNiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw2NlwxM1x1ZmZmZlwxMlw2Nlw3XHVmZmZmXDMyXDY2XDRcdWZmZmZcMVw2NlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjYiLAorICAgICAgICAgICAgIlwxXHUwMWE4IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMWE5IiwKKyAgICAgICAgICAgICJcMVw2NlwxM1x1ZmZmZlwxMlw2Nlw3XHVmZmZmXDMyXDY2XDRcdWZmZmZcMVw2NlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjYiLAorICAgICAgICAgICAgIlwxXDY2XDEzXHVmZmZmXDEyXDY2XDdcdWZmZmZcMzJcNjZcNFx1ZmZmZlwxXDY2XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw2NiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDFhYyIsCisgICAgICAgICAgICAiXDFcdTAxYWQiLAorICAgICAgICAgICAgIlwxXHUwMWFlIiwKKyAgICAgICAgICAgICJcMVx1MDFhZiIsCisgICAgICAgICAgICAiXDFcdTAxYjAiLAorICAgICAgICAgICAgIlwxXHUwMWIxIiwKKyAgICAgICAgICAgICJcMVw2NlwxM1x1ZmZmZlwxMlw2Nlw3XHVmZmZmXDMyXDY2XDRcdWZmZmZcMVw2NlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcNjZcMTNcdWZmZmZcMTJcNjZcN1x1ZmZmZlwzMlw2Nlw0XHVmZmZmXDFcNjZcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDY2IiwKKyAgICAgICAgICAgICJcMVw2NlwxM1x1ZmZmZlwxMlw2Nlw3XHVmZmZmXDMyXDY2XDRcdWZmZmZcMVw2NlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDFiNSIsCisgICAgICAgICAgICAiXDFcdTAxYjYiLAorICAgICAgICAgICAgIlwxXHUwMWI3IiwKKyAgICAgICAgICAgICJcMVw2NlwxM1x1ZmZmZlwxMlw2Nlw3XHVmZmZmXDMyXDY2XDRcdWZmZmZcMVw2NlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjYiLAorICAgICAgICAgICAgIlwxXHUwMWI5IiwKKyAgICAgICAgICAgICJcMVw2NlwxM1x1ZmZmZlwxMlw2Nlw3XHVmZmZmXDMyXDY2XDRcdWZmZmZcMVw2NlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMWJiIiwKKyAgICAgICAgICAgICJcMVx1MDFiYyIsCisgICAgICAgICAgICAiXDFcdTAxYmQiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcNjZcMTNcdWZmZmZcMTJcNjZcN1x1ZmZmZlwzMlw2Nlw0XHVmZmZmXDFcNjZcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDY2IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDY2XDEzXHVmZmZmXDEyXDY2XDdcdWZmZmZcMzJcNjZcNFx1ZmZmZlwxXDY2XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw2NiIsCisgICAgICAgICAgICAiXDFcNjZcMTNcdWZmZmZcMTJcNjZcN1x1ZmZmZlwzMlw2Nlw0XHVmZmZmXDFcNjZcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDY2IiwKKyAgICAgICAgICAgICJcMVx1MDFjMSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxYzIiLAorICAgICAgICAgICAgIlwxXDY2XDEzXHVmZmZmXDEyXDY2XDdcdWZmZmZcMzJcNjZcNFx1ZmZmZlwxXDY2XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw2NiIsCisgICAgICAgICAgICAiIgorICAgIH07CisKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyMV9lb3QgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyMV9lb3RTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyMV9lb2YgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyMV9lb2ZTKTsKKyAgICBzdGF0aWMgZmluYWwgY2hhcltdIERGQTIxX21pbiA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTIxX21pblMpOworICAgIHN0YXRpYyBmaW5hbCBjaGFyW10gREZBMjFfbWF4ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmdUb1Vuc2lnbmVkQ2hhcnMoREZBMjFfbWF4Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMjFfYWNjZXB0ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMjFfYWNjZXB0Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMjFfc3BlY2lhbCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIxX3NwZWNpYWxTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXVtdIERGQTIxX3RyYW5zaXRpb247CisKKyAgICBzdGF0aWMgeworICAgICAgICBpbnQgbnVtU3RhdGVzID0gREZBMjFfdHJhbnNpdGlvblMubGVuZ3RoOworICAgICAgICBERkEyMV90cmFuc2l0aW9uID0gbmV3IHNob3J0W251bVN0YXRlc11bXTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPG51bVN0YXRlczsgaSsrKSB7CisgICAgICAgICAgICBERkEyMV90cmFuc2l0aW9uW2ldID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMjFfdHJhbnNpdGlvblNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgREZBMjEgZXh0ZW5kcyBERkEgeworCisgICAgICAgIHB1YmxpYyBERkEyMShCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CisgICAgICAgICAgICB0aGlzLnJlY29nbml6ZXIgPSByZWNvZ25pemVyOworICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDIxOworICAgICAgICAgICAgdGhpcy5lb3QgPSBERkEyMV9lb3Q7CisgICAgICAgICAgICB0aGlzLmVvZiA9IERGQTIxX2VvZjsKKyAgICAgICAgICAgIHRoaXMubWluID0gREZBMjFfbWluOworICAgICAgICAgICAgdGhpcy5tYXggPSBERkEyMV9tYXg7CisgICAgICAgICAgICB0aGlzLmFjY2VwdCA9IERGQTIxX2FjY2VwdDsKKyAgICAgICAgICAgIHRoaXMuc3BlY2lhbCA9IERGQTIxX3NwZWNpYWw7CisgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBERkEyMV90cmFuc2l0aW9uOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gIjE6MTogVG9rZW5zIDogKCBUX18xMyB8IFRfXzE0IHwgVF9fMTUgfCBUX18xNiB8IFRfXzE3IHwgVF9fMTggfCBUX18xOSB8IFRfXzIwIHwgVF9fMjEgfCBUX18yMiB8IFRfXzIzIHwgVF9fMjQgfCBUX18yNSB8IFRfXzI2IHwgVF9fMjcgfCBUX18yOCB8IFRfXzI5IHwgVF9fMzAgfCBUX18zMSB8IFRfXzMyIHwgVF9fMzMgfCBUX18zNCB8IFRfXzM1IHwgVF9fMzYgfCBUX18zNyB8IFRfXzM4IHwgVF9fMzkgfCBUX180MCB8IFRfXzQxIHwgVF9fNDIgfCBUX180MyB8IFRfXzQ0IHwgVF9fNDUgfCBUX180NiB8IFRfXzQ3IHwgVF9fNDggfCBUX180OSB8IFRfXzUwIHwgVF9fNTEgfCBUX181MiB8IFRfXzUzIHwgVF9fNTQgfCBUX181NSB8IFRfXzU2IHwgVF9fNTcgfCBUX181OCB8IFRfXzU5IHwgVF9fNjAgfCBUX182MSB8IFRfXzYyIHwgVF9fNjMgfCBUX182NCB8IFRfXzY1IHwgVF9fNjYgfCBUX182NyB8IFRfXzY4IHwgVF9fNjkgfCBUX183MCB8IFRfXzcxIHwgVF9fNzIgfCBUX183MyB8IFRfXzc0IHwgVF9fNzUgfCBUX183NiB8IFRfXzc3IHwgVF9fNzggfCBUX183OSB8IFRfXzgwIHwgVF9fODEgfCBUX184MiB8IFRfXzgzIHwgVF9fODQgfCBUX184NSB8IFRfXzg2IHwgVF9fODcgfCBUX184OCB8IFRfXzg5IHwgVF9fOTAgfCBUX185MSB8IFRfXzkyIHwgVF9fOTMgfCBUX185NCB8IFRfXzk1IHwgVF9fOTYgfCBUX185NyB8IFRfXzk4IHwgVF9fOTkgfCBUX18xMDAgfCBUX18xMDEgfCBUX18xMDIgfCBUX18xMDMgfCBUX18xMDQgfCBUX18xMDUgfCBUX18xMDYgfCBUX18xMDcgfCBUX18xMDggfCBUX18xMDkgfCBUX18xMTAgfCBUX18xMTEgfCBUX18xMTIgfCBUX18xMTMgfCBUX18xMTQgfCBSVUxFX0hFWCB8IFJVTEVfSU5UIHwgUlVMRV9ERUNJTUFMIHwgUlVMRV9JRCB8IFJVTEVfU1RSSU5HIHwgUlVMRV9NTF9DT01NRU5UIHwgUlVMRV9TTF9DT01NRU5UIHwgUlVMRV9XUyB8IFJVTEVfQU5ZX09USEVSICk7IjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBJbnRTdHJlYW0gaW5wdXQgPSBfaW5wdXQ7CisgICAgICAgIAlpbnQgX3MgPSBzOworICAgICAgICAgICAgc3dpdGNoICggcyApIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwIDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEyMV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBMjFfMD09J3AnKSApIHtzID0gMTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0neycpICkge3MgPSAyO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSd9JykgKSB7cyA9IDM7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2knKSApIHtzID0gNDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nZCcpICkge3MgPSA1O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSd1JykgKSB7cyA9IDY7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2EnKSApIHtzID0gNzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0ndCcpICkge3MgPSA4O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdzJykgKSB7cyA9IDk7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J28nKSApIHtzID0gMTA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J3YnKSApIHtzID0gMTE7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2cnKSApIHtzID0gMTI7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2MnKSApIHtzID0gMTM7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J3InKSApIHtzID0gMTQ7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2InKSApIHtzID0gMTU7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09Jy4nKSApIHtzID0gMTY7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JyonKSApIHtzID0gMTc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J0AnKSApIHtzID0gMTg7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JygnKSApIHtzID0gMTk7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JywnKSApIHtzID0gMjA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JyknKSApIHtzID0gMjE7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09Jz0nKSApIHtzID0gMjI7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JyMnKSApIHtzID0gMjM7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J1snKSApIHtzID0gMjQ7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J10nKSApIHtzID0gMjU7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JysnKSApIHtzID0gMjY7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09Jy0nKSApIHtzID0gMjc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09Jy8nKSApIHtzID0gMjg7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JyUnKSApIHtzID0gMjk7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JzwnKSApIHtzID0gMzA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09Jz4nKSApIHtzID0gMzE7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J3wnKSApIHtzID0gMzI7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JyYnKSApIHtzID0gMzM7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JyEnKSApIHtzID0gMzQ7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09Jz8nKSApIHtzID0gMzU7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JzonKSApIHtzID0gMzY7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JzsnKSApIHtzID0gMzc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2UnKSApIHtzID0gMzg7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2YnKSApIHtzID0gMzk7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J3cnKSApIHtzID0gNDA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J24nKSApIHtzID0gNDE7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2gnKSApIHtzID0gNDI7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JzAnKSApIHtzID0gNDM7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKChMQTIxXzA+PScxJyAmJiBMQTIxXzA8PSc5JykpICkge3MgPSA0NDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nXicpICkge3MgPSA0NTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nJCd8fChMQTIxXzA+PSdBJyAmJiBMQTIxXzA8PSdaJyl8fExBMjFfMD09J18nfHwoTEEyMV8wPj0naicgJiYgTEEyMV8wPD0nbScpfHxMQTIxXzA9PSdxJ3x8KExBMjFfMD49J3gnICYmIExBMjFfMDw9J3onKSkgKSB7cyA9IDQ2O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdcIicpICkge3MgPSA0Nzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nXCcnKSApIHtzID0gNDg7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKChMQTIxXzA+PSdcdCcgJiYgTEEyMV8wPD0nXG4nKXx8TEEyMV8wPT0nXHInfHxMQTIxXzA9PScgJykgKSB7cyA9IDQ5O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoTEEyMV8wPj0nXHUwMDAwJyAmJiBMQTIxXzA8PSdcYicpfHwoTEEyMV8wPj0nXHUwMDBCJyAmJiBMQTIxXzA8PSdcZicpfHwoTEEyMV8wPj0nXHUwMDBFJyAmJiBMQTIxXzA8PSdcdTAwMUYnKXx8TEEyMV8wPT0nXFwnfHxMQTIxXzA9PSdgJ3x8KExBMjFfMD49J34nICYmIExBMjFfMDw9J1x1RkZGRicpKSApIHtzID0gNTA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDIxLCBfcywgaW5wdXQpOworICAgICAgICAgICAgZXJyb3IobnZhZSk7CisgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICB9CisgICAgfQorIAorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbFBhcnNlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2xQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2UwNGY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2xQYXJzZXIuamF2YQpAQCAtMCwwICsxLDEwMDE0IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUucGFyc2VyLmFudGxyLmludGVybmFsOyAKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLio7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmltcGwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLkFic3RyYWN0SW50ZXJuYWxBbnRsclBhcnNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuWHRleHRUb2tlblN0cmVhbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuWHRleHRUb2tlblN0cmVhbS5IaWRkZW5Ub2tlbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLkFudGxyRGF0YXR5cGVSdWxlVG9rZW47CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5zZXJ2aWNlcy5QZXJzcGVjdGl2ZURzbEdyYW1tYXJBY2Nlc3M7CisKKworCitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuKjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgSW50ZXJuYWxQZXJzcGVjdGl2ZURzbFBhcnNlciBleHRlbmRzIEFic3RyYWN0SW50ZXJuYWxBbnRsclBhcnNlciB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSB0b2tlbk5hbWVzID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgIjxpbnZhbGlkPiIsICI8RU9SPiIsICI8RE9XTj4iLCAiPFVQPiIsICJSVUxFX0lEIiwgIlJVTEVfU1RSSU5HIiwgIlJVTEVfSEVYIiwgIlJVTEVfSU5UIiwgIlJVTEVfREVDSU1BTCIsICJSVUxFX01MX0NPTU1FTlQiLCAiUlVMRV9TTF9DT01NRU5UIiwgIlJVTEVfV1MiLCAiUlVMRV9BTllfT1RIRVIiLCAiJ3BhY2thZ2UnIiwgIid7JyIsICInfSciLCAiJ2ltcG9ydCciLCAiJ3BlcnNwZWN0aXZlJyIsICInZGVzY3JpYmVkIGJ5JyIsICIncHJvY2VzcyciLCAiJ3VzZXJ0YXNrJyIsICInaWNvblVSSSciLCAiJ2FjY2Vzc2liaWxpdHknIiwgIid0b29sYmFyJyIsICInc2FzaENvbnRhaW5lciciLCAiJ29yaWVudGF0aW9uJyIsICInc2VsZWN0ZWRFbGVtZW50JyIsICInc3BhY2VWb2x1bWUnIiwgIidwYXJ0U3RhY2snIiwgIidwYXJ0JyIsICIndmlldyciLCAiJ2lzQ2xvc2FibGUnIiwgIidzZWxlY3QnIiwgIid0YWJsZSciLCAiJ2dyaWQnIiwgIidjaGFydCciLCAiJ3JlcG9ydCciLCAiJ29yZ2FuaWdyYW0nIiwgIid0b3BvbG9neSciLCAiJ2RpYWxvZyciLCAiJ2JwbW4nIiwgIicuJyIsICInKiciLCAiJ0AnIiwgIicoJyIsICInLCciLCAiJyknIiwgIic9JyIsICInIyciLCAiJ1snIiwgIiddJyIsICInKz0nIiwgIictPSciLCAiJyo9JyIsICInLz0nIiwgIiclPSciLCAiJzwnIiwgIic+JyIsICInPj0nIiwgIid8fCciLCAiJyYmJyIsICInPT0nIiwgIichPSciLCAiJz09PSciLCAiJyE9PSciLCAiJ2luc3RhbmNlb2YnIiwgIictPiciLCAiJy4uPCciLCAiJy4uJyIsICInPT4nIiwgIic8PiciLCAiJz86JyIsICInKyciLCAiJy0nIiwgIicqKiciLCAiJy8nIiwgIiclJyIsICInISciLCAiJ2FzJyIsICInKysnIiwgIictLSciLCAiJzo6JyIsICInPy4nIiwgIid8JyIsICInOyciLCAiJ2lmJyIsICInZWxzZSciLCAiJ3N3aXRjaCciLCAiJzonIiwgIidkZWZhdWx0JyIsICInY2FzZSciLCAiJ2ZvciciLCAiJ3doaWxlJyIsICInZG8nIiwgIid2YXInIiwgIid2YWwnIiwgIidleHRlbmRzJyIsICInc3RhdGljJyIsICInZXh0ZW5zaW9uJyIsICInc3VwZXInIiwgIiduZXcnIiwgIidmYWxzZSciLCAiJ3RydWUnIiwgIidudWxsJyIsICIndHlwZW9mJyIsICIndGhyb3cnIiwgIidyZXR1cm4nIiwgIid0cnknIiwgIidmaW5hbGx5JyIsICInc3luY2hyb25pemVkJyIsICInY2F0Y2gnIiwgIic/JyIsICInJiciLCAiJ2hvcml6b250YWwnIiwgIid2ZXJ0aWNhbCciCisgICAgfTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX0hFWD02OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzUwPTUwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzU5PTU5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzU1PTU1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzU2PTU2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzU3PTU3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzU4PTU4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzUxPTUxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzUyPTUyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzUzPTUzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzU0PTU0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzYwPTYwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzYxPTYxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfSUQ9NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX0lOVD03OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzY2PTY2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfTUxfQ09NTUVOVD05OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzY3PTY3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzY4PTY4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzY5PTY5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzYyPTYyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzYzPTYzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzY0PTY0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzY1PTY1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzM3PTM3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzM4PTM4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzM5PTM5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzMzPTMzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzM0PTM0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzM1PTM1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzM2PTM2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzMwPTMwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzMxPTMxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzMyPTMyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQ4PTQ4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQ5PTQ5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQ0PTQ0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQ1PTQ1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQ2PTQ2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQ3PTQ3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQwPTQwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQxPTQxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQyPTQyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQzPTQzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzkxPTkxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwMD0xMDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTI9OTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTM9OTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTAyPTEwMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185ND05NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDE9MTAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzkwPTkwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE5PTE5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE1PTE1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE2PTE2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE3PTE3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE4PTE4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzk5PTk5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEzPTEzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE0PTE0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzk1PTk1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzk2PTk2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzk3PTk3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzk4PTk4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfREVDSU1BTD04OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI2PTI2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI3PTI3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI4PTI4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI5PTI5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIyPTIyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIzPTIzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI0PTI0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI1PTI1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIwPTIwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIxPTIxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzcwPTcwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzcxPTcxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzcyPTcyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfU1RSSU5HPTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9TTF9DT01NRU5UPTEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc3PTc3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc4PTc4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc5PTc5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzczPTczOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVPRj0tMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183ND03NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMTQ9MTE0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc1PTc1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc2PTc2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzgwPTgwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExMT0xMTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODE9ODE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTEwPTExMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184Mj04MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMTM9MTEzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzgzPTgzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExMj0xMTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9XUz0xMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX0FOWV9PVEhFUj0xMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184OD04ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDg9MTA4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzg5PTg5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwNz0xMDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTA5PTEwOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184ND04NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDQ9MTA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzg1PTg1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwMz0xMDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODY9ODY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTA2PTEwNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184Nz04NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDU9MTA1OworCisgICAgLy8gZGVsZWdhdGVzCisgICAgLy8gZGVsZWdhdG9ycworCisKKyAgICAgICAgcHVibGljIEludGVybmFsUGVyc3BlY3RpdmVEc2xQYXJzZXIoVG9rZW5TdHJlYW0gaW5wdXQpIHsKKyAgICAgICAgICAgIHRoaXMoaW5wdXQsIG5ldyBSZWNvZ25pemVyU2hhcmVkU3RhdGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIEludGVybmFsUGVyc3BlY3RpdmVEc2xQYXJzZXIoVG9rZW5TdHJlYW0gaW5wdXQsIFJlY29nbml6ZXJTaGFyZWRTdGF0ZSBzdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIoaW5wdXQsIHN0YXRlKTsKKyAgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAKKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRUb2tlbk5hbWVzKCkgeyByZXR1cm4gSW50ZXJuYWxQZXJzcGVjdGl2ZURzbFBhcnNlci50b2tlbk5hbWVzOyB9CisgICAgcHVibGljIFN0cmluZyBnZXRHcmFtbWFyRmlsZU5hbWUoKSB7IHJldHVybiAiLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZyI7IH0KKworCisKKyAgICAgCXByaXZhdGUgUGVyc3BlY3RpdmVEc2xHcmFtbWFyQWNjZXNzIGdyYW1tYXJBY2Nlc3M7CisgICAgIAkKKyAgICAgICAgcHVibGljIEludGVybmFsUGVyc3BlY3RpdmVEc2xQYXJzZXIoVG9rZW5TdHJlYW0gaW5wdXQsIFBlcnNwZWN0aXZlRHNsR3JhbW1hckFjY2VzcyBncmFtbWFyQWNjZXNzKSB7CisgICAgICAgICAgICB0aGlzKGlucHV0KTsKKyAgICAgICAgICAgIHRoaXMuZ3JhbW1hckFjY2VzcyA9IGdyYW1tYXJBY2Nlc3M7CisgICAgICAgICAgICByZWdpc3RlclJ1bGVzKGdyYW1tYXJBY2Nlc3MuZ2V0R3JhbW1hcigpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Rmlyc3RSdWxlTmFtZSgpIHsKKyAgICAgICAgCXJldHVybiAiUGVyc3BlY3RpdmVNb2RlbCI7CQorICAgICAgIAl9CisgICAgICAgCQorICAgICAgIAlAT3ZlcnJpZGUKKyAgICAgICAJcHJvdGVjdGVkIFBlcnNwZWN0aXZlRHNsR3JhbW1hckFjY2VzcyBnZXRHcmFtbWFyQWNjZXNzKCkgeworICAgICAgIAkJcmV0dXJuIGdyYW1tYXJBY2Nlc3M7CisgICAgICAgCX0KKworCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVBlcnNwZWN0aXZlTW9kZWwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo2ODoxOiBlbnRyeVJ1bGVQZXJzcGVjdGl2ZU1vZGVsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVQZXJzcGVjdGl2ZU1vZGVsPSBydWxlUGVyc3BlY3RpdmVNb2RlbCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVBlcnNwZWN0aXZlTW9kZWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZVBlcnNwZWN0aXZlTW9kZWwgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Njk6MjogKGl2X3J1bGVQZXJzcGVjdGl2ZU1vZGVsPSBydWxlUGVyc3BlY3RpdmVNb2RlbCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo3MDoyOiBpdl9ydWxlUGVyc3BlY3RpdmVNb2RlbD0gcnVsZVBlcnNwZWN0aXZlTW9kZWwgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZU1vZGVsUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUGVyc3BlY3RpdmVNb2RlbF9pbl9lbnRyeVJ1bGVQZXJzcGVjdGl2ZU1vZGVsNzUpOworICAgICAgICAgICAgaXZfcnVsZVBlcnNwZWN0aXZlTW9kZWw9cnVsZVBlcnNwZWN0aXZlTW9kZWwoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVQZXJzcGVjdGl2ZU1vZGVsOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVBlcnNwZWN0aXZlTW9kZWw4NSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVQZXJzcGVjdGl2ZU1vZGVsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVQZXJzcGVjdGl2ZU1vZGVsIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Nzc6MTogcnVsZVBlcnNwZWN0aXZlTW9kZWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAobHZfcGFja2FnZXNfMF8wPSBydWxlUGVyc3BlY3RpdmVQYWNrYWdlICkgKSogOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVQZXJzcGVjdGl2ZU1vZGVsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGx2X3BhY2thZ2VzXzBfMCA9IG51bGw7CisKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgwOjI4OiAoICggKGx2X3BhY2thZ2VzXzBfMD0gcnVsZVBlcnNwZWN0aXZlUGFja2FnZSApICkqICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODE6MTogKCAobHZfcGFja2FnZXNfMF8wPSBydWxlUGVyc3BlY3RpdmVQYWNrYWdlICkgKSoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODE6MTogKCAobHZfcGFja2FnZXNfMF8wPSBydWxlUGVyc3BlY3RpdmVQYWNrYWdlICkgKSoKKyAgICAgICAgICAgIGxvb3AxOgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQxPTI7CisgICAgICAgICAgICAgICAgaW50IExBMV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTFfMD09MTMpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxPTE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEpIHsKKyAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgyOjE6IChsdl9wYWNrYWdlc18wXzA9IHJ1bGVQZXJzcGVjdGl2ZVBhY2thZ2UgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODI6MTogKGx2X3BhY2thZ2VzXzBfMD0gcnVsZVBlcnNwZWN0aXZlUGFja2FnZSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODM6MzogbHZfcGFja2FnZXNfMF8wPSBydWxlUGVyc3BlY3RpdmVQYWNrYWdlCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZU1vZGVsQWNjZXNzKCkuZ2V0UGFja2FnZXNQZXJzcGVjdGl2ZVBhY2thZ2VQYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVQZXJzcGVjdGl2ZVBhY2thZ2VfaW5fcnVsZVBlcnNwZWN0aXZlTW9kZWwxMzApOworICAgICAgICAgICAgCSAgICBsdl9wYWNrYWdlc18wXzA9cnVsZVBlcnNwZWN0aXZlUGFja2FnZSgpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlTW9kZWxSdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlhZGQoCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkicGFja2FnZXMiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9wYWNrYWdlc18wXzAsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiUGVyc3BlY3RpdmVQYWNrYWdlIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVBlcnNwZWN0aXZlTW9kZWwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlUGVyc3BlY3RpdmVQYWNrYWdlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTA3OjE6IGVudHJ5UnVsZVBlcnNwZWN0aXZlUGFja2FnZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlUGVyc3BlY3RpdmVQYWNrYWdlPSBydWxlUGVyc3BlY3RpdmVQYWNrYWdlIEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlUGVyc3BlY3RpdmVQYWNrYWdlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVQZXJzcGVjdGl2ZVBhY2thZ2UgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTA4OjI6IChpdl9ydWxlUGVyc3BlY3RpdmVQYWNrYWdlPSBydWxlUGVyc3BlY3RpdmVQYWNrYWdlIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwOToyOiBpdl9ydWxlUGVyc3BlY3RpdmVQYWNrYWdlPSBydWxlUGVyc3BlY3RpdmVQYWNrYWdlIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYWNrYWdlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUGVyc3BlY3RpdmVQYWNrYWdlX2luX2VudHJ5UnVsZVBlcnNwZWN0aXZlUGFja2FnZTE2Nik7CisgICAgICAgICAgICBpdl9ydWxlUGVyc3BlY3RpdmVQYWNrYWdlPXJ1bGVQZXJzcGVjdGl2ZVBhY2thZ2UoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVQZXJzcGVjdGl2ZVBhY2thZ2U7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlUGVyc3BlY3RpdmVQYWNrYWdlMTc2KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVBlcnNwZWN0aXZlUGFja2FnZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlUGVyc3BlY3RpdmVQYWNrYWdlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTE2OjE6IHJ1bGVQZXJzcGVjdGl2ZVBhY2thZ2UgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICdwYWNrYWdlJyAoIChsdl9uYW1lXzJfMD0gcnVsZVF1YWxpZmllZE5hbWUgKSApIChvdGhlcmx2XzM9ICd7JyAoIChsdl9pbXBvcnRzXzRfMD0gcnVsZVBlcnNwZWN0aXZlSW1wb3J0ICkgKSogKCAobHZfcGVyc3BlY3RpdmVzXzVfMD0gcnVsZVBlcnNwZWN0aXZlICkgKSogb3RoZXJsdl82PSAnfScgKT8gKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVBlcnNwZWN0aXZlUGFja2FnZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8xPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMz1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzY9bnVsbDsKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBsdl9uYW1lXzJfMCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBsdl9pbXBvcnRzXzRfMCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBsdl9wZXJzcGVjdGl2ZXNfNV8wID0gbnVsbDsKKworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTE5OjI4OiAoICggKCkgb3RoZXJsdl8xPSAncGFja2FnZScgKCAobHZfbmFtZV8yXzA9IHJ1bGVRdWFsaWZpZWROYW1lICkgKSAob3RoZXJsdl8zPSAneycgKCAobHZfaW1wb3J0c180XzA9IHJ1bGVQZXJzcGVjdGl2ZUltcG9ydCApICkqICggKGx2X3BlcnNwZWN0aXZlc181XzA9IHJ1bGVQZXJzcGVjdGl2ZSApICkqIG90aGVybHZfNj0gJ30nICk/ICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMjA6MTogKCAoKSBvdGhlcmx2XzE9ICdwYWNrYWdlJyAoIChsdl9uYW1lXzJfMD0gcnVsZVF1YWxpZmllZE5hbWUgKSApIChvdGhlcmx2XzM9ICd7JyAoIChsdl9pbXBvcnRzXzRfMD0gcnVsZVBlcnNwZWN0aXZlSW1wb3J0ICkgKSogKCAobHZfcGVyc3BlY3RpdmVzXzVfMD0gcnVsZVBlcnNwZWN0aXZlICkgKSogb3RoZXJsdl82PSAnfScgKT8gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMjA6MTogKCAoKSBvdGhlcmx2XzE9ICdwYWNrYWdlJyAoIChsdl9uYW1lXzJfMD0gcnVsZVF1YWxpZmllZE5hbWUgKSApIChvdGhlcmx2XzM9ICd7JyAoIChsdl9pbXBvcnRzXzRfMD0gcnVsZVBlcnNwZWN0aXZlSW1wb3J0ICkgKSogKCAobHZfcGVyc3BlY3RpdmVzXzVfMD0gcnVsZVBlcnNwZWN0aXZlICkgKSogb3RoZXJsdl82PSAnfScgKT8gKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMjA6MjogKCkgb3RoZXJsdl8xPSAncGFja2FnZScgKCAobHZfbmFtZV8yXzA9IHJ1bGVRdWFsaWZpZWROYW1lICkgKSAob3RoZXJsdl8zPSAneycgKCAobHZfaW1wb3J0c180XzA9IHJ1bGVQZXJzcGVjdGl2ZUltcG9ydCApICkqICggKGx2X3BlcnNwZWN0aXZlc181XzA9IHJ1bGVQZXJzcGVjdGl2ZSApICkqIG90aGVybHZfNj0gJ30nICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEyMDoyOiAoKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMjE6NTogCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhY2thZ2VBY2Nlc3MoKS5nZXRQZXJzcGVjdGl2ZVBhY2thZ2VBY3Rpb25fMCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsMTMsRk9MTE9XXzEzX2luX3J1bGVQZXJzcGVjdGl2ZVBhY2thZ2UyMjIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFja2FnZUFjY2VzcygpLmdldFBhY2thZ2VLZXl3b3JkXzEoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTMwOjE6ICggKGx2X25hbWVfMl8wPSBydWxlUXVhbGlmaWVkTmFtZSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTMxOjE6IChsdl9uYW1lXzJfMD0gcnVsZVF1YWxpZmllZE5hbWUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMzE6MTogKGx2X25hbWVfMl8wPSBydWxlUXVhbGlmaWVkTmFtZSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEzMjozOiBsdl9uYW1lXzJfMD0gcnVsZVF1YWxpZmllZE5hbWUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhY2thZ2VBY2Nlc3MoKS5nZXROYW1lUXVhbGlmaWVkTmFtZVBhcnNlclJ1bGVDYWxsXzJfMCgpKTsgCisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUXVhbGlmaWVkTmFtZV9pbl9ydWxlUGVyc3BlY3RpdmVQYWNrYWdlMjQzKTsKKyAgICAgICAgICAgIGx2X25hbWVfMl8wPXJ1bGVRdWFsaWZpZWROYW1lKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhY2thZ2VSdWxlKCkpOworICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgCQkJIm5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgIAkJbHZfbmFtZV8yXzAsIAorICAgICAgICAgICAgICAgICAgICAgIAkJIlF1YWxpZmllZE5hbWUiKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE0ODoyOiAob3RoZXJsdl8zPSAneycgKCAobHZfaW1wb3J0c180XzA9IHJ1bGVQZXJzcGVjdGl2ZUltcG9ydCApICkqICggKGx2X3BlcnNwZWN0aXZlc181XzA9IHJ1bGVQZXJzcGVjdGl2ZSApICkqIG90aGVybHZfNj0gJ30nICk/CisgICAgICAgICAgICBpbnQgYWx0ND0yOworICAgICAgICAgICAgaW50IExBNF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBNF8wPT0xNCkgKSB7CisgICAgICAgICAgICAgICAgYWx0ND0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQ0KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNDg6NDogb3RoZXJsdl8zPSAneycgKCAobHZfaW1wb3J0c180XzA9IHJ1bGVQZXJzcGVjdGl2ZUltcG9ydCApICkqICggKGx2X3BlcnNwZWN0aXZlc181XzA9IHJ1bGVQZXJzcGVjdGl2ZSApICkqIG90aGVybHZfNj0gJ30nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl8zPShUb2tlbiltYXRjaChpbnB1dCwxNCxGT0xMT1dfMTRfaW5fcnVsZVBlcnNwZWN0aXZlUGFja2FnZTI1Nik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFja2FnZUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzNfMCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNTI6MTogKCAobHZfaW1wb3J0c180XzA9IHJ1bGVQZXJzcGVjdGl2ZUltcG9ydCApICkqCisgICAgICAgICAgICAgICAgICAgIGxvb3AyOgorICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0Mj0yOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMl8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBMl8wPT0xNikgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0Mj0xOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MikgeworICAgICAgICAgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE1MzoxOiAobHZfaW1wb3J0c180XzA9IHJ1bGVQZXJzcGVjdGl2ZUltcG9ydCApCisgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTUzOjE6IChsdl9pbXBvcnRzXzRfMD0gcnVsZVBlcnNwZWN0aXZlSW1wb3J0ICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE1NDozOiBsdl9pbXBvcnRzXzRfMD0gcnVsZVBlcnNwZWN0aXZlSW1wb3J0CisgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFja2FnZUFjY2VzcygpLmdldEltcG9ydHNQZXJzcGVjdGl2ZUltcG9ydFBhcnNlclJ1bGVDYWxsXzNfMV8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVQZXJzcGVjdGl2ZUltcG9ydF9pbl9ydWxlUGVyc3BlY3RpdmVQYWNrYWdlMjc3KTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBsdl9pbXBvcnRzXzRfMD1ydWxlUGVyc3BlY3RpdmVJbXBvcnQoKTsKKworICAgICAgICAgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYWNrYWdlUnVsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAJCWFkZCgKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkiaW1wb3J0cyIsCisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfaW1wb3J0c180XzAsIAorICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJQZXJzcGVjdGl2ZUltcG9ydCIpOworICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTcwOjM6ICggKGx2X3BlcnNwZWN0aXZlc181XzA9IHJ1bGVQZXJzcGVjdGl2ZSApICkqCisgICAgICAgICAgICAgICAgICAgIGxvb3AzOgorICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0Mz0yOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBM18wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBM18wPT0xNykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0Mz0xOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MykgeworICAgICAgICAgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE3MToxOiAobHZfcGVyc3BlY3RpdmVzXzVfMD0gcnVsZVBlcnNwZWN0aXZlICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNzE6MTogKGx2X3BlcnNwZWN0aXZlc181XzA9IHJ1bGVQZXJzcGVjdGl2ZSApCisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNzI6MzogbHZfcGVyc3BlY3RpdmVzXzVfMD0gcnVsZVBlcnNwZWN0aXZlCisgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFja2FnZUFjY2VzcygpLmdldFBlcnNwZWN0aXZlc1BlcnNwZWN0aXZlUGFyc2VyUnVsZUNhbGxfM18yXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVBlcnNwZWN0aXZlX2luX3J1bGVQZXJzcGVjdGl2ZVBhY2thZ2UyOTkpOworICAgICAgICAgICAgICAgICAgICAJICAgIGx2X3BlcnNwZWN0aXZlc181XzA9cnVsZVBlcnNwZWN0aXZlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFja2FnZVJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlhZGQoCisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJInBlcnNwZWN0aXZlcyIsCisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfcGVyc3BlY3RpdmVzXzVfMCwgCisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIlBlcnNwZWN0aXZlIik7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhayBsb29wMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl82PShUb2tlbiltYXRjaChpbnB1dCwxNSxGT0xMT1dfMTVfaW5fcnVsZVBlcnNwZWN0aXZlUGFja2FnZTMxMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl82LCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFja2FnZUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8zXzMoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVQZXJzcGVjdGl2ZVBhY2thZ2UiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlUGVyc3BlY3RpdmVJbXBvcnQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMDA6MTogZW50cnlSdWxlUGVyc3BlY3RpdmVJbXBvcnQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVBlcnNwZWN0aXZlSW1wb3J0PSBydWxlUGVyc3BlY3RpdmVJbXBvcnQgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVQZXJzcGVjdGl2ZUltcG9ydCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlUGVyc3BlY3RpdmVJbXBvcnQgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjAxOjI6IChpdl9ydWxlUGVyc3BlY3RpdmVJbXBvcnQ9IHJ1bGVQZXJzcGVjdGl2ZUltcG9ydCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMDI6MjogaXZfcnVsZVBlcnNwZWN0aXZlSW1wb3J0PSBydWxlUGVyc3BlY3RpdmVJbXBvcnQgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUltcG9ydFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVBlcnNwZWN0aXZlSW1wb3J0X2luX2VudHJ5UnVsZVBlcnNwZWN0aXZlSW1wb3J0MzUwKTsKKyAgICAgICAgICAgIGl2X3J1bGVQZXJzcGVjdGl2ZUltcG9ydD1ydWxlUGVyc3BlY3RpdmVJbXBvcnQoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVQZXJzcGVjdGl2ZUltcG9ydDsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVQZXJzcGVjdGl2ZUltcG9ydDM2MCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVQZXJzcGVjdGl2ZUltcG9ydCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlUGVyc3BlY3RpdmVJbXBvcnQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMDk6MTogcnVsZVBlcnNwZWN0aXZlSW1wb3J0IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IChvdGhlcmx2XzA9ICdpbXBvcnQnICggKGx2X2ltcG9ydGVkTmFtZXNwYWNlXzFfMD0gcnVsZVBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCApICkgKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVBlcnNwZWN0aXZlSW1wb3J0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBUb2tlbiBvdGhlcmx2XzA9bnVsbDsKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBsdl9pbXBvcnRlZE5hbWVzcGFjZV8xXzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMTI6Mjg6ICggKG90aGVybHZfMD0gJ2ltcG9ydCcgKCAobHZfaW1wb3J0ZWROYW1lc3BhY2VfMV8wPSBydWxlUGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkICkgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjEzOjE6IChvdGhlcmx2XzA9ICdpbXBvcnQnICggKGx2X2ltcG9ydGVkTmFtZXNwYWNlXzFfMD0gcnVsZVBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCApICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMTM6MTogKG90aGVybHZfMD0gJ2ltcG9ydCcgKCAobHZfaW1wb3J0ZWROYW1lc3BhY2VfMV8wPSBydWxlUGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIxMzozOiBvdGhlcmx2XzA9ICdpbXBvcnQnICggKGx2X2ltcG9ydGVkTmFtZXNwYWNlXzFfMD0gcnVsZVBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG90aGVybHZfMD0oVG9rZW4pbWF0Y2goaW5wdXQsMTYsRk9MTE9XXzE2X2luX3J1bGVQZXJzcGVjdGl2ZUltcG9ydDM5Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVJbXBvcnRBY2Nlc3MoKS5nZXRJbXBvcnRLZXl3b3JkXzAoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjE3OjE6ICggKGx2X2ltcG9ydGVkTmFtZXNwYWNlXzFfMD0gcnVsZVBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjE4OjE6IChsdl9pbXBvcnRlZE5hbWVzcGFjZV8xXzA9IHJ1bGVQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMTg6MTogKGx2X2ltcG9ydGVkTmFtZXNwYWNlXzFfMD0gcnVsZVBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIxOTozOiBsdl9pbXBvcnRlZE5hbWVzcGFjZV8xXzA9IHJ1bGVQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUltcG9ydEFjY2VzcygpLmdldEltcG9ydGVkTmFtZXNwYWNlUGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkUGFyc2VyUnVsZUNhbGxfMV8wKCkpOyAKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfaW5fcnVsZVBlcnNwZWN0aXZlSW1wb3J0NDE4KTsKKyAgICAgICAgICAgIGx2X2ltcG9ydGVkTmFtZXNwYWNlXzFfMD1ydWxlUGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUltcG9ydFJ1bGUoKSk7CisgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAJCQkiaW1wb3J0ZWROYW1lc3BhY2UiLAorICAgICAgICAgICAgICAgICAgICAgIAkJbHZfaW1wb3J0ZWROYW1lc3BhY2VfMV8wLCAKKyAgICAgICAgICAgICAgICAgICAgICAJCSJQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQiKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVQZXJzcGVjdGl2ZUltcG9ydCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVQZXJzcGVjdGl2ZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI0MzoxOiBlbnRyeVJ1bGVQZXJzcGVjdGl2ZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlUGVyc3BlY3RpdmU9IHJ1bGVQZXJzcGVjdGl2ZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVBlcnNwZWN0aXZlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVQZXJzcGVjdGl2ZSA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNDQ6MjogKGl2X3J1bGVQZXJzcGVjdGl2ZT0gcnVsZVBlcnNwZWN0aXZlIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI0NToyOiBpdl9ydWxlUGVyc3BlY3RpdmU9IHJ1bGVQZXJzcGVjdGl2ZSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUGVyc3BlY3RpdmVfaW5fZW50cnlSdWxlUGVyc3BlY3RpdmU0NTQpOworICAgICAgICAgICAgaXZfcnVsZVBlcnNwZWN0aXZlPXJ1bGVQZXJzcGVjdGl2ZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZVBlcnNwZWN0aXZlOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVBlcnNwZWN0aXZlNDY0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVBlcnNwZWN0aXZlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVQZXJzcGVjdGl2ZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI1MjoxOiBydWxlUGVyc3BlY3RpdmUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICdwZXJzcGVjdGl2ZScgKCAobHZfbmFtZV8yXzA9IHJ1bGVUUkFOU0xBVEFCTEVJRCApICkgKCAoIChsdl9kZXNjcmlwdGlvbl8zXzA9ICdkZXNjcmliZWQgYnknICkgKSAoIChsdl9kZXNjcmlwdGlvblZhbHVlXzRfMD0gcnVsZVRSQU5TTEFUQUJMRVNUUklORyApICkgKT8gKG90aGVybHZfNT0gJ3Byb2Nlc3MnICggKG90aGVybHZfNj0gUlVMRV9JRCApICkgb3RoZXJsdl83PSAndXNlcnRhc2snICggKG90aGVybHZfOD0gUlVMRV9JRCApICkgKT8gKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMD0gJ2ljb25VUkknICggKGx2X2ljb25VUklfMTFfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMj0gJ2FjY2Vzc2liaWxpdHknICggKGx2X2FjY2Vzc2liaWxpdHlQaHJhc2VfMTNfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xND0gJ3Rvb2xiYXInICggKG90aGVybHZfMTU9IFJVTEVfSUQgKSApICkgKSApICkgKSogKSApICkgb3RoZXJsdl8xNj0gJ3snICggKGx2X2VsZW1lbnRzXzE3XzA9IHJ1bGVQZXJzcGVjdGl2ZUVsZW1lbnQgKSApKiBvdGhlcmx2XzE4PSAnfScgKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVBlcnNwZWN0aXZlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBUb2tlbiBvdGhlcmx2XzE9bnVsbDsKKyAgICAgICAgVG9rZW4gbHZfZGVzY3JpcHRpb25fM18wPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfNT1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzY9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl83PW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfOD1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzEwPW51bGw7CisgICAgICAgIFRva2VuIGx2X2ljb25VUklfMTFfMD1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzEyPW51bGw7CisgICAgICAgIFRva2VuIGx2X2FjY2Vzc2liaWxpdHlQaHJhc2VfMTNfMD1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzE0PW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMTU9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8xNj1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzE4PW51bGw7CisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gbHZfbmFtZV8yXzAgPSBudWxsOworCisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gbHZfZGVzY3JpcHRpb25WYWx1ZV80XzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgbHZfZWxlbWVudHNfMTdfMCA9IG51bGw7CisKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI1NToyODogKCAoICgpIG90aGVybHZfMT0gJ3BlcnNwZWN0aXZlJyAoIChsdl9uYW1lXzJfMD0gcnVsZVRSQU5TTEFUQUJMRUlEICkgKSAoICggKGx2X2Rlc2NyaXB0aW9uXzNfMD0gJ2Rlc2NyaWJlZCBieScgKSApICggKGx2X2Rlc2NyaXB0aW9uVmFsdWVfNF8wPSBydWxlVFJBTlNMQVRBQkxFU1RSSU5HICkgKSApPyAob3RoZXJsdl81PSAncHJvY2VzcycgKCAob3RoZXJsdl82PSBSVUxFX0lEICkgKSBvdGhlcmx2Xzc9ICd1c2VydGFzaycgKCAob3RoZXJsdl84PSBSVUxFX0lEICkgKSApPyAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEwPSAnaWNvblVSSScgKCAobHZfaWNvblVSSV8xMV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEyPSAnYWNjZXNzaWJpbGl0eScgKCAobHZfYWNjZXNzaWJpbGl0eVBocmFzZV8xM18wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE0PSAndG9vbGJhcicgKCAob3RoZXJsdl8xNT0gUlVMRV9JRCApICkgKSApICkgKSApKiApICkgKSBvdGhlcmx2XzE2PSAneycgKCAobHZfZWxlbWVudHNfMTdfMD0gcnVsZVBlcnNwZWN0aXZlRWxlbWVudCApICkqIG90aGVybHZfMTg9ICd9JyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjU2OjE6ICggKCkgb3RoZXJsdl8xPSAncGVyc3BlY3RpdmUnICggKGx2X25hbWVfMl8wPSBydWxlVFJBTlNMQVRBQkxFSUQgKSApICggKCAobHZfZGVzY3JpcHRpb25fM18wPSAnZGVzY3JpYmVkIGJ5JyApICkgKCAobHZfZGVzY3JpcHRpb25WYWx1ZV80XzA9IHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcgKSApICk/IChvdGhlcmx2XzU9ICdwcm9jZXNzJyAoIChvdGhlcmx2XzY9IFJVTEVfSUQgKSApIG90aGVybHZfNz0gJ3VzZXJ0YXNrJyAoIChvdGhlcmx2Xzg9IFJVTEVfSUQgKSApICk/ICggKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTA9ICdpY29uVVJJJyAoIChsdl9pY29uVVJJXzExXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTI9ICdhY2Nlc3NpYmlsaXR5JyAoIChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzEzXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTQ9ICd0b29sYmFyJyAoIChvdGhlcmx2XzE1PSBSVUxFX0lEICkgKSApICkgKSApICkqICkgKSApIG90aGVybHZfMTY9ICd7JyAoIChsdl9lbGVtZW50c18xN18wPSBydWxlUGVyc3BlY3RpdmVFbGVtZW50ICkgKSogb3RoZXJsdl8xOD0gJ30nICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjU2OjE6ICggKCkgb3RoZXJsdl8xPSAncGVyc3BlY3RpdmUnICggKGx2X25hbWVfMl8wPSBydWxlVFJBTlNMQVRBQkxFSUQgKSApICggKCAobHZfZGVzY3JpcHRpb25fM18wPSAnZGVzY3JpYmVkIGJ5JyApICkgKCAobHZfZGVzY3JpcHRpb25WYWx1ZV80XzA9IHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcgKSApICk/IChvdGhlcmx2XzU9ICdwcm9jZXNzJyAoIChvdGhlcmx2XzY9IFJVTEVfSUQgKSApIG90aGVybHZfNz0gJ3VzZXJ0YXNrJyAoIChvdGhlcmx2Xzg9IFJVTEVfSUQgKSApICk/ICggKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTA9ICdpY29uVVJJJyAoIChsdl9pY29uVVJJXzExXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTI9ICdhY2Nlc3NpYmlsaXR5JyAoIChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzEzXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTQ9ICd0b29sYmFyJyAoIChvdGhlcmx2XzE1PSBSVUxFX0lEICkgKSApICkgKSApICkqICkgKSApIG90aGVybHZfMTY9ICd7JyAoIChsdl9lbGVtZW50c18xN18wPSBydWxlUGVyc3BlY3RpdmVFbGVtZW50ICkgKSogb3RoZXJsdl8xOD0gJ30nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjU2OjI6ICgpIG90aGVybHZfMT0gJ3BlcnNwZWN0aXZlJyAoIChsdl9uYW1lXzJfMD0gcnVsZVRSQU5TTEFUQUJMRUlEICkgKSAoICggKGx2X2Rlc2NyaXB0aW9uXzNfMD0gJ2Rlc2NyaWJlZCBieScgKSApICggKGx2X2Rlc2NyaXB0aW9uVmFsdWVfNF8wPSBydWxlVFJBTlNMQVRBQkxFU1RSSU5HICkgKSApPyAob3RoZXJsdl81PSAncHJvY2VzcycgKCAob3RoZXJsdl82PSBSVUxFX0lEICkgKSBvdGhlcmx2Xzc9ICd1c2VydGFzaycgKCAob3RoZXJsdl84PSBSVUxFX0lEICkgKSApPyAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEwPSAnaWNvblVSSScgKCAobHZfaWNvblVSSV8xMV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEyPSAnYWNjZXNzaWJpbGl0eScgKCAobHZfYWNjZXNzaWJpbGl0eVBocmFzZV8xM18wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE0PSAndG9vbGJhcicgKCAob3RoZXJsdl8xNT0gUlVMRV9JRCApICkgKSApICkgKSApKiApICkgKSBvdGhlcmx2XzE2PSAneycgKCAobHZfZWxlbWVudHNfMTdfMD0gcnVsZVBlcnNwZWN0aXZlRWxlbWVudCApICkqIG90aGVybHZfMTg9ICd9JworICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNTY6MjogKCkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjU3OjU6IAorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRQZXJzcGVjdGl2ZUFjdGlvbl8wKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCwxNyxGT0xMT1dfMTdfaW5fcnVsZVBlcnNwZWN0aXZlNTEwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldFBlcnNwZWN0aXZlS2V5d29yZF8xKCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2NjoxOiAoIChsdl9uYW1lXzJfMD0gcnVsZVRSQU5TTEFUQUJMRUlEICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjc6MTogKGx2X25hbWVfMl8wPSBydWxlVFJBTlNMQVRBQkxFSUQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjc6MTogKGx2X25hbWVfMl8wPSBydWxlVFJBTlNMQVRBQkxFSUQgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjg6MzogbHZfbmFtZV8yXzA9IHJ1bGVUUkFOU0xBVEFCTEVJRAorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQWNjZXNzKCkuZ2V0TmFtZVRSQU5TTEFUQUJMRUlEUGFyc2VyUnVsZUNhbGxfMl8wKCkpOyAKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVUUkFOU0xBVEFCTEVJRF9pbl9ydWxlUGVyc3BlY3RpdmU1MzEpOworICAgICAgICAgICAgbHZfbmFtZV8yXzA9cnVsZVRSQU5TTEFUQUJMRUlEKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVJ1bGUoKSk7CisgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAJCQkibmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgCQlsdl9uYW1lXzJfMCwgCisgICAgICAgICAgICAgICAgICAgICAgCQkiVFJBTlNMQVRBQkxFSUQiKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI4NDoyOiAoICggKGx2X2Rlc2NyaXB0aW9uXzNfMD0gJ2Rlc2NyaWJlZCBieScgKSApICggKGx2X2Rlc2NyaXB0aW9uVmFsdWVfNF8wPSBydWxlVFJBTlNMQVRBQkxFU1RSSU5HICkgKSApPworICAgICAgICAgICAgaW50IGFsdDU9MjsKKyAgICAgICAgICAgIGludCBMQTVfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQTVfMD09MTgpICkgeworICAgICAgICAgICAgICAgIGFsdDU9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjg0OjM6ICggKGx2X2Rlc2NyaXB0aW9uXzNfMD0gJ2Rlc2NyaWJlZCBieScgKSApICggKGx2X2Rlc2NyaXB0aW9uVmFsdWVfNF8wPSBydWxlVFJBTlNMQVRBQkxFU1RSSU5HICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjg0OjM6ICggKGx2X2Rlc2NyaXB0aW9uXzNfMD0gJ2Rlc2NyaWJlZCBieScgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjg1OjE6IChsdl9kZXNjcmlwdGlvbl8zXzA9ICdkZXNjcmliZWQgYnknICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI4NToxOiAobHZfZGVzY3JpcHRpb25fM18wPSAnZGVzY3JpYmVkIGJ5JyApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjg2OjM6IGx2X2Rlc2NyaXB0aW9uXzNfMD0gJ2Rlc2NyaWJlZCBieScKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsdl9kZXNjcmlwdGlvbl8zXzA9KFRva2VuKW1hdGNoKGlucHV0LDE4LEZPTExPV18xOF9pbl9ydWxlUGVyc3BlY3RpdmU1NTApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGx2X2Rlc2NyaXB0aW9uXzNfMCwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldERlc2NyaXB0aW9uRGVzY3JpYmVkQnlLZXl3b3JkXzNfMF8wKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoY3VycmVudCwgImRlc2NyaXB0aW9uIiwgdHJ1ZSwgImRlc2NyaWJlZCBieSIpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyOTk6MjogKCAobHZfZGVzY3JpcHRpb25WYWx1ZV80XzA9IHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzAwOjE6IChsdl9kZXNjcmlwdGlvblZhbHVlXzRfMD0gcnVsZVRSQU5TTEFUQUJMRVNUUklORyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMDA6MTogKGx2X2Rlc2NyaXB0aW9uVmFsdWVfNF8wPSBydWxlVFJBTlNMQVRBQkxFU1RSSU5HICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMDE6MzogbHZfZGVzY3JpcHRpb25WYWx1ZV80XzA9IHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQWNjZXNzKCkuZ2V0RGVzY3JpcHRpb25WYWx1ZVRSQU5TTEFUQUJMRVNUUklOR1BhcnNlclJ1bGVDYWxsXzNfMV8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVUUkFOU0xBVEFCTEVTVFJJTkdfaW5fcnVsZVBlcnNwZWN0aXZlNTg0KTsKKyAgICAgICAgICAgICAgICAgICAgbHZfZGVzY3JpcHRpb25WYWx1ZV80XzA9cnVsZVRSQU5TTEFUQUJMRVNUUklORygpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUnVsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJImRlc2NyaXB0aW9uVmFsdWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlsdl9kZXNjcmlwdGlvblZhbHVlXzRfMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCSJUUkFOU0xBVEFCTEVTVFJJTkciKTsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMTc6NDogKG90aGVybHZfNT0gJ3Byb2Nlc3MnICggKG90aGVybHZfNj0gUlVMRV9JRCApICkgb3RoZXJsdl83PSAndXNlcnRhc2snICggKG90aGVybHZfOD0gUlVMRV9JRCApICkgKT8KKyAgICAgICAgICAgIGludCBhbHQ2PTI7CisgICAgICAgICAgICBpbnQgTEE2XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoTEE2XzA9PTE5KSApIHsKKyAgICAgICAgICAgICAgICBhbHQ2PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDYpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMxNzo2OiBvdGhlcmx2XzU9ICdwcm9jZXNzJyAoIChvdGhlcmx2XzY9IFJVTEVfSUQgKSApIG90aGVybHZfNz0gJ3VzZXJ0YXNrJyAoIChvdGhlcmx2Xzg9IFJVTEVfSUQgKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl81PShUb2tlbiltYXRjaChpbnB1dCwxOSxGT0xMT1dfMTlfaW5fcnVsZVBlcnNwZWN0aXZlNTk5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzUsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRQcm9jZXNzS2V5d29yZF80XzAoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzIxOjE6ICggKG90aGVybHZfNj0gUlVMRV9JRCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMjI6MTogKG90aGVybHZfNj0gUlVMRV9JRCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMjI6MTogKG90aGVybHZfNj0gUlVMRV9JRCApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzIzOjM6IG90aGVybHZfNj0gUlVMRV9JRAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCQkJaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUnVsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzY9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XX1JVTEVfSURfaW5fcnVsZVBlcnNwZWN0aXZlNjE5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCQluZXdMZWFmTm9kZShvdGhlcmx2XzYsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRQcm9jZXNzQmxpcENyb3NzUmVmZXJlbmNlXzRfMV8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAJCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl83PShUb2tlbiltYXRjaChpbnB1dCwyMCxGT0xMT1dfMjBfaW5fcnVsZVBlcnNwZWN0aXZlNjMxKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzcsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRVc2VydGFza0tleXdvcmRfNF8yKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMzODoxOiAoIChvdGhlcmx2Xzg9IFJVTEVfSUQgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzM5OjE6IChvdGhlcmx2Xzg9IFJVTEVfSUQgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzM5OjE6IChvdGhlcmx2Xzg9IFJVTEVfSUQgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjM0MDozOiBvdGhlcmx2Xzg9IFJVTEVfSUQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkJCWlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl84PShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lELEZPTExPV19SVUxFX0lEX2luX3J1bGVQZXJzcGVjdGl2ZTY1MSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkJbmV3TGVhZk5vZGUob3RoZXJsdl84LCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQWNjZXNzKCkuZ2V0VXNlclRhc2tCbGlwVXNlclRhc2tDcm9zc1JlZmVyZW5jZV80XzNfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgCQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjM1MTo0OiAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEwPSAnaWNvblVSSScgKCAobHZfaWNvblVSSV8xMV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEyPSAnYWNjZXNzaWJpbGl0eScgKCAobHZfYWNjZXNzaWJpbGl0eVBocmFzZV8xM18wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE0PSAndG9vbGJhcicgKCAob3RoZXJsdl8xNT0gUlVMRV9JRCApICkgKSApICkgKSApKiApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozNTM6MTogKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTA9ICdpY29uVVJJJyAoIChsdl9pY29uVVJJXzExXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTI9ICdhY2Nlc3NpYmlsaXR5JyAoIChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzEzXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTQ9ICd0b29sYmFyJyAoIChvdGhlcmx2XzE1PSBSVUxFX0lEICkgKSApICkgKSApICkqICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozNTM6MTogKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTA9ICdpY29uVVJJJyAoIChsdl9pY29uVVJJXzExXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTI9ICdhY2Nlc3NpYmlsaXR5JyAoIChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzEzXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTQ9ICd0b29sYmFyJyAoIChvdGhlcmx2XzE1PSBSVUxFX0lEICkgKSApICkgKSApICkqICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozNTQ6MjogKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEwPSAnaWNvblVSSScgKCAobHZfaWNvblVSSV8xMV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEyPSAnYWNjZXNzaWJpbGl0eScgKCAobHZfYWNjZXNzaWJpbGl0eVBocmFzZV8xM18wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE0PSAndG9vbGJhcicgKCAob3RoZXJsdl8xNT0gUlVMRV9JRCApICkgKSApICkgKSApKiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmVudGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF81KCkpOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozNTc6MjogKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEwPSAnaWNvblVSSScgKCAobHZfaWNvblVSSV8xMV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEyPSAnYWNjZXNzaWJpbGl0eScgKCAobHZfYWNjZXNzaWJpbGl0eVBocmFzZV8xM18wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE0PSAndG9vbGJhcicgKCAob3RoZXJsdl8xNT0gUlVMRV9JRCApICkgKSApICkgKSApKiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjM1ODozOiAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEwPSAnaWNvblVSSScgKCAobHZfaWNvblVSSV8xMV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEyPSAnYWNjZXNzaWJpbGl0eScgKCAobHZfYWNjZXNzaWJpbGl0eVBocmFzZV8xM18wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE0PSAndG9vbGJhcicgKCAob3RoZXJsdl8xNT0gUlVMRV9JRCApICkgKSApICkgKSApKgorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozNTg6MzogKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMD0gJ2ljb25VUkknICggKGx2X2ljb25VUklfMTFfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMj0gJ2FjY2Vzc2liaWxpdHknICggKGx2X2FjY2Vzc2liaWxpdHlQaHJhc2VfMTNfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xND0gJ3Rvb2xiYXInICggKG90aGVybHZfMTU9IFJVTEVfSUQgKSApICkgKSApICkgKSoKKyAgICAgICAgICAgIGxvb3A3OgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQ3PTQ7CisgICAgICAgICAgICAgICAgaW50IExBN18wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIExBN18wID09MjEgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzUoKSwgMCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDc9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIExBN18wID09MjIgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzUoKSwgMSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDc9MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIExBN18wID09MjMgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzUoKSwgMikgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDc9MzsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NykgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzYwOjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEwPSAnaWNvblVSSScgKCAobHZfaWNvblVSSV8xMV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzYwOjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEwPSAnaWNvblVSSScgKCAobHZfaWNvblVSSV8xMV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjM2MTo1OiB7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEwPSAnaWNvblVSSScgKCAobHZfaWNvblVSSV8xMV8wPSBSVUxFX1NUUklORyApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzUoKSwgMCkgKSB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVQZXJzcGVjdGl2ZSIsICJnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNSgpLCAwKSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzYxOjEwODogKCAoey4uLn0/ID0+IChvdGhlcmx2XzEwPSAnaWNvblVSSScgKCAobHZfaWNvblVSSV8xMV8wPSBSVUxFX1NUUklORyApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozNjI6NjogKHsuLi59PyA9PiAob3RoZXJsdl8xMD0gJ2ljb25VUkknICggKGx2X2ljb25VUklfMTFfMD0gUlVMRV9TVFJJTkcgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF81KCksIDApOworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjM2NTo2OiAoey4uLn0/ID0+IChvdGhlcmx2XzEwPSAnaWNvblVSSScgKCAobHZfaWNvblVSSV8xMV8wPSBSVUxFX1NUUklORyApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzY1Ojc6IHsuLi59PyA9PiAob3RoZXJsdl8xMD0gJ2ljb25VUkknICggKGx2X2ljb25VUklfMTFfMD0gUlVMRV9TVFJJTkcgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEoKHRydWUpKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZVBlcnNwZWN0aXZlIiwgInRydWUiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjM2NToxNjogKG90aGVybHZfMTA9ICdpY29uVVJJJyAoIChsdl9pY29uVVJJXzExXzA9IFJVTEVfU1RSSU5HICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzY1OjE4OiBvdGhlcmx2XzEwPSAnaWNvblVSSScgKCAobHZfaWNvblVSSV8xMV8wPSBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBvdGhlcmx2XzEwPShUb2tlbiltYXRjaChpbnB1dCwyMSxGT0xMT1dfMjFfaW5fcnVsZVBlcnNwZWN0aXZlNzExKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEwLCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQWNjZXNzKCkuZ2V0SWNvblVSSUtleXdvcmRfNV8wXzAoKSk7CisgICAgICAgICAgICAJICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzY5OjE6ICggKGx2X2ljb25VUklfMTFfMD0gUlVMRV9TVFJJTkcgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzcwOjE6IChsdl9pY29uVVJJXzExXzA9IFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjM3MDoxOiAobHZfaWNvblVSSV8xMV8wPSBSVUxFX1NUUklORyApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzcxOjM6IGx2X2ljb25VUklfMTFfMD0gUlVMRV9TVFJJTkcKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBsdl9pY29uVVJJXzExXzA9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfU1RSSU5HLEZPTExPV19SVUxFX1NUUklOR19pbl9ydWxlUGVyc3BlY3RpdmU3MjgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJCQluZXdMZWFmTm9kZShsdl9pY29uVVJJXzExXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRJY29uVVJJU1RSSU5HVGVybWluYWxSdWxlQ2FsbF81XzBfMV8wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAJCQorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJpY29uVVJJIiwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfaWNvblVSSV8xMV8wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIlNUUklORyIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF81KCkpOworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAyIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozOTQ6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTI9ICdhY2Nlc3NpYmlsaXR5JyAoIChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzEzXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozOTQ6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTI9ICdhY2Nlc3NpYmlsaXR5JyAoIChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzEzXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mzk1OjU6IHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTI9ICdhY2Nlc3NpYmlsaXR5JyAoIChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzEzXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNSgpLCAxKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZVBlcnNwZWN0aXZlIiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF81KCksIDEpIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozOTU6MTA4OiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTI9ICdhY2Nlc3NpYmlsaXR5JyAoIChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzEzXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjM5Njo2OiAoey4uLn0/ID0+IChvdGhlcmx2XzEyPSAnYWNjZXNzaWJpbGl0eScgKCAobHZfYWNjZXNzaWJpbGl0eVBocmFzZV8xM18wPSBSVUxFX1NUUklORyApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzUoKSwgMSk7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mzk5OjY6ICh7Li4ufT8gPT4gKG90aGVybHZfMTI9ICdhY2Nlc3NpYmlsaXR5JyAoIChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzEzXzA9IFJVTEVfU1RSSU5HICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozOTk6Nzogey4uLn0/ID0+IChvdGhlcmx2XzEyPSAnYWNjZXNzaWJpbGl0eScgKCAobHZfYWNjZXNzaWJpbGl0eVBocmFzZV8xM18wPSBSVUxFX1NUUklORyApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISgodHJ1ZSkpICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlUGVyc3BlY3RpdmUiLCAidHJ1ZSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mzk5OjE2OiAob3RoZXJsdl8xMj0gJ2FjY2Vzc2liaWxpdHknICggKGx2X2FjY2Vzc2liaWxpdHlQaHJhc2VfMTNfMD0gUlVMRV9TVFJJTkcgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozOTk6MTg6IG90aGVybHZfMTI9ICdhY2Nlc3NpYmlsaXR5JyAoIChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzEzXzA9IFJVTEVfU1RSSU5HICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIG90aGVybHZfMTI9KFRva2VuKW1hdGNoKGlucHV0LDIyLEZPTExPV18yMl9pbl9ydWxlUGVyc3BlY3RpdmU4MDEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTIsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRBY2Nlc3NpYmlsaXR5S2V5d29yZF81XzFfMCgpKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo0MDM6MTogKCAobHZfYWNjZXNzaWJpbGl0eVBocmFzZV8xM18wPSBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo0MDQ6MTogKGx2X2FjY2Vzc2liaWxpdHlQaHJhc2VfMTNfMD0gUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NDA0OjE6IChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzEzXzA9IFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo0MDU6MzogbHZfYWNjZXNzaWJpbGl0eVBocmFzZV8xM18wPSBSVUxFX1NUUklORworICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGx2X2FjY2Vzc2liaWxpdHlQaHJhc2VfMTNfMD0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9TVFJJTkcsRk9MTE9XX1JVTEVfU1RSSU5HX2luX3J1bGVQZXJzcGVjdGl2ZTgxOCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkJCW5ld0xlYWZOb2RlKGx2X2FjY2Vzc2liaWxpdHlQaHJhc2VfMTNfMCwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldEFjY2Vzc2liaWxpdHlQaHJhc2VTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzVfMV8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkJCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVSdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJImFjY2Vzc2liaWxpdHlQaHJhc2UiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzEzXzAsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiU1RSSU5HIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzUoKSk7CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDMgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQyODo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xND0gJ3Rvb2xiYXInICggKG90aGVybHZfMTU9IFJVTEVfSUQgKSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQyODo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xND0gJ3Rvb2xiYXInICggKG90aGVybHZfMTU9IFJVTEVfSUQgKSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo0Mjk6NTogey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xND0gJ3Rvb2xiYXInICggKG90aGVybHZfMTU9IFJVTEVfSUQgKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF81KCksIDIpICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlUGVyc3BlY3RpdmUiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzUoKSwgMikiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQyOToxMDg6ICggKHsuLi59PyA9PiAob3RoZXJsdl8xND0gJ3Rvb2xiYXInICggKG90aGVybHZfMTU9IFJVTEVfSUQgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NDMwOjY6ICh7Li4ufT8gPT4gKG90aGVybHZfMTQ9ICd0b29sYmFyJyAoIChvdGhlcmx2XzE1PSBSVUxFX0lEICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNSgpLCAyKTsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo0MzM6NjogKHsuLi59PyA9PiAob3RoZXJsdl8xND0gJ3Rvb2xiYXInICggKG90aGVybHZfMTU9IFJVTEVfSUQgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQzMzo3OiB7Li4ufT8gPT4gKG90aGVybHZfMTQ9ICd0b29sYmFyJyAoIChvdGhlcmx2XzE1PSBSVUxFX0lEICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhKCh0cnVlKSkgKSB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVQZXJzcGVjdGl2ZSIsICJ0cnVlIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo0MzM6MTY6IChvdGhlcmx2XzE0PSAndG9vbGJhcicgKCAob3RoZXJsdl8xNT0gUlVMRV9JRCApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQzMzoxODogb3RoZXJsdl8xND0gJ3Rvb2xiYXInICggKG90aGVybHZfMTU9IFJVTEVfSUQgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgb3RoZXJsdl8xND0oVG9rZW4pbWF0Y2goaW5wdXQsMjMsRk9MTE9XXzIzX2luX3J1bGVQZXJzcGVjdGl2ZTg5MSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xNCwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldFRvb2xiYXJLZXl3b3JkXzVfMl8wKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQzNzoxOiAoIChvdGhlcmx2XzE1PSBSVUxFX0lEICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQzODoxOiAob3RoZXJsdl8xNT0gUlVMRV9JRCApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo0Mzg6MTogKG90aGVybHZfMTU9IFJVTEVfSUQgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQzOTozOiBvdGhlcmx2XzE1PSBSVUxFX0lECisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVSdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIG90aGVybHZfMTU9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XX1JVTEVfSURfaW5fcnVsZVBlcnNwZWN0aXZlOTExKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCQluZXdMZWFmTm9kZShvdGhlcmx2XzE1LCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQWNjZXNzKCkuZ2V0VG9vbGJhckFjdGlvblRvb2xiYXJDcm9zc1JlZmVyZW5jZV81XzJfMV8wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAJCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF81KCkpOworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5sZWF2ZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNSgpKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdGhlcmx2XzE2PShUb2tlbiltYXRjaChpbnB1dCwxNCxGT0xMT1dfMTRfaW5fcnVsZVBlcnNwZWN0aXZlOTY0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTYsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF82KCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQ2ODoxOiAoIChsdl9lbGVtZW50c18xN18wPSBydWxlUGVyc3BlY3RpdmVFbGVtZW50ICkgKSoKKyAgICAgICAgICAgIGxvb3A4OgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQ4PTI7CisgICAgICAgICAgICAgICAgaW50IExBOF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQThfMD09MjR8fChMQThfMD49MjggJiYgTEE4XzA8PTI5KSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDg9MTsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0OCkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NDY5OjE6IChsdl9lbGVtZW50c18xN18wPSBydWxlUGVyc3BlY3RpdmVFbGVtZW50ICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjQ2OToxOiAobHZfZWxlbWVudHNfMTdfMD0gcnVsZVBlcnNwZWN0aXZlRWxlbWVudCApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NDcwOjM6IGx2X2VsZW1lbnRzXzE3XzA9IHJ1bGVQZXJzcGVjdGl2ZUVsZW1lbnQKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQWNjZXNzKCkuZ2V0RWxlbWVudHNQZXJzcGVjdGl2ZUVsZW1lbnRQYXJzZXJSdWxlQ2FsbF83XzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVBlcnNwZWN0aXZlRWxlbWVudF9pbl9ydWxlUGVyc3BlY3RpdmU5ODUpOworICAgICAgICAgICAgCSAgICBsdl9lbGVtZW50c18xN18wPXJ1bGVQZXJzcGVjdGl2ZUVsZW1lbnQoKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCWFkZCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJlbGVtZW50cyIsCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X2VsZW1lbnRzXzE3XzAsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiUGVyc3BlY3RpdmVFbGVtZW50Iik7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3A4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICBvdGhlcmx2XzE4PShUb2tlbiltYXRjaChpbnB1dCwxNSxGT0xMT1dfMTVfaW5fcnVsZVBlcnNwZWN0aXZlOTk4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTgsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfOCgpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlUGVyc3BlY3RpdmUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlUGVyc3BlY3RpdmVFbGVtZW50IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NDk4OjE6IGVudHJ5UnVsZVBlcnNwZWN0aXZlRWxlbWVudCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlUGVyc3BlY3RpdmVFbGVtZW50PSBydWxlUGVyc3BlY3RpdmVFbGVtZW50IEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlUGVyc3BlY3RpdmVFbGVtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVQZXJzcGVjdGl2ZUVsZW1lbnQgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NDk5OjI6IChpdl9ydWxlUGVyc3BlY3RpdmVFbGVtZW50PSBydWxlUGVyc3BlY3RpdmVFbGVtZW50IEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjUwMDoyOiBpdl9ydWxlUGVyc3BlY3RpdmVFbGVtZW50PSBydWxlUGVyc3BlY3RpdmVFbGVtZW50IEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVFbGVtZW50UnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUGVyc3BlY3RpdmVFbGVtZW50X2luX2VudHJ5UnVsZVBlcnNwZWN0aXZlRWxlbWVudDEwMzQpOworICAgICAgICAgICAgaXZfcnVsZVBlcnNwZWN0aXZlRWxlbWVudD1ydWxlUGVyc3BlY3RpdmVFbGVtZW50KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlUGVyc3BlY3RpdmVFbGVtZW50OyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVBlcnNwZWN0aXZlRWxlbWVudDEwNDQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlUGVyc3BlY3RpdmVFbGVtZW50IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVQZXJzcGVjdGl2ZUVsZW1lbnQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo1MDc6MTogcnVsZVBlcnNwZWN0aXZlRWxlbWVudCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAodGhpc19QZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfMD0gcnVsZVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lciB8IHRoaXNfUGVyc3BlY3RpdmVQYXJ0U3RhY2tfMT0gcnVsZVBlcnNwZWN0aXZlUGFydFN0YWNrIHwgdGhpc19QZXJzcGVjdGl2ZVBhcnRfMj0gcnVsZVBlcnNwZWN0aXZlUGFydCApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlUGVyc3BlY3RpdmVFbGVtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IHRoaXNfUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyXzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgdGhpc19QZXJzcGVjdGl2ZVBhcnRTdGFja18xID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IHRoaXNfUGVyc3BlY3RpdmVQYXJ0XzIgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo1MTA6Mjg6ICggKHRoaXNfUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyXzA9IHJ1bGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIgfCB0aGlzX1BlcnNwZWN0aXZlUGFydFN0YWNrXzE9IHJ1bGVQZXJzcGVjdGl2ZVBhcnRTdGFjayB8IHRoaXNfUGVyc3BlY3RpdmVQYXJ0XzI9IHJ1bGVQZXJzcGVjdGl2ZVBhcnQgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjUxMToxOiAodGhpc19QZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfMD0gcnVsZVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lciB8IHRoaXNfUGVyc3BlY3RpdmVQYXJ0U3RhY2tfMT0gcnVsZVBlcnNwZWN0aXZlUGFydFN0YWNrIHwgdGhpc19QZXJzcGVjdGl2ZVBhcnRfMj0gcnVsZVBlcnNwZWN0aXZlUGFydCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjUxMToxOiAodGhpc19QZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfMD0gcnVsZVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lciB8IHRoaXNfUGVyc3BlY3RpdmVQYXJ0U3RhY2tfMT0gcnVsZVBlcnNwZWN0aXZlUGFydFN0YWNrIHwgdGhpc19QZXJzcGVjdGl2ZVBhcnRfMj0gcnVsZVBlcnNwZWN0aXZlUGFydCApCisgICAgICAgICAgICBpbnQgYWx0OT0zOworICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7CisgICAgICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ5PTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyODoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0OT0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDk9MzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgOSwgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQ5KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo1MTI6NTogdGhpc19QZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfMD0gcnVsZVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lcgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUVsZW1lbnRBY2Nlc3MoKS5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJQYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lcl9pbl9ydWxlUGVyc3BlY3RpdmVFbGVtZW50MTA5MSk7CisgICAgICAgICAgICAgICAgICAgIHRoaXNfUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyXzA9cnVsZVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lcigpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0aGlzX1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lcl8wOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTIyOjU6IHRoaXNfUGVyc3BlY3RpdmVQYXJ0U3RhY2tfMT0gcnVsZVBlcnNwZWN0aXZlUGFydFN0YWNrCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlRWxlbWVudEFjY2VzcygpLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrUGFyc2VyUnVsZUNhbGxfMSgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVQZXJzcGVjdGl2ZVBhcnRTdGFja19pbl9ydWxlUGVyc3BlY3RpdmVFbGVtZW50MTExOCk7CisgICAgICAgICAgICAgICAgICAgIHRoaXNfUGVyc3BlY3RpdmVQYXJ0U3RhY2tfMT1ydWxlUGVyc3BlY3RpdmVQYXJ0U3RhY2soKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gdGhpc19QZXJzcGVjdGl2ZVBhcnRTdGFja18xOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMyA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTMyOjU6IHRoaXNfUGVyc3BlY3RpdmVQYXJ0XzI9IHJ1bGVQZXJzcGVjdGl2ZVBhcnQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVFbGVtZW50QWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVQYXJ0UGFyc2VyUnVsZUNhbGxfMigpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVQZXJzcGVjdGl2ZVBhcnRfaW5fcnVsZVBlcnNwZWN0aXZlRWxlbWVudDExNDUpOworICAgICAgICAgICAgICAgICAgICB0aGlzX1BlcnNwZWN0aXZlUGFydF8yPXJ1bGVQZXJzcGVjdGl2ZVBhcnQoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gdGhpc19QZXJzcGVjdGl2ZVBhcnRfMjsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVBlcnNwZWN0aXZlRWxlbWVudCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo1NDg6MTogZW50cnlSdWxlUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXI9IHJ1bGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lciA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo1NDk6MjogKGl2X3J1bGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXI9IHJ1bGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTUwOjI6IGl2X3J1bGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXI9IHJ1bGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfaW5fZW50cnlSdWxlUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyMTE4MCk7CisgICAgICAgICAgICBpdl9ydWxlUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyPXJ1bGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXI7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyMTE5MCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lciIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjU1NzoxOiBydWxlUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAnc2FzaENvbnRhaW5lcicgKCAobHZfZWxlbWVudElkXzJfMD0gUlVMRV9JRCApICkgKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80PSAnb3JpZW50YXRpb24nICggKGx2X29yaWVudGF0aW9uXzVfMD0gcnVsZVNhc2hPcmllbnRhdGlvbiApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdzZWxlY3RlZEVsZW1lbnQnICggKG90aGVybHZfNz0gUlVMRV9JRCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdzcGFjZVZvbHVtZScgKCAobHZfY29udGFpbmVyRGF0YV85XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTA9ICdhY2Nlc3NpYmlsaXR5JyAoIChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzExXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApICkqICkgKSApIG90aGVybHZfMTI9ICd7JyAoIChsdl9lbGVtZW50c18xM18wPSBydWxlUGVyc3BlY3RpdmVFbGVtZW50ICkgKSogb3RoZXJsdl8xND0gJ30nICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIFRva2VuIG90aGVybHZfMT1udWxsOworICAgICAgICBUb2tlbiBsdl9lbGVtZW50SWRfMl8wPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfND1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzY9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl83PW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfOD1udWxsOworICAgICAgICBUb2tlbiBsdl9jb250YWluZXJEYXRhXzlfMD1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzEwPW51bGw7CisgICAgICAgIFRva2VuIGx2X2FjY2Vzc2liaWxpdHlQaHJhc2VfMTFfMD1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzEyPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMTQ9bnVsbDsKKyAgICAgICAgRW51bWVyYXRvciBsdl9vcmllbnRhdGlvbl81XzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgbHZfZWxlbWVudHNfMTNfMCA9IG51bGw7CisKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjU2MDoyODogKCAoICgpIG90aGVybHZfMT0gJ3Nhc2hDb250YWluZXInICggKGx2X2VsZW1lbnRJZF8yXzA9IFJVTEVfSUQgKSApICggKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ29yaWVudGF0aW9uJyAoIChsdl9vcmllbnRhdGlvbl81XzA9IHJ1bGVTYXNoT3JpZW50YXRpb24gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAnc2VsZWN0ZWRFbGVtZW50JyAoIChvdGhlcmx2Xzc9IFJVTEVfSUQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnc3BhY2VWb2x1bWUnICggKGx2X2NvbnRhaW5lckRhdGFfOV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEwPSAnYWNjZXNzaWJpbGl0eScgKCAobHZfYWNjZXNzaWJpbGl0eVBocmFzZV8xMV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSApKiApICkgKSBvdGhlcmx2XzEyPSAneycgKCAobHZfZWxlbWVudHNfMTNfMD0gcnVsZVBlcnNwZWN0aXZlRWxlbWVudCApICkqIG90aGVybHZfMTQ9ICd9JyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTYxOjE6ICggKCkgb3RoZXJsdl8xPSAnc2FzaENvbnRhaW5lcicgKCAobHZfZWxlbWVudElkXzJfMD0gUlVMRV9JRCApICkgKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80PSAnb3JpZW50YXRpb24nICggKGx2X29yaWVudGF0aW9uXzVfMD0gcnVsZVNhc2hPcmllbnRhdGlvbiApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdzZWxlY3RlZEVsZW1lbnQnICggKG90aGVybHZfNz0gUlVMRV9JRCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdzcGFjZVZvbHVtZScgKCAobHZfY29udGFpbmVyRGF0YV85XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTA9ICdhY2Nlc3NpYmlsaXR5JyAoIChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzExXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApICkqICkgKSApIG90aGVybHZfMTI9ICd7JyAoIChsdl9lbGVtZW50c18xM18wPSBydWxlUGVyc3BlY3RpdmVFbGVtZW50ICkgKSogb3RoZXJsdl8xND0gJ30nICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTYxOjE6ICggKCkgb3RoZXJsdl8xPSAnc2FzaENvbnRhaW5lcicgKCAobHZfZWxlbWVudElkXzJfMD0gUlVMRV9JRCApICkgKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80PSAnb3JpZW50YXRpb24nICggKGx2X29yaWVudGF0aW9uXzVfMD0gcnVsZVNhc2hPcmllbnRhdGlvbiApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdzZWxlY3RlZEVsZW1lbnQnICggKG90aGVybHZfNz0gUlVMRV9JRCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdzcGFjZVZvbHVtZScgKCAobHZfY29udGFpbmVyRGF0YV85XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTA9ICdhY2Nlc3NpYmlsaXR5JyAoIChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzExXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApICkqICkgKSApIG90aGVybHZfMTI9ICd7JyAoIChsdl9lbGVtZW50c18xM18wPSBydWxlUGVyc3BlY3RpdmVFbGVtZW50ICkgKSogb3RoZXJsdl8xND0gJ30nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTYxOjI6ICgpIG90aGVybHZfMT0gJ3Nhc2hDb250YWluZXInICggKGx2X2VsZW1lbnRJZF8yXzA9IFJVTEVfSUQgKSApICggKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ29yaWVudGF0aW9uJyAoIChsdl9vcmllbnRhdGlvbl81XzA9IHJ1bGVTYXNoT3JpZW50YXRpb24gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAnc2VsZWN0ZWRFbGVtZW50JyAoIChvdGhlcmx2Xzc9IFJVTEVfSUQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnc3BhY2VWb2x1bWUnICggKGx2X2NvbnRhaW5lckRhdGFfOV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEwPSAnYWNjZXNzaWJpbGl0eScgKCAobHZfYWNjZXNzaWJpbGl0eVBocmFzZV8xMV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSApKiApICkgKSBvdGhlcmx2XzEyPSAneycgKCAobHZfZWxlbWVudHNfMTNfMD0gcnVsZVBlcnNwZWN0aXZlRWxlbWVudCApICkqIG90aGVybHZfMTQ9ICd9JworICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo1NjE6MjogKCkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTYyOjU6IAorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyQWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDI0LEZPTExPV18yNF9pbl9ydWxlUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyMTIzNik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyQWNjZXNzKCkuZ2V0U2FzaENvbnRhaW5lcktleXdvcmRfMSgpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo1NzE6MTogKCAobHZfZWxlbWVudElkXzJfMD0gUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTcyOjE6IChsdl9lbGVtZW50SWRfMl8wPSBSVUxFX0lEICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTcyOjE6IChsdl9lbGVtZW50SWRfMl8wPSBSVUxFX0lEICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTczOjM6IGx2X2VsZW1lbnRJZF8yXzA9IFJVTEVfSUQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGx2X2VsZW1lbnRJZF8yXzA9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XX1JVTEVfSURfaW5fcnVsZVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lcjEyNTMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKGx2X2VsZW1lbnRJZF8yXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyQWNjZXNzKCkuZ2V0RWxlbWVudElkSURUZXJtaW5hbFJ1bGVDYWxsXzJfMCgpKTsgCisgICAgICAgICAgICAgIAkJCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lclJ1bGUoKSk7CisgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgKKyAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgCQkJImVsZW1lbnRJZCIsCisgICAgICAgICAgICAgICAgICAgICAgCQlsdl9lbGVtZW50SWRfMl8wLCAKKyAgICAgICAgICAgICAgICAgICAgICAJCSJJRCIpOworICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjU4OToyOiAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdvcmllbnRhdGlvbicgKCAobHZfb3JpZW50YXRpb25fNV8wPSBydWxlU2FzaE9yaWVudGF0aW9uICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ3NlbGVjdGVkRWxlbWVudCcgKCAob3RoZXJsdl83PSBSVUxFX0lEICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ3NwYWNlVm9sdW1lJyAoIChsdl9jb250YWluZXJEYXRhXzlfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMD0gJ2FjY2Vzc2liaWxpdHknICggKGx2X2FjY2Vzc2liaWxpdHlQaHJhc2VfMTFfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSogKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTkxOjE6ICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdvcmllbnRhdGlvbicgKCAobHZfb3JpZW50YXRpb25fNV8wPSBydWxlU2FzaE9yaWVudGF0aW9uICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ3NlbGVjdGVkRWxlbWVudCcgKCAob3RoZXJsdl83PSBSVUxFX0lEICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ3NwYWNlVm9sdW1lJyAoIChsdl9jb250YWluZXJEYXRhXzlfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMD0gJ2FjY2Vzc2liaWxpdHknICggKGx2X2FjY2Vzc2liaWxpdHlQaHJhc2VfMTFfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSogKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjU5MToxOiAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80PSAnb3JpZW50YXRpb24nICggKGx2X29yaWVudGF0aW9uXzVfMD0gcnVsZVNhc2hPcmllbnRhdGlvbiApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdzZWxlY3RlZEVsZW1lbnQnICggKG90aGVybHZfNz0gUlVMRV9JRCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdzcGFjZVZvbHVtZScgKCAobHZfY29udGFpbmVyRGF0YV85XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTA9ICdhY2Nlc3NpYmlsaXR5JyAoIChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzExXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApICkqICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo1OTI6MjogKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdvcmllbnRhdGlvbicgKCAobHZfb3JpZW50YXRpb25fNV8wPSBydWxlU2FzaE9yaWVudGF0aW9uICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ3NlbGVjdGVkRWxlbWVudCcgKCAob3RoZXJsdl83PSBSVUxFX0lEICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ3NwYWNlVm9sdW1lJyAoIChsdl9jb250YWluZXJEYXRhXzlfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMD0gJ2FjY2Vzc2liaWxpdHknICggKGx2X2FjY2Vzc2liaWxpdHlQaHJhc2VfMTFfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSogKQorICAgICAgICAgICAgeworICAgICAgICAgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5lbnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSk7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjU5NToyOiAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ29yaWVudGF0aW9uJyAoIChsdl9vcmllbnRhdGlvbl81XzA9IHJ1bGVTYXNoT3JpZW50YXRpb24gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAnc2VsZWN0ZWRFbGVtZW50JyAoIChvdGhlcmx2Xzc9IFJVTEVfSUQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnc3BhY2VWb2x1bWUnICggKGx2X2NvbnRhaW5lckRhdGFfOV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEwPSAnYWNjZXNzaWJpbGl0eScgKCAobHZfYWNjZXNzaWJpbGl0eVBocmFzZV8xMV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSApKiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjU5NjozOiAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdvcmllbnRhdGlvbicgKCAobHZfb3JpZW50YXRpb25fNV8wPSBydWxlU2FzaE9yaWVudGF0aW9uICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ3NlbGVjdGVkRWxlbWVudCcgKCAob3RoZXJsdl83PSBSVUxFX0lEICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ3NwYWNlVm9sdW1lJyAoIChsdl9jb250YWluZXJEYXRhXzlfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMD0gJ2FjY2Vzc2liaWxpdHknICggKGx2X2FjY2Vzc2liaWxpdHlQaHJhc2VfMTFfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTk2OjM6ICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ29yaWVudGF0aW9uJyAoIChsdl9vcmllbnRhdGlvbl81XzA9IHJ1bGVTYXNoT3JpZW50YXRpb24gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAnc2VsZWN0ZWRFbGVtZW50JyAoIChvdGhlcmx2Xzc9IFJVTEVfSUQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnc3BhY2VWb2x1bWUnICggKGx2X2NvbnRhaW5lckRhdGFfOV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEwPSAnYWNjZXNzaWJpbGl0eScgKCAobHZfYWNjZXNzaWJpbGl0eVBocmFzZV8xMV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSApKgorICAgICAgICAgICAgbG9vcDEwOgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQxMD01OworICAgICAgICAgICAgICAgIGludCBMQTEwXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgIGlmICggTEExMF8wID09MjUgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDApICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxMD0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggTEExMF8wID09MjYgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxMD0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggTEExMF8wID09MjcgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDIpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxMD0zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggTEExMF8wID09MjIgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDMpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxMD00OworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMCkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTk4OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdvcmllbnRhdGlvbicgKCAobHZfb3JpZW50YXRpb25fNV8wPSBydWxlU2FzaE9yaWVudGF0aW9uICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo1OTg6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ29yaWVudGF0aW9uJyAoIChsdl9vcmllbnRhdGlvbl81XzA9IHJ1bGVTYXNoT3JpZW50YXRpb24gKSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo1OTk6NTogey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80PSAnb3JpZW50YXRpb24nICggKGx2X29yaWVudGF0aW9uXzVfMD0gcnVsZVNhc2hPcmllbnRhdGlvbiApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDApICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyIiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAwKSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NTk5OjEyMTogKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdvcmllbnRhdGlvbicgKCAobHZfb3JpZW50YXRpb25fNV8wPSBydWxlU2FzaE9yaWVudGF0aW9uICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjYwMDo2OiAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdvcmllbnRhdGlvbicgKCAobHZfb3JpZW50YXRpb25fNV8wPSBydWxlU2FzaE9yaWVudGF0aW9uICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMCk7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjAzOjY6ICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ29yaWVudGF0aW9uJyAoIChsdl9vcmllbnRhdGlvbl81XzA9IHJ1bGVTYXNoT3JpZW50YXRpb24gKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjYwMzo3OiB7Li4ufT8gPT4gKG90aGVybHZfND0gJ29yaWVudGF0aW9uJyAoIChsdl9vcmllbnRhdGlvbl81XzA9IHJ1bGVTYXNoT3JpZW50YXRpb24gKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEoKHRydWUpKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lciIsICJ0cnVlIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo2MDM6MTY6IChvdGhlcmx2XzQ9ICdvcmllbnRhdGlvbicgKCAobHZfb3JpZW50YXRpb25fNV8wPSBydWxlU2FzaE9yaWVudGF0aW9uICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjAzOjE4OiBvdGhlcmx2XzQ9ICdvcmllbnRhdGlvbicgKCAobHZfb3JpZW50YXRpb25fNV8wPSBydWxlU2FzaE9yaWVudGF0aW9uICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIG90aGVybHZfND0oVG9rZW4pbWF0Y2goaW5wdXQsMjUsRk9MTE9XXzI1X2luX3J1bGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIxMzE2KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzQsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyQWNjZXNzKCkuZ2V0T3JpZW50YXRpb25LZXl3b3JkXzNfMF8wKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjYwNzoxOiAoIChsdl9vcmllbnRhdGlvbl81XzA9IHJ1bGVTYXNoT3JpZW50YXRpb24gKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjA4OjE6IChsdl9vcmllbnRhdGlvbl81XzA9IHJ1bGVTYXNoT3JpZW50YXRpb24gKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjA4OjE6IChsdl9vcmllbnRhdGlvbl81XzA9IHJ1bGVTYXNoT3JpZW50YXRpb24gKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjYwOTozOiBsdl9vcmllbnRhdGlvbl81XzA9IHJ1bGVTYXNoT3JpZW50YXRpb24KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldE9yaWVudGF0aW9uU2FzaE9yaWVudGF0aW9uRW51bVJ1bGVDYWxsXzNfMF8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVNhc2hPcmllbnRhdGlvbl9pbl9ydWxlUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyMTMzNyk7CisgICAgICAgICAgICAJICAgIGx2X29yaWVudGF0aW9uXzVfMD1ydWxlU2FzaE9yaWVudGF0aW9uKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJIm9yaWVudGF0aW9uIiwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfb3JpZW50YXRpb25fNV8wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIlNhc2hPcmllbnRhdGlvbiIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSk7CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDIgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjYzMjo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAnc2VsZWN0ZWRFbGVtZW50JyAoIChvdGhlcmx2Xzc9IFJVTEVfSUQgKSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjYzMjo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAnc2VsZWN0ZWRFbGVtZW50JyAoIChvdGhlcmx2Xzc9IFJVTEVfSUQgKSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo2MzM6NTogey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAnc2VsZWN0ZWRFbGVtZW50JyAoIChvdGhlcmx2Xzc9IFJVTEVfSUQgKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lciIsICJnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMSkiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjYzMzoxMjE6ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAnc2VsZWN0ZWRFbGVtZW50JyAoIChvdGhlcmx2Xzc9IFJVTEVfSUQgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjM0OjY6ICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ3NlbGVjdGVkRWxlbWVudCcgKCAob3RoZXJsdl83PSBSVUxFX0lEICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMSk7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjM3OjY6ICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ3NlbGVjdGVkRWxlbWVudCcgKCAob3RoZXJsdl83PSBSVUxFX0lEICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo2Mzc6Nzogey4uLn0/ID0+IChvdGhlcmx2XzY9ICdzZWxlY3RlZEVsZW1lbnQnICggKG90aGVybHZfNz0gUlVMRV9JRCApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISgodHJ1ZSkpICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyIiwgInRydWUiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjYzNzoxNjogKG90aGVybHZfNj0gJ3NlbGVjdGVkRWxlbWVudCcgKCAob3RoZXJsdl83PSBSVUxFX0lEICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjM3OjE4OiBvdGhlcmx2XzY9ICdzZWxlY3RlZEVsZW1lbnQnICggKG90aGVybHZfNz0gUlVMRV9JRCApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBvdGhlcmx2XzY9KFRva2VuKW1hdGNoKGlucHV0LDI2LEZPTExPV18yNl9pbl9ydWxlUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyMTQwNSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl82LCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldFNlbGVjdGVkRWxlbWVudEtleXdvcmRfM18xXzAoKSk7CisgICAgICAgICAgICAJICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjQxOjE6ICggKG90aGVybHZfNz0gUlVMRV9JRCApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo2NDI6MTogKG90aGVybHZfNz0gUlVMRV9JRCApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo2NDI6MTogKG90aGVybHZfNz0gUlVMRV9JRCApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjQzOjM6IG90aGVybHZfNz0gUlVMRV9JRAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCQkJaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lclJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgb3RoZXJsdl83PShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lELEZPTExPV19SVUxFX0lEX2luX3J1bGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIxNDI1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCQluZXdMZWFmTm9kZShvdGhlcmx2XzcsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyQWNjZXNzKCkuZ2V0U2VsZWN0ZWRFbGVtZW50UGVyc3BlY3RpdmVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfM18xXzFfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCQorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSk7CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDMgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjY2MTo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnc3BhY2VWb2x1bWUnICggKGx2X2NvbnRhaW5lckRhdGFfOV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjYxOjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdzcGFjZVZvbHVtZScgKCAobHZfY29udGFpbmVyRGF0YV85XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjYyOjU6IHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ3NwYWNlVm9sdW1lJyAoIChsdl9jb250YWluZXJEYXRhXzlfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAyKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lciIsICJnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMikiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjY2MjoxMjE6ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnc3BhY2VWb2x1bWUnICggKGx2X2NvbnRhaW5lckRhdGFfOV8wPSBSVUxFX1NUUklORyApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo2NjM6NjogKHsuLi59PyA9PiAob3RoZXJsdl84PSAnc3BhY2VWb2x1bWUnICggKGx2X2NvbnRhaW5lckRhdGFfOV8wPSBSVUxFX1NUUklORyApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDIpOworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjY2Njo2OiAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdzcGFjZVZvbHVtZScgKCAobHZfY29udGFpbmVyRGF0YV85XzA9IFJVTEVfU1RSSU5HICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo2NjY6Nzogey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdzcGFjZVZvbHVtZScgKCAobHZfY29udGFpbmVyRGF0YV85XzA9IFJVTEVfU1RSSU5HICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhKCh0cnVlKSkgKSB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIiLCAidHJ1ZSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NjY2OjE2OiAob3RoZXJsdl84PSAnc3BhY2VWb2x1bWUnICggKGx2X2NvbnRhaW5lckRhdGFfOV8wPSBSVUxFX1NUUklORyApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjY2NjoxODogb3RoZXJsdl84PSAnc3BhY2VWb2x1bWUnICggKGx2X2NvbnRhaW5lckRhdGFfOV8wPSBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBvdGhlcmx2Xzg9KFRva2VuKW1hdGNoKGlucHV0LDI3LEZPTExPV18yN19pbl9ydWxlUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyMTQ5Myk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl84LCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldFNwYWNlVm9sdW1lS2V5d29yZF8zXzJfMCgpKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo2NzA6MTogKCAobHZfY29udGFpbmVyRGF0YV85XzA9IFJVTEVfU1RSSU5HICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjY3MToxOiAobHZfY29udGFpbmVyRGF0YV85XzA9IFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjY3MToxOiAobHZfY29udGFpbmVyRGF0YV85XzA9IFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo2NzI6MzogbHZfY29udGFpbmVyRGF0YV85XzA9IFJVTEVfU1RSSU5HCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgbHZfY29udGFpbmVyRGF0YV85XzA9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfU1RSSU5HLEZPTExPV19SVUxFX1NUUklOR19pbl9ydWxlUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyMTUxMCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkJCW5ld0xlYWZOb2RlKGx2X2NvbnRhaW5lckRhdGFfOV8wLCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldENvbnRhaW5lckRhdGFTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzNfMl8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkJCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJjb250YWluZXJEYXRhIiwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfY29udGFpbmVyRGF0YV85XzAsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiU1RSSU5HIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCkpOworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSA0IDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo2OTU6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTA9ICdhY2Nlc3NpYmlsaXR5JyAoIChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzExXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo2OTU6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTA9ICdhY2Nlc3NpYmlsaXR5JyAoIChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzExXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Njk2OjU6IHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTA9ICdhY2Nlc3NpYmlsaXR5JyAoIChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzExXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMykgKSB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDMpIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo2OTY6MTIxOiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTA9ICdhY2Nlc3NpYmlsaXR5JyAoIChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzExXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjY5Nzo2OiAoey4uLn0/ID0+IChvdGhlcmx2XzEwPSAnYWNjZXNzaWJpbGl0eScgKCAobHZfYWNjZXNzaWJpbGl0eVBocmFzZV8xMV8wPSBSVUxFX1NUUklORyApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDMpOworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjcwMDo2OiAoey4uLn0/ID0+IChvdGhlcmx2XzEwPSAnYWNjZXNzaWJpbGl0eScgKCAobHZfYWNjZXNzaWJpbGl0eVBocmFzZV8xMV8wPSBSVUxFX1NUUklORyApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NzAwOjc6IHsuLi59PyA9PiAob3RoZXJsdl8xMD0gJ2FjY2Vzc2liaWxpdHknICggKGx2X2FjY2Vzc2liaWxpdHlQaHJhc2VfMTFfMD0gUlVMRV9TVFJJTkcgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEoKHRydWUpKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lciIsICJ0cnVlIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo3MDA6MTY6IChvdGhlcmx2XzEwPSAnYWNjZXNzaWJpbGl0eScgKCAobHZfYWNjZXNzaWJpbGl0eVBocmFzZV8xMV8wPSBSVUxFX1NUUklORyApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjcwMDoxODogb3RoZXJsdl8xMD0gJ2FjY2Vzc2liaWxpdHknICggKGx2X2FjY2Vzc2liaWxpdHlQaHJhc2VfMTFfMD0gUlVMRV9TVFJJTkcgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgb3RoZXJsdl8xMD0oVG9rZW4pbWF0Y2goaW5wdXQsMjIsRk9MTE9XXzIyX2luX3J1bGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIxNTgzKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEwLCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldEFjY2Vzc2liaWxpdHlLZXl3b3JkXzNfM18wKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjcwNDoxOiAoIChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzExXzA9IFJVTEVfU1RSSU5HICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjcwNToxOiAobHZfYWNjZXNzaWJpbGl0eVBocmFzZV8xMV8wPSBSVUxFX1NUUklORyApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo3MDU6MTogKGx2X2FjY2Vzc2liaWxpdHlQaHJhc2VfMTFfMD0gUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjcwNjozOiBsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzExXzA9IFJVTEVfU1RSSU5HCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgbHZfYWNjZXNzaWJpbGl0eVBocmFzZV8xMV8wPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX1NUUklORyxGT0xMT1dfUlVMRV9TVFJJTkdfaW5fcnVsZVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lcjE2MDApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJCQluZXdMZWFmTm9kZShsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzExXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyQWNjZXNzKCkuZ2V0QWNjZXNzaWJpbGl0eVBocmFzZVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfM18zXzFfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCQkKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJSdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJImFjY2Vzc2liaWxpdHlQaHJhc2UiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzExXzAsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiU1RSSU5HIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCkpOworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDEwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkubGVhdmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCkpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG90aGVybHZfMTI9KFRva2VuKW1hdGNoKGlucHV0LDE0LEZPTExPV18xNF9pbl9ydWxlUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyMTY1OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEyLCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzQoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NzQwOjE6ICggKGx2X2VsZW1lbnRzXzEzXzA9IHJ1bGVQZXJzcGVjdGl2ZUVsZW1lbnQgKSApKgorICAgICAgICAgICAgbG9vcDExOgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQxMT0yOworICAgICAgICAgICAgICAgIGludCBMQTExXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgIGlmICggKExBMTFfMD09MjR8fChMQTExXzA+PTI4ICYmIExBMTFfMDw9MjkpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTE9MTsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTEpIHsKKyAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjc0MToxOiAobHZfZWxlbWVudHNfMTNfMD0gcnVsZVBlcnNwZWN0aXZlRWxlbWVudCApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo3NDE6MTogKGx2X2VsZW1lbnRzXzEzXzA9IHJ1bGVQZXJzcGVjdGl2ZUVsZW1lbnQgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjc0MjozOiBsdl9lbGVtZW50c18xM18wPSBydWxlUGVyc3BlY3RpdmVFbGVtZW50CisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRFbGVtZW50c1BlcnNwZWN0aXZlRWxlbWVudFBhcnNlclJ1bGVDYWxsXzVfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUGVyc3BlY3RpdmVFbGVtZW50X2luX3J1bGVQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIxNjc5KTsKKyAgICAgICAgICAgIAkgICAgbHZfZWxlbWVudHNfMTNfMD1ydWxlUGVyc3BlY3RpdmVFbGVtZW50KCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJYWRkKAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJImVsZW1lbnRzIiwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfZWxlbWVudHNfMTNfMCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJQZXJzcGVjdGl2ZUVsZW1lbnQiKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDExOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICBvdGhlcmx2XzE0PShUb2tlbiltYXRjaChpbnB1dCwxNSxGT0xMT1dfMTVfaW5fcnVsZVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lcjE2OTIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xNCwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNigpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVBlcnNwZWN0aXZlUGFydFN0YWNrIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NzcwOjE6IGVudHJ5UnVsZVBlcnNwZWN0aXZlUGFydFN0YWNrIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVQZXJzcGVjdGl2ZVBhcnRTdGFjaz0gcnVsZVBlcnNwZWN0aXZlUGFydFN0YWNrIEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlUGVyc3BlY3RpdmVQYXJ0U3RhY2soKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZVBlcnNwZWN0aXZlUGFydFN0YWNrID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjc3MToyOiAoaXZfcnVsZVBlcnNwZWN0aXZlUGFydFN0YWNrPSBydWxlUGVyc3BlY3RpdmVQYXJ0U3RhY2sgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NzcyOjI6IGl2X3J1bGVQZXJzcGVjdGl2ZVBhcnRTdGFjaz0gcnVsZVBlcnNwZWN0aXZlUGFydFN0YWNrIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVQZXJzcGVjdGl2ZVBhcnRTdGFja19pbl9lbnRyeVJ1bGVQZXJzcGVjdGl2ZVBhcnRTdGFjazE3MjgpOworICAgICAgICAgICAgaXZfcnVsZVBlcnNwZWN0aXZlUGFydFN0YWNrPXJ1bGVQZXJzcGVjdGl2ZVBhcnRTdGFjaygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZVBlcnNwZWN0aXZlUGFydFN0YWNrOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVBlcnNwZWN0aXZlUGFydFN0YWNrMTczOCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVQZXJzcGVjdGl2ZVBhcnRTdGFjayIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlUGVyc3BlY3RpdmVQYXJ0U3RhY2siCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo3Nzk6MTogcnVsZVBlcnNwZWN0aXZlUGFydFN0YWNrIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAncGFydFN0YWNrJyAoIChsdl9lbGVtZW50SWRfMl8wPSBSVUxFX0lEICkgKSAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdzZWxlY3RlZEVsZW1lbnQnICggKG90aGVybHZfNT0gUlVMRV9JRCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdzcGFjZVZvbHVtZScgKCAobHZfY29udGFpbmVyRGF0YV83XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ2FjY2Vzc2liaWxpdHknICggKGx2X2FjY2Vzc2liaWxpdHlQaHJhc2VfOV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSApKiApICkgKSBvdGhlcmx2XzEwPSAneycgKCAobHZfZWxlbWVudHNfMTFfMD0gcnVsZVBlcnNwZWN0aXZlRWxlbWVudCApICkqIG90aGVybHZfMTI9ICd9JyApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlUGVyc3BlY3RpdmVQYXJ0U3RhY2soKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIFRva2VuIG90aGVybHZfMT1udWxsOworICAgICAgICBUb2tlbiBsdl9lbGVtZW50SWRfMl8wPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfND1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzU9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl82PW51bGw7CisgICAgICAgIFRva2VuIGx2X2NvbnRhaW5lckRhdGFfN18wPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfOD1udWxsOworICAgICAgICBUb2tlbiBsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzlfMD1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzEwPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMTI9bnVsbDsKKyAgICAgICAgRU9iamVjdCBsdl9lbGVtZW50c18xMV8wID0gbnVsbDsKKworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NzgyOjI4OiAoICggKCkgb3RoZXJsdl8xPSAncGFydFN0YWNrJyAoIChsdl9lbGVtZW50SWRfMl8wPSBSVUxFX0lEICkgKSAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdzZWxlY3RlZEVsZW1lbnQnICggKG90aGVybHZfNT0gUlVMRV9JRCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdzcGFjZVZvbHVtZScgKCAobHZfY29udGFpbmVyRGF0YV83XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ2FjY2Vzc2liaWxpdHknICggKGx2X2FjY2Vzc2liaWxpdHlQaHJhc2VfOV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSApKiApICkgKSBvdGhlcmx2XzEwPSAneycgKCAobHZfZWxlbWVudHNfMTFfMD0gcnVsZVBlcnNwZWN0aXZlRWxlbWVudCApICkqIG90aGVybHZfMTI9ICd9JyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NzgzOjE6ICggKCkgb3RoZXJsdl8xPSAncGFydFN0YWNrJyAoIChsdl9lbGVtZW50SWRfMl8wPSBSVUxFX0lEICkgKSAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdzZWxlY3RlZEVsZW1lbnQnICggKG90aGVybHZfNT0gUlVMRV9JRCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdzcGFjZVZvbHVtZScgKCAobHZfY29udGFpbmVyRGF0YV83XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ2FjY2Vzc2liaWxpdHknICggKGx2X2FjY2Vzc2liaWxpdHlQaHJhc2VfOV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSApKiApICkgKSBvdGhlcmx2XzEwPSAneycgKCAobHZfZWxlbWVudHNfMTFfMD0gcnVsZVBlcnNwZWN0aXZlRWxlbWVudCApICkqIG90aGVybHZfMTI9ICd9JyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjc4MzoxOiAoICgpIG90aGVybHZfMT0gJ3BhcnRTdGFjaycgKCAobHZfZWxlbWVudElkXzJfMD0gUlVMRV9JRCApICkgKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80PSAnc2VsZWN0ZWRFbGVtZW50JyAoIChvdGhlcmx2XzU9IFJVTEVfSUQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAnc3BhY2VWb2x1bWUnICggKGx2X2NvbnRhaW5lckRhdGFfN18wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdhY2Nlc3NpYmlsaXR5JyAoIChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzlfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSogKSApICkgb3RoZXJsdl8xMD0gJ3snICggKGx2X2VsZW1lbnRzXzExXzA9IHJ1bGVQZXJzcGVjdGl2ZUVsZW1lbnQgKSApKiBvdGhlcmx2XzEyPSAnfScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo3ODM6MjogKCkgb3RoZXJsdl8xPSAncGFydFN0YWNrJyAoIChsdl9lbGVtZW50SWRfMl8wPSBSVUxFX0lEICkgKSAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdzZWxlY3RlZEVsZW1lbnQnICggKG90aGVybHZfNT0gUlVMRV9JRCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdzcGFjZVZvbHVtZScgKCAobHZfY29udGFpbmVyRGF0YV83XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ2FjY2Vzc2liaWxpdHknICggKGx2X2FjY2Vzc2liaWxpdHlQaHJhc2VfOV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSApKiApICkgKSBvdGhlcmx2XzEwPSAneycgKCAobHZfZWxlbWVudHNfMTFfMD0gcnVsZVBlcnNwZWN0aXZlRWxlbWVudCApICkqIG90aGVybHZfMTI9ICd9JworICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo3ODM6MjogKCkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Nzg0OjU6IAorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY2Nlc3MoKS5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja0FjdGlvbl8wKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCwyOCxGT0xMT1dfMjhfaW5fcnVsZVBlcnNwZWN0aXZlUGFydFN0YWNrMTc4NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY2Nlc3MoKS5nZXRQYXJ0U3RhY2tLZXl3b3JkXzEoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6NzkzOjE6ICggKGx2X2VsZW1lbnRJZF8yXzA9IFJVTEVfSUQgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjc5NDoxOiAobHZfZWxlbWVudElkXzJfMD0gUlVMRV9JRCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjc5NDoxOiAobHZfZWxlbWVudElkXzJfMD0gUlVMRV9JRCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjc5NTozOiBsdl9lbGVtZW50SWRfMl8wPSBSVUxFX0lECisgICAgICAgICAgICB7CisgICAgICAgICAgICBsdl9lbGVtZW50SWRfMl8wPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lELEZPTExPV19SVUxFX0lEX2luX3J1bGVQZXJzcGVjdGl2ZVBhcnRTdGFjazE4MDEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKGx2X2VsZW1lbnRJZF8yXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY2Nlc3MoKS5nZXRFbGVtZW50SWRJRFRlcm1pbmFsUnVsZUNhbGxfMl8wKCkpOyAKKyAgICAgICAgICAgICAgCQkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tSdWxlKCkpOworICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoCisgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgIAkJCSJlbGVtZW50SWQiLAorICAgICAgICAgICAgICAgICAgICAgIAkJbHZfZWxlbWVudElkXzJfMCwgCisgICAgICAgICAgICAgICAgICAgICAgCQkiSUQiKTsKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4MTE6MjogKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80PSAnc2VsZWN0ZWRFbGVtZW50JyAoIChvdGhlcmx2XzU9IFJVTEVfSUQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAnc3BhY2VWb2x1bWUnICggKGx2X2NvbnRhaW5lckRhdGFfN18wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdhY2Nlc3NpYmlsaXR5JyAoIChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzlfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSogKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODEzOjE6ICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdzZWxlY3RlZEVsZW1lbnQnICggKG90aGVybHZfNT0gUlVMRV9JRCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdzcGFjZVZvbHVtZScgKCAobHZfY29udGFpbmVyRGF0YV83XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ2FjY2Vzc2liaWxpdHknICggKGx2X2FjY2Vzc2liaWxpdHlQaHJhc2VfOV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSApKiApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODEzOjE6ICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdzZWxlY3RlZEVsZW1lbnQnICggKG90aGVybHZfNT0gUlVMRV9JRCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdzcGFjZVZvbHVtZScgKCAobHZfY29udGFpbmVyRGF0YV83XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ2FjY2Vzc2liaWxpdHknICggKGx2X2FjY2Vzc2liaWxpdHlQaHJhc2VfOV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSApKiApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODE0OjI6ICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80PSAnc2VsZWN0ZWRFbGVtZW50JyAoIChvdGhlcmx2XzU9IFJVTEVfSUQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAnc3BhY2VWb2x1bWUnICggKGx2X2NvbnRhaW5lckRhdGFfN18wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdhY2Nlc3NpYmlsaXR5JyAoIChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzlfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSogKQorICAgICAgICAgICAgeworICAgICAgICAgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5lbnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpKTsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODE3OjI6ICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80PSAnc2VsZWN0ZWRFbGVtZW50JyAoIChvdGhlcmx2XzU9IFJVTEVfSUQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAnc3BhY2VWb2x1bWUnICggKGx2X2NvbnRhaW5lckRhdGFfN18wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdhY2Nlc3NpYmlsaXR5JyAoIChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzlfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSogKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4MTg6MzogKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80PSAnc2VsZWN0ZWRFbGVtZW50JyAoIChvdGhlcmx2XzU9IFJVTEVfSUQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAnc3BhY2VWb2x1bWUnICggKGx2X2NvbnRhaW5lckRhdGFfN18wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdhY2Nlc3NpYmlsaXR5JyAoIChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzlfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODE4OjM6ICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ3NlbGVjdGVkRWxlbWVudCcgKCAob3RoZXJsdl81PSBSVUxFX0lEICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ3NwYWNlVm9sdW1lJyAoIChsdl9jb250YWluZXJEYXRhXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnYWNjZXNzaWJpbGl0eScgKCAobHZfYWNjZXNzaWJpbGl0eVBocmFzZV85XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApICkqCisgICAgICAgICAgICBsb29wMTI6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDEyPTQ7CisgICAgICAgICAgICAgICAgaW50IExBMTJfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgaWYgKCBMQTEyXzAgPT0yNiAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAwKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTI9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIExBMTJfMCA9PTI3ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxMj0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggTEExMl8wID09MjIgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja0FjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMikgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDEyPTM7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEyKSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4MjA6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ3NlbGVjdGVkRWxlbWVudCcgKCAob3RoZXJsdl81PSBSVUxFX0lEICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4MjA6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ3NlbGVjdGVkRWxlbWVudCcgKCAob3RoZXJsdl81PSBSVUxFX0lEICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODIxOjU6IHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ3NlbGVjdGVkRWxlbWVudCcgKCAob3RoZXJsdl81PSBSVUxFX0lEICkgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAwKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZVBlcnNwZWN0aXZlUGFydFN0YWNrIiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDApIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4MjE6MTE3OiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ3NlbGVjdGVkRWxlbWVudCcgKCAob3RoZXJsdl81PSBSVUxFX0lEICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjgyMjo2OiAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdzZWxlY3RlZEVsZW1lbnQnICggKG90aGVybHZfNT0gUlVMRV9JRCApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja0FjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMCk7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODI1OjY6ICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ3NlbGVjdGVkRWxlbWVudCcgKCAob3RoZXJsdl81PSBSVUxFX0lEICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4MjU6Nzogey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdzZWxlY3RlZEVsZW1lbnQnICggKG90aGVybHZfNT0gUlVMRV9JRCApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISgodHJ1ZSkpICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlUGVyc3BlY3RpdmVQYXJ0U3RhY2siLCAidHJ1ZSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODI1OjE2OiAob3RoZXJsdl80PSAnc2VsZWN0ZWRFbGVtZW50JyAoIChvdGhlcmx2XzU9IFJVTEVfSUQgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4MjU6MTg6IG90aGVybHZfND0gJ3NlbGVjdGVkRWxlbWVudCcgKCAob3RoZXJsdl81PSBSVUxFX0lEICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIG90aGVybHZfND0oVG9rZW4pbWF0Y2goaW5wdXQsMjYsRk9MTE9XXzI2X2luX3J1bGVQZXJzcGVjdGl2ZVBhcnRTdGFjazE4NjQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNCwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja0FjY2VzcygpLmdldFNlbGVjdGVkRWxlbWVudEtleXdvcmRfM18wXzAoKSk7CisgICAgICAgICAgICAJICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODI5OjE6ICggKG90aGVybHZfNT0gUlVMRV9JRCApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4MzA6MTogKG90aGVybHZfNT0gUlVMRV9JRCApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4MzA6MTogKG90aGVybHZfNT0gUlVMRV9JRCApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODMxOjM6IG90aGVybHZfNT0gUlVMRV9JRAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCQkJaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBvdGhlcmx2XzU9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XX1JVTEVfSURfaW5fcnVsZVBlcnNwZWN0aXZlUGFydFN0YWNrMTg4NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkJbmV3TGVhZk5vZGUob3RoZXJsdl81LCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrQWNjZXNzKCkuZ2V0U2VsZWN0ZWRFbGVtZW50UGVyc3BlY3RpdmVQYXJ0Q3Jvc3NSZWZlcmVuY2VfM18wXzFfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCQorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpKTsKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMiA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODQ5OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdzcGFjZVZvbHVtZScgKCAobHZfY29udGFpbmVyRGF0YV83XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4NDk6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ3NwYWNlVm9sdW1lJyAoIChsdl9jb250YWluZXJEYXRhXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4NTA6NTogey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAnc3BhY2VWb2x1bWUnICggKGx2X2NvbnRhaW5lckRhdGFfN18wPSBSVUxFX1NUUklORyApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja0FjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMSkgKSB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVQZXJzcGVjdGl2ZVBhcnRTdGFjayIsICJnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxKSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODUwOjExNzogKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdzcGFjZVZvbHVtZScgKCAobHZfY29udGFpbmVyRGF0YV83XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjg1MTo2OiAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdzcGFjZVZvbHVtZScgKCAobHZfY29udGFpbmVyRGF0YV83XzA9IFJVTEVfU1RSSU5HICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxKTsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4NTQ6NjogKHsuLi59PyA9PiAob3RoZXJsdl82PSAnc3BhY2VWb2x1bWUnICggKGx2X2NvbnRhaW5lckRhdGFfN18wPSBSVUxFX1NUUklORyApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODU0Ojc6IHsuLi59PyA9PiAob3RoZXJsdl82PSAnc3BhY2VWb2x1bWUnICggKGx2X2NvbnRhaW5lckRhdGFfN18wPSBSVUxFX1NUUklORyApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISgodHJ1ZSkpICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlUGVyc3BlY3RpdmVQYXJ0U3RhY2siLCAidHJ1ZSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODU0OjE2OiAob3RoZXJsdl82PSAnc3BhY2VWb2x1bWUnICggKGx2X2NvbnRhaW5lckRhdGFfN18wPSBSVUxFX1NUUklORyApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjg1NDoxODogb3RoZXJsdl82PSAnc3BhY2VWb2x1bWUnICggKGx2X2NvbnRhaW5lckRhdGFfN18wPSBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBvdGhlcmx2XzY9KFRva2VuKW1hdGNoKGlucHV0LDI3LEZPTExPV18yN19pbl9ydWxlUGVyc3BlY3RpdmVQYXJ0U3RhY2sxOTUyKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzYsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY2Nlc3MoKS5nZXRTcGFjZVZvbHVtZUtleXdvcmRfM18xXzAoKSk7CisgICAgICAgICAgICAJICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODU4OjE6ICggKGx2X2NvbnRhaW5lckRhdGFfN18wPSBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4NTk6MTogKGx2X2NvbnRhaW5lckRhdGFfN18wPSBSVUxFX1NUUklORyApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4NTk6MTogKGx2X2NvbnRhaW5lckRhdGFfN18wPSBSVUxFX1NUUklORyApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODYwOjM6IGx2X2NvbnRhaW5lckRhdGFfN18wPSBSVUxFX1NUUklORworICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGx2X2NvbnRhaW5lckRhdGFfN18wPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX1NUUklORyxGT0xMT1dfUlVMRV9TVFJJTkdfaW5fcnVsZVBlcnNwZWN0aXZlUGFydFN0YWNrMTk2OSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkJCW5ld0xlYWZOb2RlKGx2X2NvbnRhaW5lckRhdGFfN18wLCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrQWNjZXNzKCkuZ2V0Q29udGFpbmVyRGF0YVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfM18xXzFfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCQkKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja1J1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkiY29udGFpbmVyRGF0YSIsCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X2NvbnRhaW5lckRhdGFfN18wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIlNUUklORyIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCkpOworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAzIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4ODM6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ2FjY2Vzc2liaWxpdHknICggKGx2X2FjY2Vzc2liaWxpdHlQaHJhc2VfOV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODgzOjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdhY2Nlc3NpYmlsaXR5JyAoIChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzlfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4ODQ6NTogey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnYWNjZXNzaWJpbGl0eScgKCAobHZfYWNjZXNzaWJpbGl0eVBocmFzZV85XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAyKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZVBlcnNwZWN0aXZlUGFydFN0YWNrIiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDIpIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4ODQ6MTE3OiAoICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ2FjY2Vzc2liaWxpdHknICggKGx2X2FjY2Vzc2liaWxpdHlQaHJhc2VfOV8wPSBSVUxFX1NUUklORyApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4ODU6NjogKHsuLi59PyA9PiAob3RoZXJsdl84PSAnYWNjZXNzaWJpbGl0eScgKCAobHZfYWNjZXNzaWJpbGl0eVBocmFzZV85XzA9IFJVTEVfU1RSSU5HICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAyKTsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4ODg6NjogKHsuLi59PyA9PiAob3RoZXJsdl84PSAnYWNjZXNzaWJpbGl0eScgKCAobHZfYWNjZXNzaWJpbGl0eVBocmFzZV85XzA9IFJVTEVfU1RSSU5HICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo4ODg6Nzogey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdhY2Nlc3NpYmlsaXR5JyAoIChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzlfMD0gUlVMRV9TVFJJTkcgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEoKHRydWUpKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZVBlcnNwZWN0aXZlUGFydFN0YWNrIiwgInRydWUiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjg4ODoxNjogKG90aGVybHZfOD0gJ2FjY2Vzc2liaWxpdHknICggKGx2X2FjY2Vzc2liaWxpdHlQaHJhc2VfOV8wPSBSVUxFX1NUUklORyApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjg4ODoxODogb3RoZXJsdl84PSAnYWNjZXNzaWJpbGl0eScgKCAobHZfYWNjZXNzaWJpbGl0eVBocmFzZV85XzA9IFJVTEVfU1RSSU5HICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIG90aGVybHZfOD0oVG9rZW4pbWF0Y2goaW5wdXQsMjIsRk9MTE9XXzIyX2luX3J1bGVQZXJzcGVjdGl2ZVBhcnRTdGFjazIwNDIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfOCwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja0FjY2VzcygpLmdldEFjY2Vzc2liaWxpdHlLZXl3b3JkXzNfMl8wKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjg5MjoxOiAoIChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzlfMD0gUlVMRV9TVFJJTkcgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODkzOjE6IChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzlfMD0gUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6ODkzOjE6IChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzlfMD0gUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjg5NDozOiBsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzlfMD0gUlVMRV9TVFJJTkcKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzlfMD0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9TVFJJTkcsRk9MTE9XX1JVTEVfU1RSSU5HX2luX3J1bGVQZXJzcGVjdGl2ZVBhcnRTdGFjazIwNTkpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJCQluZXdMZWFmTm9kZShsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzlfMCwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja0FjY2VzcygpLmdldEFjY2Vzc2liaWxpdHlQaHJhc2VTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzNfMl8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkJCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tSdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJImFjY2Vzc2liaWxpdHlQaHJhc2UiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzlfMCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJTVFJJTkciKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFN0YWNrQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpKTsKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmxlYXZlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCkpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG90aGVybHZfMTA9KFRva2VuKW1hdGNoKGlucHV0LDE0LEZPTExPV18xNF9pbl9ydWxlUGVyc3BlY3RpdmVQYXJ0U3RhY2syMTE3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTAsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF80KCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjkyODoxOiAoIChsdl9lbGVtZW50c18xMV8wPSBydWxlUGVyc3BlY3RpdmVFbGVtZW50ICkgKSoKKyAgICAgICAgICAgIGxvb3AxMzoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTM9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExM18wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTEzXzA9PTI0fHwoTEExM18wPj0yOCAmJiBMQTEzXzA8PTI5KSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDEzPTE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEzKSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo5Mjk6MTogKGx2X2VsZW1lbnRzXzExXzA9IHJ1bGVQZXJzcGVjdGl2ZUVsZW1lbnQgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6OTI5OjE6IChsdl9lbGVtZW50c18xMV8wPSBydWxlUGVyc3BlY3RpdmVFbGVtZW50ICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo5MzA6MzogbHZfZWxlbWVudHNfMTFfMD0gcnVsZVBlcnNwZWN0aXZlRWxlbWVudAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY2Nlc3MoKS5nZXRFbGVtZW50c1BlcnNwZWN0aXZlRWxlbWVudFBhcnNlclJ1bGVDYWxsXzVfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUGVyc3BlY3RpdmVFbGVtZW50X2luX3J1bGVQZXJzcGVjdGl2ZVBhcnRTdGFjazIxMzgpOworICAgICAgICAgICAgCSAgICBsdl9lbGVtZW50c18xMV8wPXJ1bGVQZXJzcGVjdGl2ZUVsZW1lbnQoKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja1J1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCWFkZCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJlbGVtZW50cyIsCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X2VsZW1lbnRzXzExXzAsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiUGVyc3BlY3RpdmVFbGVtZW50Iik7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxMzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworICAgICAgICAgICAgb3RoZXJsdl8xMj0oVG9rZW4pbWF0Y2goaW5wdXQsMTUsRk9MTE9XXzE1X2luX3J1bGVQZXJzcGVjdGl2ZVBhcnRTdGFjazIxNTEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xMiwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRTdGFja0FjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF82KCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVQZXJzcGVjdGl2ZVBhcnRTdGFjayIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVQZXJzcGVjdGl2ZVBhcnQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo5NTg6MTogZW50cnlSdWxlUGVyc3BlY3RpdmVQYXJ0IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVQZXJzcGVjdGl2ZVBhcnQ9IHJ1bGVQZXJzcGVjdGl2ZVBhcnQgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVQZXJzcGVjdGl2ZVBhcnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZVBlcnNwZWN0aXZlUGFydCA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo5NTk6MjogKGl2X3J1bGVQZXJzcGVjdGl2ZVBhcnQ9IHJ1bGVQZXJzcGVjdGl2ZVBhcnQgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6OTYwOjI6IGl2X3J1bGVQZXJzcGVjdGl2ZVBhcnQ9IHJ1bGVQZXJzcGVjdGl2ZVBhcnQgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVQZXJzcGVjdGl2ZVBhcnRfaW5fZW50cnlSdWxlUGVyc3BlY3RpdmVQYXJ0MjE4Nyk7CisgICAgICAgICAgICBpdl9ydWxlUGVyc3BlY3RpdmVQYXJ0PXJ1bGVQZXJzcGVjdGl2ZVBhcnQoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVQZXJzcGVjdGl2ZVBhcnQ7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlUGVyc3BlY3RpdmVQYXJ0MjE5Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVQZXJzcGVjdGl2ZVBhcnQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVBlcnNwZWN0aXZlUGFydCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjk2NzoxOiBydWxlUGVyc3BlY3RpdmVQYXJ0IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAncGFydCcgKCAobHZfZWxlbWVudElkXzJfMD0gcnVsZVRSQU5TTEFUQUJMRUlEICkgKSAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfZGVzY3JpcHRpb25fNF8wPSAnZGVzY3JpYmVkIGJ5JyApICkgKCAobHZfZGVzY3JpcHRpb25WYWx1ZV81XzA9IHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAnc3BhY2VWb2x1bWUnICggKGx2X2NvbnRhaW5lckRhdGFfN18wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdhY2Nlc3NpYmlsaXR5JyAoIChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzlfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMD0gJ2ljb25VUkknICggKGx2X2ljb25VUklfMTFfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMj0gJ3ZpZXcnICggKGx2X3ZpZXdfMTNfMD0gcnVsZVBlcnNwZWN0aXZlVmlldyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2lzQ2xvc2FibGVfMTRfMD0gJ2lzQ2xvc2FibGUnICkgKSApICkgKSApKiApICkgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlUGVyc3BlY3RpdmVQYXJ0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBUb2tlbiBvdGhlcmx2XzE9bnVsbDsKKyAgICAgICAgVG9rZW4gbHZfZGVzY3JpcHRpb25fNF8wPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfNj1udWxsOworICAgICAgICBUb2tlbiBsdl9jb250YWluZXJEYXRhXzdfMD1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2Xzg9bnVsbDsKKyAgICAgICAgVG9rZW4gbHZfYWNjZXNzaWJpbGl0eVBocmFzZV85XzA9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8xMD1udWxsOworICAgICAgICBUb2tlbiBsdl9pY29uVVJJXzExXzA9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8xMj1udWxsOworICAgICAgICBUb2tlbiBsdl9pc0Nsb3NhYmxlXzE0XzA9bnVsbDsKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBsdl9lbGVtZW50SWRfMl8wID0gbnVsbDsKKworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGx2X2Rlc2NyaXB0aW9uVmFsdWVfNV8wID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGx2X3ZpZXdfMTNfMCA9IG51bGw7CisKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjk3MDoyODogKCAoICgpIG90aGVybHZfMT0gJ3BhcnQnICggKGx2X2VsZW1lbnRJZF8yXzA9IHJ1bGVUUkFOU0xBVEFCTEVJRCApICkgKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoICggKGx2X2Rlc2NyaXB0aW9uXzRfMD0gJ2Rlc2NyaWJlZCBieScgKSApICggKGx2X2Rlc2NyaXB0aW9uVmFsdWVfNV8wPSBydWxlVFJBTlNMQVRBQkxFU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ3NwYWNlVm9sdW1lJyAoIChsdl9jb250YWluZXJEYXRhXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnYWNjZXNzaWJpbGl0eScgKCAobHZfYWNjZXNzaWJpbGl0eVBocmFzZV85XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTA9ICdpY29uVVJJJyAoIChsdl9pY29uVVJJXzExXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTI9ICd2aWV3JyAoIChsdl92aWV3XzEzXzA9IHJ1bGVQZXJzcGVjdGl2ZVZpZXcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9pc0Nsb3NhYmxlXzE0XzA9ICdpc0Nsb3NhYmxlJyApICkgKSApICkgKSogKSApICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjk3MToxOiAoICgpIG90aGVybHZfMT0gJ3BhcnQnICggKGx2X2VsZW1lbnRJZF8yXzA9IHJ1bGVUUkFOU0xBVEFCTEVJRCApICkgKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoICggKGx2X2Rlc2NyaXB0aW9uXzRfMD0gJ2Rlc2NyaWJlZCBieScgKSApICggKGx2X2Rlc2NyaXB0aW9uVmFsdWVfNV8wPSBydWxlVFJBTlNMQVRBQkxFU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ3NwYWNlVm9sdW1lJyAoIChsdl9jb250YWluZXJEYXRhXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnYWNjZXNzaWJpbGl0eScgKCAobHZfYWNjZXNzaWJpbGl0eVBocmFzZV85XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTA9ICdpY29uVVJJJyAoIChsdl9pY29uVVJJXzExXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTI9ICd2aWV3JyAoIChsdl92aWV3XzEzXzA9IHJ1bGVQZXJzcGVjdGl2ZVZpZXcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9pc0Nsb3NhYmxlXzE0XzA9ICdpc0Nsb3NhYmxlJyApICkgKSApICkgKSogKSApICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo5NzE6MTogKCAoKSBvdGhlcmx2XzE9ICdwYXJ0JyAoIChsdl9lbGVtZW50SWRfMl8wPSBydWxlVFJBTlNMQVRBQkxFSUQgKSApICggKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAoIChsdl9kZXNjcmlwdGlvbl80XzA9ICdkZXNjcmliZWQgYnknICkgKSAoIChsdl9kZXNjcmlwdGlvblZhbHVlXzVfMD0gcnVsZVRSQU5TTEFUQUJMRVNUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdzcGFjZVZvbHVtZScgKCAobHZfY29udGFpbmVyRGF0YV83XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ2FjY2Vzc2liaWxpdHknICggKGx2X2FjY2Vzc2liaWxpdHlQaHJhc2VfOV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEwPSAnaWNvblVSSScgKCAobHZfaWNvblVSSV8xMV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEyPSAndmlldycgKCAobHZfdmlld18xM18wPSBydWxlUGVyc3BlY3RpdmVWaWV3ICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfaXNDbG9zYWJsZV8xNF8wPSAnaXNDbG9zYWJsZScgKSApICkgKSApICkqICkgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6OTcxOjI6ICgpIG90aGVybHZfMT0gJ3BhcnQnICggKGx2X2VsZW1lbnRJZF8yXzA9IHJ1bGVUUkFOU0xBVEFCTEVJRCApICkgKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoICggKGx2X2Rlc2NyaXB0aW9uXzRfMD0gJ2Rlc2NyaWJlZCBieScgKSApICggKGx2X2Rlc2NyaXB0aW9uVmFsdWVfNV8wPSBydWxlVFJBTlNMQVRBQkxFU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ3NwYWNlVm9sdW1lJyAoIChsdl9jb250YWluZXJEYXRhXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnYWNjZXNzaWJpbGl0eScgKCAobHZfYWNjZXNzaWJpbGl0eVBocmFzZV85XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTA9ICdpY29uVVJJJyAoIChsdl9pY29uVVJJXzExXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTI9ICd2aWV3JyAoIChsdl92aWV3XzEzXzA9IHJ1bGVQZXJzcGVjdGl2ZVZpZXcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9pc0Nsb3NhYmxlXzE0XzA9ICdpc0Nsb3NhYmxlJyApICkgKSApICkgKSogKSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6OTcxOjI6ICgpCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjk3Mjo1OiAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldFBlcnNwZWN0aXZlUGFydEFjdGlvbl8wKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCwyOSxGT0xMT1dfMjlfaW5fcnVsZVBlcnNwZWN0aXZlUGFydDIyNDMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldFBhcnRLZXl3b3JkXzEoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6OTgxOjE6ICggKGx2X2VsZW1lbnRJZF8yXzA9IHJ1bGVUUkFOU0xBVEFCTEVJRCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6OTgyOjE6IChsdl9lbGVtZW50SWRfMl8wPSBydWxlVFJBTlNMQVRBQkxFSUQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo5ODI6MTogKGx2X2VsZW1lbnRJZF8yXzA9IHJ1bGVUUkFOU0xBVEFCTEVJRCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjk4MzozOiBsdl9lbGVtZW50SWRfMl8wPSBydWxlVFJBTlNMQVRBQkxFSUQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRFbGVtZW50SWRUUkFOU0xBVEFCTEVJRFBhcnNlclJ1bGVDYWxsXzJfMCgpKTsgCisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlVFJBTlNMQVRBQkxFSURfaW5fcnVsZVBlcnNwZWN0aXZlUGFydDIyNjQpOworICAgICAgICAgICAgbHZfZWxlbWVudElkXzJfMD1ydWxlVFJBTlNMQVRBQkxFSUQoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFJ1bGUoKSk7CisgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAJCQkiZWxlbWVudElkIiwKKyAgICAgICAgICAgICAgICAgICAgICAJCWx2X2VsZW1lbnRJZF8yXzAsIAorICAgICAgICAgICAgICAgICAgICAgIAkJIlRSQU5TTEFUQUJMRUlEIik7CisgICAgICAgICAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzo5OTk6MjogKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoICggKGx2X2Rlc2NyaXB0aW9uXzRfMD0gJ2Rlc2NyaWJlZCBieScgKSApICggKGx2X2Rlc2NyaXB0aW9uVmFsdWVfNV8wPSBydWxlVFJBTlNMQVRBQkxFU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ3NwYWNlVm9sdW1lJyAoIChsdl9jb250YWluZXJEYXRhXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnYWNjZXNzaWJpbGl0eScgKCAobHZfYWNjZXNzaWJpbGl0eVBocmFzZV85XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTA9ICdpY29uVVJJJyAoIChsdl9pY29uVVJJXzExXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTI9ICd2aWV3JyAoIChsdl92aWV3XzEzXzA9IHJ1bGVQZXJzcGVjdGl2ZVZpZXcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9pc0Nsb3NhYmxlXzE0XzA9ICdpc0Nsb3NhYmxlJyApICkgKSApICkgKSogKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTAwMToxOiAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoICggKGx2X2Rlc2NyaXB0aW9uXzRfMD0gJ2Rlc2NyaWJlZCBieScgKSApICggKGx2X2Rlc2NyaXB0aW9uVmFsdWVfNV8wPSBydWxlVFJBTlNMQVRBQkxFU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ3NwYWNlVm9sdW1lJyAoIChsdl9jb250YWluZXJEYXRhXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnYWNjZXNzaWJpbGl0eScgKCAobHZfYWNjZXNzaWJpbGl0eVBocmFzZV85XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTA9ICdpY29uVVJJJyAoIChsdl9pY29uVVJJXzExXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTI9ICd2aWV3JyAoIChsdl92aWV3XzEzXzA9IHJ1bGVQZXJzcGVjdGl2ZVZpZXcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9pc0Nsb3NhYmxlXzE0XzA9ICdpc0Nsb3NhYmxlJyApICkgKSApICkgKSogKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwMDE6MTogKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAoIChsdl9kZXNjcmlwdGlvbl80XzA9ICdkZXNjcmliZWQgYnknICkgKSAoIChsdl9kZXNjcmlwdGlvblZhbHVlXzVfMD0gcnVsZVRSQU5TTEFUQUJMRVNUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdzcGFjZVZvbHVtZScgKCAobHZfY29udGFpbmVyRGF0YV83XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ2FjY2Vzc2liaWxpdHknICggKGx2X2FjY2Vzc2liaWxpdHlQaHJhc2VfOV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEwPSAnaWNvblVSSScgKCAobHZfaWNvblVSSV8xMV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEyPSAndmlldycgKCAobHZfdmlld18xM18wPSBydWxlUGVyc3BlY3RpdmVWaWV3ICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfaXNDbG9zYWJsZV8xNF8wPSAnaXNDbG9zYWJsZScgKSApICkgKSApICkqICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDAyOjI6ICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoICggKGx2X2Rlc2NyaXB0aW9uXzRfMD0gJ2Rlc2NyaWJlZCBieScgKSApICggKGx2X2Rlc2NyaXB0aW9uVmFsdWVfNV8wPSBydWxlVFJBTlNMQVRBQkxFU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ3NwYWNlVm9sdW1lJyAoIChsdl9jb250YWluZXJEYXRhXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnYWNjZXNzaWJpbGl0eScgKCAobHZfYWNjZXNzaWJpbGl0eVBocmFzZV85XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTA9ICdpY29uVVJJJyAoIChsdl9pY29uVVJJXzExXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTI9ICd2aWV3JyAoIChsdl92aWV3XzEzXzA9IHJ1bGVQZXJzcGVjdGl2ZVZpZXcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9pc0Nsb3NhYmxlXzE0XzA9ICdpc0Nsb3NhYmxlJyApICkgKSApICkgKSogKQorICAgICAgICAgICAgeworICAgICAgICAgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5lbnRlcihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSk7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwMDU6MjogKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfZGVzY3JpcHRpb25fNF8wPSAnZGVzY3JpYmVkIGJ5JyApICkgKCAobHZfZGVzY3JpcHRpb25WYWx1ZV81XzA9IHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAnc3BhY2VWb2x1bWUnICggKGx2X2NvbnRhaW5lckRhdGFfN18wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdhY2Nlc3NpYmlsaXR5JyAoIChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzlfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMD0gJ2ljb25VUkknICggKGx2X2ljb25VUklfMTFfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMj0gJ3ZpZXcnICggKGx2X3ZpZXdfMTNfMD0gcnVsZVBlcnNwZWN0aXZlVmlldyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2lzQ2xvc2FibGVfMTRfMD0gJ2lzQ2xvc2FibGUnICkgKSApICkgKSApKiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwMDY6MzogKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoICggKGx2X2Rlc2NyaXB0aW9uXzRfMD0gJ2Rlc2NyaWJlZCBieScgKSApICggKGx2X2Rlc2NyaXB0aW9uVmFsdWVfNV8wPSBydWxlVFJBTlNMQVRBQkxFU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ3NwYWNlVm9sdW1lJyAoIChsdl9jb250YWluZXJEYXRhXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnYWNjZXNzaWJpbGl0eScgKCAobHZfYWNjZXNzaWJpbGl0eVBocmFzZV85XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTA9ICdpY29uVVJJJyAoIChsdl9pY29uVVJJXzExXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTI9ICd2aWV3JyAoIChsdl92aWV3XzEzXzA9IHJ1bGVQZXJzcGVjdGl2ZVZpZXcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9pc0Nsb3NhYmxlXzE0XzA9ICdpc0Nsb3NhYmxlJyApICkgKSApICkgKSoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTAwNjozOiAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfZGVzY3JpcHRpb25fNF8wPSAnZGVzY3JpYmVkIGJ5JyApICkgKCAobHZfZGVzY3JpcHRpb25WYWx1ZV81XzA9IHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAnc3BhY2VWb2x1bWUnICggKGx2X2NvbnRhaW5lckRhdGFfN18wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdhY2Nlc3NpYmlsaXR5JyAoIChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzlfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMD0gJ2ljb25VUkknICggKGx2X2ljb25VUklfMTFfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMj0gJ3ZpZXcnICggKGx2X3ZpZXdfMTNfMD0gcnVsZVBlcnNwZWN0aXZlVmlldyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2lzQ2xvc2FibGVfMTRfMD0gJ2lzQ2xvc2FibGUnICkgKSApICkgKSApKgorICAgICAgICAgICAgbG9vcDE0OgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQxND03OworICAgICAgICAgICAgICAgIGludCBMQTE0XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgIGlmICggTEExNF8wID09MTggJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDApICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxND0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggTEExNF8wID09MjcgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxND0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggTEExNF8wID09MjIgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDIpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxND0zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggTEExNF8wID09MjEgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDMpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxND00OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggTEExNF8wID09MzAgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDQpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxND01OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggTEExNF8wID09MzEgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDUpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxND02OworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNCkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTAwODo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoICggKGx2X2Rlc2NyaXB0aW9uXzRfMD0gJ2Rlc2NyaWJlZCBieScgKSApICggKGx2X2Rlc2NyaXB0aW9uVmFsdWVfNV8wPSBydWxlVFJBTlNMQVRBQkxFU1RSSU5HICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDA4OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfZGVzY3JpcHRpb25fNF8wPSAnZGVzY3JpYmVkIGJ5JyApICkgKCAobHZfZGVzY3JpcHRpb25WYWx1ZV81XzA9IHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcgKSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDA5OjU6IHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAoIChsdl9kZXNjcmlwdGlvbl80XzA9ICdkZXNjcmliZWQgYnknICkgKSAoIChsdl9kZXNjcmlwdGlvblZhbHVlXzVfMD0gcnVsZVRSQU5TTEFUQUJMRVNUUklORyApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDApICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlUGVyc3BlY3RpdmVQYXJ0IiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAwKSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTAwOToxMTI6ICggKHsuLi59PyA9PiAoICggKGx2X2Rlc2NyaXB0aW9uXzRfMD0gJ2Rlc2NyaWJlZCBieScgKSApICggKGx2X2Rlc2NyaXB0aW9uVmFsdWVfNV8wPSBydWxlVFJBTlNMQVRBQkxFU1RSSU5HICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwMTA6NjogKHsuLi59PyA9PiAoICggKGx2X2Rlc2NyaXB0aW9uXzRfMD0gJ2Rlc2NyaWJlZCBieScgKSApICggKGx2X2Rlc2NyaXB0aW9uVmFsdWVfNV8wPSBydWxlVFJBTlNMQVRBQkxFU1RSSU5HICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMCk7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTAxMzo2OiAoey4uLn0/ID0+ICggKCAobHZfZGVzY3JpcHRpb25fNF8wPSAnZGVzY3JpYmVkIGJ5JyApICkgKCAobHZfZGVzY3JpcHRpb25WYWx1ZV81XzA9IHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwMTM6Nzogey4uLn0/ID0+ICggKCAobHZfZGVzY3JpcHRpb25fNF8wPSAnZGVzY3JpYmVkIGJ5JyApICkgKCAobHZfZGVzY3JpcHRpb25WYWx1ZV81XzA9IHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEoKHRydWUpKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZVBlcnNwZWN0aXZlUGFydCIsICJ0cnVlIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDEzOjE2OiAoICggKGx2X2Rlc2NyaXB0aW9uXzRfMD0gJ2Rlc2NyaWJlZCBieScgKSApICggKGx2X2Rlc2NyaXB0aW9uVmFsdWVfNV8wPSBydWxlVFJBTlNMQVRBQkxFU1RSSU5HICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTAxMzoxNzogKCAobHZfZGVzY3JpcHRpb25fNF8wPSAnZGVzY3JpYmVkIGJ5JyApICkgKCAobHZfZGVzY3JpcHRpb25WYWx1ZV81XzA9IHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDEzOjE3OiAoIChsdl9kZXNjcmlwdGlvbl80XzA9ICdkZXNjcmliZWQgYnknICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwMTQ6MTogKGx2X2Rlc2NyaXB0aW9uXzRfMD0gJ2Rlc2NyaWJlZCBieScgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTAxNDoxOiAobHZfZGVzY3JpcHRpb25fNF8wPSAnZGVzY3JpYmVkIGJ5JyApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTAxNTozOiBsdl9kZXNjcmlwdGlvbl80XzA9ICdkZXNjcmliZWQgYnknCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgbHZfZGVzY3JpcHRpb25fNF8wPShUb2tlbiltYXRjaChpbnB1dCwxOCxGT0xMT1dfMThfaW5fcnVsZVBlcnNwZWN0aXZlUGFydDIzMjgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGx2X2Rlc2NyaXB0aW9uXzRfMCwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXREZXNjcmlwdGlvbkRlc2NyaWJlZEJ5S2V5d29yZF8zXzBfMF8wKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRSdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKGN1cnJlbnQsICJkZXNjcmlwdGlvbiIsIHRydWUsICJkZXNjcmliZWQgYnkiKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTAyODoyOiAoIChsdl9kZXNjcmlwdGlvblZhbHVlXzVfMD0gcnVsZVRSQU5TTEFUQUJMRVNUUklORyApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDI5OjE6IChsdl9kZXNjcmlwdGlvblZhbHVlXzVfMD0gcnVsZVRSQU5TTEFUQUJMRVNUUklORyApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDI5OjE6IChsdl9kZXNjcmlwdGlvblZhbHVlXzVfMD0gcnVsZVRSQU5TTEFUQUJMRVNUUklORyApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTAzMDozOiBsdl9kZXNjcmlwdGlvblZhbHVlXzVfMD0gcnVsZVRSQU5TTEFUQUJMRVNUUklORworICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0RGVzY3JpcHRpb25WYWx1ZVRSQU5TTEFUQUJMRVNUUklOR1BhcnNlclJ1bGVDYWxsXzNfMF8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVRSQU5TTEFUQUJMRVNUUklOR19pbl9ydWxlUGVyc3BlY3RpdmVQYXJ0MjM2Mik7CisgICAgICAgICAgICAJICAgIGx2X2Rlc2NyaXB0aW9uVmFsdWVfNV8wPXJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcoKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRSdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkiZGVzY3JpcHRpb25WYWx1ZSIsCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X2Rlc2NyaXB0aW9uVmFsdWVfNV8wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIlRSQU5TTEFUQUJMRVNUUklORyIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSk7CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDIgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwNTM6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ3NwYWNlVm9sdW1lJyAoIChsdl9jb250YWluZXJEYXRhXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwNTM6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ3NwYWNlVm9sdW1lJyAoIChsdl9jb250YWluZXJEYXRhXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDU0OjU6IHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ3NwYWNlVm9sdW1lJyAoIChsdl9jb250YWluZXJEYXRhXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZVBlcnNwZWN0aXZlUGFydCIsICJnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMSkiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwNTQ6MTEyOiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ3NwYWNlVm9sdW1lJyAoIChsdl9jb250YWluZXJEYXRhXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTA1NTo2OiAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdzcGFjZVZvbHVtZScgKCAobHZfY29udGFpbmVyRGF0YV83XzA9IFJVTEVfU1RSSU5HICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMSk7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTA1ODo2OiAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdzcGFjZVZvbHVtZScgKCAobHZfY29udGFpbmVyRGF0YV83XzA9IFJVTEVfU1RSSU5HICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDU4Ojc6IHsuLi59PyA9PiAob3RoZXJsdl82PSAnc3BhY2VWb2x1bWUnICggKGx2X2NvbnRhaW5lckRhdGFfN18wPSBSVUxFX1NUUklORyApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISgodHJ1ZSkpICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlUGVyc3BlY3RpdmVQYXJ0IiwgInRydWUiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwNTg6MTY6IChvdGhlcmx2XzY9ICdzcGFjZVZvbHVtZScgKCAobHZfY29udGFpbmVyRGF0YV83XzA9IFJVTEVfU1RSSU5HICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTA1ODoxODogb3RoZXJsdl82PSAnc3BhY2VWb2x1bWUnICggKGx2X2NvbnRhaW5lckRhdGFfN18wPSBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBvdGhlcmx2XzY9KFRva2VuKW1hdGNoKGlucHV0LDI3LEZPTExPV18yN19pbl9ydWxlUGVyc3BlY3RpdmVQYXJ0MjQzMCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl82LCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldFNwYWNlVm9sdW1lS2V5d29yZF8zXzFfMCgpKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDYyOjE6ICggKGx2X2NvbnRhaW5lckRhdGFfN18wPSBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDYzOjE6IChsdl9jb250YWluZXJEYXRhXzdfMD0gUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTA2MzoxOiAobHZfY29udGFpbmVyRGF0YV83XzA9IFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDY0OjM6IGx2X2NvbnRhaW5lckRhdGFfN18wPSBSVUxFX1NUUklORworICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGx2X2NvbnRhaW5lckRhdGFfN18wPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX1NUUklORyxGT0xMT1dfUlVMRV9TVFJJTkdfaW5fcnVsZVBlcnNwZWN0aXZlUGFydDI0NDcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJCQluZXdMZWFmTm9kZShsdl9jb250YWluZXJEYXRhXzdfMCwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRDb250YWluZXJEYXRhU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8zXzFfMV8wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAJCQorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydFJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkiY29udGFpbmVyRGF0YSIsCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X2NvbnRhaW5lckRhdGFfN18wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIlNUUklORyIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpKTsKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMyA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTA4Nzo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnYWNjZXNzaWJpbGl0eScgKCAobHZfYWNjZXNzaWJpbGl0eVBocmFzZV85XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDg3OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdhY2Nlc3NpYmlsaXR5JyAoIChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzlfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDg4OjU6IHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ2FjY2Vzc2liaWxpdHknICggKGx2X2FjY2Vzc2liaWxpdHlQaHJhc2VfOV8wPSBSVUxFX1NUUklORyApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDIpICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlUGVyc3BlY3RpdmVQYXJ0IiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAyKSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTA4ODoxMTI6ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnYWNjZXNzaWJpbGl0eScgKCAobHZfYWNjZXNzaWJpbGl0eVBocmFzZV85XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwODk6NjogKHsuLi59PyA9PiAob3RoZXJsdl84PSAnYWNjZXNzaWJpbGl0eScgKCAobHZfYWNjZXNzaWJpbGl0eVBocmFzZV85XzA9IFJVTEVfU1RSSU5HICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMik7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTA5Mjo2OiAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdhY2Nlc3NpYmlsaXR5JyAoIChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzlfMD0gUlVMRV9TVFJJTkcgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwOTI6Nzogey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdhY2Nlc3NpYmlsaXR5JyAoIChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzlfMD0gUlVMRV9TVFJJTkcgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEoKHRydWUpKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZVBlcnNwZWN0aXZlUGFydCIsICJ0cnVlIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMDkyOjE2OiAob3RoZXJsdl84PSAnYWNjZXNzaWJpbGl0eScgKCAobHZfYWNjZXNzaWJpbGl0eVBocmFzZV85XzA9IFJVTEVfU1RSSU5HICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTA5MjoxODogb3RoZXJsdl84PSAnYWNjZXNzaWJpbGl0eScgKCAobHZfYWNjZXNzaWJpbGl0eVBocmFzZV85XzA9IFJVTEVfU1RSSU5HICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIG90aGVybHZfOD0oVG9rZW4pbWF0Y2goaW5wdXQsMjIsRk9MTE9XXzIyX2luX3J1bGVQZXJzcGVjdGl2ZVBhcnQyNTIwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzgsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0QWNjZXNzaWJpbGl0eUtleXdvcmRfM18yXzAoKSk7CisgICAgICAgICAgICAJICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTA5NjoxOiAoIChsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzlfMD0gUlVMRV9TVFJJTkcgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTA5NzoxOiAobHZfYWNjZXNzaWJpbGl0eVBocmFzZV85XzA9IFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEwOTc6MTogKGx2X2FjY2Vzc2liaWxpdHlQaHJhc2VfOV8wPSBSVUxFX1NUUklORyApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTA5ODozOiBsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzlfMD0gUlVMRV9TVFJJTkcKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzlfMD0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9TVFJJTkcsRk9MTE9XX1JVTEVfU1RSSU5HX2luX3J1bGVQZXJzcGVjdGl2ZVBhcnQyNTM3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCQkJbmV3TGVhZk5vZGUobHZfYWNjZXNzaWJpbGl0eVBocmFzZV85XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0QWNjZXNzaWJpbGl0eVBocmFzZVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfM18yXzFfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCQkKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRSdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJImFjY2Vzc2liaWxpdHlQaHJhc2UiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9hY2Nlc3NpYmlsaXR5UGhyYXNlXzlfMCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJTVFJJTkciKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSk7CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDQgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjExMjE6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTA9ICdpY29uVVJJJyAoIChsdl9pY29uVVJJXzExXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMTIxOjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEwPSAnaWNvblVSSScgKCAobHZfaWNvblVSSV8xMV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjExMjI6NTogey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMD0gJ2ljb25VUkknICggKGx2X2ljb25VUklfMTFfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAzKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZVBlcnNwZWN0aXZlUGFydCIsICJnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMykiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjExMjI6MTEyOiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTA9ICdpY29uVVJJJyAoIChsdl9pY29uVVJJXzExXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjExMjM6NjogKHsuLi59PyA9PiAob3RoZXJsdl8xMD0gJ2ljb25VUkknICggKGx2X2ljb25VUklfMTFfMD0gUlVMRV9TVFJJTkcgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAzKTsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMTI2OjY6ICh7Li4ufT8gPT4gKG90aGVybHZfMTA9ICdpY29uVVJJJyAoIChsdl9pY29uVVJJXzExXzA9IFJVTEVfU1RSSU5HICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMTI2Ojc6IHsuLi59PyA9PiAob3RoZXJsdl8xMD0gJ2ljb25VUkknICggKGx2X2ljb25VUklfMTFfMD0gUlVMRV9TVFJJTkcgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEoKHRydWUpKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZVBlcnNwZWN0aXZlUGFydCIsICJ0cnVlIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMTI2OjE2OiAob3RoZXJsdl8xMD0gJ2ljb25VUkknICggKGx2X2ljb25VUklfMTFfMD0gUlVMRV9TVFJJTkcgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMTI2OjE4OiBvdGhlcmx2XzEwPSAnaWNvblVSSScgKCAobHZfaWNvblVSSV8xMV8wPSBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBvdGhlcmx2XzEwPShUb2tlbiltYXRjaChpbnB1dCwyMSxGT0xMT1dfMjFfaW5fcnVsZVBlcnNwZWN0aXZlUGFydDI2MTApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTAsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0SWNvblVSSUtleXdvcmRfM18zXzAoKSk7CisgICAgICAgICAgICAJICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTEzMDoxOiAoIChsdl9pY29uVVJJXzExXzA9IFJVTEVfU1RSSU5HICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjExMzE6MTogKGx2X2ljb25VUklfMTFfMD0gUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTEzMToxOiAobHZfaWNvblVSSV8xMV8wPSBSVUxFX1NUUklORyApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTEzMjozOiBsdl9pY29uVVJJXzExXzA9IFJVTEVfU1RSSU5HCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgbHZfaWNvblVSSV8xMV8wPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX1NUUklORyxGT0xMT1dfUlVMRV9TVFJJTkdfaW5fcnVsZVBlcnNwZWN0aXZlUGFydDI2MjcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJCQluZXdMZWFmTm9kZShsdl9pY29uVVJJXzExXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0SWNvblVSSVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfM18zXzFfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCQkKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRSdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJImljb25VUkkiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9pY29uVVJJXzExXzAsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiU1RSSU5HIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCkpOworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSA1IDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMTU1OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEyPSAndmlldycgKCAobHZfdmlld18xM18wPSBydWxlUGVyc3BlY3RpdmVWaWV3ICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMTU1OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEyPSAndmlldycgKCAobHZfdmlld18xM18wPSBydWxlUGVyc3BlY3RpdmVWaWV3ICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTE1Njo1OiB7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEyPSAndmlldycgKCAobHZfdmlld18xM18wPSBydWxlUGVyc3BlY3RpdmVWaWV3ICkgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgNCkgKSB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVQZXJzcGVjdGl2ZVBhcnQiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDQpIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMTU2OjExMjogKCAoey4uLn0/ID0+IChvdGhlcmx2XzEyPSAndmlldycgKCAobHZfdmlld18xM18wPSBydWxlUGVyc3BlY3RpdmVWaWV3ICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjExNTc6NjogKHsuLi59PyA9PiAob3RoZXJsdl8xMj0gJ3ZpZXcnICggKGx2X3ZpZXdfMTNfMD0gcnVsZVBlcnNwZWN0aXZlVmlldyApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDQpOworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjExNjA6NjogKHsuLi59PyA9PiAob3RoZXJsdl8xMj0gJ3ZpZXcnICggKGx2X3ZpZXdfMTNfMD0gcnVsZVBlcnNwZWN0aXZlVmlldyApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTE2MDo3OiB7Li4ufT8gPT4gKG90aGVybHZfMTI9ICd2aWV3JyAoIChsdl92aWV3XzEzXzA9IHJ1bGVQZXJzcGVjdGl2ZVZpZXcgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEoKHRydWUpKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZVBlcnNwZWN0aXZlUGFydCIsICJ0cnVlIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMTYwOjE2OiAob3RoZXJsdl8xMj0gJ3ZpZXcnICggKGx2X3ZpZXdfMTNfMD0gcnVsZVBlcnNwZWN0aXZlVmlldyApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjExNjA6MTg6IG90aGVybHZfMTI9ICd2aWV3JyAoIChsdl92aWV3XzEzXzA9IHJ1bGVQZXJzcGVjdGl2ZVZpZXcgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgb3RoZXJsdl8xMj0oVG9rZW4pbWF0Y2goaW5wdXQsMzAsRk9MTE9XXzMwX2luX3J1bGVQZXJzcGVjdGl2ZVBhcnQyNzAwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEyLCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldFZpZXdLZXl3b3JkXzNfNF8wKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjExNjQ6MTogKCAobHZfdmlld18xM18wPSBydWxlUGVyc3BlY3RpdmVWaWV3ICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjExNjU6MTogKGx2X3ZpZXdfMTNfMD0gcnVsZVBlcnNwZWN0aXZlVmlldyApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMTY1OjE6IChsdl92aWV3XzEzXzA9IHJ1bGVQZXJzcGVjdGl2ZVZpZXcgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjExNjY6MzogbHZfdmlld18xM18wPSBydWxlUGVyc3BlY3RpdmVWaWV3CisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRWaWV3UGVyc3BlY3RpdmVWaWV3UGFyc2VyUnVsZUNhbGxfM180XzFfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUGVyc3BlY3RpdmVWaWV3X2luX3J1bGVQZXJzcGVjdGl2ZVBhcnQyNzIxKTsKKyAgICAgICAgICAgIAkgICAgbHZfdmlld18xM18wPXJ1bGVQZXJzcGVjdGl2ZVZpZXcoKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRSdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkidmlldyIsCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X3ZpZXdfMTNfMCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJQZXJzcGVjdGl2ZVZpZXciKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCkpOworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSA2IDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMTg5OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2lzQ2xvc2FibGVfMTRfMD0gJ2lzQ2xvc2FibGUnICkgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTE4OTo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9pc0Nsb3NhYmxlXzE0XzA9ICdpc0Nsb3NhYmxlJyApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMTkwOjU6IHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfaXNDbG9zYWJsZV8xNF8wPSAnaXNDbG9zYWJsZScgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgNSkgKSB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVQZXJzcGVjdGl2ZVBhcnQiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDUpIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMTkwOjExMjogKCAoey4uLn0/ID0+ICggKGx2X2lzQ2xvc2FibGVfMTRfMD0gJ2lzQ2xvc2FibGUnICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMTkxOjY6ICh7Li4ufT8gPT4gKCAobHZfaXNDbG9zYWJsZV8xNF8wPSAnaXNDbG9zYWJsZScgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgNSk7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTE5NDo2OiAoey4uLn0/ID0+ICggKGx2X2lzQ2xvc2FibGVfMTRfMD0gJ2lzQ2xvc2FibGUnICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTE5NDo3OiB7Li4ufT8gPT4gKCAobHZfaXNDbG9zYWJsZV8xNF8wPSAnaXNDbG9zYWJsZScgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhKCh0cnVlKSkgKSB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVQZXJzcGVjdGl2ZVBhcnQiLCAidHJ1ZSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTE5NDoxNjogKCAobHZfaXNDbG9zYWJsZV8xNF8wPSAnaXNDbG9zYWJsZScgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTE5NToxOiAobHZfaXNDbG9zYWJsZV8xNF8wPSAnaXNDbG9zYWJsZScgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTE5NToxOiAobHZfaXNDbG9zYWJsZV8xNF8wPSAnaXNDbG9zYWJsZScgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjExOTY6MzogbHZfaXNDbG9zYWJsZV8xNF8wPSAnaXNDbG9zYWJsZScKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBsdl9pc0Nsb3NhYmxlXzE0XzA9KFRva2VuKW1hdGNoKGlucHV0LDMxLEZPTExPV18zMV9pbl9ydWxlUGVyc3BlY3RpdmVQYXJ0Mjc5NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgbmV3TGVhZk5vZGUobHZfaXNDbG9zYWJsZV8xNF8wLCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFydEFjY2VzcygpLmdldElzQ2xvc2FibGVJc0Nsb3NhYmxlS2V5d29yZF8zXzVfMCgpKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0UnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZChjdXJyZW50LCAiaXNDbG9zYWJsZSIsIHRydWUsICJpc0Nsb3NhYmxlIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCkpOworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDE0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkubGVhdmUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCkpOworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVBlcnNwZWN0aXZlUGFydCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVQZXJzcGVjdGl2ZVZpZXciCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMjMxOjE6IGVudHJ5UnVsZVBlcnNwZWN0aXZlVmlldyByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlUGVyc3BlY3RpdmVWaWV3PSBydWxlUGVyc3BlY3RpdmVWaWV3IEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlUGVyc3BlY3RpdmVWaWV3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVQZXJzcGVjdGl2ZVZpZXcgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTIzMjoyOiAoaXZfcnVsZVBlcnNwZWN0aXZlVmlldz0gcnVsZVBlcnNwZWN0aXZlVmlldyBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMjMzOjI6IGl2X3J1bGVQZXJzcGVjdGl2ZVZpZXc9IHJ1bGVQZXJzcGVjdGl2ZVZpZXcgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVZpZXdSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVQZXJzcGVjdGl2ZVZpZXdfaW5fZW50cnlSdWxlUGVyc3BlY3RpdmVWaWV3Mjg4Myk7CisgICAgICAgICAgICBpdl9ydWxlUGVyc3BlY3RpdmVWaWV3PXJ1bGVQZXJzcGVjdGl2ZVZpZXcoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVQZXJzcGVjdGl2ZVZpZXc7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlUGVyc3BlY3RpdmVWaWV3Mjg5Myk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVQZXJzcGVjdGl2ZVZpZXciCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVBlcnNwZWN0aXZlVmlldyIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEyNDA6MTogcnVsZVBlcnNwZWN0aXZlVmlldyByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAodGhpc19QZXJzcGVjdGl2ZVNlbGVjdGlvbl8wPSBydWxlUGVyc3BlY3RpdmVTZWxlY3Rpb24gfCB0aGlzX1BlcnNwZWN0aXZlVGFibGVfMT0gcnVsZVBlcnNwZWN0aXZlVGFibGUgfCB0aGlzX1BlcnNwZWN0aXZlQ2hhcnRfMj0gcnVsZVBlcnNwZWN0aXZlQ2hhcnQgfCB0aGlzX1BlcnNwZWN0aXZlUmVwb3J0XzM9IHJ1bGVQZXJzcGVjdGl2ZVJlcG9ydCB8IHRoaXNfUGVyc3BlY3RpdmVPcmdhbml6YXRpb25fND0gcnVsZVBlcnNwZWN0aXZlT3JnYW5pemF0aW9uIHwgdGhpc19QZXJzcGVjdGl2ZVRvcG9sb2d5XzU9IHJ1bGVQZXJzcGVjdGl2ZVRvcG9sb2d5IHwgdGhpc19QZXJzcGVjdGl2ZURpYWxvZ182PSBydWxlUGVyc3BlY3RpdmVEaWFsb2cgfCB0aGlzX1BlcnNwZWN0aXZlQlBNTl83PSBydWxlUGVyc3BlY3RpdmVCUE1OIHwgdGhpc19QZXJzcGVjdGl2ZUdyaWRfOD0gcnVsZVBlcnNwZWN0aXZlR3JpZCApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlUGVyc3BlY3RpdmVWaWV3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IHRoaXNfUGVyc3BlY3RpdmVTZWxlY3Rpb25fMCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCB0aGlzX1BlcnNwZWN0aXZlVGFibGVfMSA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCB0aGlzX1BlcnNwZWN0aXZlQ2hhcnRfMiA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCB0aGlzX1BlcnNwZWN0aXZlUmVwb3J0XzMgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgdGhpc19QZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbl80ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IHRoaXNfUGVyc3BlY3RpdmVUb3BvbG9neV81ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IHRoaXNfUGVyc3BlY3RpdmVEaWFsb2dfNiA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCB0aGlzX1BlcnNwZWN0aXZlQlBNTl83ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IHRoaXNfUGVyc3BlY3RpdmVHcmlkXzggPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMjQzOjI4OiAoICh0aGlzX1BlcnNwZWN0aXZlU2VsZWN0aW9uXzA9IHJ1bGVQZXJzcGVjdGl2ZVNlbGVjdGlvbiB8IHRoaXNfUGVyc3BlY3RpdmVUYWJsZV8xPSBydWxlUGVyc3BlY3RpdmVUYWJsZSB8IHRoaXNfUGVyc3BlY3RpdmVDaGFydF8yPSBydWxlUGVyc3BlY3RpdmVDaGFydCB8IHRoaXNfUGVyc3BlY3RpdmVSZXBvcnRfMz0gcnVsZVBlcnNwZWN0aXZlUmVwb3J0IHwgdGhpc19QZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbl80PSBydWxlUGVyc3BlY3RpdmVPcmdhbml6YXRpb24gfCB0aGlzX1BlcnNwZWN0aXZlVG9wb2xvZ3lfNT0gcnVsZVBlcnNwZWN0aXZlVG9wb2xvZ3kgfCB0aGlzX1BlcnNwZWN0aXZlRGlhbG9nXzY9IHJ1bGVQZXJzcGVjdGl2ZURpYWxvZyB8IHRoaXNfUGVyc3BlY3RpdmVCUE1OXzc9IHJ1bGVQZXJzcGVjdGl2ZUJQTU4gfCB0aGlzX1BlcnNwZWN0aXZlR3JpZF84PSBydWxlUGVyc3BlY3RpdmVHcmlkICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMjQ0OjE6ICh0aGlzX1BlcnNwZWN0aXZlU2VsZWN0aW9uXzA9IHJ1bGVQZXJzcGVjdGl2ZVNlbGVjdGlvbiB8IHRoaXNfUGVyc3BlY3RpdmVUYWJsZV8xPSBydWxlUGVyc3BlY3RpdmVUYWJsZSB8IHRoaXNfUGVyc3BlY3RpdmVDaGFydF8yPSBydWxlUGVyc3BlY3RpdmVDaGFydCB8IHRoaXNfUGVyc3BlY3RpdmVSZXBvcnRfMz0gcnVsZVBlcnNwZWN0aXZlUmVwb3J0IHwgdGhpc19QZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbl80PSBydWxlUGVyc3BlY3RpdmVPcmdhbml6YXRpb24gfCB0aGlzX1BlcnNwZWN0aXZlVG9wb2xvZ3lfNT0gcnVsZVBlcnNwZWN0aXZlVG9wb2xvZ3kgfCB0aGlzX1BlcnNwZWN0aXZlRGlhbG9nXzY9IHJ1bGVQZXJzcGVjdGl2ZURpYWxvZyB8IHRoaXNfUGVyc3BlY3RpdmVCUE1OXzc9IHJ1bGVQZXJzcGVjdGl2ZUJQTU4gfCB0aGlzX1BlcnNwZWN0aXZlR3JpZF84PSBydWxlUGVyc3BlY3RpdmVHcmlkICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTI0NDoxOiAodGhpc19QZXJzcGVjdGl2ZVNlbGVjdGlvbl8wPSBydWxlUGVyc3BlY3RpdmVTZWxlY3Rpb24gfCB0aGlzX1BlcnNwZWN0aXZlVGFibGVfMT0gcnVsZVBlcnNwZWN0aXZlVGFibGUgfCB0aGlzX1BlcnNwZWN0aXZlQ2hhcnRfMj0gcnVsZVBlcnNwZWN0aXZlQ2hhcnQgfCB0aGlzX1BlcnNwZWN0aXZlUmVwb3J0XzM9IHJ1bGVQZXJzcGVjdGl2ZVJlcG9ydCB8IHRoaXNfUGVyc3BlY3RpdmVPcmdhbml6YXRpb25fND0gcnVsZVBlcnNwZWN0aXZlT3JnYW5pemF0aW9uIHwgdGhpc19QZXJzcGVjdGl2ZVRvcG9sb2d5XzU9IHJ1bGVQZXJzcGVjdGl2ZVRvcG9sb2d5IHwgdGhpc19QZXJzcGVjdGl2ZURpYWxvZ182PSBydWxlUGVyc3BlY3RpdmVEaWFsb2cgfCB0aGlzX1BlcnNwZWN0aXZlQlBNTl83PSBydWxlUGVyc3BlY3RpdmVCUE1OIHwgdGhpc19QZXJzcGVjdGl2ZUdyaWRfOD0gcnVsZVBlcnNwZWN0aXZlR3JpZCApCisgICAgICAgICAgICBpbnQgYWx0MTU9OTsKKyAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0MTU9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMzOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQxNT0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDE1PTM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzNjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0MTU9NDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM3OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQxNT01OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzg6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDE1PTY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0MTU9NzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQwOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQxNT04OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDE1PTk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDE1LCAwLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE1KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMjQ1OjU6IHRoaXNfUGVyc3BlY3RpdmVTZWxlY3Rpb25fMD0gcnVsZVBlcnNwZWN0aXZlU2VsZWN0aW9uCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVmlld0FjY2VzcygpLmdldFBlcnNwZWN0aXZlU2VsZWN0aW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVQZXJzcGVjdGl2ZVNlbGVjdGlvbl9pbl9ydWxlUGVyc3BlY3RpdmVWaWV3Mjk0MCk7CisgICAgICAgICAgICAgICAgICAgIHRoaXNfUGVyc3BlY3RpdmVTZWxlY3Rpb25fMD1ydWxlUGVyc3BlY3RpdmVTZWxlY3Rpb24oKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gdGhpc19QZXJzcGVjdGl2ZVNlbGVjdGlvbl8wOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTI1NTo1OiB0aGlzX1BlcnNwZWN0aXZlVGFibGVfMT0gcnVsZVBlcnNwZWN0aXZlVGFibGUKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVWaWV3QWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVUYWJsZVBhcnNlclJ1bGVDYWxsXzEoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUGVyc3BlY3RpdmVUYWJsZV9pbl9ydWxlUGVyc3BlY3RpdmVWaWV3Mjk2Nyk7CisgICAgICAgICAgICAgICAgICAgIHRoaXNfUGVyc3BlY3RpdmVUYWJsZV8xPXJ1bGVQZXJzcGVjdGl2ZVRhYmxlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHRoaXNfUGVyc3BlY3RpdmVUYWJsZV8xOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMyA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTI2NTo1OiB0aGlzX1BlcnNwZWN0aXZlQ2hhcnRfMj0gcnVsZVBlcnNwZWN0aXZlQ2hhcnQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVWaWV3QWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVDaGFydFBhcnNlclJ1bGVDYWxsXzIoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUGVyc3BlY3RpdmVDaGFydF9pbl9ydWxlUGVyc3BlY3RpdmVWaWV3Mjk5NCk7CisgICAgICAgICAgICAgICAgICAgIHRoaXNfUGVyc3BlY3RpdmVDaGFydF8yPXJ1bGVQZXJzcGVjdGl2ZUNoYXJ0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHRoaXNfUGVyc3BlY3RpdmVDaGFydF8yOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNCA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTI3NTo1OiB0aGlzX1BlcnNwZWN0aXZlUmVwb3J0XzM9IHJ1bGVQZXJzcGVjdGl2ZVJlcG9ydAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVZpZXdBY2Nlc3MoKS5nZXRQZXJzcGVjdGl2ZVJlcG9ydFBhcnNlclJ1bGVDYWxsXzMoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUGVyc3BlY3RpdmVSZXBvcnRfaW5fcnVsZVBlcnNwZWN0aXZlVmlldzMwMjEpOworICAgICAgICAgICAgICAgICAgICB0aGlzX1BlcnNwZWN0aXZlUmVwb3J0XzM9cnVsZVBlcnNwZWN0aXZlUmVwb3J0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHRoaXNfUGVyc3BlY3RpdmVSZXBvcnRfMzsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDUgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEyODU6NTogdGhpc19QZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbl80PSBydWxlUGVyc3BlY3RpdmVPcmdhbml6YXRpb24KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVWaWV3QWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVPcmdhbml6YXRpb25QYXJzZXJSdWxlQ2FsbF80KCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVBlcnNwZWN0aXZlT3JnYW5pemF0aW9uX2luX3J1bGVQZXJzcGVjdGl2ZVZpZXczMDQ4KTsKKyAgICAgICAgICAgICAgICAgICAgdGhpc19QZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbl80PXJ1bGVQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbigpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0aGlzX1BlcnNwZWN0aXZlT3JnYW5pemF0aW9uXzQ7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA2IDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMjk1OjU6IHRoaXNfUGVyc3BlY3RpdmVUb3BvbG9neV81PSBydWxlUGVyc3BlY3RpdmVUb3BvbG9neQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVZpZXdBY2Nlc3MoKS5nZXRQZXJzcGVjdGl2ZVRvcG9sb2d5UGFyc2VyUnVsZUNhbGxfNSgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVQZXJzcGVjdGl2ZVRvcG9sb2d5X2luX3J1bGVQZXJzcGVjdGl2ZVZpZXczMDc1KTsKKyAgICAgICAgICAgICAgICAgICAgdGhpc19QZXJzcGVjdGl2ZVRvcG9sb2d5XzU9cnVsZVBlcnNwZWN0aXZlVG9wb2xvZ3koKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gdGhpc19QZXJzcGVjdGl2ZVRvcG9sb2d5XzU7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA3IDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMzA1OjU6IHRoaXNfUGVyc3BlY3RpdmVEaWFsb2dfNj0gcnVsZVBlcnNwZWN0aXZlRGlhbG9nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVmlld0FjY2VzcygpLmdldFBlcnNwZWN0aXZlRGlhbG9nUGFyc2VyUnVsZUNhbGxfNigpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVQZXJzcGVjdGl2ZURpYWxvZ19pbl9ydWxlUGVyc3BlY3RpdmVWaWV3MzEwMik7CisgICAgICAgICAgICAgICAgICAgIHRoaXNfUGVyc3BlY3RpdmVEaWFsb2dfNj1ydWxlUGVyc3BlY3RpdmVEaWFsb2coKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gdGhpc19QZXJzcGVjdGl2ZURpYWxvZ182OyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgOCA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTMxNTo1OiB0aGlzX1BlcnNwZWN0aXZlQlBNTl83PSBydWxlUGVyc3BlY3RpdmVCUE1OCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVmlld0FjY2VzcygpLmdldFBlcnNwZWN0aXZlQlBNTlBhcnNlclJ1bGVDYWxsXzcoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUGVyc3BlY3RpdmVCUE1OX2luX3J1bGVQZXJzcGVjdGl2ZVZpZXczMTI5KTsKKyAgICAgICAgICAgICAgICAgICAgdGhpc19QZXJzcGVjdGl2ZUJQTU5fNz1ydWxlUGVyc3BlY3RpdmVCUE1OKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHRoaXNfUGVyc3BlY3RpdmVCUE1OXzc7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA5IDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMzI1OjU6IHRoaXNfUGVyc3BlY3RpdmVHcmlkXzg9IHJ1bGVQZXJzcGVjdGl2ZUdyaWQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVWaWV3QWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVHcmlkUGFyc2VyUnVsZUNhbGxfOCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVQZXJzcGVjdGl2ZUdyaWRfaW5fcnVsZVBlcnNwZWN0aXZlVmlldzMxNTYpOworICAgICAgICAgICAgICAgICAgICB0aGlzX1BlcnNwZWN0aXZlR3JpZF84PXJ1bGVQZXJzcGVjdGl2ZUdyaWQoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gdGhpc19QZXJzcGVjdGl2ZUdyaWRfODsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVBlcnNwZWN0aXZlVmlldyIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVQZXJzcGVjdGl2ZVNlbGVjdGlvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEzNDE6MTogZW50cnlSdWxlUGVyc3BlY3RpdmVTZWxlY3Rpb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVBlcnNwZWN0aXZlU2VsZWN0aW9uPSBydWxlUGVyc3BlY3RpdmVTZWxlY3Rpb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVQZXJzcGVjdGl2ZVNlbGVjdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlUGVyc3BlY3RpdmVTZWxlY3Rpb24gPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTM0MjoyOiAoaXZfcnVsZVBlcnNwZWN0aXZlU2VsZWN0aW9uPSBydWxlUGVyc3BlY3RpdmVTZWxlY3Rpb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTM0MzoyOiBpdl9ydWxlUGVyc3BlY3RpdmVTZWxlY3Rpb249IHJ1bGVQZXJzcGVjdGl2ZVNlbGVjdGlvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2VsZWN0aW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUGVyc3BlY3RpdmVTZWxlY3Rpb25faW5fZW50cnlSdWxlUGVyc3BlY3RpdmVTZWxlY3Rpb24zMTkxKTsKKyAgICAgICAgICAgIGl2X3J1bGVQZXJzcGVjdGl2ZVNlbGVjdGlvbj1ydWxlUGVyc3BlY3RpdmVTZWxlY3Rpb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVQZXJzcGVjdGl2ZVNlbGVjdGlvbjsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVQZXJzcGVjdGl2ZVNlbGVjdGlvbjMyMDEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlUGVyc3BlY3RpdmVTZWxlY3Rpb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVBlcnNwZWN0aXZlU2VsZWN0aW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTM1MDoxOiBydWxlUGVyc3BlY3RpdmVTZWxlY3Rpb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICdzZWxlY3QnICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVBlcnNwZWN0aXZlU2VsZWN0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBUb2tlbiBvdGhlcmx2XzE9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8yPW51bGw7CisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMzUzOjI4OiAoICggKCkgb3RoZXJsdl8xPSAnc2VsZWN0JyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMzU0OjE6ICggKCkgb3RoZXJsdl8xPSAnc2VsZWN0JyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTM1NDoxOiAoICgpIG90aGVybHZfMT0gJ3NlbGVjdCcgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEzNTQ6MjogKCkgb3RoZXJsdl8xPSAnc2VsZWN0JyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEzNTQ6MjogKCkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTM1NTo1OiAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2VsZWN0aW9uQWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVTZWxlY3Rpb25BY3Rpb25fMCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsMzIsRk9MTE9XXzMyX2luX3J1bGVQZXJzcGVjdGl2ZVNlbGVjdGlvbjMyNDcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2VsZWN0aW9uQWNjZXNzKCkuZ2V0U2VsZWN0S2V5d29yZF8xKCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEzNjQ6MTogKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMzY1OjE6IChvdGhlcmx2XzI9IFJVTEVfSUQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMzY1OjE6IChvdGhlcmx2XzI9IFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMzY2OjM6IG90aGVybHZfMj0gUlVMRV9JRAorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCQkJaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNlbGVjdGlvblJ1bGUoKSk7CisgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG90aGVybHZfMj0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9JRCxGT0xMT1dfUlVMRV9JRF9pbl9ydWxlUGVyc3BlY3RpdmVTZWxlY3Rpb24zMjY3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNlbGVjdGlvbkFjY2VzcygpLmdldFJlZlRhYmxlQ3Jvc3NSZWZlcmVuY2VfMl8wKCkpOyAKKyAgICAgICAgICAgICAgCQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVQZXJzcGVjdGl2ZVNlbGVjdGlvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVQZXJzcGVjdGl2ZVRhYmxlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTM4NToxOiBlbnRyeVJ1bGVQZXJzcGVjdGl2ZVRhYmxlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVQZXJzcGVjdGl2ZVRhYmxlPSBydWxlUGVyc3BlY3RpdmVUYWJsZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVBlcnNwZWN0aXZlVGFibGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZVBlcnNwZWN0aXZlVGFibGUgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTM4NjoyOiAoaXZfcnVsZVBlcnNwZWN0aXZlVGFibGU9IHJ1bGVQZXJzcGVjdGl2ZVRhYmxlIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEzODc6MjogaXZfcnVsZVBlcnNwZWN0aXZlVGFibGU9IHJ1bGVQZXJzcGVjdGl2ZVRhYmxlIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVUYWJsZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVBlcnNwZWN0aXZlVGFibGVfaW5fZW50cnlSdWxlUGVyc3BlY3RpdmVUYWJsZTMzMDMpOworICAgICAgICAgICAgaXZfcnVsZVBlcnNwZWN0aXZlVGFibGU9cnVsZVBlcnNwZWN0aXZlVGFibGUoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVQZXJzcGVjdGl2ZVRhYmxlOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVBlcnNwZWN0aXZlVGFibGUzMzEzKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVBlcnNwZWN0aXZlVGFibGUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVBlcnNwZWN0aXZlVGFibGUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMzk0OjE6IHJ1bGVQZXJzcGVjdGl2ZVRhYmxlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAndGFibGUnICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVBlcnNwZWN0aXZlVGFibGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIFRva2VuIG90aGVybHZfMT1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzI9bnVsbDsKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEzOTc6Mjg6ICggKCAoKSBvdGhlcmx2XzE9ICd0YWJsZScgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTM5ODoxOiAoICgpIG90aGVybHZfMT0gJ3RhYmxlJyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTM5ODoxOiAoICgpIG90aGVybHZfMT0gJ3RhYmxlJyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTM5ODoyOiAoKSBvdGhlcmx2XzE9ICd0YWJsZScgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxMzk4OjI6ICgpCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjEzOTk6NTogCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVRhYmxlQWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVUYWJsZUFjdGlvbl8wKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCwzMyxGT0xMT1dfMzNfaW5fcnVsZVBlcnNwZWN0aXZlVGFibGUzMzU5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVRhYmxlQWNjZXNzKCkuZ2V0VGFibGVLZXl3b3JkXzEoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTQwODoxOiAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE0MDk6MTogKG90aGVybHZfMj0gUlVMRV9JRCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE0MDk6MTogKG90aGVybHZfMj0gUlVMRV9JRCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE0MTA6Mzogb3RoZXJsdl8yPSBSVUxFX0lECisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVGFibGVSdWxlKCkpOworICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdGhlcmx2XzI9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XX1JVTEVfSURfaW5fcnVsZVBlcnNwZWN0aXZlVGFibGUzMzc5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVRhYmxlQWNjZXNzKCkuZ2V0UmVmVGFibGVDcm9zc1JlZmVyZW5jZV8yXzAoKSk7IAorICAgICAgICAgICAgICAJCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVBlcnNwZWN0aXZlVGFibGUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlUGVyc3BlY3RpdmVHcmlkIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTQyOToxOiBlbnRyeVJ1bGVQZXJzcGVjdGl2ZUdyaWQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVBlcnNwZWN0aXZlR3JpZD0gcnVsZVBlcnNwZWN0aXZlR3JpZCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVBlcnNwZWN0aXZlR3JpZCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlUGVyc3BlY3RpdmVHcmlkID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE0MzA6MjogKGl2X3J1bGVQZXJzcGVjdGl2ZUdyaWQ9IHJ1bGVQZXJzcGVjdGl2ZUdyaWQgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTQzMToyOiBpdl9ydWxlUGVyc3BlY3RpdmVHcmlkPSBydWxlUGVyc3BlY3RpdmVHcmlkIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVHcmlkUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUGVyc3BlY3RpdmVHcmlkX2luX2VudHJ5UnVsZVBlcnNwZWN0aXZlR3JpZDM0MTUpOworICAgICAgICAgICAgaXZfcnVsZVBlcnNwZWN0aXZlR3JpZD1ydWxlUGVyc3BlY3RpdmVHcmlkKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlUGVyc3BlY3RpdmVHcmlkOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVBlcnNwZWN0aXZlR3JpZDM0MjUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlUGVyc3BlY3RpdmVHcmlkIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVQZXJzcGVjdGl2ZUdyaWQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNDM4OjE6IHJ1bGVQZXJzcGVjdGl2ZUdyaWQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICdncmlkJyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVQZXJzcGVjdGl2ZUdyaWQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIFRva2VuIG90aGVybHZfMT1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzI9bnVsbDsKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE0NDE6Mjg6ICggKCAoKSBvdGhlcmx2XzE9ICdncmlkJyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNDQyOjE6ICggKCkgb3RoZXJsdl8xPSAnZ3JpZCcgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE0NDI6MTogKCAoKSBvdGhlcmx2XzE9ICdncmlkJyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTQ0MjoyOiAoKSBvdGhlcmx2XzE9ICdncmlkJyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE0NDI6MjogKCkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTQ0Mzo1OiAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlR3JpZEFjY2VzcygpLmdldFBlcnNwZWN0aXZlR3JpZEFjdGlvbl8wKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCwzNCxGT0xMT1dfMzRfaW5fcnVsZVBlcnNwZWN0aXZlR3JpZDM0NzEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlR3JpZEFjY2VzcygpLmdldEdyaWRLZXl3b3JkXzEoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTQ1MjoxOiAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE0NTM6MTogKG90aGVybHZfMj0gUlVMRV9JRCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE0NTM6MTogKG90aGVybHZfMj0gUlVMRV9JRCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE0NTQ6Mzogb3RoZXJsdl8yPSBSVUxFX0lECisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlR3JpZFJ1bGUoKSk7CisgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG90aGVybHZfMj0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9JRCxGT0xMT1dfUlVMRV9JRF9pbl9ydWxlUGVyc3BlY3RpdmVHcmlkMzQ5MSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCQluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVHcmlkQWNjZXNzKCkuZ2V0UmVmVGFibGVDcm9zc1JlZmVyZW5jZV8yXzAoKSk7IAorICAgICAgICAgICAgICAJCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVBlcnNwZWN0aXZlR3JpZCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVQZXJzcGVjdGl2ZUNoYXJ0IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTQ3MzoxOiBlbnRyeVJ1bGVQZXJzcGVjdGl2ZUNoYXJ0IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVQZXJzcGVjdGl2ZUNoYXJ0PSBydWxlUGVyc3BlY3RpdmVDaGFydCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVBlcnNwZWN0aXZlQ2hhcnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZVBlcnNwZWN0aXZlQ2hhcnQgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTQ3NDoyOiAoaXZfcnVsZVBlcnNwZWN0aXZlQ2hhcnQ9IHJ1bGVQZXJzcGVjdGl2ZUNoYXJ0IEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE0NzU6MjogaXZfcnVsZVBlcnNwZWN0aXZlQ2hhcnQ9IHJ1bGVQZXJzcGVjdGl2ZUNoYXJ0IEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVDaGFydFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVBlcnNwZWN0aXZlQ2hhcnRfaW5fZW50cnlSdWxlUGVyc3BlY3RpdmVDaGFydDM1MjcpOworICAgICAgICAgICAgaXZfcnVsZVBlcnNwZWN0aXZlQ2hhcnQ9cnVsZVBlcnNwZWN0aXZlQ2hhcnQoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVQZXJzcGVjdGl2ZUNoYXJ0OyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVBlcnNwZWN0aXZlQ2hhcnQzNTM3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVBlcnNwZWN0aXZlQ2hhcnQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVBlcnNwZWN0aXZlQ2hhcnQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNDgyOjE6IHJ1bGVQZXJzcGVjdGl2ZUNoYXJ0IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAnY2hhcnQnICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVBlcnNwZWN0aXZlQ2hhcnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIFRva2VuIG90aGVybHZfMT1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzI9bnVsbDsKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE0ODU6Mjg6ICggKCAoKSBvdGhlcmx2XzE9ICdjaGFydCcgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTQ4NjoxOiAoICgpIG90aGVybHZfMT0gJ2NoYXJ0JyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTQ4NjoxOiAoICgpIG90aGVybHZfMT0gJ2NoYXJ0JyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTQ4NjoyOiAoKSBvdGhlcmx2XzE9ICdjaGFydCcgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNDg2OjI6ICgpCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE0ODc6NTogCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUNoYXJ0QWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVDaGFydEFjdGlvbl8wKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCwzNSxGT0xMT1dfMzVfaW5fcnVsZVBlcnNwZWN0aXZlQ2hhcnQzNTgzKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUNoYXJ0QWNjZXNzKCkuZ2V0Q2hhcnRLZXl3b3JkXzEoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTQ5NjoxOiAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE0OTc6MTogKG90aGVybHZfMj0gUlVMRV9JRCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE0OTc6MTogKG90aGVybHZfMj0gUlVMRV9JRCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE0OTg6Mzogb3RoZXJsdl8yPSBSVUxFX0lECisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQ2hhcnRSdWxlKCkpOworICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdGhlcmx2XzI9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XX1JVTEVfSURfaW5fcnVsZVBlcnNwZWN0aXZlQ2hhcnQzNjAzKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUNoYXJ0QWNjZXNzKCkuZ2V0UmVmQ2hhcnRDcm9zc1JlZmVyZW5jZV8yXzAoKSk7IAorICAgICAgICAgICAgICAJCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVBlcnNwZWN0aXZlQ2hhcnQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlUGVyc3BlY3RpdmVSZXBvcnQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNTE3OjE6IGVudHJ5UnVsZVBlcnNwZWN0aXZlUmVwb3J0IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVQZXJzcGVjdGl2ZVJlcG9ydD0gcnVsZVBlcnNwZWN0aXZlUmVwb3J0IEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlUGVyc3BlY3RpdmVSZXBvcnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZVBlcnNwZWN0aXZlUmVwb3J0ID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE1MTg6MjogKGl2X3J1bGVQZXJzcGVjdGl2ZVJlcG9ydD0gcnVsZVBlcnNwZWN0aXZlUmVwb3J0IEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE1MTk6MjogaXZfcnVsZVBlcnNwZWN0aXZlUmVwb3J0PSBydWxlUGVyc3BlY3RpdmVSZXBvcnQgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVJlcG9ydFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVBlcnNwZWN0aXZlUmVwb3J0X2luX2VudHJ5UnVsZVBlcnNwZWN0aXZlUmVwb3J0MzYzOSk7CisgICAgICAgICAgICBpdl9ydWxlUGVyc3BlY3RpdmVSZXBvcnQ9cnVsZVBlcnNwZWN0aXZlUmVwb3J0KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlUGVyc3BlY3RpdmVSZXBvcnQ7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlUGVyc3BlY3RpdmVSZXBvcnQzNjQ5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVBlcnNwZWN0aXZlUmVwb3J0IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVQZXJzcGVjdGl2ZVJlcG9ydCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE1MjY6MTogcnVsZVBlcnNwZWN0aXZlUmVwb3J0IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAncmVwb3J0JyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVQZXJzcGVjdGl2ZVJlcG9ydCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8xPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMj1udWxsOworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTUyOToyODogKCAoICgpIG90aGVybHZfMT0gJ3JlcG9ydCcgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTUzMDoxOiAoICgpIG90aGVybHZfMT0gJ3JlcG9ydCcgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE1MzA6MTogKCAoKSBvdGhlcmx2XzE9ICdyZXBvcnQnICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNTMwOjI6ICgpIG90aGVybHZfMT0gJ3JlcG9ydCcgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNTMwOjI6ICgpCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE1MzE6NTogCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVJlcG9ydEFjY2VzcygpLmdldFBlcnNwZWN0aXZlUmVwb3J0QWN0aW9uXzAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDM2LEZPTExPV18zNl9pbl9ydWxlUGVyc3BlY3RpdmVSZXBvcnQzNjk1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVJlcG9ydEFjY2VzcygpLmdldFJlcG9ydEtleXdvcmRfMSgpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNTQwOjE6ICggKG90aGVybHZfMj0gUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTU0MToxOiAob3RoZXJsdl8yPSBSVUxFX0lEICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTU0MToxOiAob3RoZXJsdl8yPSBSVUxFX0lEICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTU0MjozOiBvdGhlcmx2XzI9IFJVTEVfSUQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJCWlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVSZXBvcnRSdWxlKCkpOworICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdGhlcmx2XzI9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XX1JVTEVfSURfaW5fcnVsZVBlcnNwZWN0aXZlUmVwb3J0MzcxNSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCQluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVSZXBvcnRBY2Nlc3MoKS5nZXRSZWZSZXBvcnRDcm9zc1JlZmVyZW5jZV8yXzAoKSk7IAorICAgICAgICAgICAgICAJCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVBlcnNwZWN0aXZlUmVwb3J0IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVBlcnNwZWN0aXZlT3JnYW5pemF0aW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTU2MToxOiBlbnRyeVJ1bGVQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlUGVyc3BlY3RpdmVPcmdhbml6YXRpb249IHJ1bGVQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVBlcnNwZWN0aXZlT3JnYW5pemF0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbiA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNTYyOjI6IChpdl9ydWxlUGVyc3BlY3RpdmVPcmdhbml6YXRpb249IHJ1bGVQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNTYzOjI6IGl2X3J1bGVQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbj0gcnVsZVBlcnNwZWN0aXZlT3JnYW5pemF0aW9uIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVPcmdhbml6YXRpb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbl9pbl9lbnRyeVJ1bGVQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbjM3NTEpOworICAgICAgICAgICAgaXZfcnVsZVBlcnNwZWN0aXZlT3JnYW5pemF0aW9uPXJ1bGVQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZVBlcnNwZWN0aXZlT3JnYW5pemF0aW9uOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVBlcnNwZWN0aXZlT3JnYW5pemF0aW9uMzc2MSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlUGVyc3BlY3RpdmVPcmdhbml6YXRpb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNTcwOjE6IHJ1bGVQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICgpIG90aGVybHZfMT0gJ29yZ2FuaWdyYW0nICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVBlcnNwZWN0aXZlT3JnYW5pemF0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBUb2tlbiBvdGhlcmx2XzE9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8yPW51bGw7CisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNTczOjI4OiAoICggKCkgb3RoZXJsdl8xPSAnb3JnYW5pZ3JhbScgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTU3NDoxOiAoICgpIG90aGVybHZfMT0gJ29yZ2FuaWdyYW0nICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNTc0OjE6ICggKCkgb3RoZXJsdl8xPSAnb3JnYW5pZ3JhbScgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE1NzQ6MjogKCkgb3RoZXJsdl8xPSAnb3JnYW5pZ3JhbScgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNTc0OjI6ICgpCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE1NzU6NTogCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbkFjY2VzcygpLmdldFBlcnNwZWN0aXZlT3JnYW5pemF0aW9uQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDM3LEZPTExPV18zN19pbl9ydWxlUGVyc3BlY3RpdmVPcmdhbml6YXRpb24zODA3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbkFjY2VzcygpLmdldE9yZ2FuaWdyYW1LZXl3b3JkXzEoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTU4NDoxOiAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE1ODU6MTogKG90aGVybHZfMj0gUlVMRV9JRCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE1ODU6MTogKG90aGVybHZfMj0gUlVMRV9JRCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE1ODY6Mzogb3RoZXJsdl8yPSBSVUxFX0lECisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlT3JnYW5pemF0aW9uUnVsZSgpKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3RoZXJsdl8yPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lELEZPTExPV19SVUxFX0lEX2luX3J1bGVQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbjM4MjcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlT3JnYW5pemF0aW9uQWNjZXNzKCkuZ2V0UmVmT3JnYW5pemF0aW9uQ3Jvc3NSZWZlcmVuY2VfMl8wKCkpOyAKKyAgICAgICAgICAgICAgCQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVQZXJzcGVjdGl2ZVRvcG9sb2d5IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTYwNToxOiBlbnRyeVJ1bGVQZXJzcGVjdGl2ZVRvcG9sb2d5IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVQZXJzcGVjdGl2ZVRvcG9sb2d5PSBydWxlUGVyc3BlY3RpdmVUb3BvbG9neSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVBlcnNwZWN0aXZlVG9wb2xvZ3koKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZVBlcnNwZWN0aXZlVG9wb2xvZ3kgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTYwNjoyOiAoaXZfcnVsZVBlcnNwZWN0aXZlVG9wb2xvZ3k9IHJ1bGVQZXJzcGVjdGl2ZVRvcG9sb2d5IEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE2MDc6MjogaXZfcnVsZVBlcnNwZWN0aXZlVG9wb2xvZ3k9IHJ1bGVQZXJzcGVjdGl2ZVRvcG9sb2d5IEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVUb3BvbG9neVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVBlcnNwZWN0aXZlVG9wb2xvZ3lfaW5fZW50cnlSdWxlUGVyc3BlY3RpdmVUb3BvbG9neTM4NjMpOworICAgICAgICAgICAgaXZfcnVsZVBlcnNwZWN0aXZlVG9wb2xvZ3k9cnVsZVBlcnNwZWN0aXZlVG9wb2xvZ3koKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVQZXJzcGVjdGl2ZVRvcG9sb2d5OyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVBlcnNwZWN0aXZlVG9wb2xvZ3kzODczKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVBlcnNwZWN0aXZlVG9wb2xvZ3kiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVBlcnNwZWN0aXZlVG9wb2xvZ3kiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNjE0OjE6IHJ1bGVQZXJzcGVjdGl2ZVRvcG9sb2d5IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAndG9wb2xvZ3knICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVBlcnNwZWN0aXZlVG9wb2xvZ3koKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIFRva2VuIG90aGVybHZfMT1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzI9bnVsbDsKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE2MTc6Mjg6ICggKCAoKSBvdGhlcmx2XzE9ICd0b3BvbG9neScgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTYxODoxOiAoICgpIG90aGVybHZfMT0gJ3RvcG9sb2d5JyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTYxODoxOiAoICgpIG90aGVybHZfMT0gJ3RvcG9sb2d5JyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTYxODoyOiAoKSBvdGhlcmx2XzE9ICd0b3BvbG9neScgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNjE4OjI6ICgpCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE2MTk6NTogCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVRvcG9sb2d5QWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVUb3BvbG9neUFjdGlvbl8wKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCwzOCxGT0xMT1dfMzhfaW5fcnVsZVBlcnNwZWN0aXZlVG9wb2xvZ3kzOTE5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVRvcG9sb2d5QWNjZXNzKCkuZ2V0VG9wb2xvZ3lLZXl3b3JkXzEoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTYyODoxOiAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE2Mjk6MTogKG90aGVybHZfMj0gUlVMRV9JRCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE2Mjk6MTogKG90aGVybHZfMj0gUlVMRV9JRCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE2MzA6Mzogb3RoZXJsdl8yPSBSVUxFX0lECisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVG9wb2xvZ3lSdWxlKCkpOworICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdGhlcmx2XzI9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XX1JVTEVfSURfaW5fcnVsZVBlcnNwZWN0aXZlVG9wb2xvZ3kzOTM5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVRvcG9sb2d5QWNjZXNzKCkuZ2V0UmVmVG9wb2xvZ3lDcm9zc1JlZmVyZW5jZV8yXzAoKSk7IAorICAgICAgICAgICAgICAJCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVBlcnNwZWN0aXZlVG9wb2xvZ3kiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlUGVyc3BlY3RpdmVEaWFsb2ciCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNjQ5OjE6IGVudHJ5UnVsZVBlcnNwZWN0aXZlRGlhbG9nIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVQZXJzcGVjdGl2ZURpYWxvZz0gcnVsZVBlcnNwZWN0aXZlRGlhbG9nIEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlUGVyc3BlY3RpdmVEaWFsb2coKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZVBlcnNwZWN0aXZlRGlhbG9nID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE2NTA6MjogKGl2X3J1bGVQZXJzcGVjdGl2ZURpYWxvZz0gcnVsZVBlcnNwZWN0aXZlRGlhbG9nIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE2NTE6MjogaXZfcnVsZVBlcnNwZWN0aXZlRGlhbG9nPSBydWxlUGVyc3BlY3RpdmVEaWFsb2cgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZURpYWxvZ1J1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVBlcnNwZWN0aXZlRGlhbG9nX2luX2VudHJ5UnVsZVBlcnNwZWN0aXZlRGlhbG9nMzk3NSk7CisgICAgICAgICAgICBpdl9ydWxlUGVyc3BlY3RpdmVEaWFsb2c9cnVsZVBlcnNwZWN0aXZlRGlhbG9nKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlUGVyc3BlY3RpdmVEaWFsb2c7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlUGVyc3BlY3RpdmVEaWFsb2czOTg1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVBlcnNwZWN0aXZlRGlhbG9nIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVQZXJzcGVjdGl2ZURpYWxvZyIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE2NTg6MTogcnVsZVBlcnNwZWN0aXZlRGlhbG9nIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAnZGlhbG9nJyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVQZXJzcGVjdGl2ZURpYWxvZygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8xPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMj1udWxsOworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTY2MToyODogKCAoICgpIG90aGVybHZfMT0gJ2RpYWxvZycgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTY2MjoxOiAoICgpIG90aGVybHZfMT0gJ2RpYWxvZycgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE2NjI6MTogKCAoKSBvdGhlcmx2XzE9ICdkaWFsb2cnICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNjYyOjI6ICgpIG90aGVybHZfMT0gJ2RpYWxvZycgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNjYyOjI6ICgpCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE2NjM6NTogCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZURpYWxvZ0FjY2VzcygpLmdldFBlcnNwZWN0aXZlRGlhbG9nQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDM5LEZPTExPV18zOV9pbl9ydWxlUGVyc3BlY3RpdmVEaWFsb2c0MDMxKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZURpYWxvZ0FjY2VzcygpLmdldERpYWxvZ0tleXdvcmRfMSgpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNjcyOjE6ICggKG90aGVybHZfMj0gUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTY3MzoxOiAob3RoZXJsdl8yPSBSVUxFX0lEICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTY3MzoxOiAob3RoZXJsdl8yPSBSVUxFX0lEICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTY3NDozOiBvdGhlcmx2XzI9IFJVTEVfSUQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJCWlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVEaWFsb2dSdWxlKCkpOworICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdGhlcmx2XzI9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XX1JVTEVfSURfaW5fcnVsZVBlcnNwZWN0aXZlRGlhbG9nNDA1MSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCQluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVEaWFsb2dBY2Nlc3MoKS5nZXRSZWZEaWFsb2dDcm9zc1JlZmVyZW5jZV8yXzAoKSk7IAorICAgICAgICAgICAgICAJCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVBlcnNwZWN0aXZlRGlhbG9nIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVBlcnNwZWN0aXZlQlBNTiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE2OTM6MTogZW50cnlSdWxlUGVyc3BlY3RpdmVCUE1OIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVQZXJzcGVjdGl2ZUJQTU49IHJ1bGVQZXJzcGVjdGl2ZUJQTU4gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVQZXJzcGVjdGl2ZUJQTU4oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZVBlcnNwZWN0aXZlQlBNTiA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNjk0OjI6IChpdl9ydWxlUGVyc3BlY3RpdmVCUE1OPSBydWxlUGVyc3BlY3RpdmVCUE1OIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE2OTU6MjogaXZfcnVsZVBlcnNwZWN0aXZlQlBNTj0gcnVsZVBlcnNwZWN0aXZlQlBNTiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQlBNTlJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVBlcnNwZWN0aXZlQlBNTl9pbl9lbnRyeVJ1bGVQZXJzcGVjdGl2ZUJQTU40MDg3KTsKKyAgICAgICAgICAgIGl2X3J1bGVQZXJzcGVjdGl2ZUJQTU49cnVsZVBlcnNwZWN0aXZlQlBNTigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZVBlcnNwZWN0aXZlQlBNTjsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVQZXJzcGVjdGl2ZUJQTU40MDk3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVBlcnNwZWN0aXZlQlBNTiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlUGVyc3BlY3RpdmVCUE1OIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTcwMjoxOiBydWxlUGVyc3BlY3RpdmVCUE1OIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAnYnBtbicgKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVBlcnNwZWN0aXZlQlBNTigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8xPW51bGw7CisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNzA1OjI4OiAoICggKCkgb3RoZXJsdl8xPSAnYnBtbicgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE3MDY6MTogKCAoKSBvdGhlcmx2XzE9ICdicG1uJyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE3MDY6MTogKCAoKSBvdGhlcmx2XzE9ICdicG1uJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE3MDY6MjogKCkgb3RoZXJsdl8xPSAnYnBtbicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTcwNjoyOiAoKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNzA3OjU6IAorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVCUE1OQWNjZXNzKCkuZ2V0UGVyc3BlY3RpdmVCUE1OQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDQwLEZPTExPV180MF9pbl9ydWxlUGVyc3BlY3RpdmVCUE1ONDE0Myk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVCUE1OQWNjZXNzKCkuZ2V0QnBtbktleXdvcmRfMSgpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlUGVyc3BlY3RpdmVCUE1OIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE3MjQ6MTogZW50cnlSdWxlUGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIDogaXZfcnVsZVBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZD0gcnVsZVBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZW50cnlSdWxlUGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gaXZfcnVsZVBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNzI1OjI6IChpdl9ydWxlUGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkPSBydWxlUGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE3MjY6MjogaXZfcnVsZVBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZD0gcnVsZVBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9pbl9lbnRyeVJ1bGVQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQ0MTgwKTsKKyAgICAgICAgICAgIGl2X3J1bGVQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQ9cnVsZVBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZVBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZC5nZXRUZXh0KCk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlUGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkNDE5MSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE3MzM6MTogcnVsZVBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gOiAodGhpc19RdWFsaWZpZWROYW1lXzA9IHJ1bGVRdWFsaWZpZWROYW1lIChrdz0gJy4nIGt3PSAnKicgKT8gKSA7CisgICAgcHVibGljIGZpbmFsIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gcnVsZVBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudCA9IG5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCk7CisKKyAgICAgICAgVG9rZW4ga3c9bnVsbDsKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiB0aGlzX1F1YWxpZmllZE5hbWVfMCA9IG51bGw7CisKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE3MzY6Mjg6ICggKHRoaXNfUXVhbGlmaWVkTmFtZV8wPSBydWxlUXVhbGlmaWVkTmFtZSAoa3c9ICcuJyBrdz0gJyonICk/ICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNzM3OjE6ICh0aGlzX1F1YWxpZmllZE5hbWVfMD0gcnVsZVF1YWxpZmllZE5hbWUgKGt3PSAnLicga3c9ICcqJyApPyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE3Mzc6MTogKHRoaXNfUXVhbGlmaWVkTmFtZV8wPSBydWxlUXVhbGlmaWVkTmFtZSAoa3c9ICcuJyBrdz0gJyonICk/ICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTczODo1OiB0aGlzX1F1YWxpZmllZE5hbWVfMD0gcnVsZVF1YWxpZmllZE5hbWUgKGt3PSAnLicga3c9ICcqJyApPworICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkQWNjZXNzKCkuZ2V0UXVhbGlmaWVkTmFtZVBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUXVhbGlmaWVkTmFtZV9pbl9ydWxlUGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkNDIzOCk7CisgICAgICAgICAgICB0aGlzX1F1YWxpZmllZE5hbWVfMD1ydWxlUXVhbGlmaWVkTmFtZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJY3VycmVudC5tZXJnZSh0aGlzX1F1YWxpZmllZE5hbWVfMCk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE3NDg6MTogKGt3PSAnLicga3c9ICcqJyApPworICAgICAgICAgICAgaW50IGFsdDE2PTI7CisgICAgICAgICAgICBpbnQgTEExNl8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBMTZfMD09NDEpICkgeworICAgICAgICAgICAgICAgIGFsdDE2PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE2KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNzQ5OjI6IGt3PSAnLicga3c9ICcqJworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw0MSxGT0xMT1dfNDFfaW5fcnVsZVBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZDQyNTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkQWNjZXNzKCkuZ2V0RnVsbFN0b3BLZXl3b3JkXzFfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw0MixGT0xMT1dfNDJfaW5fcnVsZVBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZDQyNzApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkQWNjZXNzKCkuZ2V0QXN0ZXJpc2tLZXl3b3JkXzFfMSgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlUXVhbGlmaWVkTmFtZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE3Njg6MTogZW50cnlSdWxlUXVhbGlmaWVkTmFtZSByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSA6IGl2X3J1bGVRdWFsaWZpZWROYW1lPSBydWxlUXVhbGlmaWVkTmFtZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZW50cnlSdWxlUXVhbGlmaWVkTmFtZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGl2X3J1bGVRdWFsaWZpZWROYW1lID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE3Njk6MjogKGl2X3J1bGVRdWFsaWZpZWROYW1lPSBydWxlUXVhbGlmaWVkTmFtZSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNzcwOjI6IGl2X3J1bGVRdWFsaWZpZWROYW1lPSBydWxlUXVhbGlmaWVkTmFtZSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVRdWFsaWZpZWROYW1lX2luX2VudHJ5UnVsZVF1YWxpZmllZE5hbWU0MzEzKTsKKyAgICAgICAgICAgIGl2X3J1bGVRdWFsaWZpZWROYW1lPXJ1bGVRdWFsaWZpZWROYW1lKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlUXVhbGlmaWVkTmFtZS5nZXRUZXh0KCk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlUXVhbGlmaWVkTmFtZTQzMjQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlUXVhbGlmaWVkTmFtZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlUXVhbGlmaWVkTmFtZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE3Nzc6MTogcnVsZVF1YWxpZmllZE5hbWUgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIDogKHRoaXNfVmFsaWRJRF8wPSBydWxlVmFsaWRJRCAoICggKCAnLicgKT0+a3c9ICcuJyApIHRoaXNfVmFsaWRJRF8yPSBydWxlVmFsaWRJRCApKiApIDsKKyAgICBwdWJsaWMgZmluYWwgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBydWxlUXVhbGlmaWVkTmFtZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudCA9IG5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCk7CisKKyAgICAgICAgVG9rZW4ga3c9bnVsbDsKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiB0aGlzX1ZhbGlkSURfMCA9IG51bGw7CisKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiB0aGlzX1ZhbGlkSURfMiA9IG51bGw7CisKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE3ODA6Mjg6ICggKHRoaXNfVmFsaWRJRF8wPSBydWxlVmFsaWRJRCAoICggKCAnLicgKT0+a3c9ICcuJyApIHRoaXNfVmFsaWRJRF8yPSBydWxlVmFsaWRJRCApKiApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTc4MToxOiAodGhpc19WYWxpZElEXzA9IHJ1bGVWYWxpZElEICggKCAoICcuJyApPT5rdz0gJy4nICkgdGhpc19WYWxpZElEXzI9IHJ1bGVWYWxpZElEICkqICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTc4MToxOiAodGhpc19WYWxpZElEXzA9IHJ1bGVWYWxpZElEICggKCAoICcuJyApPT5rdz0gJy4nICkgdGhpc19WYWxpZElEXzI9IHJ1bGVWYWxpZElEICkqICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTc4Mjo1OiB0aGlzX1ZhbGlkSURfMD0gcnVsZVZhbGlkSUQgKCAoICggJy4nICk9Pmt3PSAnLicgKSB0aGlzX1ZhbGlkSURfMj0gcnVsZVZhbGlkSUQgKSoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVBY2Nlc3MoKS5nZXRWYWxpZElEUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVWYWxpZElEX2luX3J1bGVRdWFsaWZpZWROYW1lNDM3MSk7CisgICAgICAgICAgICB0aGlzX1ZhbGlkSURfMD1ydWxlVmFsaWRJRCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJY3VycmVudC5tZXJnZSh0aGlzX1ZhbGlkSURfMCk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE3OTI6MTogKCAoICggJy4nICk9Pmt3PSAnLicgKSB0aGlzX1ZhbGlkSURfMj0gcnVsZVZhbGlkSUQgKSoKKyAgICAgICAgICAgIGxvb3AxNzoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTc9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExN18wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTE3XzA9PTQxKSApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBMTdfMiA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKExBMTdfMj09UlVMRV9JRCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExN18zID0gaW5wdXQuTEEoMyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxX0ludGVybmFsUGVyc3BlY3RpdmVEc2woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTc9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE3KSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxNzkyOjI6ICggKCAnLicgKT0+a3c9ICcuJyApIHRoaXNfVmFsaWRJRF8yPSBydWxlVmFsaWRJRAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTc5MjoyOiAoICggJy4nICk9Pmt3PSAnLicgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE3OTI6MzogKCAnLicgKT0+a3c9ICcuJworICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw0MSxGT0xMT1dfNDFfaW5fcnVsZVF1YWxpZmllZE5hbWU0Mzk5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgICAgICAgICBjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVBY2Nlc3MoKS5nZXRGdWxsU3RvcEtleXdvcmRfMV8wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVBY2Nlc3MoKS5nZXRWYWxpZElEUGFyc2VyUnVsZUNhbGxfMV8xKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVZhbGlkSURfaW5fcnVsZVF1YWxpZmllZE5hbWU0NDIyKTsKKyAgICAgICAgICAgIAkgICAgdGhpc19WYWxpZElEXzI9cnVsZVZhbGlkSUQoKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkJY3VycmVudC5tZXJnZSh0aGlzX1ZhbGlkSURfMik7CisgICAgICAgICAgICAJICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxNzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlUXVhbGlmaWVkTmFtZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVWYWxpZElEIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTgxOToxOiBlbnRyeVJ1bGVWYWxpZElEIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIDogaXZfcnVsZVZhbGlkSUQ9IHJ1bGVWYWxpZElEIEVPRiA7CisgICAgcHVibGljIGZpbmFsIFN0cmluZyBlbnRyeVJ1bGVWYWxpZElEKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gaXZfcnVsZVZhbGlkSUQgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTgyMDoyOiAoaXZfcnVsZVZhbGlkSUQ9IHJ1bGVWYWxpZElEIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE4MjE6MjogaXZfcnVsZVZhbGlkSUQ9IHJ1bGVWYWxpZElEIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0VmFsaWRJRFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVZhbGlkSURfaW5fZW50cnlSdWxlVmFsaWRJRDQ0NzApOworICAgICAgICAgICAgaXZfcnVsZVZhbGlkSUQ9cnVsZVZhbGlkSUQoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVWYWxpZElELmdldFRleHQoKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVWYWxpZElENDQ4MSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVWYWxpZElEIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVWYWxpZElEIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTgyODoxOiBydWxlVmFsaWRJRCByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gOiB0aGlzX0lEXzA9IFJVTEVfSUQgOworICAgIHB1YmxpYyBmaW5hbCBBbnRsckRhdGF0eXBlUnVsZVRva2VuIHJ1bGVWYWxpZElEKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50ID0gbmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKTsKKworICAgICAgICBUb2tlbiB0aGlzX0lEXzA9bnVsbDsKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE4MzE6Mjg6ICh0aGlzX0lEXzA9IFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxODMyOjU6IHRoaXNfSURfMD0gUlVMRV9JRAorICAgICAgICAgICAgeworICAgICAgICAgICAgdGhpc19JRF8wPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lELEZPTExPV19SVUxFX0lEX2luX3J1bGVWYWxpZElENDUyMCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCQljdXJyZW50Lm1lcmdlKHRoaXNfSURfMCk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZSh0aGlzX0lEXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0VmFsaWRJREFjY2VzcygpLmdldElEVGVybWluYWxSdWxlQ2FsbCgpKTsgCisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlVmFsaWRJRCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVUUkFOU0xBVEFCTEVJRCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE4NDc6MTogZW50cnlSdWxlVFJBTlNMQVRBQkxFSUQgcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlVFJBTlNMQVRBQkxFSUQ9IHJ1bGVUUkFOU0xBVEFCTEVJRCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZW50cnlSdWxlVFJBTlNMQVRBQkxFSUQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBpdl9ydWxlVFJBTlNMQVRBQkxFSUQgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTg0ODoyOiAoaXZfcnVsZVRSQU5TTEFUQUJMRUlEPSBydWxlVFJBTlNMQVRBQkxFSUQgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTg0OToyOiBpdl9ydWxlVFJBTlNMQVRBQkxFSUQ9IHJ1bGVUUkFOU0xBVEFCTEVJRCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFRSQU5TTEFUQUJMRUlEUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlVFJBTlNMQVRBQkxFSURfaW5fZW50cnlSdWxlVFJBTlNMQVRBQkxFSUQ0NTY1KTsKKyAgICAgICAgICAgIGl2X3J1bGVUUkFOU0xBVEFCTEVJRD1ydWxlVFJBTlNMQVRBQkxFSUQoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVUUkFOU0xBVEFCTEVJRC5nZXRUZXh0KCk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlVFJBTlNMQVRBQkxFSUQ0NTc2KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVRSQU5TTEFUQUJMRUlEIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVUUkFOU0xBVEFCTEVJRCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE4NTY6MTogcnVsZVRSQU5TTEFUQUJMRUlEIHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSA6IHRoaXNfSURfMD0gUlVMRV9JRCA7CisgICAgcHVibGljIGZpbmFsIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gcnVsZVRSQU5TTEFUQUJMRUlEKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50ID0gbmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKTsKKworICAgICAgICBUb2tlbiB0aGlzX0lEXzA9bnVsbDsKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE4NTk6Mjg6ICh0aGlzX0lEXzA9IFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxODYwOjU6IHRoaXNfSURfMD0gUlVMRV9JRAorICAgICAgICAgICAgeworICAgICAgICAgICAgdGhpc19JRF8wPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lELEZPTExPV19SVUxFX0lEX2luX3J1bGVUUkFOU0xBVEFCTEVJRDQ2MTUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJY3VycmVudC5tZXJnZSh0aGlzX0lEXzApOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUodGhpc19JRF8wLCBncmFtbWFyQWNjZXNzLmdldFRSQU5TTEFUQUJMRUlEQWNjZXNzKCkuZ2V0SURUZXJtaW5hbFJ1bGVDYWxsKCkpOyAKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVUUkFOU0xBVEFCTEVJRCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVUUkFOU0xBVEFCTEVTVFJJTkciCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxODc1OjE6IGVudHJ5UnVsZVRSQU5TTEFUQUJMRVNUUklORyByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSA6IGl2X3J1bGVUUkFOU0xBVEFCTEVTVFJJTkc9IHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGVudHJ5UnVsZVRSQU5TTEFUQUJMRVNUUklORygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGl2X3J1bGVUUkFOU0xBVEFCTEVTVFJJTkcgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTg3NjoyOiAoaXZfcnVsZVRSQU5TTEFUQUJMRVNUUklORz0gcnVsZVRSQU5TTEFUQUJMRVNUUklORyBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxODc3OjI6IGl2X3J1bGVUUkFOU0xBVEFCTEVTVFJJTkc9IHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRUUkFOU0xBVEFCTEVTVFJJTkdSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVUUkFOU0xBVEFCTEVTVFJJTkdfaW5fZW50cnlSdWxlVFJBTlNMQVRBQkxFU1RSSU5HNDY2MCk7CisgICAgICAgICAgICBpdl9ydWxlVFJBTlNMQVRBQkxFU1RSSU5HPXJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVUUkFOU0xBVEFCTEVTVFJJTkcuZ2V0VGV4dCgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVRSQU5TTEFUQUJMRVNUUklORzQ2NzEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlVFJBTlNMQVRBQkxFU1RSSU5HIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVUUkFOU0xBVEFCTEVTVFJJTkciCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxODg0OjE6IHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIDogdGhpc19TVFJJTkdfMD0gUlVMRV9TVFJJTkcgOworICAgIHB1YmxpYyBmaW5hbCBBbnRsckRhdGF0eXBlUnVsZVRva2VuIHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQgPSBuZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpOworCisgICAgICAgIFRva2VuIHRoaXNfU1RSSU5HXzA9bnVsbDsKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE4ODc6Mjg6ICh0aGlzX1NUUklOR18wPSBSVUxFX1NUUklORyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE4ODg6NTogdGhpc19TVFJJTkdfMD0gUlVMRV9TVFJJTkcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXNfU1RSSU5HXzA9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfU1RSSU5HLEZPTExPV19SVUxFX1NUUklOR19pbl9ydWxlVFJBTlNMQVRBQkxFU1RSSU5HNDcxMCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCQljdXJyZW50Lm1lcmdlKHRoaXNfU1RSSU5HXzApOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUodGhpc19TVFJJTkdfMCwgZ3JhbW1hckFjY2Vzcy5nZXRUUkFOU0xBVEFCTEVTVFJJTkdBY2Nlc3MoKS5nZXRTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsKCkpOyAKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVUUkFOU0xBVEFCTEVTVFJJTkciCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEFubm90YXRpb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOTAzOjE6IGVudHJ5UnVsZVhBbm5vdGF0aW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYQW5ub3RhdGlvbj0gcnVsZVhBbm5vdGF0aW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlWEFubm90YXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZVhBbm5vdGF0aW9uID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE5MDQ6MjogKGl2X3J1bGVYQW5ub3RhdGlvbj0gcnVsZVhBbm5vdGF0aW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE5MDU6MjogaXZfcnVsZVhBbm5vdGF0aW9uPSBydWxlWEFubm90YXRpb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBbm5vdGF0aW9uX2luX2VudHJ5UnVsZVhBbm5vdGF0aW9uNDc1NCk7CisgICAgICAgICAgICBpdl9ydWxlWEFubm90YXRpb249cnVsZVhBbm5vdGF0aW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlWEFubm90YXRpb247IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWEFubm90YXRpb240NzY0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhBbm5vdGF0aW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQW5ub3RhdGlvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE5MTI6MTogcnVsZVhBbm5vdGF0aW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAnQCcgKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSAoICggKCAnKCcgKT0+b3RoZXJsdl8zPSAnKCcgKSAoICggKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzRfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKG90aGVybHZfNT0gJywnICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc182XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApICkqICkgfCAoIChsdl92YWx1ZV83XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0ICkgKSApPyBvdGhlcmx2Xzg9ICcpJyApPyApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlWEFubm90YXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIFRva2VuIG90aGVybHZfMT1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzM9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl81PW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfOD1udWxsOworICAgICAgICBFT2JqZWN0IGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzRfMCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBsdl9lbGVtZW50VmFsdWVQYWlyc182XzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgbHZfdmFsdWVfN18wID0gbnVsbDsKKworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTkxNToyODogKCAoICgpIG90aGVybHZfMT0gJ0AnICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkgKCAoICggJygnICk9Pm90aGVybHZfMz0gJygnICkgKCAoICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc180XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApIChvdGhlcmx2XzU9ICcsJyAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSApKiApIHwgKCAobHZfdmFsdWVfN18wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCApICkgKT8gb3RoZXJsdl84PSAnKScgKT8gKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE5MTY6MTogKCAoKSBvdGhlcmx2XzE9ICdAJyAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApICggKCAoICcoJyApPT5vdGhlcmx2XzM9ICcoJyApICggKCAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNF8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSAob3RoZXJsdl81PSAnLCcgKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzZfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKSogKSB8ICggKGx2X3ZhbHVlXzdfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgKSApICk/IG90aGVybHZfOD0gJyknICk/ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTkxNjoxOiAoICgpIG90aGVybHZfMT0gJ0AnICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkgKCAoICggJygnICk9Pm90aGVybHZfMz0gJygnICkgKCAoICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc180XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApIChvdGhlcmx2XzU9ICcsJyAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSApKiApIHwgKCAobHZfdmFsdWVfN18wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCApICkgKT8gb3RoZXJsdl84PSAnKScgKT8gKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOTE2OjI6ICgpIG90aGVybHZfMT0gJ0AnICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkgKCAoICggJygnICk9Pm90aGVybHZfMz0gJygnICkgKCAoICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc180XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApIChvdGhlcmx2XzU9ICcsJyAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSApKiApIHwgKCAobHZfdmFsdWVfN18wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCApICkgKT8gb3RoZXJsdl84PSAnKScgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTkxNjoyOiAoKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOTE3OjU6IAorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRYQW5ub3RhdGlvbkFjdGlvbl8wKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCw0MyxGT0xMT1dfNDNfaW5fcnVsZVhBbm5vdGF0aW9uNDgxMCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRDb21tZXJjaWFsQXRLZXl3b3JkXzEoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTkyNjoxOiAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE5Mjc6MTogKCBydWxlUXVhbGlmaWVkTmFtZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE5Mjc6MTogKCBydWxlUXVhbGlmaWVkTmFtZSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE5Mjg6MzogcnVsZVF1YWxpZmllZE5hbWUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJCWlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25SdWxlKCkpOworICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRBbm5vdGF0aW9uVHlwZUp2bUFubm90YXRpb25UeXBlQ3Jvc3NSZWZlcmVuY2VfMl8wKCkpOyAKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVRdWFsaWZpZWROYW1lX2luX3J1bGVYQW5ub3RhdGlvbjQ4MzMpOworICAgICAgICAgICAgcnVsZVF1YWxpZmllZE5hbWUoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTk0MToyOiAoICggKCAnKCcgKT0+b3RoZXJsdl8zPSAnKCcgKSAoICggKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzRfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKG90aGVybHZfNT0gJywnICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc182XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApICkqICkgfCAoIChsdl92YWx1ZV83XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0ICkgKSApPyBvdGhlcmx2Xzg9ICcpJyApPworICAgICAgICAgICAgaW50IGFsdDIwPTI7CisgICAgICAgICAgICBpbnQgTEEyMF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBMjBfMD09NDQpICYmIChzeW5wcmVkMl9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsKCkpKSB7CisgICAgICAgICAgICAgICAgYWx0MjA9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MjApIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE5NDE6MzogKCAoICcoJyApPT5vdGhlcmx2XzM9ICcoJyApICggKCAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNF8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSAob3RoZXJsdl81PSAnLCcgKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzZfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKSogKSB8ICggKGx2X3ZhbHVlXzdfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgKSApICk/IG90aGVybHZfOD0gJyknCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOTQxOjM6ICggKCAnKCcgKT0+b3RoZXJsdl8zPSAnKCcgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE5NDE6NDogKCAnKCcgKT0+b3RoZXJsdl8zPSAnKCcKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzM9KFRva2VuKW1hdGNoKGlucHV0LDQ0LEZPTExPV180NF9pbl9ydWxlWEFubm90YXRpb240ODU0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzMsIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzNfMCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOTQ2OjI6ICggKCAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNF8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSAob3RoZXJsdl81PSAnLCcgKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzZfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKSogKSB8ICggKGx2X3ZhbHVlXzdfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgKSApICk/CisgICAgICAgICAgICAgICAgICAgIGludCBhbHQxOT0zOworICAgICAgICAgICAgICAgICAgICBhbHQxOSA9IGRmYTE5LnByZWRpY3QoaW5wdXQpOworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTk0NjozOiAoICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc180XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApIChvdGhlcmx2XzU9ICcsJyAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSApKiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTk0NjozOiAoICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc180XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApIChvdGhlcmx2XzU9ICcsJyAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSApKiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOTQ2OjQ6ICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc180XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApIChvdGhlcmx2XzU9ICcsJyAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSApKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE5NDY6NDogKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzRfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE5NDY6NTogKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc180XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE5NTI6MTogKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzRfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOTUzOjM6IGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzRfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEVsZW1lbnRWYWx1ZVBhaXJzWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyUGFyc2VyUnVsZUNhbGxfM18xXzBfMF8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfaW5fcnVsZVhBbm5vdGF0aW9uNDg5OCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHZfZWxlbWVudFZhbHVlUGFpcnNfNF8wPXJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25SdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJYWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCSJlbGVtZW50VmFsdWVQYWlycyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJbHZfZWxlbWVudFZhbHVlUGFpcnNfNF8wLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkiWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOTY5OjI6IChvdGhlcmx2XzU9ICcsJyAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSApKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AxODoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHQxOD0yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExOF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExOF8wPT00NSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQxOD0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE5Njk6NDogb3RoZXJsdl81PSAnLCcgKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzZfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIG90aGVybHZfNT0oVG9rZW4pbWF0Y2goaW5wdXQsNDUsRk9MTE9XXzQ1X2luX3J1bGVYQW5ub3RhdGlvbjQ5MTEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl81LCBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzNfMV8wXzFfMCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOTczOjE6ICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc182XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE5NzM6MjogKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc182XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOTc5OjE6IChsdl9lbGVtZW50VmFsdWVQYWlyc182XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoxOTgwOjM6IGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzZfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0RWxlbWVudFZhbHVlUGFpcnNYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJQYXJzZXJSdWxlQ2FsbF8zXzFfMF8xXzFfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX2luX3J1bGVYQW5ub3RhdGlvbjQ5NTIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgbHZfZWxlbWVudFZhbHVlUGFpcnNfNl8wPXJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uUnVsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlhZGQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJlbGVtZW50VmFsdWVQYWlycyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9lbGVtZW50VmFsdWVQYWlyc182XzAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIlhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTk5Nzo2OiAoIChsdl92YWx1ZV83XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0ICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE5OTc6NjogKCAobHZfdmFsdWVfN18wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE5OTg6MTogKGx2X3ZhbHVlXzdfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjE5OTg6MTogKGx2X3ZhbHVlXzdfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MTk5OTozOiBsdl92YWx1ZV83XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0VmFsdWVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UGFyc2VyUnVsZUNhbGxfM18xXzFfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9pbl9ydWxlWEFubm90YXRpb240OTgyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdl92YWx1ZV83XzA9cnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25SdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCSJ2YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJbHZfdmFsdWVfN18wLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkiWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBvdGhlcmx2Xzg9KFRva2VuKW1hdGNoKGlucHV0LDQ2LEZPTExPV180Nl9pbl9ydWxlWEFubm90YXRpb240OTk2KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzgsIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF8zXzIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYQW5ub3RhdGlvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMDI3OjE6IGVudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyIEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjAyODoyOiAoaXZfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcj0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMDI5OjI6IGl2X3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXI9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfaW5fZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyNTAzNCk7CisgICAgICAgICAgICBpdl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyPXJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXI7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyNTA0NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIwMzY6MTogcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+ICggKCAoIHJ1bGVWYWxpZElEICkgKSBvdGhlcmx2XzE9ICc9JyApICkgKCAobHZfdmFsdWVfMl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUgKSApICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIFRva2VuIG90aGVybHZfMT1udWxsOworICAgICAgICBFT2JqZWN0IGx2X3ZhbHVlXzJfMCA9IG51bGw7CisKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIwMzk6Mjg6ICggKCAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAoICggKCBydWxlVmFsaWRJRCApICkgb3RoZXJsdl8xPSAnPScgKSApICggKGx2X3ZhbHVlXzJfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlICkgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjA0MDoxOiAoICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+ICggKCAoIHJ1bGVWYWxpZElEICkgKSBvdGhlcmx2XzE9ICc9JyApICkgKCAobHZfdmFsdWVfMl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUgKSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjA0MDoxOiAoICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+ICggKCAoIHJ1bGVWYWxpZElEICkgKSBvdGhlcmx2XzE9ICc9JyApICkgKCAobHZfdmFsdWVfMl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjA0MDoyOiAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAoICggKCBydWxlVmFsaWRJRCApICkgb3RoZXJsdl8xPSAnPScgKSApICggKGx2X3ZhbHVlXzJfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMDQwOjI6ICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+ICggKCAoIHJ1bGVWYWxpZElEICkgKSBvdGhlcmx2XzE9ICc9JyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjA0MDozOiAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKCAoICggcnVsZVZhbGlkSUQgKSApIG90aGVybHZfMT0gJz0nICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjA0NTo1OiAoICggKCBydWxlVmFsaWRJRCApICkgb3RoZXJsdl8xPSAnPScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMDQ1OjY6ICggKCBydWxlVmFsaWRJRCApICkgb3RoZXJsdl8xPSAnPScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjA0NTo2OiAoICggcnVsZVZhbGlkSUQgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIwNDY6MTogKCBydWxlVmFsaWRJRCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIwNDY6MTogKCBydWxlVmFsaWRJRCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIwNDc6MzogcnVsZVZhbGlkSUQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJCWlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyUnVsZSgpKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpLmdldEVsZW1lbnRKdm1PcGVyYXRpb25Dcm9zc1JlZmVyZW5jZV8wXzBfMF8wKCkpOyAKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVWYWxpZElEX2luX3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXI1MTE0KTsKKyAgICAgICAgICAgIHJ1bGVWYWxpZElEKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDQ3LEZPTExPV180N19pbl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyNTEyNik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyQWNjZXNzKCkuZ2V0RXF1YWxzU2lnbktleXdvcmRfMF8wXzEoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMDY0OjM6ICggKGx2X3ZhbHVlXzJfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMDY1OjE6IChsdl92YWx1ZV8yXzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIwNjU6MTogKGx2X3ZhbHVlXzJfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjA2NjozOiBsdl92YWx1ZV8yXzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpLmdldFZhbHVlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IAorICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlX2luX3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXI1MTQ5KTsKKyAgICAgICAgICAgIGx2X3ZhbHVlXzJfMD1ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpclJ1bGUoKSk7CisgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAJCQkidmFsdWUiLAorICAgICAgICAgICAgICAgICAgICAgIAkJbHZfdmFsdWVfMl8wLCAKKyAgICAgICAgICAgICAgICAgICAgICAJCSJYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSIpOworICAgICAgICAgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjA5MDoxOiBlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0PSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjA5MToyOiAoaXZfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3Q9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0IEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIwOTI6MjogaXZfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3Q9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0IEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfaW5fZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdDUxODUpOworICAgICAgICAgICAgaXZfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3Q9cnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0OyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3Q1MTk1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMDk5OjE6IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCAoICggKCAoKSAnIycgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKSApICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSogKT8gb3RoZXJsdl82PSAnXScgKSB8ICh0aGlzX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uXzc9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiAoICgpIChvdGhlcmx2Xzk9ICcsJyAoIChsdl9lbGVtZW50c18xMF8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkrICk/ICkgKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIFRva2VuIG90aGVybHZfMT1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzI9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl80PW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfNj1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2Xzk9bnVsbDsKKyAgICAgICAgRU9iamVjdCBsdl9lbGVtZW50c18zXzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgbHZfZWxlbWVudHNfNV8wID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IHRoaXNfWEFubm90YXRpb25PckV4cHJlc3Npb25fNyA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBsdl9lbGVtZW50c18xMF8wID0gbnVsbDsKKworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjEwMjoyODogKCAoICggKCAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkgKSAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nICkgfCAodGhpc19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl83PSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKCAoKSAob3RoZXJsdl85PSAnLCcgKCAobHZfZWxlbWVudHNfMTBfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKyApPyApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMTAzOjE6ICggKCAoICggKCAoKSAnIycgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKSApICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSogKT8gb3RoZXJsdl82PSAnXScgKSB8ICh0aGlzX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uXzc9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiAoICgpIChvdGhlcmx2Xzk9ICcsJyAoIChsdl9lbGVtZW50c18xMF8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkrICk/ICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMTAzOjE6ICggKCAoICggKCAoKSAnIycgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKSApICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSogKT8gb3RoZXJsdl82PSAnXScgKSB8ICh0aGlzX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uXzc9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiAoICgpIChvdGhlcmx2Xzk9ICcsJyAoIChsdl9lbGVtZW50c18xMF8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkrICk/ICkgKQorICAgICAgICAgICAgaW50IGFsdDI1PTI7CisgICAgICAgICAgICBhbHQyNSA9IGRmYTI1LnByZWRpY3QoaW5wdXQpOworICAgICAgICAgICAgc3dpdGNoIChhbHQyNSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjEwMzoyOiAoICggKCAoICgpICcjJyAnWycgKSApPT4gKCAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICdbJyApICkgKCAoIChsdl9lbGVtZW50c18zXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKiApPyBvdGhlcmx2XzY9ICddJyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMTAzOjI6ICggKCAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkgKSAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMTAzOjM6ICggKCAoICgpICcjJyAnWycgKSApPT4gKCAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICdbJyApICkgKCAoIChsdl9lbGVtZW50c18zXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKiApPyBvdGhlcmx2XzY9ICddJworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjEwMzozOiAoICggKCAoKSAnIycgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjEwMzo0OiAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIxMDY6NTogKCAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICdbJyApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjEwNjo2OiAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICdbJworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjEwNjo2OiAoKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIxMDc6NTogCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxBY3Rpb25fMF8wXzBfMCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDQ4LEZPTExPV180OF9pbl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdDUyNjApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0TnVtYmVyU2lnbktleXdvcmRfMF8wXzBfMSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl8yPShUb2tlbiltYXRjaChpbnB1dCw0OSxGT0xMT1dfNDlfaW5fcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3Q1MjcyKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldExlZnRTcXVhcmVCcmFja2V0S2V5d29yZF8wXzBfMF8yKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIxMjA6MzogKCAoIChsdl9lbGVtZW50c18zXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKiApPworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MjI9MjsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBMjJfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKChMQTIyXzA+PVJVTEVfSUQgJiYgTEEyMl8wPD1SVUxFX0RFQ0lNQUwpfHxMQTIyXzA9PTE0fHxMQTIyXzA9PTE2fHwoTEEyMl8wPj00MyAmJiBMQTIyXzA8PTQ0KXx8KExBMjJfMD49NDggJiYgTEEyMl8wPD00OSl8fExBMjJfMD09NTZ8fChMQTIyXzA+PTcyICYmIExBMjJfMDw9NzMpfHxMQTIyXzA9PTc3fHxMQTIyXzA9PTg1fHxMQTIyXzA9PTg3fHwoTEEyMl8wPj05MSAmJiBMQTIyXzA8PTkzKXx8KExBMjJfMD49OTYgJiYgTEEyMl8wPD0xMDcpfHxMQTIyXzA9PTEwOSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQyMj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MjIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMTIwOjQ6ICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjEyMDo0OiAoIChsdl9lbGVtZW50c18zXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIxMjE6MTogKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMTIxOjE6IChsdl9lbGVtZW50c18zXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMTIyOjM6IGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRFbGVtZW50c1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMF8xXzBfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb25faW5fcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3Q1Mjk2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdl9lbGVtZW50c18zXzA9cnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJYWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCSJlbGVtZW50cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJbHZfZWxlbWVudHNfM18wLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkiWEFubm90YXRpb25PckV4cHJlc3Npb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIxMzg6MjogKG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AyMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHQyMT0yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEyMV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEEyMV8wPT00NSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQyMT0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDIxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIxMzg6NDogb3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBvdGhlcmx2XzQ9KFRva2VuKW1hdGNoKGlucHV0LDQ1LEZPTExPV180NV9pbl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdDUzMDkpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfMF8xXzFfMCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMTQyOjE6ICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMTQzOjE6IChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIxNDM6MTogKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjE0NDozOiBsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRFbGVtZW50c1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMF8xXzFfMV8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl9pbl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdDUzMzApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgbHZfZWxlbWVudHNfNV8wPXJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgIAkJYWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkiZWxlbWVudHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfZWxlbWVudHNfNV8wLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhayBsb29wMjE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzY9KFRva2VuKW1hdGNoKGlucHV0LDUwLEZPTExPV181MF9pbl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdDUzNDYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNiwgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0UmlnaHRTcXVhcmVCcmFja2V0S2V5d29yZF8wXzIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIxNjU6NjogKHRoaXNfWEFubm90YXRpb25PckV4cHJlc3Npb25fNz0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICggKCkgKG90aGVybHZfOT0gJywnICggKGx2X2VsZW1lbnRzXzEwXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSsgKT8gKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjE2NTo2OiAodGhpc19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl83PSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKCAoKSAob3RoZXJsdl85PSAnLCcgKCAobHZfZWxlbWVudHNfMTBfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKyApPyApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjE2Njo1OiB0aGlzX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uXzc9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiAoICgpIChvdGhlcmx2Xzk9ICcsJyAoIChsdl9lbGVtZW50c18xMF8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkrICk/CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl9pbl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdDUzNzYpOworICAgICAgICAgICAgICAgICAgICB0aGlzX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uXzc9cnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHRoaXNfWEFubm90YXRpb25PckV4cHJlc3Npb25fNzsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjE3NDoxOiAoICgpIChvdGhlcmx2Xzk9ICcsJyAoIChsdl9lbGVtZW50c18xMF8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkrICk/CisgICAgICAgICAgICAgICAgICAgIGludCBhbHQyND0yOworICAgICAgICAgICAgICAgICAgICBpbnQgTEEyNF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEEyNF8wPT00NSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQyND0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MjQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMTc0OjI6ICgpIChvdGhlcmx2Xzk9ICcsJyAoIChsdl9lbGVtZW50c18xMF8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjE3NDoyOiAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjE3NTo1OiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50QW5kQWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjE4MDoyOiAob3RoZXJsdl85PSAnLCcgKCAobHZfZWxlbWVudHNfMTBfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbnQyMz0wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AyMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHQyMz0yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEyM18wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEEyM18wPT00NSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQyMz0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDIzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIxODA6NDogb3RoZXJsdl85PSAnLCcgKCAobHZfZWxlbWVudHNfMTBfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgb3RoZXJsdl85PShUb2tlbiltYXRjaChpbnB1dCw0NSxGT0xMT1dfNDVfaW5fcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3Q1Mzk4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfOSwgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzFfMV8xXzAoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjE4NDoxOiAoIChsdl9lbGVtZW50c18xMF8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIxODU6MTogKGx2X2VsZW1lbnRzXzEwXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIxODU6MTogKGx2X2VsZW1lbnRzXzEwXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIxODY6MzogbHZfZWxlbWVudHNfMTBfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEVsZW1lbnRzWEFubm90YXRpb25PckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xXzFfMV8xXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uX2luX3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0NTQxOSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBsdl9lbGVtZW50c18xMF8wPXJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgIAkJYWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkiZWxlbWVudHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfZWxlbWVudHNfMTBfMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiWEFubm90YXRpb25PckV4cHJlc3Npb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBjbnQyMyA+PSAxICkgYnJlYWsgbG9vcDIzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFYXJseUV4aXRFeGNlcHRpb24gZWVlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVhcmx5RXhpdEV4Y2VwdGlvbigyMywgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVlZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbnQyMysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMjEwOjE6IGVudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZT0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIyMTE6MjogKGl2X3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZT0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIyMTI6MjogaXZfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlX2luX2VudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlNTQ2MCk7CisgICAgICAgICAgICBpdl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWU9cnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWU7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWU1NDcwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIyMTk6MTogcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCAoICggKCAoKSAnIycgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKSApICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSogKT8gb3RoZXJsdl82PSAnXScgKSB8IHRoaXNfWEFubm90YXRpb25PckV4cHJlc3Npb25fNz0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8xPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMj1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzQ9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl82PW51bGw7CisgICAgICAgIEVPYmplY3QgbHZfZWxlbWVudHNfM18wID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGx2X2VsZW1lbnRzXzVfMCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCB0aGlzX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uXzcgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMjIyOjI4OiAoICggKCAoICggKCAoKSAnIycgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKSApICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSogKT8gb3RoZXJsdl82PSAnXScgKSB8IHRoaXNfWEFubm90YXRpb25PckV4cHJlc3Npb25fNz0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMjIzOjE6ICggKCAoICggKCAoKSAnIycgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKSApICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSogKT8gb3RoZXJsdl82PSAnXScgKSB8IHRoaXNfWEFubm90YXRpb25PckV4cHJlc3Npb25fNz0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjIyMzoxOiAoICggKCAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkgKSAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nICkgfCB0aGlzX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uXzc9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCisgICAgICAgICAgICBpbnQgYWx0Mjg9MjsKKyAgICAgICAgICAgIGFsdDI4ID0gZGZhMjgucHJlZGljdChpbnB1dCk7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDI4KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMjIzOjI6ICggKCAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkgKSAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIyMjM6MjogKCAoICggKCAoKSAnIycgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKSApICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSogKT8gb3RoZXJsdl82PSAnXScgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIyMjM6MzogKCAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkgKSAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMjIzOjM6ICggKCAoICgpICcjJyAnWycgKSApPT4gKCAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICdbJyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMjIzOjQ6ICggKCAoKSAnIycgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjIyNjo1OiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMjI2OjY6ICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMjI2OjY6ICgpCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjIyNzo1OiAKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxBY3Rpb25fMF8wXzBfMCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDQ4LEZPTExPV180OF9pbl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWU1NTM1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXROdW1iZXJTaWduS2V5d29yZF8wXzBfMF8xKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzI9KFRva2VuKW1hdGNoKGlucHV0LDQ5LEZPTExPV180OV9pbl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWU1NTQ3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRMZWZ0U3F1YXJlQnJhY2tldEtleXdvcmRfMF8wXzBfMigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMjQwOjM6ICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSogKT8KKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdDI3PTI7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTI3XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoICgoTEEyN18wPj1SVUxFX0lEICYmIExBMjdfMDw9UlVMRV9ERUNJTUFMKXx8TEEyN18wPT0xNHx8TEEyN18wPT0xNnx8KExBMjdfMD49NDMgJiYgTEEyN18wPD00NCl8fChMQTI3XzA+PTQ4ICYmIExBMjdfMDw9NDkpfHxMQTI3XzA9PTU2fHwoTEEyN18wPj03MiAmJiBMQTI3XzA8PTczKXx8TEEyN18wPT03N3x8TEEyN18wPT04NXx8TEEyN18wPT04N3x8KExBMjdfMD49OTEgJiYgTEEyN18wPD05Myl8fChMQTI3XzA+PTk2ICYmIExBMjdfMDw9MTA3KXx8TEEyN18wPT0xMDkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0Mjc9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDI3KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjI0MDo0OiAoIChsdl9lbGVtZW50c18zXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIyNDA6NDogKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMjQxOjE6IChsdl9lbGVtZW50c18zXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjI0MToxOiAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjI0MjozOiBsdl9lbGVtZW50c18zXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEVsZW1lbnRzWEFubm90YXRpb25PckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8wXzFfMF8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl9pbl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWU1NTcxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdl9lbGVtZW50c18zXzA9cnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCWFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkiZWxlbWVudHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCWx2X2VsZW1lbnRzXzNfMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJIlhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMjU4OjI6IChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wMjY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MjY9MjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMjZfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBMjZfMD09NDUpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MjY9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQyNikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMjU4OjQ6IG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgb3RoZXJsdl80PShUb2tlbiltYXRjaChpbnB1dCw0NSxGT0xMT1dfNDVfaW5fcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlNTU4NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzQsIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfMF8xXzFfMCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMjYyOjE6ICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMjYzOjE6IChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIyNjM6MTogKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjI2NDozOiBsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0RWxlbWVudHNYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzBfMV8xXzFfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb25faW5fcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlNTYwNSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBsdl9lbGVtZW50c181XzA9cnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgIAkJYWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkiZWxlbWVudHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfZWxlbWVudHNfNV8wLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhayBsb29wMjY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzY9KFRva2VuKW1hdGNoKGlucHV0LDUwLEZPTExPV181MF9pbl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWU1NjIxKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzYsIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRSaWdodFNxdWFyZUJyYWNrZXRLZXl3b3JkXzBfMigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjI4Njo1OiB0aGlzX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uXzc9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMSgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl9pbl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWU1NjUwKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpc19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl83PXJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0aGlzX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uXzc7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIzMDI6MTogZW50cnlSdWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjMwMzoyOiAoaXZfcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjMwNDoyOiBpdl9ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb249IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb25faW5fZW50cnlSdWxlWEFubm90YXRpb25PckV4cHJlc3Npb241Njg1KTsKKyAgICAgICAgICAgIGl2X3J1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbj1ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbjsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbjU2OTUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWEFubm90YXRpb25PckV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjMxMToxOiBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKHRoaXNfWEFubm90YXRpb25fMD0gcnVsZVhBbm5vdGF0aW9uIHwgdGhpc19YRXhwcmVzc2lvbl8xPSBydWxlWEV4cHJlc3Npb24gKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IHRoaXNfWEFubm90YXRpb25fMCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCB0aGlzX1hFeHByZXNzaW9uXzEgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMzE0OjI4OiAoICh0aGlzX1hBbm5vdGF0aW9uXzA9IHJ1bGVYQW5ub3RhdGlvbiB8IHRoaXNfWEV4cHJlc3Npb25fMT0gcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMzE1OjE6ICh0aGlzX1hBbm5vdGF0aW9uXzA9IHJ1bGVYQW5ub3RhdGlvbiB8IHRoaXNfWEV4cHJlc3Npb25fMT0gcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjMxNToxOiAodGhpc19YQW5ub3RhdGlvbl8wPSBydWxlWEFubm90YXRpb24gfCB0aGlzX1hFeHByZXNzaW9uXzE9IHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICBpbnQgYWx0Mjk9MjsKKyAgICAgICAgICAgIGludCBMQTI5XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoTEEyOV8wPT00MykgKSB7CisgICAgICAgICAgICAgICAgYWx0Mjk9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBMjlfMD49UlVMRV9JRCAmJiBMQTI5XzA8PVJVTEVfREVDSU1BTCl8fExBMjlfMD09MTR8fExBMjlfMD09MTZ8fExBMjlfMD09NDR8fChMQTI5XzA+PTQ4ICYmIExBMjlfMDw9NDkpfHxMQTI5XzA9PTU2fHwoTEEyOV8wPj03MiAmJiBMQTI5XzA8PTczKXx8TEEyOV8wPT03N3x8TEEyOV8wPT04NXx8TEEyOV8wPT04N3x8KExBMjlfMD49OTEgJiYgTEEyOV8wPD05Myl8fChMQTI5XzA+PTk2ICYmIExBMjlfMDw9MTA3KXx8TEEyOV8wPT0xMDkpICkgeworICAgICAgICAgICAgICAgIGFsdDI5PTI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDI5LCAwLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQyOSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjMxNjo1OiB0aGlzX1hBbm5vdGF0aW9uXzA9IHJ1bGVYQW5ub3RhdGlvbgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhBbm5vdGF0aW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQW5ub3RhdGlvbl9pbl9ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb241NzQyKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpc19YQW5ub3RhdGlvbl8wPXJ1bGVYQW5ub3RhdGlvbigpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0aGlzX1hBbm5vdGF0aW9uXzA7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMzI2OjU6IHRoaXNfWEV4cHJlc3Npb25fMT0gcnVsZVhFeHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhFeHByZXNzaW9uX2luX3J1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbjU3NjkpOworICAgICAgICAgICAgICAgICAgICB0aGlzX1hFeHByZXNzaW9uXzE9cnVsZVhFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHRoaXNfWEV4cHJlc3Npb25fMTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjM0MjoxOiBlbnRyeVJ1bGVYRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWEV4cHJlc3Npb249IHJ1bGVYRXhwcmVzc2lvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVhFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVYRXhwcmVzc2lvbiA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMzQzOjI6IChpdl9ydWxlWEV4cHJlc3Npb249IHJ1bGVYRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMzQ0OjI6IGl2X3J1bGVYRXhwcmVzc2lvbj0gcnVsZVhFeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYRXhwcmVzc2lvbl9pbl9lbnRyeVJ1bGVYRXhwcmVzc2lvbjU4MDQpOworICAgICAgICAgICAgaXZfcnVsZVhFeHByZXNzaW9uPXJ1bGVYRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZVhFeHByZXNzaW9uOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhFeHByZXNzaW9uNTgxNCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWEV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMzUxOjE6IHJ1bGVYRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiB0aGlzX1hBc3NpZ25tZW50XzA9IHJ1bGVYQXNzaWdubWVudCA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVhFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IHRoaXNfWEFzc2lnbm1lbnRfMCA9IG51bGw7CisKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIzNTQ6Mjg6ICh0aGlzX1hBc3NpZ25tZW50XzA9IHJ1bGVYQXNzaWdubWVudCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIzNTY6NTogdGhpc19YQXNzaWdubWVudF8wPSBydWxlWEFzc2lnbm1lbnQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRQYXJzZXJSdWxlQ2FsbCgpKTsgCisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQXNzaWdubWVudF9pbl9ydWxlWEV4cHJlc3Npb241ODYwKTsKKyAgICAgICAgICAgIHRoaXNfWEFzc2lnbm1lbnRfMD1ydWxlWEFzc2lnbm1lbnQoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0aGlzX1hBc3NpZ25tZW50XzA7IAorICAgICAgICAgICAgICAgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQXNzaWdubWVudCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIzNzI6MTogZW50cnlSdWxlWEFzc2lnbm1lbnQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhBc3NpZ25tZW50PSBydWxlWEFzc2lnbm1lbnQgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVYQXNzaWdubWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlWEFzc2lnbm1lbnQgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjM3MzoyOiAoaXZfcnVsZVhBc3NpZ25tZW50PSBydWxlWEFzc2lnbm1lbnQgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjM3NDoyOiBpdl9ydWxlWEFzc2lnbm1lbnQ9IHJ1bGVYQXNzaWdubWVudCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFzc2lnbm1lbnRfaW5fZW50cnlSdWxlWEFzc2lnbm1lbnQ1ODk0KTsKKyAgICAgICAgICAgIGl2X3J1bGVYQXNzaWdubWVudD1ydWxlWEFzc2lnbm1lbnQoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVYQXNzaWdubWVudDsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYQXNzaWdubWVudDU5MDQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWEFzc2lnbm1lbnQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhBc3NpZ25tZW50IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjM4MToxOiBydWxlWEFzc2lnbm1lbnQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoICgpICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkgcnVsZU9wU2luZ2xlQXNzaWduICggKGx2X3ZhbHVlXzNfMD0gcnVsZVhBc3NpZ25tZW50ICkgKSApIHwgKHRoaXNfWE9yRXhwcmVzc2lvbl80PSBydWxlWE9yRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKSApPT4gKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfN18wPSBydWxlWEFzc2lnbm1lbnQgKSApICk/ICkgKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVhBc3NpZ25tZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGx2X3ZhbHVlXzNfMCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCB0aGlzX1hPckV4cHJlc3Npb25fNCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBsdl9yaWdodE9wZXJhbmRfN18wID0gbnVsbDsKKworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjM4NDoyODogKCAoICggKCkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKCAobHZfdmFsdWVfM18wPSBydWxlWEFzc2lnbm1lbnQgKSApICkgfCAodGhpc19YT3JFeHByZXNzaW9uXzQ9IHJ1bGVYT3JFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICk9PiAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF83XzA9IHJ1bGVYQXNzaWdubWVudCApICkgKT8gKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjM4NToxOiAoICggKCkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKCAobHZfdmFsdWVfM18wPSBydWxlWEFzc2lnbm1lbnQgKSApICkgfCAodGhpc19YT3JFeHByZXNzaW9uXzQ9IHJ1bGVYT3JFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICk9PiAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF83XzA9IHJ1bGVYQXNzaWdubWVudCApICkgKT8gKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIzODU6MTogKCAoICgpICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkgcnVsZU9wU2luZ2xlQXNzaWduICggKGx2X3ZhbHVlXzNfMD0gcnVsZVhBc3NpZ25tZW50ICkgKSApIHwgKHRoaXNfWE9yRXhwcmVzc2lvbl80PSBydWxlWE9yRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKSApPT4gKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfN18wPSBydWxlWEFzc2lnbm1lbnQgKSApICk/ICkgKQorICAgICAgICAgICAgaW50IGFsdDMxPTI7CisgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKKyAgICAgICAgICAgIGNhc2UgUlVMRV9JRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IExBMzFfMSA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEEzMV8xPT00NykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDMxPTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEzMV8xPT1FT0Z8fChMQTMxXzE+PVJVTEVfSUQgJiYgTEEzMV8xPD1SVUxFX0RFQ0lNQUwpfHwoTEEzMV8xPj0xNCAmJiBMQTMxXzE8PTE2KXx8KExBMzFfMT49NDEgJiYgTEEzMV8xPD00Mil8fChMQTMxXzE+PTQ0ICYmIExBMzFfMTw9NDYpfHwoTEEzMV8xPj00OCAmJiBMQTMxXzE8PTgyKXx8KExBMzFfMT49ODQgJiYgTEEzMV8xPD0xMTApKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MzE9MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAzMSwgMSwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTY6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBMQTMxXzIgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgIGlmICggKExBMzFfMj09RU9GfHwoTEEzMV8yPj1SVUxFX0lEICYmIExBMzFfMjw9UlVMRV9ERUNJTUFMKXx8KExBMzFfMj49MTQgJiYgTEEzMV8yPD0xNil8fChMQTMxXzI+PTQxICYmIExBMzFfMjw9NDIpfHwoTEEzMV8yPj00NCAmJiBMQTMxXzI8PTQ2KXx8KExBMzFfMj49NDggJiYgTEEzMV8yPD04Mil8fChMQTMxXzI+PTg0ICYmIExBMzFfMjw9MTEwKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDMxPTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEzMV8yPT00NykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDMxPTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMzEsIDIsIGlucHV0KTsKKworICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDk3OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgTEEzMV8zID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTMxXzM9PTQ3KSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MzE9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTMxXzM9PUVPRnx8KExBMzFfMz49UlVMRV9JRCAmJiBMQTMxXzM8PVJVTEVfREVDSU1BTCl8fChMQTMxXzM+PTE0ICYmIExBMzFfMzw9MTYpfHwoTEEzMV8zPj00MSAmJiBMQTMxXzM8PTQyKXx8KExBMzFfMz49NDQgJiYgTEEzMV8zPD00Nil8fChMQTMxXzM+PTQ4ICYmIExBMzFfMzw9ODIpfHwoTEEzMV8zPj04NCAmJiBMQTMxXzM8PTExMCkpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQzMT0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDMxLCAzLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IExBMzFfNCA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEEzMV80PT00NykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDMxPTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEzMV80PT1FT0Z8fChMQTMxXzQ+PVJVTEVfSUQgJiYgTEEzMV80PD1SVUxFX0RFQ0lNQUwpfHwoTEEzMV80Pj0xNCAmJiBMQTMxXzQ8PTE2KXx8KExBMzFfND49NDEgJiYgTEEzMV80PD00Mil8fChMQTMxXzQ+PTQ0ICYmIExBMzFfNDw9NDYpfHwoTEEzMV80Pj00OCAmJiBMQTMxXzQ8PTgyKXx8KExBMzFfND49ODQgJiYgTEEzMV80PD0xMTApKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MzE9MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAzMSwgNCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTg6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBMQTMxXzUgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgIGlmICggKExBMzFfNT09RU9GfHwoTEEzMV81Pj1SVUxFX0lEICYmIExBMzFfNTw9UlVMRV9ERUNJTUFMKXx8KExBMzFfNT49MTQgJiYgTEEzMV81PD0xNil8fChMQTMxXzU+PTQxICYmIExBMzFfNTw9NDIpfHwoTEEzMV81Pj00NCAmJiBMQTMxXzU8PTQ2KXx8KExBMzFfNT49NDggJiYgTEEzMV81PD04Mil8fChMQTMxXzU+PTg0ICYmIExBMzFfNTw9MTEwKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDMxPTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEzMV81PT00NykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDMxPTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMzEsIDUsIGlucHV0KTsKKworICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJVTEVfU1RSSU5HOgorICAgICAgICAgICAgY2FzZSBSVUxFX0hFWDoKKyAgICAgICAgICAgIGNhc2UgUlVMRV9JTlQ6CisgICAgICAgICAgICBjYXNlIFJVTEVfREVDSU1BTDoKKyAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICBjYXNlIDQ0OgorICAgICAgICAgICAgY2FzZSA0ODoKKyAgICAgICAgICAgIGNhc2UgNDk6CisgICAgICAgICAgICBjYXNlIDU2OgorICAgICAgICAgICAgY2FzZSA3MjoKKyAgICAgICAgICAgIGNhc2UgNzM6CisgICAgICAgICAgICBjYXNlIDc3OgorICAgICAgICAgICAgY2FzZSA4NToKKyAgICAgICAgICAgIGNhc2UgODc6CisgICAgICAgICAgICBjYXNlIDkxOgorICAgICAgICAgICAgY2FzZSA5MjoKKyAgICAgICAgICAgIGNhc2UgOTM6CisgICAgICAgICAgICBjYXNlIDk5OgorICAgICAgICAgICAgY2FzZSAxMDA6CisgICAgICAgICAgICBjYXNlIDEwMToKKyAgICAgICAgICAgIGNhc2UgMTAyOgorICAgICAgICAgICAgY2FzZSAxMDM6CisgICAgICAgICAgICBjYXNlIDEwNDoKKyAgICAgICAgICAgIGNhc2UgMTA1OgorICAgICAgICAgICAgY2FzZSAxMDY6CisgICAgICAgICAgICBjYXNlIDEwNzoKKyAgICAgICAgICAgIGNhc2UgMTA5OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQzMT0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAzMSwgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQzMSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjM4NToyOiAoICgpICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkgcnVsZU9wU2luZ2xlQXNzaWduICggKGx2X3ZhbHVlXzNfMD0gcnVsZVhBc3NpZ25tZW50ICkgKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMzg1OjI6ICggKCkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKCAobHZfdmFsdWVfM18wPSBydWxlWEFzc2lnbm1lbnQgKSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyMzg1OjM6ICgpICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkgcnVsZU9wU2luZ2xlQXNzaWduICggKGx2X3ZhbHVlXzNfMD0gcnVsZVhBc3NpZ25tZW50ICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjM4NTozOiAoKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIzODY6NTogCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBY3Rpb25fMF8wKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjM5MToyOiAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjM5MjoxOiAoIHJ1bGVGZWF0dXJlQ2FsbElEICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjIzOTI6MTogKCBydWxlRmVhdHVyZUNhbGxJRCApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjM5MzozOiBydWxlRmVhdHVyZUNhbGxJRAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCQkJaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRDcm9zc1JlZmVyZW5jZV8wXzFfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlRmVhdHVyZUNhbGxJRF9pbl9ydWxlWEFzc2lnbm1lbnQ1OTYyKTsKKyAgICAgICAgICAgICAgICAgICAgcnVsZUZlYXR1cmVDYWxsSUQoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0T3BTaW5nbGVBc3NpZ25QYXJzZXJSdWxlQ2FsbF8wXzIoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlT3BTaW5nbGVBc3NpZ25faW5fcnVsZVhBc3NpZ25tZW50NTk3OCk7CisgICAgICAgICAgICAgICAgICAgIHJ1bGVPcFNpbmdsZUFzc2lnbigpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNDE0OjE6ICggKGx2X3ZhbHVlXzNfMD0gcnVsZVhBc3NpZ25tZW50ICkgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI0MTU6MTogKGx2X3ZhbHVlXzNfMD0gcnVsZVhBc3NpZ25tZW50ICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI0MTU6MTogKGx2X3ZhbHVlXzNfMD0gcnVsZVhBc3NpZ25tZW50ICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNDE2OjM6IGx2X3ZhbHVlXzNfMD0gcnVsZVhBc3NpZ25tZW50CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFZhbHVlWEFzc2lnbm1lbnRQYXJzZXJSdWxlQ2FsbF8wXzNfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFzc2lnbm1lbnRfaW5fcnVsZVhBc3NpZ25tZW50NTk5OCk7CisgICAgICAgICAgICAgICAgICAgIGx2X3ZhbHVlXzNfMD1ydWxlWEFzc2lnbm1lbnQoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCSJ2YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCWx2X3ZhbHVlXzNfMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCSJYQXNzaWdubWVudCIpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI0MzM6NjogKHRoaXNfWE9yRXhwcmVzc2lvbl80PSBydWxlWE9yRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKSApPT4gKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfN18wPSBydWxlWEFzc2lnbm1lbnQgKSApICk/ICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI0MzM6NjogKHRoaXNfWE9yRXhwcmVzc2lvbl80PSBydWxlWE9yRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKSApPT4gKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfN18wPSBydWxlWEFzc2lnbm1lbnQgKSApICk/ICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNDM0OjU6IHRoaXNfWE9yRXhwcmVzc2lvbl80PSBydWxlWE9yRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKSApPT4gKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfN18wPSBydWxlWEFzc2lnbm1lbnQgKSApICk/CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WE9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYT3JFeHByZXNzaW9uX2luX3J1bGVYQXNzaWdubWVudDYwMjgpOworICAgICAgICAgICAgICAgICAgICB0aGlzX1hPckV4cHJlc3Npb25fND1ydWxlWE9yRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0aGlzX1hPckV4cHJlc3Npb25fNDsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjQ0MjoxOiAoICggKCAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKSApPT4gKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfN18wPSBydWxlWEFzc2lnbm1lbnQgKSApICk/CisgICAgICAgICAgICAgICAgICAgIGludCBhbHQzMD0yOworICAgICAgICAgICAgICAgICAgICBhbHQzMCA9IGRmYTMwLnByZWRpY3QoaW5wdXQpOworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDMwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjQ0MjoyOiAoICggKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzdfMD0gcnVsZVhBc3NpZ25tZW50ICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI0NDI6MjogKCAoICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICk9PiAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNDQyOjM6ICggKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjQ0Nzo2OiAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjQ0Nzo3OiAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjQ0Nzo3OiAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjQ0ODo1OiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50QW5kU2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjQ1MzoyOiAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNDU0OjE6ICggcnVsZU9wTXVsdGlBc3NpZ24gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI0NTQ6MTogKCBydWxlT3BNdWx0aUFzc2lnbiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNDU1OjM6IHJ1bGVPcE11bHRpQXNzaWduCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMV8xXzBfMF8xXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZU9wTXVsdGlBc3NpZ25faW5fcnVsZVhBc3NpZ25tZW50NjA4MSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9wTXVsdGlBc3NpZ24oKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNDY4OjQ6ICggKGx2X3JpZ2h0T3BlcmFuZF83XzA9IHJ1bGVYQXNzaWdubWVudCApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI0Njk6MTogKGx2X3JpZ2h0T3BlcmFuZF83XzA9IHJ1bGVYQXNzaWdubWVudCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjQ2OToxOiAobHZfcmlnaHRPcGVyYW5kXzdfMD0gcnVsZVhBc3NpZ25tZW50ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI0NzA6MzogbHZfcmlnaHRPcGVyYW5kXzdfMD0gcnVsZVhBc3NpZ25tZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kWEFzc2lnbm1lbnRQYXJzZXJSdWxlQ2FsbF8xXzFfMV8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQXNzaWdubWVudF9pbl9ydWxlWEFzc2lnbm1lbnQ2MTA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdl9yaWdodE9wZXJhbmRfN18wPXJ1bGVYQXNzaWdubWVudCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJInJpZ2h0T3BlcmFuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJbHZfcmlnaHRPcGVyYW5kXzdfMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJIlhBc3NpZ25tZW50Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhBc3NpZ25tZW50IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZU9wU2luZ2xlQXNzaWduIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjQ5NDoxOiBlbnRyeVJ1bGVPcFNpbmdsZUFzc2lnbiByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSA6IGl2X3J1bGVPcFNpbmdsZUFzc2lnbj0gcnVsZU9wU2luZ2xlQXNzaWduIEVPRiA7CisgICAgcHVibGljIGZpbmFsIFN0cmluZyBlbnRyeVJ1bGVPcFNpbmdsZUFzc2lnbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGl2X3J1bGVPcFNpbmdsZUFzc2lnbiA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNDk1OjI6IChpdl9ydWxlT3BTaW5nbGVBc3NpZ249IHJ1bGVPcFNpbmdsZUFzc2lnbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNDk2OjI6IGl2X3J1bGVPcFNpbmdsZUFzc2lnbj0gcnVsZU9wU2luZ2xlQXNzaWduIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BTaW5nbGVBc3NpZ25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVPcFNpbmdsZUFzc2lnbl9pbl9lbnRyeVJ1bGVPcFNpbmdsZUFzc2lnbjYxNDQpOworICAgICAgICAgICAgaXZfcnVsZU9wU2luZ2xlQXNzaWduPXJ1bGVPcFNpbmdsZUFzc2lnbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZU9wU2luZ2xlQXNzaWduLmdldFRleHQoKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVPcFNpbmdsZUFzc2lnbjYxNTUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlT3BTaW5nbGVBc3NpZ24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZU9wU2luZ2xlQXNzaWduIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjUwMzoxOiBydWxlT3BTaW5nbGVBc3NpZ24gcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIDoga3c9ICc9JyA7CisgICAgcHVibGljIGZpbmFsIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gcnVsZU9wU2luZ2xlQXNzaWduKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50ID0gbmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKTsKKworICAgICAgICBUb2tlbiBrdz1udWxsOworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjUwNjoyODogKGt3PSAnPScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNTA4OjI6IGt3PSAnPScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw0NyxGT0xMT1dfNDdfaW5fcnVsZU9wU2luZ2xlQXNzaWduNjE5Mik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcFNpbmdsZUFzc2lnbkFjY2VzcygpLmdldEVxdWFsc1NpZ25LZXl3b3JkKCkpOyAKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVPcFNpbmdsZUFzc2lnbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVPcE11bHRpQXNzaWduIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjUyMToxOiBlbnRyeVJ1bGVPcE11bHRpQXNzaWduIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIDogaXZfcnVsZU9wTXVsdGlBc3NpZ249IHJ1bGVPcE11bHRpQXNzaWduIEVPRiA7CisgICAgcHVibGljIGZpbmFsIFN0cmluZyBlbnRyeVJ1bGVPcE11bHRpQXNzaWduKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gaXZfcnVsZU9wTXVsdGlBc3NpZ24gPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjUyMjoyOiAoaXZfcnVsZU9wTXVsdGlBc3NpZ249IHJ1bGVPcE11bHRpQXNzaWduIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI1MjM6MjogaXZfcnVsZU9wTXVsdGlBc3NpZ249IHJ1bGVPcE11bHRpQXNzaWduIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZU9wTXVsdGlBc3NpZ25faW5fZW50cnlSdWxlT3BNdWx0aUFzc2lnbjYyMzIpOworICAgICAgICAgICAgaXZfcnVsZU9wTXVsdGlBc3NpZ249cnVsZU9wTXVsdGlBc3NpZ24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVPcE11bHRpQXNzaWduLmdldFRleHQoKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVPcE11bHRpQXNzaWduNjI0Myk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVPcE11bHRpQXNzaWduIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcE11bHRpQXNzaWduIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjUzMDoxOiBydWxlT3BNdWx0aUFzc2lnbiByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gOiAoa3c9ICcrPScgfCBrdz0gJy09JyB8IGt3PSAnKj0nIHwga3c9ICcvPScgfCBrdz0gJyU9JyB8IChrdz0gJzwnIGt3PSAnPCcga3c9ICc9JyApIHwgKGt3PSAnPicgKGt3PSAnPicgKT8ga3c9ICc+PScgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBydWxlT3BNdWx0aUFzc2lnbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudCA9IG5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCk7CisKKyAgICAgICAgVG9rZW4ga3c9bnVsbDsKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI1MzM6Mjg6ICggKGt3PSAnKz0nIHwga3c9ICctPScgfCBrdz0gJyo9JyB8IGt3PSAnLz0nIHwga3c9ICclPScgfCAoa3c9ICc8JyBrdz0gJzwnIGt3PSAnPScgKSB8IChrdz0gJz4nIChrdz0gJz4nICk/IGt3PSAnPj0nICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI1MzQ6MTogKGt3PSAnKz0nIHwga3c9ICctPScgfCBrdz0gJyo9JyB8IGt3PSAnLz0nIHwga3c9ICclPScgfCAoa3c9ICc8JyBrdz0gJzwnIGt3PSAnPScgKSB8IChrdz0gJz4nIChrdz0gJz4nICk/IGt3PSAnPj0nICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNTM0OjE6IChrdz0gJys9JyB8IGt3PSAnLT0nIHwga3c9ICcqPScgfCBrdz0gJy89JyB8IGt3PSAnJT0nIHwgKGt3PSAnPCcga3c9ICc8JyBrdz0gJz0nICkgfCAoa3c9ICc+JyAoa3c9ICc+JyApPyBrdz0gJz49JyApICkKKyAgICAgICAgICAgIGludCBhbHQzMz03OworICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7CisgICAgICAgICAgICBjYXNlIDUxOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQzMz0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDMzPTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1MzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0MzM9MzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQzMz00OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDMzPTU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1NjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0MzM9NjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU3OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQzMz03OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAzMywgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQzMykgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjUzNToyOiBrdz0gJys9JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw1MSxGT0xMT1dfNTFfaW5fcnVsZU9wTXVsdGlBc3NpZ242MjgxKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRQbHVzU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNTQyOjI6IGt3PSAnLT0nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDUyLEZPTExPV181Ml9pbl9ydWxlT3BNdWx0aUFzc2lnbjYzMDApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEh5cGhlbk1pbnVzRXF1YWxzU2lnbktleXdvcmRfMSgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDMgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI1NDk6Mjoga3c9ICcqPScKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNTMsRk9MTE9XXzUzX2luX3J1bGVPcE11bHRpQXNzaWduNjMxOSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0QXN0ZXJpc2tFcXVhbHNTaWduS2V5d29yZF8yKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNCA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjU1NjoyOiBrdz0gJy89JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw1NCxGT0xMT1dfNTRfaW5fcnVsZU9wTXVsdGlBc3NpZ242MzM4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRTb2xpZHVzRXF1YWxzU2lnbktleXdvcmRfMygpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDUgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI1NjM6Mjoga3c9ICclPScKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNTUsRk9MTE9XXzU1X2luX3J1bGVPcE11bHRpQXNzaWduNjM1Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0UGVyY2VudFNpZ25FcXVhbHNTaWduS2V5d29yZF80KCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjU2OTo2OiAoa3c9ICc8JyBrdz0gJzwnIGt3PSAnPScgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjU2OTo2OiAoa3c9ICc8JyBrdz0gJzwnIGt3PSAnPScgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI1NzA6Mjoga3c9ICc8JyBrdz0gJzwnIGt3PSAnPScKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNTYsRk9MTE9XXzU2X2luX3J1bGVPcE11bHRpQXNzaWduNjM3Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF81XzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNTYsRk9MTE9XXzU2X2luX3J1bGVPcE11bHRpQXNzaWduNjM5MCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF81XzEoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNDcsRk9MTE9XXzQ3X2luX3J1bGVPcE11bHRpQXNzaWduNjQwMyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0RXF1YWxzU2lnbktleXdvcmRfNV8yKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNyA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjU4ODo2OiAoa3c9ICc+JyAoa3c9ICc+JyApPyBrdz0gJz49JyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNTg4OjY6IChrdz0gJz4nIChrdz0gJz4nICk/IGt3PSAnPj0nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNTg5OjI6IGt3PSAnPicgKGt3PSAnPicgKT8ga3c9ICc+PScKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNTcsRk9MTE9XXzU3X2luX3J1bGVPcE11bHRpQXNzaWduNjQyNCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF82XzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI1OTQ6MTogKGt3PSAnPicgKT8KKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdDMyPTI7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTMyXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTMyXzA9PTU3KSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDMyPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQzMikgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI1OTU6Mjoga3c9ICc+JworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNTcsRk9MTE9XXzU3X2luX3J1bGVPcE11bHRpQXNzaWduNjQzOCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF82XzEoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDU4LEZPTExPV181OF9pbl9ydWxlT3BNdWx0aUFzc2lnbjY0NTMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzZfMigpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZU9wTXVsdGlBc3NpZ24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWE9yRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2MTQ6MTogZW50cnlSdWxlWE9yRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWE9yRXhwcmVzc2lvbj0gcnVsZVhPckV4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVYT3JFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVYT3JFeHByZXNzaW9uID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2MTU6MjogKGl2X3J1bGVYT3JFeHByZXNzaW9uPSBydWxlWE9yRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjE2OjI6IGl2X3J1bGVYT3JFeHByZXNzaW9uPSBydWxlWE9yRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYT3JFeHByZXNzaW9uX2luX2VudHJ5UnVsZVhPckV4cHJlc3Npb242NDk0KTsKKyAgICAgICAgICAgIGl2X3J1bGVYT3JFeHByZXNzaW9uPXJ1bGVYT3JFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlWE9yRXhwcmVzc2lvbjsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYT3JFeHByZXNzaW9uNjUwNCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYT3JFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYT3JFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjYyMzoxOiBydWxlWE9yRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAodGhpc19YQW5kRXhwcmVzc2lvbl8wPSBydWxlWEFuZEV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wT3IgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE9yICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhBbmRFeHByZXNzaW9uICkgKSApKiApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlWE9yRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCB0aGlzX1hBbmRFeHByZXNzaW9uXzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgbHZfcmlnaHRPcGVyYW5kXzNfMCA9IG51bGw7CisKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2MjY6Mjg6ICggKHRoaXNfWEFuZEV4cHJlc3Npb25fMD0gcnVsZVhBbmRFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE9yICkgKSApICk9PiAoICgpICggKCBydWxlT3BPciApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQW5kRXhwcmVzc2lvbiApICkgKSogKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2Mjc6MTogKHRoaXNfWEFuZEV4cHJlc3Npb25fMD0gcnVsZVhBbmRFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE9yICkgKSApICk9PiAoICgpICggKCBydWxlT3BPciApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQW5kRXhwcmVzc2lvbiApICkgKSogKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjI3OjE6ICh0aGlzX1hBbmRFeHByZXNzaW9uXzA9IHJ1bGVYQW5kRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BPciApICkgKSApPT4gKCAoKSAoICggcnVsZU9wT3IgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEFuZEV4cHJlc3Npb24gKSApICkqICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjYyODo1OiB0aGlzX1hBbmRFeHByZXNzaW9uXzA9IHJ1bGVYQW5kRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BPciApICkgKSApPT4gKCAoKSAoICggcnVsZU9wT3IgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEFuZEV4cHJlc3Npb24gKSApICkqCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEFuZEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBbmRFeHByZXNzaW9uX2luX3J1bGVYT3JFeHByZXNzaW9uNjU1MSk7CisgICAgICAgICAgICB0aGlzX1hBbmRFeHByZXNzaW9uXzA9cnVsZVhBbmRFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gdGhpc19YQW5kRXhwcmVzc2lvbl8wOyAKKyAgICAgICAgICAgICAgICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjYzNjoxOiAoICggKCAoICgpICggKCBydWxlT3BPciApICkgKSApPT4gKCAoKSAoICggcnVsZU9wT3IgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEFuZEV4cHJlc3Npb24gKSApICkqCisgICAgICAgICAgICBsb29wMzQ6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDM0PTI7CisgICAgICAgICAgICAgICAgaW50IExBMzRfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEEzNF8wPT01OSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTM0XzIgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkOV9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsKCkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzQ9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MzQpIHsKKyAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2MzY6MjogKCAoICggKCkgKCAoIHJ1bGVPcE9yICkgKSApICk9PiAoICgpICggKCBydWxlT3BPciApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQW5kRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2MzY6MjogKCAoICggKCkgKCAoIHJ1bGVPcE9yICkgKSApICk9PiAoICgpICggKCBydWxlT3BPciApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjYzNjozOiAoICggKCkgKCAoIHJ1bGVPcE9yICkgKSApICk9PiAoICgpICggKCBydWxlT3BPciApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjY0MTo2OiAoICgpICggKCBydWxlT3BPciApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2NDE6NzogKCkgKCAoIHJ1bGVPcE9yICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjY0MTo3OiAoKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2NDI6NTogCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudEFuZFNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2NDc6MjogKCAoIHJ1bGVPcE9yICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2NDg6MTogKCBydWxlT3BPciApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjQ4OjE6ICggcnVsZU9wT3IgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2NDk6MzogcnVsZU9wT3IKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkJCWlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudENyb3NzUmVmZXJlbmNlXzFfMF8wXzFfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlT3BPcl9pbl9ydWxlWE9yRXhwcmVzc2lvbjY2MDQpOworICAgICAgICAgICAgCSAgICBydWxlT3BPcigpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2NjI6NDogKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhBbmRFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2NjM6MTogKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQW5kRXhwcmVzc2lvbiApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjYzOjE6IChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEFuZEV4cHJlc3Npb24gKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI2NjQ6MzogbHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhBbmRFeHByZXNzaW9uCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kWEFuZEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xXzFfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFuZEV4cHJlc3Npb25faW5fcnVsZVhPckV4cHJlc3Npb242NjI3KTsKKyAgICAgICAgICAgIAkgICAgbHZfcmlnaHRPcGVyYW5kXzNfMD1ydWxlWEFuZEV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJInJpZ2h0T3BlcmFuZCIsCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X3JpZ2h0T3BlcmFuZF8zXzAsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiWEFuZEV4cHJlc3Npb24iKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDM0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYT3JFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZU9wT3IiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjg4OjE6IGVudHJ5UnVsZU9wT3IgcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlT3BPcj0gcnVsZU9wT3IgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGVudHJ5UnVsZU9wT3IoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBpdl9ydWxlT3BPciA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjg5OjI6IChpdl9ydWxlT3BPcj0gcnVsZU9wT3IgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjY5MDoyOiBpdl9ydWxlT3BPcj0gcnVsZU9wT3IgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRPcE9yUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlT3BPcl9pbl9lbnRyeVJ1bGVPcE9yNjY2Nik7CisgICAgICAgICAgICBpdl9ydWxlT3BPcj1ydWxlT3BPcigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZU9wT3IuZ2V0VGV4dCgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZU9wT3I2Njc3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZU9wT3IiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZU9wT3IiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNjk3OjE6IHJ1bGVPcE9yIHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSA6IGt3PSAnfHwnIDsKKyAgICBwdWJsaWMgZmluYWwgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBydWxlT3BPcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudCA9IG5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCk7CisKKyAgICAgICAgVG9rZW4ga3c9bnVsbDsKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI3MDA6Mjg6IChrdz0gJ3x8JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI3MDI6Mjoga3c9ICd8fCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw1OSxGT0xMT1dfNTlfaW5fcnVsZU9wT3I2NzE0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wT3JBY2Nlc3MoKS5nZXRWZXJ0aWNhbExpbmVWZXJ0aWNhbExpbmVLZXl3b3JkKCkpOyAKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVPcE9yIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhBbmRFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjcxNToxOiBlbnRyeVJ1bGVYQW5kRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWEFuZEV4cHJlc3Npb249IHJ1bGVYQW5kRXhwcmVzc2lvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVhBbmRFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVYQW5kRXhwcmVzc2lvbiA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNzE2OjI6IChpdl9ydWxlWEFuZEV4cHJlc3Npb249IHJ1bGVYQW5kRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNzE3OjI6IGl2X3J1bGVYQW5kRXhwcmVzc2lvbj0gcnVsZVhBbmRFeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQW5kRXhwcmVzc2lvbl9pbl9lbnRyeVJ1bGVYQW5kRXhwcmVzc2lvbjY3NTMpOworICAgICAgICAgICAgaXZfcnVsZVhBbmRFeHByZXNzaW9uPXJ1bGVYQW5kRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZVhBbmRFeHByZXNzaW9uOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhBbmRFeHByZXNzaW9uNjc2Myk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYQW5kRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWEFuZEV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNzI0OjE6IHJ1bGVYQW5kRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAodGhpc19YRXF1YWxpdHlFeHByZXNzaW9uXzA9IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcEFuZCApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQW5kICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKSApICkqICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVYQW5kRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCB0aGlzX1hFcXVhbGl0eUV4cHJlc3Npb25fMCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBsdl9yaWdodE9wZXJhbmRfM18wID0gbnVsbDsKKworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjcyNzoyODogKCAodGhpc19YRXF1YWxpdHlFeHByZXNzaW9uXzA9IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcEFuZCApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQW5kICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKSApICkqICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNzI4OjE6ICh0aGlzX1hFcXVhbGl0eUV4cHJlc3Npb25fMD0gcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wQW5kICkgKSApICk9PiAoICgpICggKCBydWxlT3BBbmQgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiApICkgKSogKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNzI4OjE6ICh0aGlzX1hFcXVhbGl0eUV4cHJlc3Npb25fMD0gcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wQW5kICkgKSApICk9PiAoICgpICggKCBydWxlT3BBbmQgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiApICkgKSogKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNzI5OjU6IHRoaXNfWEVxdWFsaXR5RXhwcmVzc2lvbl8wPSBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BBbmQgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEFuZCApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uICkgKSApKgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYRXF1YWxpdHlFeHByZXNzaW9uX2luX3J1bGVYQW5kRXhwcmVzc2lvbjY4MTApOworICAgICAgICAgICAgdGhpc19YRXF1YWxpdHlFeHByZXNzaW9uXzA9cnVsZVhFcXVhbGl0eUV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0aGlzX1hFcXVhbGl0eUV4cHJlc3Npb25fMDsgCisgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI3Mzc6MTogKCAoICggKCAoKSAoICggcnVsZU9wQW5kICkgKSApICk9PiAoICgpICggKCBydWxlT3BBbmQgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiApICkgKSoKKyAgICAgICAgICAgIGxvb3AzNToKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MzU9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEEzNV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTM1XzA9PTYwKSApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBMzVfMiA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMF9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsKCkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzU9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MzUpIHsKKyAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI3Mzc6MjogKCAoICggKCkgKCAoIHJ1bGVPcEFuZCApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQW5kICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNzM3OjI6ICggKCAoICgpICggKCBydWxlT3BBbmQgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEFuZCApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjczNzozOiAoICggKCkgKCAoIHJ1bGVPcEFuZCApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQW5kICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNzQyOjY6ICggKCkgKCAoIHJ1bGVPcEFuZCApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI3NDI6NzogKCkgKCAoIHJ1bGVPcEFuZCApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI3NDI6NzogKCkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNzQzOjU6IAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgICAgICAgICBjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnRBbmRTZXQoCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCksCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgICAgICAJICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjc0ODoyOiAoICggcnVsZU9wQW5kICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI3NDk6MTogKCBydWxlT3BBbmQgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjc0OToxOiAoIHJ1bGVPcEFuZCApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjc1MDozOiBydWxlT3BBbmQKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkJCWlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMV8wXzBfMV8wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVPcEFuZF9pbl9ydWxlWEFuZEV4cHJlc3Npb242ODYzKTsKKyAgICAgICAgICAgIAkgICAgcnVsZU9wQW5kKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjc2Mzo0OiAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNzY0OjE6IChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyNzY0OjE6IChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjc2NTozOiBsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRYRXF1YWxpdHlFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhFcXVhbGl0eUV4cHJlc3Npb25faW5fcnVsZVhBbmRFeHByZXNzaW9uNjg4Nik7CisgICAgICAgICAgICAJICAgIGx2X3JpZ2h0T3BlcmFuZF8zXzA9cnVsZVhFcXVhbGl0eUV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJyaWdodE9wZXJhbmQiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9yaWdodE9wZXJhbmRfM18wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIlhFcXVhbGl0eUV4cHJlc3Npb24iKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDM1OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYQW5kRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVPcEFuZCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI3ODk6MTogZW50cnlSdWxlT3BBbmQgcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlT3BBbmQ9IHJ1bGVPcEFuZCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZW50cnlSdWxlT3BBbmQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBpdl9ydWxlT3BBbmQgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjc5MDoyOiAoaXZfcnVsZU9wQW5kPSBydWxlT3BBbmQgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjc5MToyOiBpdl9ydWxlT3BBbmQ9IHJ1bGVPcEFuZCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE9wQW5kUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlT3BBbmRfaW5fZW50cnlSdWxlT3BBbmQ2OTI1KTsKKyAgICAgICAgICAgIGl2X3J1bGVPcEFuZD1ydWxlT3BBbmQoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVPcEFuZC5nZXRUZXh0KCk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlT3BBbmQ2OTM2KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZU9wQW5kIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcEFuZCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI3OTg6MTogcnVsZU9wQW5kIHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSA6IGt3PSAnJiYnIDsKKyAgICBwdWJsaWMgZmluYWwgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBydWxlT3BBbmQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQgPSBuZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpOworCisgICAgICAgIFRva2VuIGt3PW51bGw7CisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyODAxOjI4OiAoa3c9ICcmJicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyODAzOjI6IGt3PSAnJiYnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNjAsRk9MTE9XXzYwX2luX3J1bGVPcEFuZDY5NzMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BBbmRBY2Nlc3MoKS5nZXRBbXBlcnNhbmRBbXBlcnNhbmRLZXl3b3JkKCkpOyAKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVPcEFuZCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjgxNjoxOiBlbnRyeVJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYRXF1YWxpdHlFeHByZXNzaW9uPSBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVhFcXVhbGl0eUV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjgxNzoyOiAoaXZfcnVsZVhFcXVhbGl0eUV4cHJlc3Npb249IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI4MTg6MjogaXZfcnVsZVhFcXVhbGl0eUV4cHJlc3Npb249IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhFcXVhbGl0eUV4cHJlc3Npb25faW5fZW50cnlSdWxlWEVxdWFsaXR5RXhwcmVzc2lvbjcwMTIpOworICAgICAgICAgICAgaXZfcnVsZVhFcXVhbGl0eUV4cHJlc3Npb249cnVsZVhFcXVhbGl0eUV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVYRXF1YWxpdHlFeHByZXNzaW9uOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhFcXVhbGl0eUV4cHJlc3Npb243MDIyKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhFcXVhbGl0eUV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhFcXVhbGl0eUV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyODI1OjE6IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICh0aGlzX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl8wPSBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApICk9PiAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKSApICkqICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IHRoaXNfWFJlbGF0aW9uYWxFeHByZXNzaW9uXzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgbHZfcmlnaHRPcGVyYW5kXzNfMCA9IG51bGw7CisKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI4Mjg6Mjg6ICggKHRoaXNfWFJlbGF0aW9uYWxFeHByZXNzaW9uXzA9IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wRXF1YWxpdHkgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiApICkgKSogKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI4Mjk6MTogKHRoaXNfWFJlbGF0aW9uYWxFeHByZXNzaW9uXzA9IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wRXF1YWxpdHkgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiApICkgKSogKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyODI5OjE6ICh0aGlzX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl8wPSBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApICk9PiAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKSApICkqICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjgzMDo1OiB0aGlzX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl8wPSBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApICk9PiAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKSApICkqCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYUmVsYXRpb25hbEV4cHJlc3Npb25faW5fcnVsZVhFcXVhbGl0eUV4cHJlc3Npb243MDY5KTsKKyAgICAgICAgICAgIHRoaXNfWFJlbGF0aW9uYWxFeHByZXNzaW9uXzA9cnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHRoaXNfWFJlbGF0aW9uYWxFeHByZXNzaW9uXzA7IAorICAgICAgICAgICAgICAgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyODM4OjE6ICggKCAoICggKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApICk9PiAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKSApICkqCisgICAgICAgICAgICBsb29wMzY6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDM2PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7CisgICAgICAgICAgICAgICAgY2FzZSA2MToKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEEzNl8yID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDExX0ludGVybmFsUGVyc3BlY3RpdmVEc2woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzNj0xOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNjI6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBMzZfMyA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMV9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsKCkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDYzOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTM2XzQgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTFfSW50ZXJuYWxQZXJzcGVjdGl2ZURzbCgpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM2PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA2NDoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEEzNl81ID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDExX0ludGVybmFsUGVyc3BlY3RpdmVEc2woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzNj0xOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQzNikgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjgzODoyOiAoICggKCAoKSAoICggcnVsZU9wRXF1YWxpdHkgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI4Mzg6MjogKCAoICggKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApICk9PiAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjgzODozOiAoICggKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApICk9PiAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjg0Mzo2OiAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI4NDM6NzogKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjg0Mzo3OiAoKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI4NDQ6NTogCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudEFuZFNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI4NDk6MjogKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI4NTA6MTogKCBydWxlT3BFcXVhbGl0eSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyODUwOjE6ICggcnVsZU9wRXF1YWxpdHkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI4NTE6MzogcnVsZU9wRXF1YWxpdHkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkJCWlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudENyb3NzUmVmZXJlbmNlXzFfMF8wXzFfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlT3BFcXVhbGl0eV9pbl9ydWxlWEVxdWFsaXR5RXhwcmVzc2lvbjcxMjIpOworICAgICAgICAgICAgCSAgICBydWxlT3BFcXVhbGl0eSgpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI4NjQ6NDogKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyODY1OjE6IChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI4NjU6MTogKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI4NjY6MzogbHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZFhSZWxhdGlvbmFsRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMV8wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYUmVsYXRpb25hbEV4cHJlc3Npb25faW5fcnVsZVhFcXVhbGl0eUV4cHJlc3Npb243MTQ1KTsKKyAgICAgICAgICAgIAkgICAgbHZfcmlnaHRPcGVyYW5kXzNfMD1ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJyaWdodE9wZXJhbmQiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9yaWdodE9wZXJhbmRfM18wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIlhSZWxhdGlvbmFsRXhwcmVzc2lvbiIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBicmVhayBsb29wMzY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhFcXVhbGl0eUV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlT3BFcXVhbGl0eSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI4OTA6MTogZW50cnlSdWxlT3BFcXVhbGl0eSByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSA6IGl2X3J1bGVPcEVxdWFsaXR5PSBydWxlT3BFcXVhbGl0eSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZW50cnlSdWxlT3BFcXVhbGl0eSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGl2X3J1bGVPcEVxdWFsaXR5ID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI4OTE6MjogKGl2X3J1bGVPcEVxdWFsaXR5PSBydWxlT3BFcXVhbGl0eSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyODkyOjI6IGl2X3J1bGVPcEVxdWFsaXR5PSBydWxlT3BFcXVhbGl0eSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVPcEVxdWFsaXR5X2luX2VudHJ5UnVsZU9wRXF1YWxpdHk3MTg0KTsKKyAgICAgICAgICAgIGl2X3J1bGVPcEVxdWFsaXR5PXJ1bGVPcEVxdWFsaXR5KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlT3BFcXVhbGl0eS5nZXRUZXh0KCk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlT3BFcXVhbGl0eTcxOTUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlT3BFcXVhbGl0eSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlT3BFcXVhbGl0eSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI4OTk6MTogcnVsZU9wRXF1YWxpdHkgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIDogKGt3PSAnPT0nIHwga3c9ICchPScgfCBrdz0gJz09PScgfCBrdz0gJyE9PScgKSA7CisgICAgcHVibGljIGZpbmFsIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gcnVsZU9wRXF1YWxpdHkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQgPSBuZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpOworCisgICAgICAgIFRva2VuIGt3PW51bGw7CisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyOTAyOjI4OiAoIChrdz0gJz09JyB8IGt3PSAnIT0nIHwga3c9ICc9PT0nIHwga3c9ICchPT0nICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyOTAzOjE6IChrdz0gJz09JyB8IGt3PSAnIT0nIHwga3c9ICc9PT0nIHwga3c9ICchPT0nICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjkwMzoxOiAoa3c9ICc9PScgfCBrdz0gJyE9JyB8IGt3PSAnPT09JyB8IGt3PSAnIT09JyApCisgICAgICAgICAgICBpbnQgYWx0Mzc9NDsKKyAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgY2FzZSA2MToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0Mzc9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDYyOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQzNz0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDM3PTM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2NDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0Mzc9NDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMzcsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MzcpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI5MDQ6Mjoga3c9ICc9PScKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNjEsRk9MTE9XXzYxX2luX3J1bGVPcEVxdWFsaXR5NzIzMyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5QWNjZXNzKCkuZ2V0RXF1YWxzU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyOTExOjI6IGt3PSAnIT0nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDYyLEZPTExPV182Ml9pbl9ydWxlT3BFcXVhbGl0eTcyNTIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BFcXVhbGl0eUFjY2VzcygpLmdldEV4Y2xhbWF0aW9uTWFya0VxdWFsc1NpZ25LZXl3b3JkXzEoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyOTE4OjI6IGt3PSAnPT09JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw2MyxGT0xMT1dfNjNfaW5fcnVsZU9wRXF1YWxpdHk3MjcxKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlBY2Nlc3MoKS5nZXRFcXVhbHNTaWduRXF1YWxzU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzIoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA0IDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyOTI1OjI6IGt3PSAnIT09JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw2NCxGT0xMT1dfNjRfaW5fcnVsZU9wRXF1YWxpdHk3MjkwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlBY2Nlc3MoKS5nZXRFeGNsYW1hdGlvbk1hcmtFcXVhbHNTaWduRXF1YWxzU2lnbktleXdvcmRfMygpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZU9wRXF1YWxpdHkiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MjkzODoxOiBlbnRyeVJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbj0gcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI5Mzk6MjogKGl2X3J1bGVYUmVsYXRpb25hbEV4cHJlc3Npb249IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjk0MDoyOiBpdl9ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uPSBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uX2luX2VudHJ5UnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbjczMzApOworICAgICAgICAgICAgaXZfcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbj1ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbjczNDApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyOTQ3OjE6IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKHRoaXNfWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uXzA9IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKCAoICggKCAoICgpICdpbnN0YW5jZW9mJyApICk9PiAoICgpIG90aGVybHZfMj0gJ2luc3RhbmNlb2YnICkgKSAoIChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICkgfCAoICggKCAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApICk9PiAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzZfMD0gcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiApICkgKSApKiApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBUb2tlbiBvdGhlcmx2XzI9bnVsbDsKKyAgICAgICAgRU9iamVjdCB0aGlzX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl8wID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGx2X3R5cGVfM18wID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGx2X3JpZ2h0T3BlcmFuZF82XzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyOTUwOjI4OiAoICh0aGlzX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl8wPSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICggKCAoICggKCAoKSAnaW5zdGFuY2VvZicgKSApPT4gKCAoKSBvdGhlcmx2XzI9ICdpbnN0YW5jZW9mJyApICkgKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSApIHwgKCAoICggKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF82XzA9IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKSApICkgKSogKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI5NTE6MTogKHRoaXNfWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uXzA9IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKCAoICggKCAoICgpICdpbnN0YW5jZW9mJyApICk9PiAoICgpIG90aGVybHZfMj0gJ2luc3RhbmNlb2YnICkgKSAoIChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICkgfCAoICggKCAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApICk9PiAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzZfMD0gcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiApICkgKSApKiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI5NTE6MTogKHRoaXNfWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uXzA9IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKCAoICggKCAoICgpICdpbnN0YW5jZW9mJyApICk9PiAoICgpIG90aGVybHZfMj0gJ2luc3RhbmNlb2YnICkgKSAoIChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICkgfCAoICggKCAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApICk9PiAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzZfMD0gcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiApICkgKSApKiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI5NTI6NTogdGhpc19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fMD0gcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiAoICggKCAoICggKCkgJ2luc3RhbmNlb2YnICkgKT0+ICggKCkgb3RoZXJsdl8yPSAnaW5zdGFuY2VvZicgKSApICggKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSB8ICggKCAoICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfNl8wPSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICkgKSApICkqCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9pbl9ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uNzM4Nyk7CisgICAgICAgICAgICB0aGlzX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl8wPXJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0aGlzX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl8wOyAKKyAgICAgICAgICAgICAgICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjk2MDoxOiAoICggKCAoICggKCkgJ2luc3RhbmNlb2YnICkgKT0+ICggKCkgb3RoZXJsdl8yPSAnaW5zdGFuY2VvZicgKSApICggKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSB8ICggKCAoICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfNl8wPSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICkgKSApICkqCisgICAgICAgICAgICBsb29wMzg6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDM4PTM7CisgICAgICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7CisgICAgICAgICAgICAgICAgY2FzZSA1NjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEEzOF8yID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEzX0ludGVybmFsUGVyc3BlY3RpdmVEc2woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzOD0yOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNTc6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBMzhfMyA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxM19JbnRlcm5hbFBlcnNwZWN0aXZlRHNsKCkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0Mzg9MjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDY1OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTM4XzQgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTJfSW50ZXJuYWxQZXJzcGVjdGl2ZURzbCgpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM4PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA1ODoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEEzOF81ID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEzX0ludGVybmFsUGVyc3BlY3RpdmVEc2woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzOD0yOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQzOCkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjk2MDoyOiAoICggKCAoICgpICdpbnN0YW5jZW9mJyApICk9PiAoICgpIG90aGVybHZfMj0gJ2luc3RhbmNlb2YnICkgKSAoIChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI5NjA6MjogKCAoICggKCAoKSAnaW5zdGFuY2VvZicgKSApPT4gKCAoKSBvdGhlcmx2XzI9ICdpbnN0YW5jZW9mJyApICkgKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjk2MDozOiAoICggKCAoKSAnaW5zdGFuY2VvZicgKSApPT4gKCAoKSBvdGhlcmx2XzI9ICdpbnN0YW5jZW9mJyApICkgKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjk2MDozOiAoICggKCAoKSAnaW5zdGFuY2VvZicgKSApPT4gKCAoKSBvdGhlcmx2XzI9ICdpbnN0YW5jZW9mJyApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyOTYwOjQ6ICggKCAoKSAnaW5zdGFuY2VvZicgKSApPT4gKCAoKSBvdGhlcmx2XzI9ICdpbnN0YW5jZW9mJyApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyOTYyOjU6ICggKCkgb3RoZXJsdl8yPSAnaW5zdGFuY2VvZicgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI5NjI6NjogKCkgb3RoZXJsdl8yPSAnaW5zdGFuY2VvZicKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI5NjI6NjogKCkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyOTYzOjU6IAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgICAgICAgICBjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnRBbmRTZXQoCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBvdGhlcmx2XzI9KFRva2VuKW1hdGNoKGlucHV0LDY1LEZPTExPV182NV9pbl9ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uNzQyMyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEluc3RhbmNlb2ZLZXl3b3JkXzFfMF8wXzBfMSgpKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyOTcyOjM6ICggKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyOTczOjE6IChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjk3MzoxOiAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyOTc0OjM6IGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0VHlwZUp2bVR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xXzBfMV8wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVKdm1UeXBlUmVmZXJlbmNlX2luX3J1bGVYUmVsYXRpb25hbEV4cHJlc3Npb243NDQ2KTsKKyAgICAgICAgICAgIAkgICAgbHZfdHlwZV8zXzA9cnVsZUp2bVR5cGVSZWZlcmVuY2UoKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkidHlwZSIsCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X3R5cGVfM18wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIkp2bVR5cGVSZWZlcmVuY2UiKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAyIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyOTkxOjY6ICggKCAoICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfNl8wPSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyOTkxOjY6ICggKCAoICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfNl8wPSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjk5MTo3OiAoICggKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF82XzA9IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyOTkxOjc6ICggKCAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApICk9PiAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyOTkxOjg6ICggKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjk5Njo2OiAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6Mjk5Njo3OiAoKSAoICggcnVsZU9wQ29tcGFyZSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjI5OTY6NzogKCkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzoyOTk3OjU6IAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgICAgICAgICBjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnRBbmRTZXQoCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCksCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgICAgICAJICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzAwMjoyOiAoICggcnVsZU9wQ29tcGFyZSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMDAzOjE6ICggcnVsZU9wQ29tcGFyZSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMDAzOjE6ICggcnVsZU9wQ29tcGFyZSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzAwNDozOiBydWxlT3BDb21wYXJlCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMV8xXzBfMF8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZU9wQ29tcGFyZV9pbl9ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uNzUwNyk7CisgICAgICAgICAgICAJICAgIHJ1bGVPcENvbXBhcmUoKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMDE3OjQ6ICggKGx2X3JpZ2h0T3BlcmFuZF82XzA9IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzAxODoxOiAobHZfcmlnaHRPcGVyYW5kXzZfMD0gcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMDE4OjE6IChsdl9yaWdodE9wZXJhbmRfNl8wPSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMDE5OjM6IGx2X3JpZ2h0T3BlcmFuZF82XzA9IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMV8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9pbl9ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uNzUzMCk7CisgICAgICAgICAgICAJICAgIGx2X3JpZ2h0T3BlcmFuZF82XzA9cnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJyaWdodE9wZXJhbmQiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9yaWdodE9wZXJhbmRfNl8wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIlhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBicmVhayBsb29wMzg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVPcENvbXBhcmUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMDQzOjE6IGVudHJ5UnVsZU9wQ29tcGFyZSByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSA6IGl2X3J1bGVPcENvbXBhcmU9IHJ1bGVPcENvbXBhcmUgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGVudHJ5UnVsZU9wQ29tcGFyZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGl2X3J1bGVPcENvbXBhcmUgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzA0NDoyOiAoaXZfcnVsZU9wQ29tcGFyZT0gcnVsZU9wQ29tcGFyZSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMDQ1OjI6IGl2X3J1bGVPcENvbXBhcmU9IHJ1bGVPcENvbXBhcmUgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVPcENvbXBhcmVfaW5fZW50cnlSdWxlT3BDb21wYXJlNzU3MCk7CisgICAgICAgICAgICBpdl9ydWxlT3BDb21wYXJlPXJ1bGVPcENvbXBhcmUoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVPcENvbXBhcmUuZ2V0VGV4dCgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZU9wQ29tcGFyZTc1ODEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlT3BDb21wYXJlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcENvbXBhcmUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMDUyOjE6IHJ1bGVPcENvbXBhcmUgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIDogKGt3PSAnPj0nIHwgKGt3PSAnPCcga3c9ICc9JyApIHwga3c9ICc+JyB8IGt3PSAnPCcgKSA7CisgICAgcHVibGljIGZpbmFsIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gcnVsZU9wQ29tcGFyZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudCA9IG5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCk7CisKKyAgICAgICAgVG9rZW4ga3c9bnVsbDsKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMwNTU6Mjg6ICggKGt3PSAnPj0nIHwgKGt3PSAnPCcga3c9ICc9JyApIHwga3c9ICc+JyB8IGt3PSAnPCcgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMwNTY6MTogKGt3PSAnPj0nIHwgKGt3PSAnPCcga3c9ICc9JyApIHwga3c9ICc+JyB8IGt3PSAnPCcgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMDU2OjE6IChrdz0gJz49JyB8IChrdz0gJzwnIGt3PSAnPScgKSB8IGt3PSAnPicgfCBrdz0gJzwnICkKKyAgICAgICAgICAgIGludCBhbHQzOT00OworICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7CisgICAgICAgICAgICBjYXNlIDU4OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQzOT0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTY6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBMQTM5XzIgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgIGlmICggKExBMzlfMj09RU9GfHwoTEEzOV8yPj1SVUxFX0lEICYmIExBMzlfMjw9UlVMRV9ERUNJTUFMKXx8TEEzOV8yPT0xNHx8TEEzOV8yPT0xNnx8TEEzOV8yPT00NHx8KExBMzlfMj49NDggJiYgTEEzOV8yPD00OSl8fExBMzlfMj09NTZ8fChMQTM5XzI+PTcyICYmIExBMzlfMjw9NzMpfHxMQTM5XzI9PTc3fHxMQTM5XzI9PTg1fHxMQTM5XzI9PTg3fHwoTEEzOV8yPj05MSAmJiBMQTM5XzI8PTkzKXx8KExBMzlfMj49OTYgJiYgTEEzOV8yPD0xMDcpfHxMQTM5XzI9PTEwOSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDM5PTQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEzOV8yPT00NykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDM5PTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMzksIDIsIGlucHV0KTsKKworICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU3OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQzOT0zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAzOSwgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQzOSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzA1NzoyOiBrdz0gJz49JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw1OCxGT0xMT1dfNThfaW5fcnVsZU9wQ29tcGFyZTc2MTkpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduRXF1YWxzU2lnbktleXdvcmRfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMwNjM6NjogKGt3PSAnPCcga3c9ICc9JyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMDYzOjY6IChrdz0gJzwnIGt3PSAnPScgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMwNjQ6Mjoga3c9ICc8JyBrdz0gJz0nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDU2LEZPTExPV181Nl9pbl9ydWxlT3BDb21wYXJlNzYzOSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzFfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw0NyxGT0xMT1dfNDdfaW5fcnVsZU9wQ29tcGFyZTc2NTIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlQWNjZXNzKCkuZ2V0RXF1YWxzU2lnbktleXdvcmRfMV8xKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMyA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzA3NzoyOiBrdz0gJz4nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDU3LEZPTExPV181N19pbl9ydWxlT3BDb21wYXJlNzY3Mik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzIoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA0IDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMDg0OjI6IGt3PSAnPCcKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNTYsRk9MTE9XXzU2X2luX3J1bGVPcENvbXBhcmU3NjkxKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZUFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfMygpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZU9wQ29tcGFyZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMDk3OjE6IGVudHJ5UnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uPSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzA5ODoyOiAoaXZfcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbj0gcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMDk5OjI6IGl2X3J1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb249IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25faW5fZW50cnlSdWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uNzczMSk7CisgICAgICAgICAgICBpdl9ydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uPXJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb247IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uNzc0MSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMxMDY6MTogcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAodGhpc19YQWRkaXRpdmVFeHByZXNzaW9uXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICk9PiAoICgpICggKCBydWxlT3BPdGhlciApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkgKSApKiApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IHRoaXNfWEFkZGl0aXZlRXhwcmVzc2lvbl8wID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGx2X3JpZ2h0T3BlcmFuZF8zXzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMTA5OjI4OiAoICh0aGlzX1hBZGRpdGl2ZUV4cHJlc3Npb25fMD0gcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wT3RoZXIgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gKSApICkqICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMTEwOjE6ICh0aGlzX1hBZGRpdGl2ZUV4cHJlc3Npb25fMD0gcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wT3RoZXIgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gKSApICkqICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzExMDoxOiAodGhpc19YQWRkaXRpdmVFeHByZXNzaW9uXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICk9PiAoICgpICggKCBydWxlT3BPdGhlciApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkgKSApKiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMxMTE6NTogdGhpc19YQWRkaXRpdmVFeHByZXNzaW9uXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICk9PiAoICgpICggKCBydWxlT3BPdGhlciApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkgKSApKgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFkZGl0aXZlRXhwcmVzc2lvbl9pbl9ydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uNzc4OCk7CisgICAgICAgICAgICB0aGlzX1hBZGRpdGl2ZUV4cHJlc3Npb25fMD1ydWxlWEFkZGl0aXZlRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHRoaXNfWEFkZGl0aXZlRXhwcmVzc2lvbl8wOyAKKyAgICAgICAgICAgICAgICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzExOToxOiAoICggKCAoICgpICggKCBydWxlT3BPdGhlciApICkgKSApPT4gKCAoKSAoICggcnVsZU9wT3RoZXIgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiApICkgKSoKKyAgICAgICAgICAgIGxvb3A0MDoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0NDA9MjsKKyAgICAgICAgICAgICAgICBhbHQ0MCA9IGRmYTQwLnByZWRpY3QoaW5wdXQpOworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NDApIHsKKyAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMxMTk6MjogKCAoICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICk9PiAoICgpICggKCBydWxlT3BPdGhlciApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzExOToyOiAoICggKCAoKSAoICggcnVsZU9wT3RoZXIgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMTE5OjM6ICggKCAoKSAoICggcnVsZU9wT3RoZXIgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMTI0OjY6ICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzEyNDo3OiAoKSAoICggcnVsZU9wT3RoZXIgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMTI0Ojc6ICgpCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzEyNTo1OiAKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50QW5kU2V0KAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgICAgIAkgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMTMwOjI6ICggKCBydWxlT3BPdGhlciApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMTMxOjE6ICggcnVsZU9wT3RoZXIgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzEzMToxOiAoIHJ1bGVPcE90aGVyICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMTMyOjM6IHJ1bGVPcE90aGVyCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMV8wXzBfMV8wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVPcE90aGVyX2luX3J1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb243ODQxKTsKKyAgICAgICAgICAgIAkgICAgcnVsZU9wT3RoZXIoKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMTQ1OjQ6ICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMxNDY6MTogKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMxNDY6MTogKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMTQ3OjM6IGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRYQWRkaXRpdmVFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb25faW5fcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbjc4NjQpOworICAgICAgICAgICAgCSAgICBsdl9yaWdodE9wZXJhbmRfM18wPXJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJInJpZ2h0T3BlcmFuZCIsCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X3JpZ2h0T3BlcmFuZF8zXzAsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiWEFkZGl0aXZlRXhwcmVzc2lvbiIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBicmVhayBsb29wNDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVPcE90aGVyIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzE3MToxOiBlbnRyeVJ1bGVPcE90aGVyIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIDogaXZfcnVsZU9wT3RoZXI9IHJ1bGVPcE90aGVyIEVPRiA7CisgICAgcHVibGljIGZpbmFsIFN0cmluZyBlbnRyeVJ1bGVPcE90aGVyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gaXZfcnVsZU9wT3RoZXIgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzE3MjoyOiAoaXZfcnVsZU9wT3RoZXI9IHJ1bGVPcE90aGVyIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMxNzM6MjogaXZfcnVsZU9wT3RoZXI9IHJ1bGVPcE90aGVyIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlclJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZU9wT3RoZXJfaW5fZW50cnlSdWxlT3BPdGhlcjc5MDMpOworICAgICAgICAgICAgaXZfcnVsZU9wT3RoZXI9cnVsZU9wT3RoZXIoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVPcE90aGVyLmdldFRleHQoKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVPcE90aGVyNzkxNCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVPcE90aGVyIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcE90aGVyIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzE4MDoxOiBydWxlT3BPdGhlciByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gOiAoa3c9ICctPicgfCBrdz0gJy4uPCcgfCAoa3c9ICc+JyBrdz0gJy4uJyApIHwga3c9ICcuLicgfCBrdz0gJz0+JyB8IChrdz0gJz4nICggKCAoICggJz4nICc+JyApICk9PiAoa3c9ICc+JyBrdz0gJz4nICkgKSB8IGt3PSAnPicgKSApIHwgKGt3PSAnPCcgKCAoICggKCAnPCcgJzwnICkgKT0+IChrdz0gJzwnIGt3PSAnPCcgKSApIHwga3c9ICc8JyB8IGt3PSAnPT4nICkgKSB8IGt3PSAnPD4nIHwga3c9ICc/OicgKSA7CisgICAgcHVibGljIGZpbmFsIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gcnVsZU9wT3RoZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQgPSBuZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpOworCisgICAgICAgIFRva2VuIGt3PW51bGw7CisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMTgzOjI4OiAoIChrdz0gJy0+JyB8IGt3PSAnLi48JyB8IChrdz0gJz4nIGt3PSAnLi4nICkgfCBrdz0gJy4uJyB8IGt3PSAnPT4nIHwgKGt3PSAnPicgKCAoICggKCAnPicgJz4nICkgKT0+IChrdz0gJz4nIGt3PSAnPicgKSApIHwga3c9ICc+JyApICkgfCAoa3c9ICc8JyAoICggKCAoICc8JyAnPCcgKSApPT4gKGt3PSAnPCcga3c9ICc8JyApICkgfCBrdz0gJzwnIHwga3c9ICc9PicgKSApIHwga3c9ICc8PicgfCBrdz0gJz86JyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzE4NDoxOiAoa3c9ICctPicgfCBrdz0gJy4uPCcgfCAoa3c9ICc+JyBrdz0gJy4uJyApIHwga3c9ICcuLicgfCBrdz0gJz0+JyB8IChrdz0gJz4nICggKCAoICggJz4nICc+JyApICk9PiAoa3c9ICc+JyBrdz0gJz4nICkgKSB8IGt3PSAnPicgKSApIHwgKGt3PSAnPCcgKCAoICggKCAnPCcgJzwnICkgKT0+IChrdz0gJzwnIGt3PSAnPCcgKSApIHwga3c9ICc8JyB8IGt3PSAnPT4nICkgKSB8IGt3PSAnPD4nIHwga3c9ICc/OicgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMTg0OjE6IChrdz0gJy0+JyB8IGt3PSAnLi48JyB8IChrdz0gJz4nIGt3PSAnLi4nICkgfCBrdz0gJy4uJyB8IGt3PSAnPT4nIHwgKGt3PSAnPicgKCAoICggKCAnPicgJz4nICkgKT0+IChrdz0gJz4nIGt3PSAnPicgKSApIHwga3c9ICc+JyApICkgfCAoa3c9ICc8JyAoICggKCAoICc8JyAnPCcgKSApPT4gKGt3PSAnPCcga3c9ICc8JyApICkgfCBrdz0gJzwnIHwga3c9ICc9PicgKSApIHwga3c9ICc8PicgfCBrdz0gJz86JyApCisgICAgICAgICAgICBpbnQgYWx0NDM9OTsKKyAgICAgICAgICAgIGFsdDQzID0gZGZhNDMucHJlZGljdChpbnB1dCk7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDQzKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMTg1OjI6IGt3PSAnLT4nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDY2LEZPTExPV182Nl9pbl9ydWxlT3BPdGhlcjc5NTIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEh5cGhlbk1pbnVzR3JlYXRlclRoYW5TaWduS2V5d29yZF8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzE5MjoyOiBrdz0gJy4uPCcKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNjcsRk9MTE9XXzY3X2luX3J1bGVPcE90aGVyNzk3MSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0RnVsbFN0b3BGdWxsU3RvcExlc3NUaGFuU2lnbktleXdvcmRfMSgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDMgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMxOTg6NjogKGt3PSAnPicga3c9ICcuLicgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzE5ODo2OiAoa3c9ICc+JyBrdz0gJy4uJyApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzE5OToyOiBrdz0gJz4nIGt3PSAnLi4nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDU3LEZPTExPV181N19pbl9ydWxlT3BPdGhlcjc5OTEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfMl8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDY4LEZPTExPV182OF9pbl9ydWxlT3BPdGhlcjgwMDQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEZ1bGxTdG9wRnVsbFN0b3BLZXl3b3JkXzJfMSgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMyMTI6Mjoga3c9ICcuLicKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNjgsRk9MTE9XXzY4X2luX3J1bGVPcE90aGVyODAyNCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0RnVsbFN0b3BGdWxsU3RvcEtleXdvcmRfMygpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDUgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMyMTk6Mjoga3c9ICc9PicKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNjksRk9MTE9XXzY5X2luX3J1bGVPcE90aGVyODA0Myk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0RXF1YWxzU2lnbkdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDYgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMyMjU6NjogKGt3PSAnPicgKCAoICggKCAnPicgJz4nICkgKT0+IChrdz0gJz4nIGt3PSAnPicgKSApIHwga3c9ICc+JyApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMyMjU6NjogKGt3PSAnPicgKCAoICggKCAnPicgJz4nICkgKT0+IChrdz0gJz4nIGt3PSAnPicgKSApIHwga3c9ICc+JyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMjI2OjI6IGt3PSAnPicgKCAoICggKCAnPicgJz4nICkgKT0+IChrdz0gJz4nIGt3PSAnPicgKSApIHwga3c9ICc+JyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDU3LEZPTExPV181N19pbl9ydWxlT3BPdGhlcjgwNjMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNV8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMjMxOjE6ICggKCAoICggJz4nICc+JyApICk9PiAoa3c9ICc+JyBrdz0gJz4nICkgKSB8IGt3PSAnPicgKQorICAgICAgICAgICAgICAgICAgICBpbnQgYWx0NDE9MjsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBNDFfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKExBNDFfMD09NTcpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBNDFfMSA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTQxXzE9PUVPRnx8KExBNDFfMT49UlVMRV9JRCAmJiBMQTQxXzE8PVJVTEVfREVDSU1BTCl8fExBNDFfMT09MTR8fExBNDFfMT09MTZ8fExBNDFfMT09NDR8fChMQTQxXzE+PTQ4ICYmIExBNDFfMTw9NDkpfHxMQTQxXzE9PTU2fHwoTEE0MV8xPj03MiAmJiBMQTQxXzE8PTczKXx8TEE0MV8xPT03N3x8TEE0MV8xPT04NXx8TEE0MV8xPT04N3x8KExBNDFfMT49OTEgJiYgTEE0MV8xPD05Myl8fChMQTQxXzE+PTk2ICYmIExBNDFfMTw9MTA3KXx8TEE0MV8xPT0xMDkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDQxPTI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBNDFfMT09NTcpICYmIChzeW5wcmVkMTVfSW50ZXJuYWxQZXJzcGVjdGl2ZURzbCgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDQxPTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDQxLCAxLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNDEsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDQxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzIzMToyOiAoICggKCAnPicgJz4nICkgKT0+IChrdz0gJz4nIGt3PSAnPicgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzIzMToyOiAoICggKCAnPicgJz4nICkgKT0+IChrdz0gJz4nIGt3PSAnPicgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMjMxOjM6ICggKCAnPicgJz4nICkgKT0+IChrdz0gJz4nIGt3PSAnPicgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMyMzU6NTogKGt3PSAnPicga3c9ICc+JyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMjM2OjI6IGt3PSAnPicga3c9ICc+JworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNTcsRk9MTE9XXzU3X2luX3J1bGVPcE90aGVyODA5NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF81XzFfMF8wXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNTcsRk9MTE9XXzU3X2luX3J1bGVPcE90aGVyODEwNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF81XzFfMF8wXzEoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzI0OToyOiBrdz0gJz4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw1NyxGT0xMT1dfNTdfaW5fcnVsZU9wT3RoZXI4MTI4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzVfMV8xKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDcgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMyNTU6NjogKGt3PSAnPCcgKCAoICggKCAnPCcgJzwnICkgKT0+IChrdz0gJzwnIGt3PSAnPCcgKSApIHwga3c9ICc8JyB8IGt3PSAnPT4nICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzI1NTo2OiAoa3c9ICc8JyAoICggKCAoICc8JyAnPCcgKSApPT4gKGt3PSAnPCcga3c9ICc8JyApICkgfCBrdz0gJzwnIHwga3c9ICc9PicgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzI1NjoyOiBrdz0gJzwnICggKCAoICggJzwnICc8JyApICk9PiAoa3c9ICc8JyBrdz0gJzwnICkgKSB8IGt3PSAnPCcgfCBrdz0gJz0+JyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDU2LEZPTExPV181Nl9pbl9ydWxlT3BPdGhlcjgxNTApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfNl8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMjYxOjE6ICggKCAoICggJzwnICc8JyApICk9PiAoa3c9ICc8JyBrdz0gJzwnICkgKSB8IGt3PSAnPCcgfCBrdz0gJz0+JyApCisgICAgICAgICAgICAgICAgICAgIGludCBhbHQ0Mj0zOworICAgICAgICAgICAgICAgICAgICBpbnQgTEE0Ml8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEE0Ml8wPT01NikgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE0Ml8xID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNl9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsKCkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDQyPTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDQyPTI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDQyLCAxLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE0Ml8wPT02OSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ0Mj0zOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNDIsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDQyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzI2MToyOiAoICggKCAnPCcgJzwnICkgKT0+IChrdz0gJzwnIGt3PSAnPCcgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzI2MToyOiAoICggKCAnPCcgJzwnICkgKT0+IChrdz0gJzwnIGt3PSAnPCcgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMjYxOjM6ICggKCAnPCcgJzwnICkgKT0+IChrdz0gJzwnIGt3PSAnPCcgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMyNjU6NTogKGt3PSAnPCcga3c9ICc8JyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMjY2OjI6IGt3PSAnPCcga3c9ICc8JworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNTYsRk9MTE9XXzU2X2luX3J1bGVPcE90aGVyODE4MSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF82XzFfMF8wXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNTYsRk9MTE9XXzU2X2luX3J1bGVPcE90aGVyODE5NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF82XzFfMF8wXzEoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzI3OToyOiBrdz0gJzwnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw1NixGT0xMT1dfNTZfaW5fcnVsZU9wT3RoZXI4MjE1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzZfMV8xKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzI4NjoyOiBrdz0gJz0+JworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNjksRk9MTE9XXzY5X2luX3J1bGVPcE90aGVyODIzNCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0RXF1YWxzU2lnbkdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNl8xXzIoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgOCA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzI5MzoyOiBrdz0gJzw+JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw3MCxGT0xMT1dfNzBfaW5fcnVsZU9wT3RoZXI4MjU1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25HcmVhdGVyVGhhblNpZ25LZXl3b3JkXzcoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA5IDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMzAwOjI6IGt3PSAnPzonCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDcxLEZPTExPV183MV9pbl9ydWxlT3BPdGhlcjgyNzQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldFF1ZXN0aW9uTWFya0NvbG9uS2V5d29yZF84KCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlT3BPdGhlciIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzMxMzoxOiBlbnRyeVJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYQWRkaXRpdmVFeHByZXNzaW9uPSBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzMxNDoyOiAoaXZfcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb249IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMzMTU6MjogaXZfcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb249IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb25faW5fZW50cnlSdWxlWEFkZGl0aXZlRXhwcmVzc2lvbjgzMTQpOworICAgICAgICAgICAgaXZfcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb249cnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVYQWRkaXRpdmVFeHByZXNzaW9uOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhBZGRpdGl2ZUV4cHJlc3Npb244MzI0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMzIyOjE6IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICh0aGlzX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fMD0gcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wQWRkICkgKSApICk9PiAoICgpICggKCBydWxlT3BBZGQgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiApICkgKSogKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgdGhpc19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uXzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgbHZfcmlnaHRPcGVyYW5kXzNfMCA9IG51bGw7CisKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMzMjU6Mjg6ICggKHRoaXNfWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl8wPSBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BBZGQgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEFkZCApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICkgKSApKiApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzMyNjoxOiAodGhpc19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uXzA9IHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcEFkZCApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQWRkICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKSApICkqICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzMyNjoxOiAodGhpc19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uXzA9IHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcEFkZCApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQWRkICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKSApICkqICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzMyNzo1OiB0aGlzX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fMD0gcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wQWRkICkgKSApICk9PiAoICgpICggKCBydWxlT3BBZGQgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiApICkgKSoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX2luX3J1bGVYQWRkaXRpdmVFeHByZXNzaW9uODM3MSk7CisgICAgICAgICAgICB0aGlzX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fMD1ydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHRoaXNfWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl8wOyAKKyAgICAgICAgICAgICAgICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzMzNToxOiAoICggKCAoICgpICggKCBydWxlT3BBZGQgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEFkZCApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICkgKSApKgorICAgICAgICAgICAgbG9vcDQ0OgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQ0ND0yOworICAgICAgICAgICAgICAgIGludCBMQTQ0XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgIGlmICggKExBNDRfMD09NzIpICkgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEE0NF8yID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE3X0ludGVybmFsUGVyc3BlY3RpdmVEc2woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ0ND0xOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBNDRfMD09NzMpICkgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEE0NF8zID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE3X0ludGVybmFsUGVyc3BlY3RpdmVEc2woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ0ND0xOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ0NCkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzMzNToyOiAoICggKCAoKSAoICggcnVsZU9wQWRkICkgKSApICk9PiAoICgpICggKCBydWxlT3BBZGQgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMzMzU6MjogKCAoICggKCkgKCAoIHJ1bGVPcEFkZCApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQWRkICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMzM1OjM6ICggKCAoKSAoICggcnVsZU9wQWRkICkgKSApICk9PiAoICgpICggKCBydWxlT3BBZGQgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMzNDA6NjogKCAoKSAoICggcnVsZU9wQWRkICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzM0MDo3OiAoKSAoICggcnVsZU9wQWRkICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzM0MDo3OiAoKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMzNDE6NTogCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudEFuZFNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMzNDY6MjogKCAoIHJ1bGVPcEFkZCApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMzQ3OjE6ICggcnVsZU9wQWRkICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMzNDc6MTogKCBydWxlT3BBZGQgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMzNDg6MzogcnVsZU9wQWRkCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRDcm9zc1JlZmVyZW5jZV8xXzBfMF8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZU9wQWRkX2luX3J1bGVYQWRkaXRpdmVFeHByZXNzaW9uODQyNCk7CisgICAgICAgICAgICAJICAgIHJ1bGVPcEFkZCgpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMzNjE6NDogKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzM2MjoxOiAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzM2MjoxOiAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMzNjM6MzogbHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25faW5fcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb244NDQ3KTsKKyAgICAgICAgICAgIAkgICAgbHZfcmlnaHRPcGVyYW5kXzNfMD1ydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkicmlnaHRPcGVyYW5kIiwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfcmlnaHRPcGVyYW5kXzNfMCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3A0NDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVPcEFkZCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMzODc6MTogZW50cnlSdWxlT3BBZGQgcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlT3BBZGQ9IHJ1bGVPcEFkZCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZW50cnlSdWxlT3BBZGQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBpdl9ydWxlT3BBZGQgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzM4ODoyOiAoaXZfcnVsZU9wQWRkPSBydWxlT3BBZGQgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzM4OToyOiBpdl9ydWxlT3BBZGQ9IHJ1bGVPcEFkZCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE9wQWRkUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlT3BBZGRfaW5fZW50cnlSdWxlT3BBZGQ4NDg2KTsKKyAgICAgICAgICAgIGl2X3J1bGVPcEFkZD1ydWxlT3BBZGQoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVPcEFkZC5nZXRUZXh0KCk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlT3BBZGQ4NDk3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZU9wQWRkIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcEFkZCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjMzOTY6MTogcnVsZU9wQWRkIHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSA6IChrdz0gJysnIHwga3c9ICctJyApIDsKKyAgICBwdWJsaWMgZmluYWwgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBydWxlT3BBZGQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQgPSBuZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpOworCisgICAgICAgIFRva2VuIGt3PW51bGw7CisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozMzk5OjI4OiAoIChrdz0gJysnIHwga3c9ICctJyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzQwMDoxOiAoa3c9ICcrJyB8IGt3PSAnLScgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozNDAwOjE6IChrdz0gJysnIHwga3c9ICctJyApCisgICAgICAgICAgICBpbnQgYWx0NDU9MjsKKyAgICAgICAgICAgIGludCBMQTQ1XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoTEE0NV8wPT03MikgKSB7CisgICAgICAgICAgICAgICAgYWx0NDU9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE0NV8wPT03MykgKSB7CisgICAgICAgICAgICAgICAgYWx0NDU9MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNDUsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ1KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozNDAxOjI6IGt3PSAnKycKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNzIsRk9MTE9XXzcyX2luX3J1bGVPcEFkZDg1MzUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BBZGRBY2Nlc3MoKS5nZXRQbHVzU2lnbktleXdvcmRfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjM0MDg6Mjoga3c9ICctJworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw3MyxGT0xMT1dfNzNfaW5fcnVsZU9wQWRkODU1NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcEFkZEFjY2VzcygpLmdldEh5cGhlbk1pbnVzS2V5d29yZF8xKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlT3BBZGQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjM0MjE6MTogZW50cnlSdWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbj0gcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjM0MjI6MjogKGl2X3J1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uPSBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozNDIzOjI6IGl2X3J1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uPSBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX2luX2VudHJ5UnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb244NTk0KTsKKyAgICAgICAgICAgIGl2X3J1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uPXJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbjsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uODYwNCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzQzMDoxOiBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAodGhpc19YVW5hcnlPcGVyYXRpb25fMD0gcnVsZVhVbmFyeU9wZXJhdGlvbiAoICggKCAoICgpICggKCBydWxlT3BNdWx0aSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wTXVsdGkgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWFVuYXJ5T3BlcmF0aW9uICkgKSApKiApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCB0aGlzX1hVbmFyeU9wZXJhdGlvbl8wID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGx2X3JpZ2h0T3BlcmFuZF8zXzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozNDMzOjI4OiAoICh0aGlzX1hVbmFyeU9wZXJhdGlvbl8wPSBydWxlWFVuYXJ5T3BlcmF0aW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE11bHRpICkgKSApICk9PiAoICgpICggKCBydWxlT3BNdWx0aSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYVW5hcnlPcGVyYXRpb24gKSApICkqICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUGVyc3BlY3RpdmVEc2wuZzozNDM0OjE6ICh0aGlzX1hVbmFyeU9wZXJhdGlvbl8wPSBydWxlWFVuYXJ5T3BlcmF0aW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE11bHRpICkgKSApICk9PiAoICgpICggKCBydWxlT3BNdWx0aSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYVW5hcnlPcGVyYXRpb24gKSApICkqICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzQzNDoxOiAodGhpc19YVW5hcnlPcGVyYXRpb25fMD0gcnVsZVhVbmFyeU9wZXJhdGlvbiAoICggKCAoICgpICggKCBydWxlT3BNdWx0aSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wTXVsdGkgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWFVuYXJ5T3BlcmF0aW9uICkgKSApKiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxQZXJzcGVjdGl2ZURzbC5nOjM0MzU6NTogdGhpc19YVW5hcnlPcGVyYXRpb25fMD0gcnVsZVhVbmFyeU9wZXJhdGlvbiAoICggKCAoICgpICggKCBydWxlT3BNdWx0aSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wTXVsdGkgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWFVuYXJ5T3BlcmF0aW9uICkgKSApKgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhVbmFyeU9wZXJhdGlvblBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWFVuYXJ5T3BlcmF0aW9uX2luX3J1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uODY1MSk7CisgICAgICAgICAgICB0aGlzX1hVbmFyeU9wZXJhdGlvbl8wPXJ1bGVYVW5hcnlPcGVyYXRpb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0aGlzX1hVbmFyeU9wZXJhdGlvbl8wOyAKKyAgICAgICAgICAgICAgICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsLmc6MzQ0MzoxOiAoICggKCAoICgpICggKCBydWxlT3BNdWx0aSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wTXVsdGkgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWFVuYXJ5T3BlcmF0aW9uICkgKSApKgorICAgICAgICAgICAgbG9vcDQ2OgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQ0Nj0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgICAgIGNhc2UgNDI6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBNDZfMiA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxOF9JbnRlcm5hbFBlcnNwZWN0aXZlRHNsKCkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0NDY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDc0OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTQ2XzMgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMThfSW50ZXJuYWxQZXJzcGVjdGl2ZURzbCgpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDQ2PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA3NToKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEE0Nl80ID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE4X0ludGVybmFsUGVyc3BlY3RpdmVEc2woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ0Nj0xOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvc2VyaWFsaXplci9QZXJzcGVjdGl2ZURzbFNlbWFudGljU2VxdWVuY2VyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9zZXJpYWxpemVyL1BlcnNwZWN0aXZlRHNsU2VtYW50aWNTZXF1ZW5jZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWU0N2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvc2VyaWFsaXplci9QZXJzcGVjdGl2ZURzbFNlbWFudGljU2VxdWVuY2VyLmphdmEKQEAgLTAsMCArMSwxNjQxIEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuc2VyaWFsaXplcjsKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXMuTEltcG9ydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXMuT1NCUFR5cGVzUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVCUE1OOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVDaGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVHcmlkOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlT3JnYW5pemF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYXJ0U3RhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVJlcG9ydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlU2FzaENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVUYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlVG9wb2xvZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5zZXJ2aWNlcy5QZXJzcGVjdGl2ZURzbEdyYW1tYXJBY2Nlc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bUZvcm1hbFBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtR2VuZXJpY0FycmF5VHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtSW5uZXJUeXBlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy5Kdm1Mb3dlckJvdW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy5Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtVHlwZVBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtVXBwZXJCb3VuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy5UeXBlc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuc2VyaWFsaXplci5hY2NlcHRvci5JU2VtYW50aWNTZXF1ZW5jZUFjY2VwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnNlcmlhbGl6ZXIuYWNjZXB0b3IuU2VxdWVuY2VGZWVkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuc2VyaWFsaXplci5kaWFnbm9zdGljLklTZW1hbnRpY1NlcXVlbmNlckRpYWdub3N0aWNQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5zZXJpYWxpemVyLmRpYWdub3N0aWMuSVNlcmlhbGl6YXRpb25EaWFnbm9zdGljLkFjY2VwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnNlcmlhbGl6ZXIuc2VxdWVuY2VyLkdlbmVyaWNTZXF1ZW5jZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuc2VyaWFsaXplci5zZXF1ZW5jZXIuSVNlbWFudGljTm9kZVByb3ZpZGVyLklOb2Rlc0ZvckVPYmplY3RQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5zZXJpYWxpemVyLnNlcXVlbmNlci5JU2VtYW50aWNTZXF1ZW5jZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuc2VyaWFsaXplci5zZXF1ZW5jZXIuSVRyYW5zaWVudFZhbHVlU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5zZXJpYWxpemVyLnNlcXVlbmNlci5JVHJhbnNpZW50VmFsdWVTZXJ2aWNlLlZhbHVlVHJhbnNpZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhBc3NpZ25tZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhCYXNpY0Zvckxvb3BFeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhCaW5hcnlPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuWEJsb2NrRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YQm9vbGVhbkxpdGVyYWw7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuWENhc2VQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhDYXN0ZWRFeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhDYXRjaENsYXVzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YQ2xvc3VyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YQ29uc3RydWN0b3JDYWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhEb1doaWxlRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YRmVhdHVyZUNhbGw7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuWEZvckxvb3BFeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhJZkV4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuWEluc3RhbmNlT2ZFeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhMaXN0TGl0ZXJhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YTWVtYmVyRmVhdHVyZUNhbGw7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuWE51bGxMaXRlcmFsOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhOdW1iZXJMaXRlcmFsOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhQb3N0Zml4T3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhSZXR1cm5FeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhTZXRMaXRlcmFsOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhTdHJpbmdMaXRlcmFsOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhTd2l0Y2hFeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhTeW5jaHJvbml6ZWRFeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhUaHJvd0V4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuWFR5cGVMaXRlcmFsOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhVbmFyeU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YVmFyaWFibGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YV2hpbGVFeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhiYXNlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5hbm5vdGF0aW9ucy5zZXJpYWxpemVyLlhiYXNlV2l0aEFubm90YXRpb25zU2VtYW50aWNTZXF1ZW5jZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuYW5ub3RhdGlvbnMueEFubm90YXRpb25zLlhBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmFubm90YXRpb25zLnhBbm5vdGF0aW9ucy5YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuYW5ub3RhdGlvbnMueEFubm90YXRpb25zLlhBbm5vdGF0aW9uc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueHR5cGUuWEZ1bmN0aW9uVHlwZVJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54dHlwZS5YSW1wb3J0RGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueHR5cGUuWEltcG9ydFNlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueHR5cGUuWHR5cGVQYWNrYWdlOworCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBQZXJzcGVjdGl2ZURzbFNlbWFudGljU2VxdWVuY2VyIGV4dGVuZHMgWGJhc2VXaXRoQW5ub3RhdGlvbnNTZW1hbnRpY1NlcXVlbmNlciB7CisKKwlASW5qZWN0CisJcHJpdmF0ZSBQZXJzcGVjdGl2ZURzbEdyYW1tYXJBY2Nlc3MgZ3JhbW1hckFjY2VzczsKKwkKKwlwdWJsaWMgdm9pZCBjcmVhdGVTZXF1ZW5jZShFT2JqZWN0IGNvbnRleHQsIEVPYmplY3Qgc2VtYW50aWNPYmplY3QpIHsKKwkJaWYoc2VtYW50aWNPYmplY3QuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuZUlOU1RBTkNFKSBzd2l0Y2goc2VtYW50aWNPYmplY3QuZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCkpIHsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9QZXJzcGVjdGl2ZShjb250ZXh0LCAoUGVyc3BlY3RpdmUpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9CUE1OOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUJQTU5SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVWaWV3UnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1BlcnNwZWN0aXZlQlBNTihjb250ZXh0LCAoUGVyc3BlY3RpdmVCUE1OKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfQ0hBUlQ6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlQ2hhcnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVWaWV3UnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1BlcnNwZWN0aXZlQ2hhcnQoY29udGV4dCwgKFBlcnNwZWN0aXZlQ2hhcnQpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9ESUFMT0c6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlRGlhbG9nUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVmlld1J1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9QZXJzcGVjdGl2ZURpYWxvZyhjb250ZXh0LCAoUGVyc3BlY3RpdmVEaWFsb2cpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9HUklEOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUdyaWRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVWaWV3UnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1BlcnNwZWN0aXZlR3JpZChjb250ZXh0LCAoUGVyc3BlY3RpdmVHcmlkKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfTU9ERUw6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlTW9kZWxSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfUGVyc3BlY3RpdmVNb2RlbChjb250ZXh0LCAoUGVyc3BlY3RpdmVNb2RlbCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX09SR0FOSVpBVElPTjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVPcmdhbml6YXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVWaWV3UnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1BlcnNwZWN0aXZlT3JnYW5pemF0aW9uKGNvbnRleHQsIChQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1BBQ0tBR0U6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlUGFja2FnZVJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9QZXJzcGVjdGl2ZVBhY2thZ2UoY29udGV4dCwgKFBlcnNwZWN0aXZlUGFja2FnZSkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1BBUlQ6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlRWxlbWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhcnRSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfUGVyc3BlY3RpdmVQYXJ0KGNvbnRleHQsIChQZXJzcGVjdGl2ZVBhcnQpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9QQVJUX1NUQUNLOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZUVsZW1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfUGVyc3BlY3RpdmVQYXJ0U3RhY2soY29udGV4dCwgKFBlcnNwZWN0aXZlUGFydFN0YWNrKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfUkVQT1JUOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVJlcG9ydFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVZpZXdSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfUGVyc3BlY3RpdmVSZXBvcnQoY29udGV4dCwgKFBlcnNwZWN0aXZlUmVwb3J0KSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuUEVSU1BFQ1RJVkVfU0FTSF9DT05UQUlORVI6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlRWxlbWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyKGNvbnRleHQsIChQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9TRUxFQ1RJT046CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlU2VsZWN0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVmlld1J1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9QZXJzcGVjdGl2ZVNlbGVjdGlvbihjb250ZXh0LCAoUGVyc3BlY3RpdmVTZWxlY3Rpb24pIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5QRVJTUEVDVElWRV9UQUJMRToKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0UGVyc3BlY3RpdmVUYWJsZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVZpZXdSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfUGVyc3BlY3RpdmVUYWJsZShjb250ZXh0LCAoUGVyc3BlY3RpdmVUYWJsZSkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLlBFUlNQRUNUSVZFX1RPUE9MT0dZOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVRvcG9sb2d5UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlVmlld1J1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9QZXJzcGVjdGl2ZVRvcG9sb2d5KGNvbnRleHQsIChQZXJzcGVjdGl2ZVRvcG9sb2d5KSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJfQorCQllbHNlIGlmKHNlbWFudGljT2JqZWN0LmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gT1NCUFR5cGVzUGFja2FnZS5lSU5TVEFOQ0UpIHN3aXRjaChzZW1hbnRpY09iamVjdC5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKSkgeworCQkJY2FzZSBPU0JQVHlwZXNQYWNrYWdlLkxJTVBPUlQ6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlSW1wb3J0UnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1BlcnNwZWN0aXZlSW1wb3J0KGNvbnRleHQsIChMSW1wb3J0KSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJfQorCQllbHNlIGlmKHNlbWFudGljT2JqZWN0LmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gVHlwZXNQYWNrYWdlLmVJTlNUQU5DRSkgc3dpdGNoKHNlbWFudGljT2JqZWN0LmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpKSB7CisJCQljYXNlIFR5cGVzUGFja2FnZS5KVk1fRk9STUFMX1BBUkFNRVRFUjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0RnVsbEp2bUZvcm1hbFBhcmFtZXRlclJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9GdWxsSnZtRm9ybWFsUGFyYW1ldGVyKGNvbnRleHQsIChKdm1Gb3JtYWxQYXJhbWV0ZXIpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEp2bUZvcm1hbFBhcmFtZXRlclJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9Kdm1Gb3JtYWxQYXJhbWV0ZXIoY29udGV4dCwgKEp2bUZvcm1hbFBhcmFtZXRlcikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgVHlwZXNQYWNrYWdlLkpWTV9HRU5FUklDX0FSUkFZX1RZUEVfUkVGRVJFTkNFOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0SnZtR2VuZXJpY0FycmF5VHlwZVJlZmVyZW5jZUNvbXBvbmVudFR5cGVBY3Rpb25fMF8xXzBfMCgpKSB7CisJCQkJCXNlcXVlbmNlX0p2bVR5cGVSZWZlcmVuY2UoY29udGV4dCwgKEp2bUdlbmVyaWNBcnJheVR5cGVSZWZlcmVuY2UpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFR5cGVzUGFja2FnZS5KVk1fSU5ORVJfVFlQRV9SRUZFUkVOQ0U6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEp2bUlubmVyVHlwZVJlZmVyZW5jZU91dGVyQWN0aW9uXzFfNF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEp2bUdlbmVyaWNBcnJheVR5cGVSZWZlcmVuY2VDb21wb25lbnRUeXBlQWN0aW9uXzBfMV8wXzAoKSkgeworCQkJCQlzZXF1ZW5jZV9Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZShjb250ZXh0LCAoSnZtSW5uZXJUeXBlUmVmZXJlbmNlKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBUeXBlc1BhY2thZ2UuSlZNX0xPV0VSX0JPVU5EOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRKdm1Mb3dlckJvdW5kQW5kZWRSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfSnZtTG93ZXJCb3VuZEFuZGVkKGNvbnRleHQsIChKdm1Mb3dlckJvdW5kKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRKdm1Mb3dlckJvdW5kUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX0p2bUxvd2VyQm91bmQoY29udGV4dCwgKEp2bUxvd2VyQm91bmQpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFR5cGVzUGFja2FnZS5KVk1fUEFSQU1FVEVSSVpFRF9UWVBFX1JFRkVSRU5DRToKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0SnZtSW5uZXJUeXBlUmVmZXJlbmNlT3V0ZXJBY3Rpb25fMV80XzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0SnZtR2VuZXJpY0FycmF5VHlwZVJlZmVyZW5jZUNvbXBvbmVudFR5cGVBY3Rpb25fMF8xXzBfMCgpKSB7CisJCQkJCXNlcXVlbmNlX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlKGNvbnRleHQsIChKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgVHlwZXNQYWNrYWdlLkpWTV9UWVBFX1BBUkFNRVRFUjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVBhcmFtZXRlclJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9Kdm1UeXBlUGFyYW1ldGVyKGNvbnRleHQsIChKdm1UeXBlUGFyYW1ldGVyKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBUeXBlc1BhY2thZ2UuSlZNX1VQUEVSX0JPVU5EOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kQW5kZWRSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfSnZtVXBwZXJCb3VuZEFuZGVkKGNvbnRleHQsIChKdm1VcHBlckJvdW5kKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX0p2bVVwcGVyQm91bmQoY29udGV4dCwgKEp2bVVwcGVyQm91bmQpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFR5cGVzUGFja2FnZS5KVk1fV0lMRENBUkRfVFlQRV9SRUZFUkVOQ0U6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlKGNvbnRleHQsIChKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQl9CisJCWVsc2UgaWYoc2VtYW50aWNPYmplY3QuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBYQW5ub3RhdGlvbnNQYWNrYWdlLmVJTlNUQU5DRSkgc3dpdGNoKHNlbWFudGljT2JqZWN0LmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpKSB7CisJCQljYXNlIFhBbm5vdGF0aW9uc1BhY2thZ2UuWEFOTk9UQVRJT046CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWEFubm90YXRpb24oY29udGV4dCwgKFhBbm5vdGF0aW9uKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYQW5ub3RhdGlvbnNQYWNrYWdlLlhBTk5PVEFUSU9OX0VMRU1FTlRfVkFMVUVfUEFJUjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcihjb250ZXh0LCAoWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJfQorCQllbHNlIGlmKHNlbWFudGljT2JqZWN0LmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gWGJhc2VQYWNrYWdlLmVJTlNUQU5DRSkgc3dpdGNoKHNlbWFudGljT2JqZWN0LmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpKSB7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YQVNTSUdOTUVOVDoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hBc3NpZ25tZW50X1hNZW1iZXJGZWF0dXJlQ2FsbChjb250ZXh0LCAoWEFzc2lnbm1lbnQpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YQkFTSUNfRk9SX0xPT1BfRVhQUkVTU0lPTjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uKGNvbnRleHQsIChYQmFzaWNGb3JMb29wRXhwcmVzc2lvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhCSU5BUllfT1BFUkFUSU9OOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWEFkZGl0aXZlRXhwcmVzc2lvbl9YQW5kRXhwcmVzc2lvbl9YQXNzaWdubWVudF9YRXF1YWxpdHlFeHByZXNzaW9uX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fWE9yRXhwcmVzc2lvbl9YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fWFJlbGF0aW9uYWxFeHByZXNzaW9uKGNvbnRleHQsIChYQmluYXJ5T3BlcmF0aW9uKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYYmFzZVBhY2thZ2UuWEJMT0NLX0VYUFJFU1NJT046CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEJsb2NrRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hCbG9ja0V4cHJlc3Npb24oY29udGV4dCwgKFhCbG9ja0V4cHJlc3Npb24pIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uSW5DbG9zdXJlUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hFeHByZXNzaW9uSW5DbG9zdXJlKGNvbnRleHQsIChYQmxvY2tFeHByZXNzaW9uKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYYmFzZVBhY2thZ2UuWEJPT0xFQU5fTElURVJBTDoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQm9vbGVhbkxpdGVyYWxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblRhcmdldEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YQm9vbGVhbkxpdGVyYWwoY29udGV4dCwgKFhCb29sZWFuTGl0ZXJhbCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhDQVNFX1BBUlQ6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydFJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YQ2FzZVBhcnQoY29udGV4dCwgKFhDYXNlUGFydCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhDQVNURURfRVhQUkVTU0lPTjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hDYXN0ZWRFeHByZXNzaW9uKGNvbnRleHQsIChYQ2FzdGVkRXhwcmVzc2lvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhDQVRDSF9DTEFVU0U6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXRjaENsYXVzZVJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YQ2F0Y2hDbGF1c2UoY29udGV4dCwgKFhDYXRjaENsYXVzZSkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhDTE9TVVJFOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWENsb3N1cmUoY29udGV4dCwgKFhDbG9zdXJlKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hTaG9ydENsb3N1cmUoY29udGV4dCwgKFhDbG9zdXJlKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYYmFzZVBhY2thZ2UuWENPTlNUUlVDVE9SX0NBTEw6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblRhcmdldEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hDb25zdHJ1Y3RvckNhbGwoY29udGV4dCwgKFhDb25zdHJ1Y3RvckNhbGwpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YRE9fV0hJTEVfRVhQUkVTU0lPTjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YRG9XaGlsZUV4cHJlc3Npb24oY29udGV4dCwgKFhEb1doaWxlRXhwcmVzc2lvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhGRUFUVVJFX0NBTEw6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblRhcmdldEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWEZlYXR1cmVDYWxsKGNvbnRleHQsIChYRmVhdHVyZUNhbGwpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YRk9SX0xPT1BfRVhQUkVTU0lPTjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YRm9yTG9vcEV4cHJlc3Npb24oY29udGV4dCwgKFhGb3JMb29wRXhwcmVzc2lvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhJRl9FWFBSRVNTSU9OOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YSWZFeHByZXNzaW9uKGNvbnRleHQsIChYSWZFeHByZXNzaW9uKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYYmFzZVBhY2thZ2UuWElOU1RBTkNFX09GX0VYUFJFU1NJT046CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblRhcmdldEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YUmVsYXRpb25hbEV4cHJlc3Npb24oY29udGV4dCwgKFhJbnN0YW5jZU9mRXhwcmVzc2lvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhMSVNUX0xJVEVSQUw6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9YTGlzdExpdGVyYWwoY29udGV4dCwgKFhMaXN0TGl0ZXJhbCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWEFubm90YXRpb25FbGVtZW50VmFsdWVfWExpc3RMaXRlcmFsKGNvbnRleHQsIChYTGlzdExpdGVyYWwpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDb2xsZWN0aW9uTGl0ZXJhbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTGlzdExpdGVyYWxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YTGlzdExpdGVyYWwoY29udGV4dCwgKFhMaXN0TGl0ZXJhbCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhNRU1CRVJfRkVBVFVSRV9DQUxMOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWE1lbWJlckZlYXR1cmVDYWxsKGNvbnRleHQsIChYTWVtYmVyRmVhdHVyZUNhbGwpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YTlVMTF9MSVRFUkFMOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhOdWxsTGl0ZXJhbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hOdWxsTGl0ZXJhbChjb250ZXh0LCAoWE51bGxMaXRlcmFsKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYYmFzZVBhY2thZ2UuWE5VTUJFUl9MSVRFUkFMOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhOdW1iZXJMaXRlcmFsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWE51bWJlckxpdGVyYWwoY29udGV4dCwgKFhOdW1iZXJMaXRlcmFsKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYYmFzZVBhY2thZ2UuWFBPU1RGSVhfT1BFUkFUSU9OOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWFBvc3RmaXhPcGVyYXRpb24oY29udGV4dCwgKFhQb3N0Zml4T3BlcmF0aW9uKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYYmFzZVBhY2thZ2UuWFJFVFVSTl9FWFBSRVNTSU9OOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmV0dXJuRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWFJldHVybkV4cHJlc3Npb24oY29udGV4dCwgKFhSZXR1cm5FeHByZXNzaW9uKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYYmFzZVBhY2thZ2UuWFNFVF9MSVRFUkFMOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDb2xsZWN0aW9uTGl0ZXJhbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hTZXRMaXRlcmFsKGNvbnRleHQsIChYU2V0TGl0ZXJhbCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhTVFJJTkdfTElURVJBTDoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFN0cmluZ0xpdGVyYWxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hTdHJpbmdMaXRlcmFsKGNvbnRleHQsIChYU3RyaW5nTGl0ZXJhbCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhTV0lUQ0hfRVhQUkVTU0lPTjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hTd2l0Y2hFeHByZXNzaW9uKGNvbnRleHQsIChYU3dpdGNoRXhwcmVzc2lvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhTWU5DSFJPTklaRURfRVhQUkVTU0lPTjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uKGNvbnRleHQsIChYU3luY2hyb25pemVkRXhwcmVzc2lvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhUSFJPV19FWFBSRVNTSU9OOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVGhyb3dFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YVGhyb3dFeHByZXNzaW9uKGNvbnRleHQsIChYVGhyb3dFeHByZXNzaW9uKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYYmFzZVBhY2thZ2UuWFRSWV9DQVRDSF9GSU5BTExZX0VYUFJFU1NJT046CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblRhcmdldEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbihjb250ZXh0LCAoWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24pIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YVFlQRV9MSVRFUkFMOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVHlwZUxpdGVyYWxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hUeXBlTGl0ZXJhbChjb250ZXh0LCAoWFR5cGVMaXRlcmFsKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYYmFzZVBhY2thZ2UuWFVOQVJZX09QRVJBVElPTjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hVbmFyeU9wZXJhdGlvbihjb250ZXh0LCAoWFVuYXJ5T3BlcmF0aW9uKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYYmFzZVBhY2thZ2UuWFZBUklBQkxFX0RFQ0xBUkFUSU9OOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWFZhcmlhYmxlRGVjbGFyYXRpb24oY29udGV4dCwgKFhWYXJpYWJsZURlY2xhcmF0aW9uKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYYmFzZVBhY2thZ2UuWFdISUxFX0VYUFJFU1NJT046CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblRhcmdldEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYV2hpbGVFeHByZXNzaW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hXaGlsZUV4cHJlc3Npb24oY29udGV4dCwgKFhXaGlsZUV4cHJlc3Npb24pIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQl9CisJCWVsc2UgaWYoc2VtYW50aWNPYmplY3QuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBYdHlwZVBhY2thZ2UuZUlOU1RBTkNFKSBzd2l0Y2goc2VtYW50aWNPYmplY3QuZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCkpIHsKKwkJCWNhc2UgWHR5cGVQYWNrYWdlLlhGVU5DVElPTl9UWVBFX1JFRjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZlJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YRnVuY3Rpb25UeXBlUmVmKGNvbnRleHQsIChYRnVuY3Rpb25UeXBlUmVmKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYdHlwZVBhY2thZ2UuWElNUE9SVF9ERUNMQVJBVElPTjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hJbXBvcnREZWNsYXJhdGlvbihjb250ZXh0LCAoWEltcG9ydERlY2xhcmF0aW9uKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYdHlwZVBhY2thZ2UuWElNUE9SVF9TRUNUSU9OOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0U2VjdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YSW1wb3J0U2VjdGlvbihjb250ZXh0LCAoWEltcG9ydFNlY3Rpb24pIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQl9CisJCWlmIChlcnJvckFjY2VwdG9yICE9IG51bGwpIGVycm9yQWNjZXB0b3IuYWNjZXB0KGRpYWdub3N0aWNQcm92aWRlci5jcmVhdGVJbnZhbGlkQ29udGV4dE9yVHlwZURpYWdub3N0aWMoc2VtYW50aWNPYmplY3QsIGNvbnRleHQpKTsKKwl9CisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAge1BlcnNwZWN0aXZlQlBNTn0KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9QZXJzcGVjdGl2ZUJQTU4oRU9iamVjdCBjb250ZXh0LCBQZXJzcGVjdGl2ZUJQTU4gc2VtYW50aWNPYmplY3QpIHsKKwkJZ2VuZXJpY1NlcXVlbmNlci5jcmVhdGVTZXF1ZW5jZShjb250ZXh0LCBzZW1hbnRpY09iamVjdCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgIHJlZj1bQ2hhcnR8SURdCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfUGVyc3BlY3RpdmVDaGFydChFT2JqZWN0IGNvbnRleHQsIFBlcnNwZWN0aXZlQ2hhcnQgc2VtYW50aWNPYmplY3QpIHsKKwkJZ2VuZXJpY1NlcXVlbmNlci5jcmVhdGVTZXF1ZW5jZShjb250ZXh0LCBzZW1hbnRpY09iamVjdCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgIHJlZj1bRGlhbG9nfElEXQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX1BlcnNwZWN0aXZlRGlhbG9nKEVPYmplY3QgY29udGV4dCwgUGVyc3BlY3RpdmVEaWFsb2cgc2VtYW50aWNPYmplY3QpIHsKKwkJZ2VuZXJpY1NlcXVlbmNlci5jcmVhdGVTZXF1ZW5jZShjb250ZXh0LCBzZW1hbnRpY09iamVjdCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgIHJlZj1bVGFibGV8SURdCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfUGVyc3BlY3RpdmVHcmlkKEVPYmplY3QgY29udGV4dCwgUGVyc3BlY3RpdmVHcmlkIHNlbWFudGljT2JqZWN0KSB7CisJCWdlbmVyaWNTZXF1ZW5jZXIuY3JlYXRlU2VxdWVuY2UoY29udGV4dCwgc2VtYW50aWNPYmplY3QpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb25zdHJhaW50OgorCSAqICAgICBpbXBvcnRlZE5hbWVzcGFjZT1QZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9QZXJzcGVjdGl2ZUltcG9ydChFT2JqZWN0IGNvbnRleHQsIExJbXBvcnQgc2VtYW50aWNPYmplY3QpIHsKKwkJaWYoZXJyb3JBY2NlcHRvciAhPSBudWxsKSB7CisJCQlpZih0cmFuc2llbnRWYWx1ZXMuaXNWYWx1ZVRyYW5zaWVudChzZW1hbnRpY09iamVjdCwgT1NCUFR5cGVzUGFja2FnZS5MaXRlcmFscy5MSU1QT1JUX19JTVBPUlRFRF9OQU1FU1BBQ0UpID09IFZhbHVlVHJhbnNpZW50LllFUykKKwkJCQllcnJvckFjY2VwdG9yLmFjY2VwdChkaWFnbm9zdGljUHJvdmlkZXIuY3JlYXRlRmVhdHVyZVZhbHVlTWlzc2luZyhzZW1hbnRpY09iamVjdCwgT1NCUFR5cGVzUGFja2FnZS5MaXRlcmFscy5MSU1QT1JUX19JTVBPUlRFRF9OQU1FU1BBQ0UpKTsKKwkJfQorCQlJTm9kZXNGb3JFT2JqZWN0UHJvdmlkZXIgbm9kZXMgPSBjcmVhdGVOb2RlUHJvdmlkZXIoc2VtYW50aWNPYmplY3QpOworCQlTZXF1ZW5jZUZlZWRlciBmZWVkZXIgPSBjcmVhdGVTZXF1ZW5jZXJGZWVkZXIoc2VtYW50aWNPYmplY3QsIG5vZGVzKTsKKwkJZmVlZGVyLmFjY2VwdChncmFtbWFyQWNjZXNzLmdldFBlcnNwZWN0aXZlSW1wb3J0QWNjZXNzKCkuZ2V0SW1wb3J0ZWROYW1lc3BhY2VQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRQYXJzZXJSdWxlQ2FsbF8xXzAoKSwgc2VtYW50aWNPYmplY3QuZ2V0SW1wb3J0ZWROYW1lc3BhY2UoKSk7CisJCWZlZWRlci5maW5pc2goKTsKKwl9CisJCisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgcGFja2FnZXMrPVBlcnNwZWN0aXZlUGFja2FnZSoKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9QZXJzcGVjdGl2ZU1vZGVsKEVPYmplY3QgY29udGV4dCwgUGVyc3BlY3RpdmVNb2RlbCBzZW1hbnRpY09iamVjdCkgeworCQlnZW5lcmljU2VxdWVuY2VyLmNyZWF0ZVNlcXVlbmNlKGNvbnRleHQsIHNlbWFudGljT2JqZWN0KTsKKwl9CisJCisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgcmVmPVtPcmdhbml6YXRpb258SURdCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfUGVyc3BlY3RpdmVPcmdhbml6YXRpb24oRU9iamVjdCBjb250ZXh0LCBQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbiBzZW1hbnRpY09iamVjdCkgeworCQlpZihlcnJvckFjY2VwdG9yICE9IG51bGwpIHsKKwkJCWlmKHRyYW5zaWVudFZhbHVlcy5pc1ZhbHVlVHJhbnNpZW50KHNlbWFudGljT2JqZWN0LCBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuTGl0ZXJhbHMuUEVSU1BFQ1RJVkVfT1JHQU5JWkFUSU9OX19SRUYpID09IFZhbHVlVHJhbnNpZW50LllFUykKKwkJCQllcnJvckFjY2VwdG9yLmFjY2VwdChkaWFnbm9zdGljUHJvdmlkZXIuY3JlYXRlRmVhdHVyZVZhbHVlTWlzc2luZyhzZW1hbnRpY09iamVjdCwgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLkxpdGVyYWxzLlBFUlNQRUNUSVZFX09SR0FOSVpBVElPTl9fUkVGKSk7CisJCX0KKwkJSU5vZGVzRm9yRU9iamVjdFByb3ZpZGVyIG5vZGVzID0gY3JlYXRlTm9kZVByb3ZpZGVyKHNlbWFudGljT2JqZWN0KTsKKwkJU2VxdWVuY2VGZWVkZXIgZmVlZGVyID0gY3JlYXRlU2VxdWVuY2VyRmVlZGVyKHNlbWFudGljT2JqZWN0LCBub2Rlcyk7CisJCWZlZWRlci5hY2NlcHQoZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbkFjY2VzcygpLmdldFJlZk9yZ2FuaXphdGlvbklEVGVybWluYWxSdWxlQ2FsbF8yXzBfMSgpLCBzZW1hbnRpY09iamVjdC5nZXRSZWYoKSk7CisJCWZlZWRlci5maW5pc2goKTsKKwl9CisJCisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgKG5hbWU9UXVhbGlmaWVkTmFtZSAoaW1wb3J0cys9UGVyc3BlY3RpdmVJbXBvcnQqIHBlcnNwZWN0aXZlcys9UGVyc3BlY3RpdmUqKT8pCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfUGVyc3BlY3RpdmVQYWNrYWdlKEVPYmplY3QgY29udGV4dCwgUGVyc3BlY3RpdmVQYWNrYWdlIHNlbWFudGljT2JqZWN0KSB7CisJCWdlbmVyaWNTZXF1ZW5jZXIuY3JlYXRlU2VxdWVuY2UoY29udGV4dCwgc2VtYW50aWNPYmplY3QpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb25zdHJhaW50OgorCSAqICAgICAoZWxlbWVudElkPUlEIHNlbGVjdGVkRWxlbWVudD1bUGVyc3BlY3RpdmVQYXJ0fElEXT8gY29udGFpbmVyRGF0YT1TVFJJTkc/IGFjY2Vzc2liaWxpdHlQaHJhc2U9U1RSSU5HPyBlbGVtZW50cys9UGVyc3BlY3RpdmVFbGVtZW50KikKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9QZXJzcGVjdGl2ZVBhcnRTdGFjayhFT2JqZWN0IGNvbnRleHQsIFBlcnNwZWN0aXZlUGFydFN0YWNrIHNlbWFudGljT2JqZWN0KSB7CisJCWdlbmVyaWNTZXF1ZW5jZXIuY3JlYXRlU2VxdWVuY2UoY29udGV4dCwgc2VtYW50aWNPYmplY3QpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb25zdHJhaW50OgorCSAqICAgICAoCisJICogICAgICAgICBlbGVtZW50SWQ9VFJBTlNMQVRBQkxFSUQgCisJICogICAgICAgICAoZGVzY3JpcHRpb24/PSdkZXNjcmliZWQgYnknIGRlc2NyaXB0aW9uVmFsdWU9VFJBTlNMQVRBQkxFU1RSSU5HKT8gCisJICogICAgICAgICBjb250YWluZXJEYXRhPVNUUklORz8gCisJICogICAgICAgICBhY2Nlc3NpYmlsaXR5UGhyYXNlPVNUUklORz8gCisJICogICAgICAgICBpY29uVVJJPVNUUklORz8gCisJICogICAgICAgICB2aWV3PVBlcnNwZWN0aXZlVmlldz8gCisJICogICAgICAgICBpc0Nsb3NhYmxlPz0naXNDbG9zYWJsZSc/CisJICogICAgICkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9QZXJzcGVjdGl2ZVBhcnQoRU9iamVjdCBjb250ZXh0LCBQZXJzcGVjdGl2ZVBhcnQgc2VtYW50aWNPYmplY3QpIHsKKwkJZ2VuZXJpY1NlcXVlbmNlci5jcmVhdGVTZXF1ZW5jZShjb250ZXh0LCBzZW1hbnRpY09iamVjdCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgIHJlZj1bUmVwb3J0fElEXQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX1BlcnNwZWN0aXZlUmVwb3J0KEVPYmplY3QgY29udGV4dCwgUGVyc3BlY3RpdmVSZXBvcnQgc2VtYW50aWNPYmplY3QpIHsKKwkJZ2VuZXJpY1NlcXVlbmNlci5jcmVhdGVTZXF1ZW5jZShjb250ZXh0LCBzZW1hbnRpY09iamVjdCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgICgKKwkgKiAgICAgICAgIGVsZW1lbnRJZD1JRCAKKwkgKiAgICAgICAgIG9yaWVudGF0aW9uPVNhc2hPcmllbnRhdGlvbj8gCisJICogICAgICAgICBzZWxlY3RlZEVsZW1lbnQ9W1BlcnNwZWN0aXZlRWxlbWVudHxJRF0/IAorCSAqICAgICAgICAgY29udGFpbmVyRGF0YT1TVFJJTkc/IAorCSAqICAgICAgICAgYWNjZXNzaWJpbGl0eVBocmFzZT1TVFJJTkc/IAorCSAqICAgICAgICAgZWxlbWVudHMrPVBlcnNwZWN0aXZlRWxlbWVudCoKKwkgKiAgICAgKQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lcihFT2JqZWN0IGNvbnRleHQsIFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lciBzZW1hbnRpY09iamVjdCkgeworCQlnZW5lcmljU2VxdWVuY2VyLmNyZWF0ZVNlcXVlbmNlKGNvbnRleHQsIHNlbWFudGljT2JqZWN0KTsKKwl9CisJCisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgcmVmPVtUYWJsZXxJRF0KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9QZXJzcGVjdGl2ZVNlbGVjdGlvbihFT2JqZWN0IGNvbnRleHQsIFBlcnNwZWN0aXZlU2VsZWN0aW9uIHNlbWFudGljT2JqZWN0KSB7CisJCWdlbmVyaWNTZXF1ZW5jZXIuY3JlYXRlU2VxdWVuY2UoY29udGV4dCwgc2VtYW50aWNPYmplY3QpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb25zdHJhaW50OgorCSAqICAgICByZWY9W1RhYmxlfElEXQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX1BlcnNwZWN0aXZlVGFibGUoRU9iamVjdCBjb250ZXh0LCBQZXJzcGVjdGl2ZVRhYmxlIHNlbWFudGljT2JqZWN0KSB7CisJCWdlbmVyaWNTZXF1ZW5jZXIuY3JlYXRlU2VxdWVuY2UoY29udGV4dCwgc2VtYW50aWNPYmplY3QpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb25zdHJhaW50OgorCSAqICAgICByZWY9W1RvcG9sb2d5fElEXQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX1BlcnNwZWN0aXZlVG9wb2xvZ3koRU9iamVjdCBjb250ZXh0LCBQZXJzcGVjdGl2ZVRvcG9sb2d5IHNlbWFudGljT2JqZWN0KSB7CisJCWdlbmVyaWNTZXF1ZW5jZXIuY3JlYXRlU2VxdWVuY2UoY29udGV4dCwgc2VtYW50aWNPYmplY3QpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb25zdHJhaW50OgorCSAqICAgICAoCisJICogICAgICAgICBuYW1lPVRSQU5TTEFUQUJMRUlEIAorCSAqICAgICAgICAgKGRlc2NyaXB0aW9uPz0nZGVzY3JpYmVkIGJ5JyBkZXNjcmlwdGlvblZhbHVlPVRSQU5TTEFUQUJMRVNUUklORyk/IAorCSAqICAgICAgICAgKHByb2Nlc3M9W0JsaXB8SURdIHVzZXJUYXNrPVtCbGlwVXNlclRhc2t8SURdKT8gCisJICogICAgICAgICBpY29uVVJJPVNUUklORz8gCisJICogICAgICAgICBhY2Nlc3NpYmlsaXR5UGhyYXNlPVNUUklORz8gCisJICogICAgICAgICB0b29sYmFyPVtBY3Rpb25Ub29sYmFyfElEXT8gCisJICogICAgICAgICBlbGVtZW50cys9UGVyc3BlY3RpdmVFbGVtZW50KgorCSAqICAgICApCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfUGVyc3BlY3RpdmUoRU9iamVjdCBjb250ZXh0LCBQZXJzcGVjdGl2ZSBzZW1hbnRpY09iamVjdCkgeworCQlnZW5lcmljU2VxdWVuY2VyLmNyZWF0ZVNlcXVlbmNlKGNvbnRleHQsIHNlbWFudGljT2JqZWN0KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9zZXJpYWxpemVyL1BlcnNwZWN0aXZlRHNsU3ludGFjdGljU2VxdWVuY2VyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9zZXJpYWxpemVyL1BlcnNwZWN0aXZlRHNsU3ludGFjdGljU2VxdWVuY2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM0ZGMwNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3NlcmlhbGl6ZXIvUGVyc3BlY3RpdmVEc2xTeW50YWN0aWNTZXF1ZW5jZXIuamF2YQpAQCAtMCwwICsxLDE3NyBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnNlcmlhbGl6ZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5zZXJ2aWNlcy5QZXJzcGVjdGl2ZURzbEdyYW1tYXJBY2Nlc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuSUdyYW1tYXJBY2Nlc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuUnVsZUNhbGw7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQubm9kZW1vZGVsLklOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnNlcmlhbGl6ZXIuYW5hbHlzaXMuR3JhbW1hckFsaWFzLkFic3RyYWN0RWxlbWVudEFsaWFzOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnNlcmlhbGl6ZXIuYW5hbHlzaXMuR3JhbW1hckFsaWFzLkdyb3VwQWxpYXM7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuc2VyaWFsaXplci5hbmFseXNpcy5HcmFtbWFyQWxpYXMuVG9rZW5BbGlhczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5zZXJpYWxpemVyLmFuYWx5c2lzLklTeW50YWN0aWNTZXF1ZW5jZXJQREFQcm92aWRlci5JU3luTmF2aWdhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnNlcmlhbGl6ZXIuYW5hbHlzaXMuSVN5bnRhY3RpY1NlcXVlbmNlclBEQVByb3ZpZGVyLklTeW5UcmFuc2l0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnNlcmlhbGl6ZXIuc2VxdWVuY2VyLkFic3RyYWN0U3ludGFjdGljU2VxdWVuY2VyOworCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBQZXJzcGVjdGl2ZURzbFN5bnRhY3RpY1NlcXVlbmNlciBleHRlbmRzIEFic3RyYWN0U3ludGFjdGljU2VxdWVuY2VyIHsKKworCXByb3RlY3RlZCBQZXJzcGVjdGl2ZURzbEdyYW1tYXJBY2Nlc3MgZ3JhbW1hckFjY2VzczsKKwlwcm90ZWN0ZWQgQWJzdHJhY3RFbGVtZW50QWxpYXMgbWF0Y2hfUGVyc3BlY3RpdmVQYWNrYWdlX19fTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfM18wX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8zXzNfX3E7CisJcHJvdGVjdGVkIEFic3RyYWN0RWxlbWVudEFsaWFzIG1hdGNoX1hBbm5vdGF0aW9uX19fTGVmdFBhcmVudGhlc2lzS2V5d29yZF8zXzBfUmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfM18yX19xOworCXByb3RlY3RlZCBBYnN0cmFjdEVsZW1lbnRBbGlhcyBtYXRjaF9YQmxvY2tFeHByZXNzaW9uX1NlbWljb2xvbktleXdvcmRfMl8xX3E7CisJcHJvdGVjdGVkIEFic3RyYWN0RWxlbWVudEFsaWFzIG1hdGNoX1hFeHByZXNzaW9uSW5DbG9zdXJlX1NlbWljb2xvbktleXdvcmRfMV8xX3E7CisJcHJvdGVjdGVkIEFic3RyYWN0RWxlbWVudEFsaWFzIG1hdGNoX1hGdW5jdGlvblR5cGVSZWZfX19MZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzBfMF9SaWdodFBhcmVudGhlc2lzS2V5d29yZF8wXzJfX3E7CisJcHJvdGVjdGVkIEFic3RyYWN0RWxlbWVudEFsaWFzIG1hdGNoX1hJbXBvcnREZWNsYXJhdGlvbl9TZW1pY29sb25LZXl3b3JkXzJfcTsKKwlwcm90ZWN0ZWQgQWJzdHJhY3RFbGVtZW50QWxpYXMgbWF0Y2hfWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX0xlZnRQYXJlbnRoZXNpc0tleXdvcmRfMF9hOworCXByb3RlY3RlZCBBYnN0cmFjdEVsZW1lbnRBbGlhcyBtYXRjaF9YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fTGVmdFBhcmVudGhlc2lzS2V5d29yZF8wX3A7CisJCisJQEluamVjdAorCXByb3RlY3RlZCB2b2lkIGluaXQoSUdyYW1tYXJBY2Nlc3MgYWNjZXNzKSB7CisJCWdyYW1tYXJBY2Nlc3MgPSAoUGVyc3BlY3RpdmVEc2xHcmFtbWFyQWNjZXNzKSBhY2Nlc3M7CisJCW1hdGNoX1BlcnNwZWN0aXZlUGFja2FnZV9fX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzNfMF9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfM18zX19xID0gbmV3IEdyb3VwQWxpYXMoZmFsc2UsIHRydWUsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhY2thZ2VBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8zXzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXRQZXJzcGVjdGl2ZVBhY2thZ2VBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfM18zKCkpKTsKKwkJbWF0Y2hfWEFubm90YXRpb25fX19MZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzNfMF9SaWdodFBhcmVudGhlc2lzS2V5d29yZF8zXzJfX3EgPSBuZXcgR3JvdXBBbGlhcyhmYWxzZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8zXzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzNfMigpKSk7CisJCW1hdGNoX1hCbG9ja0V4cHJlc3Npb25fU2VtaWNvbG9uS2V5d29yZF8yXzFfcSA9IG5ldyBUb2tlbkFsaWFzKGZhbHNlLCB0cnVlLCBncmFtbWFyQWNjZXNzLmdldFhCbG9ja0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRTZW1pY29sb25LZXl3b3JkXzJfMSgpKTsKKwkJbWF0Y2hfWEV4cHJlc3Npb25JbkNsb3N1cmVfU2VtaWNvbG9uS2V5d29yZF8xXzFfcSA9IG5ldyBUb2tlbkFsaWFzKGZhbHNlLCB0cnVlLCBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uSW5DbG9zdXJlQWNjZXNzKCkuZ2V0U2VtaWNvbG9uS2V5d29yZF8xXzEoKSk7CisJCW1hdGNoX1hGdW5jdGlvblR5cGVSZWZfX19MZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzBfMF9SaWdodFBhcmVudGhlc2lzS2V5d29yZF8wXzJfX3EgPSBuZXcgR3JvdXBBbGlhcyhmYWxzZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZBY2Nlc3MoKS5nZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzBfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZBY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF8wXzIoKSkpOworCQltYXRjaF9YSW1wb3J0RGVjbGFyYXRpb25fU2VtaWNvbG9uS2V5d29yZF8yX3EgPSBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgdHJ1ZSwgZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRTZW1pY29sb25LZXl3b3JkXzIoKSk7CisJCW1hdGNoX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9MZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzBfYSA9IG5ldyBUb2tlbkFsaWFzKHRydWUsIHRydWUsIGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8wKCkpOworCQltYXRjaF9YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fTGVmdFBhcmVudGhlc2lzS2V5d29yZF8wX3AgPSBuZXcgVG9rZW5BbGlhcyh0cnVlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzAoKSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0VW5hc3NpZ25lZFJ1bGVDYWxsVG9rZW4oRU9iamVjdCBzZW1hbnRpY09iamVjdCwgUnVsZUNhbGwgcnVsZUNhbGwsIElOb2RlIG5vZGUpIHsKKwkJaWYocnVsZUNhbGwuZ2V0UnVsZSgpID09IGdyYW1tYXJBY2Nlc3MuZ2V0QXJyYXlCcmFja2V0c1J1bGUoKSkKKwkJCXJldHVybiBnZXRBcnJheUJyYWNrZXRzVG9rZW4oc2VtYW50aWNPYmplY3QsIHJ1bGVDYWxsLCBub2RlKTsKKwkJZWxzZSBpZihydWxlQ2FsbC5nZXRSdWxlKCkgPT0gZ3JhbW1hckFjY2Vzcy5nZXRPcFNpbmdsZUFzc2lnblJ1bGUoKSkKKwkJCXJldHVybiBnZXRPcFNpbmdsZUFzc2lnblRva2VuKHNlbWFudGljT2JqZWN0LCBydWxlQ2FsbCwgbm9kZSk7CisJCXJldHVybiAiIjsKKwl9CisJCisJLyoqCisJICogQXJyYXlCcmFja2V0cyA6CisJICogCSdbJyAnXScKKwkgKiA7CisJICovCisJcHJvdGVjdGVkIFN0cmluZyBnZXRBcnJheUJyYWNrZXRzVG9rZW4oRU9iamVjdCBzZW1hbnRpY09iamVjdCwgUnVsZUNhbGwgcnVsZUNhbGwsIElOb2RlIG5vZGUpIHsKKwkJaWYgKG5vZGUgIT0gbnVsbCkKKwkJCXJldHVybiBnZXRUb2tlblRleHQobm9kZSk7CisJCXJldHVybiAiW10iOworCX0KKwkKKwkvKioKKwkgKiBPcFNpbmdsZUFzc2lnbjoKKwkgKiAJJz0nCisJICogOworCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZ2V0T3BTaW5nbGVBc3NpZ25Ub2tlbihFT2JqZWN0IHNlbWFudGljT2JqZWN0LCBSdWxlQ2FsbCBydWxlQ2FsbCwgSU5vZGUgbm9kZSkgeworCQlpZiAobm9kZSAhPSBudWxsKQorCQkJcmV0dXJuIGdldFRva2VuVGV4dChub2RlKTsKKwkJcmV0dXJuICI9IjsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgZW1pdFVuYXNzaWduZWRUb2tlbnMoRU9iamVjdCBzZW1hbnRpY09iamVjdCwgSVN5blRyYW5zaXRpb24gdHJhbnNpdGlvbiwgSU5vZGUgZnJvbU5vZGUsIElOb2RlIHRvTm9kZSkgeworCQlpZiAodHJhbnNpdGlvbi5nZXRBbWJpZ3VvdXNTeW50YXhlcygpLmlzRW1wdHkoKSkgcmV0dXJuOworCQlMaXN0PElOb2RlPiB0cmFuc2l0aW9uTm9kZXMgPSBjb2xsZWN0Tm9kZXMoZnJvbU5vZGUsIHRvTm9kZSk7CisJCWZvciAoQWJzdHJhY3RFbGVtZW50QWxpYXMgc3ludGF4IDogdHJhbnNpdGlvbi5nZXRBbWJpZ3VvdXNTeW50YXhlcygpKSB7CisJCQlMaXN0PElOb2RlPiBzeW50YXhOb2RlcyA9IGdldE5vZGVzRm9yKHRyYW5zaXRpb25Ob2Rlcywgc3ludGF4KTsKKwkJCWlmKG1hdGNoX1BlcnNwZWN0aXZlUGFja2FnZV9fX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzNfMF9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfM18zX19xLmVxdWFscyhzeW50YXgpKQorCQkJCWVtaXRfUGVyc3BlY3RpdmVQYWNrYWdlX19fTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfM18wX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8zXzNfX3Eoc2VtYW50aWNPYmplY3QsIGdldExhc3ROYXZpZ2FibGVTdGF0ZSgpLCBzeW50YXhOb2Rlcyk7CisJCQllbHNlIGlmKG1hdGNoX1hBbm5vdGF0aW9uX19fTGVmdFBhcmVudGhlc2lzS2V5d29yZF8zXzBfUmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfM18yX19xLmVxdWFscyhzeW50YXgpKQorCQkJCWVtaXRfWEFubm90YXRpb25fX19MZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzNfMF9SaWdodFBhcmVudGhlc2lzS2V5d29yZF8zXzJfX3Eoc2VtYW50aWNPYmplY3QsIGdldExhc3ROYXZpZ2FibGVTdGF0ZSgpLCBzeW50YXhOb2Rlcyk7CisJCQllbHNlIGlmKG1hdGNoX1hCbG9ja0V4cHJlc3Npb25fU2VtaWNvbG9uS2V5d29yZF8yXzFfcS5lcXVhbHMoc3ludGF4KSkKKwkJCQllbWl0X1hCbG9ja0V4cHJlc3Npb25fU2VtaWNvbG9uS2V5d29yZF8yXzFfcShzZW1hbnRpY09iamVjdCwgZ2V0TGFzdE5hdmlnYWJsZVN0YXRlKCksIHN5bnRheE5vZGVzKTsKKwkJCWVsc2UgaWYobWF0Y2hfWEV4cHJlc3Npb25JbkNsb3N1cmVfU2VtaWNvbG9uS2V5d29yZF8xXzFfcS5lcXVhbHMoc3ludGF4KSkKKwkJCQllbWl0X1hFeHByZXNzaW9uSW5DbG9zdXJlX1NlbWljb2xvbktleXdvcmRfMV8xX3Eoc2VtYW50aWNPYmplY3QsIGdldExhc3ROYXZpZ2FibGVTdGF0ZSgpLCBzeW50YXhOb2Rlcyk7CisJCQllbHNlIGlmKG1hdGNoX1hGdW5jdGlvblR5cGVSZWZfX19MZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzBfMF9SaWdodFBhcmVudGhlc2lzS2V5d29yZF8wXzJfX3EuZXF1YWxzKHN5bnRheCkpCisJCQkJZW1pdF9YRnVuY3Rpb25UeXBlUmVmX19fTGVmdFBhcmVudGhlc2lzS2V5d29yZF8wXzBfUmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfMF8yX19xKHNlbWFudGljT2JqZWN0LCBnZXRMYXN0TmF2aWdhYmxlU3RhdGUoKSwgc3ludGF4Tm9kZXMpOworCQkJZWxzZSBpZihtYXRjaF9YSW1wb3J0RGVjbGFyYXRpb25fU2VtaWNvbG9uS2V5d29yZF8yX3EuZXF1YWxzKHN5bnRheCkpCisJCQkJZW1pdF9YSW1wb3J0RGVjbGFyYXRpb25fU2VtaWNvbG9uS2V5d29yZF8yX3Eoc2VtYW50aWNPYmplY3QsIGdldExhc3ROYXZpZ2FibGVTdGF0ZSgpLCBzeW50YXhOb2Rlcyk7CisJCQllbHNlIGlmKG1hdGNoX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9MZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzBfYS5lcXVhbHMoc3ludGF4KSkKKwkJCQllbWl0X1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9MZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzBfYShzZW1hbnRpY09iamVjdCwgZ2V0TGFzdE5hdmlnYWJsZVN0YXRlKCksIHN5bnRheE5vZGVzKTsKKwkJCWVsc2UgaWYobWF0Y2hfWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX0xlZnRQYXJlbnRoZXNpc0tleXdvcmRfMF9wLmVxdWFscyhzeW50YXgpKQorCQkJCWVtaXRfWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX0xlZnRQYXJlbnRoZXNpc0tleXdvcmRfMF9wKHNlbWFudGljT2JqZWN0LCBnZXRMYXN0TmF2aWdhYmxlU3RhdGUoKSwgc3ludGF4Tm9kZXMpOworCQkJZWxzZSBhY2NlcHROb2RlcyhnZXRMYXN0TmF2aWdhYmxlU3RhdGUoKSwgc3ludGF4Tm9kZXMpOworCQl9CisJfQorCisJLyoqCisJICogU3ludGF4OgorCSAqICAgICAoJ3snICd9Jyk/CisJICovCisJcHJvdGVjdGVkIHZvaWQgZW1pdF9QZXJzcGVjdGl2ZVBhY2thZ2VfX19MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8zXzBfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzNfM19fcShFT2JqZWN0IHNlbWFudGljT2JqZWN0LCBJU3luTmF2aWdhYmxlIHRyYW5zaXRpb24sIExpc3Q8SU5vZGU+IG5vZGVzKSB7CisJCWFjY2VwdE5vZGVzKHRyYW5zaXRpb24sIG5vZGVzKTsKKwl9CisJCisJLyoqCisJICogU3ludGF4OgorCSAqICAgICAoJygnICcpJyk/CisJICovCisJcHJvdGVjdGVkIHZvaWQgZW1pdF9YQW5ub3RhdGlvbl9fX0xlZnRQYXJlbnRoZXNpc0tleXdvcmRfM18wX1JpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzNfMl9fcShFT2JqZWN0IHNlbWFudGljT2JqZWN0LCBJU3luTmF2aWdhYmxlIHRyYW5zaXRpb24sIExpc3Q8SU5vZGU+IG5vZGVzKSB7CisJCWFjY2VwdE5vZGVzKHRyYW5zaXRpb24sIG5vZGVzKTsKKwl9CisJCisJLyoqCisJICogU3ludGF4OgorCSAqICAgICAnOyc/CisJICovCisJcHJvdGVjdGVkIHZvaWQgZW1pdF9YQmxvY2tFeHByZXNzaW9uX1NlbWljb2xvbktleXdvcmRfMl8xX3EoRU9iamVjdCBzZW1hbnRpY09iamVjdCwgSVN5bk5hdmlnYWJsZSB0cmFuc2l0aW9uLCBMaXN0PElOb2RlPiBub2RlcykgeworCQlhY2NlcHROb2Rlcyh0cmFuc2l0aW9uLCBub2Rlcyk7CisJfQorCQorCS8qKgorCSAqIFN5bnRheDoKKwkgKiAgICAgJzsnPworCSAqLworCXByb3RlY3RlZCB2b2lkIGVtaXRfWEV4cHJlc3Npb25JbkNsb3N1cmVfU2VtaWNvbG9uS2V5d29yZF8xXzFfcShFT2JqZWN0IHNlbWFudGljT2JqZWN0LCBJU3luTmF2aWdhYmxlIHRyYW5zaXRpb24sIExpc3Q8SU5vZGU+IG5vZGVzKSB7CisJCWFjY2VwdE5vZGVzKHRyYW5zaXRpb24sIG5vZGVzKTsKKwl9CisJCisJLyoqCisJICogU3ludGF4OgorCSAqICAgICAoJygnICcpJyk/CisJICovCisJcHJvdGVjdGVkIHZvaWQgZW1pdF9YRnVuY3Rpb25UeXBlUmVmX19fTGVmdFBhcmVudGhlc2lzS2V5d29yZF8wXzBfUmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfMF8yX19xKEVPYmplY3Qgc2VtYW50aWNPYmplY3QsIElTeW5OYXZpZ2FibGUgdHJhbnNpdGlvbiwgTGlzdDxJTm9kZT4gbm9kZXMpIHsKKwkJYWNjZXB0Tm9kZXModHJhbnNpdGlvbiwgbm9kZXMpOworCX0KKwkKKwkvKioKKwkgKiBTeW50YXg6CisJICogICAgICc7Jz8KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBlbWl0X1hJbXBvcnREZWNsYXJhdGlvbl9TZW1pY29sb25LZXl3b3JkXzJfcShFT2JqZWN0IHNlbWFudGljT2JqZWN0LCBJU3luTmF2aWdhYmxlIHRyYW5zaXRpb24sIExpc3Q8SU5vZGU+IG5vZGVzKSB7CisJCWFjY2VwdE5vZGVzKHRyYW5zaXRpb24sIG5vZGVzKTsKKwl9CisJCisJLyoqCisJICogU3ludGF4OgorCSAqICAgICAnKCcqCisJICovCisJcHJvdGVjdGVkIHZvaWQgZW1pdF9YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fTGVmdFBhcmVudGhlc2lzS2V5d29yZF8wX2EoRU9iamVjdCBzZW1hbnRpY09iamVjdCwgSVN5bk5hdmlnYWJsZSB0cmFuc2l0aW9uLCBMaXN0PElOb2RlPiBub2RlcykgeworCQlhY2NlcHROb2Rlcyh0cmFuc2l0aW9uLCBub2Rlcyk7CisJfQorCQorCS8qKgorCSAqIFN5bnRheDoKKwkgKiAgICAgJygnKworCSAqLworCXByb3RlY3RlZCB2b2lkIGVtaXRfWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX0xlZnRQYXJlbnRoZXNpc0tleXdvcmRfMF9wKEVPYmplY3Qgc2VtYW50aWNPYmplY3QsIElTeW5OYXZpZ2FibGUgdHJhbnNpdGlvbiwgTGlzdDxJTm9kZT4gbm9kZXMpIHsKKwkJYWNjZXB0Tm9kZXModHJhbnNpdGlvbiwgbm9kZXMpOworCX0KKwkKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3NlcnZpY2VzL1BlcnNwZWN0aXZlRHNsR3JhbW1hckFjY2Vzcy5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvc2VydmljZXMvUGVyc3BlY3RpdmVEc2xHcmFtbWFyQWNjZXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIxZGMzNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3NlcnZpY2VzL1BlcnNwZWN0aXZlRHNsR3JhbW1hckFjY2Vzcy5qYXZhCkBAIC0wLDAgKzEsMjM2NCBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnNlcnZpY2VzOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5zZXJ2aWNlLkdyYW1tYXJQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5zZXJ2aWNlLkFic3RyYWN0RWxlbWVudEZpbmRlci4qOworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuYW5ub3RhdGlvbnMuc2VydmljZXMuWGJhc2VXaXRoQW5ub3RhdGlvbnNHcmFtbWFyQWNjZXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnNlcnZpY2VzLlhiYXNlR3JhbW1hckFjY2VzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5zZXJ2aWNlcy5YdHlwZUdyYW1tYXJBY2Nlc3M7CisKK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBQZXJzcGVjdGl2ZURzbEdyYW1tYXJBY2Nlc3MgZXh0ZW5kcyBBYnN0cmFjdEdyYW1tYXJFbGVtZW50RmluZGVyIHsKKwkKKwkKKwlwdWJsaWMgY2xhc3MgUGVyc3BlY3RpdmVNb2RlbEVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJQZXJzcGVjdGl2ZU1vZGVsIik7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjUGFja2FnZXNBc3NpZ25tZW50ID0gKEFzc2lnbm1lbnQpcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1BhY2thZ2VzUGVyc3BlY3RpdmVQYWNrYWdlUGFyc2VyUnVsZUNhbGxfMCA9IChSdWxlQ2FsbCljUGFja2FnZXNBc3NpZ25tZW50LmVDb250ZW50cygpLmdldCgwKTsKKwkJCisJCS8vUGVyc3BlY3RpdmVNb2RlbDoKKwkJLy8JcGFja2FnZXMrPVBlcnNwZWN0aXZlUGFja2FnZSo7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy9wYWNrYWdlcys9UGVyc3BlY3RpdmVQYWNrYWdlKgorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRQYWNrYWdlc0Fzc2lnbm1lbnQoKSB7IHJldHVybiBjUGFja2FnZXNBc3NpZ25tZW50OyB9CisKKwkJLy9QZXJzcGVjdGl2ZVBhY2thZ2UKKwkJcHVibGljIFJ1bGVDYWxsIGdldFBhY2thZ2VzUGVyc3BlY3RpdmVQYWNrYWdlUGFyc2VyUnVsZUNhbGxfMCgpIHsgcmV0dXJuIGNQYWNrYWdlc1BlcnNwZWN0aXZlUGFja2FnZVBhcnNlclJ1bGVDYWxsXzA7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgUGVyc3BlY3RpdmVQYWNrYWdlRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlBlcnNwZWN0aXZlUGFja2FnZSIpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cCA9IChHcm91cClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBY3Rpb24gY1BlcnNwZWN0aXZlUGFja2FnZUFjdGlvbl8wID0gKEFjdGlvbiljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1BhY2thZ2VLZXl3b3JkXzEgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY05hbWVBc3NpZ25tZW50XzIgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNOYW1lUXVhbGlmaWVkTmFtZVBhcnNlclJ1bGVDYWxsXzJfMCA9IChSdWxlQ2FsbCljTmFtZUFzc2lnbm1lbnRfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzMgPSAoR3JvdXApY0dyb3VwLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8zXzAgPSAoS2V5d29yZCljR3JvdXBfMy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjSW1wb3J0c0Fzc2lnbm1lbnRfM18xID0gKEFzc2lnbm1lbnQpY0dyb3VwXzMuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNJbXBvcnRzUGVyc3BlY3RpdmVJbXBvcnRQYXJzZXJSdWxlQ2FsbF8zXzFfMCA9IChSdWxlQ2FsbCljSW1wb3J0c0Fzc2lnbm1lbnRfM18xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNQZXJzcGVjdGl2ZXNBc3NpZ25tZW50XzNfMiA9IChBc3NpZ25tZW50KWNHcm91cF8zLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUGVyc3BlY3RpdmVzUGVyc3BlY3RpdmVQYXJzZXJSdWxlQ2FsbF8zXzJfMCA9IChSdWxlQ2FsbCljUGVyc3BlY3RpdmVzQXNzaWdubWVudF8zXzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8zXzMgPSAoS2V5d29yZCljR3JvdXBfMy5lQ29udGVudHMoKS5nZXQoMyk7CisJCQorCQkvL1BlcnNwZWN0aXZlUGFja2FnZToKKwkJLy8Je1BlcnNwZWN0aXZlUGFja2FnZX0gInBhY2thZ2UiIG5hbWU9UXVhbGlmaWVkTmFtZSAoInsiIGltcG9ydHMrPVBlcnNwZWN0aXZlSW1wb3J0KiBwZXJzcGVjdGl2ZXMrPVBlcnNwZWN0aXZlKiAifSIpPzsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL3tQZXJzcGVjdGl2ZVBhY2thZ2V9ICJwYWNrYWdlIiBuYW1lPVF1YWxpZmllZE5hbWUgKCJ7IiBpbXBvcnRzKz1QZXJzcGVjdGl2ZUltcG9ydCogcGVyc3BlY3RpdmVzKz1QZXJzcGVjdGl2ZSogIn0iKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwKCkgeyByZXR1cm4gY0dyb3VwOyB9CisKKwkJLy97UGVyc3BlY3RpdmVQYWNrYWdlfQorCQlwdWJsaWMgQWN0aW9uIGdldFBlcnNwZWN0aXZlUGFja2FnZUFjdGlvbl8wKCkgeyByZXR1cm4gY1BlcnNwZWN0aXZlUGFja2FnZUFjdGlvbl8wOyB9CisKKwkJLy8icGFja2FnZSIKKwkJcHVibGljIEtleXdvcmQgZ2V0UGFja2FnZUtleXdvcmRfMSgpIHsgcmV0dXJuIGNQYWNrYWdlS2V5d29yZF8xOyB9CisKKwkJLy9uYW1lPVF1YWxpZmllZE5hbWUKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0TmFtZUFzc2lnbm1lbnRfMigpIHsgcmV0dXJuIGNOYW1lQXNzaWdubWVudF8yOyB9CisKKwkJLy9RdWFsaWZpZWROYW1lCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXROYW1lUXVhbGlmaWVkTmFtZVBhcnNlclJ1bGVDYWxsXzJfMCgpIHsgcmV0dXJuIGNOYW1lUXVhbGlmaWVkTmFtZVBhcnNlclJ1bGVDYWxsXzJfMDsgfQorCisJCS8vKCJ7IiBpbXBvcnRzKz1QZXJzcGVjdGl2ZUltcG9ydCogcGVyc3BlY3RpdmVzKz1QZXJzcGVjdGl2ZSogIn0iKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzMoKSB7IHJldHVybiBjR3JvdXBfMzsgfQorCisJCS8vInsiCisJCXB1YmxpYyBLZXl3b3JkIGdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzNfMCgpIHsgcmV0dXJuIGNMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8zXzA7IH0KKworCQkvL2ltcG9ydHMrPVBlcnNwZWN0aXZlSW1wb3J0KgorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRJbXBvcnRzQXNzaWdubWVudF8zXzEoKSB7IHJldHVybiBjSW1wb3J0c0Fzc2lnbm1lbnRfM18xOyB9CisKKwkJLy9QZXJzcGVjdGl2ZUltcG9ydAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0SW1wb3J0c1BlcnNwZWN0aXZlSW1wb3J0UGFyc2VyUnVsZUNhbGxfM18xXzAoKSB7IHJldHVybiBjSW1wb3J0c1BlcnNwZWN0aXZlSW1wb3J0UGFyc2VyUnVsZUNhbGxfM18xXzA7IH0KKworCQkvL3BlcnNwZWN0aXZlcys9UGVyc3BlY3RpdmUqCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFBlcnNwZWN0aXZlc0Fzc2lnbm1lbnRfM18yKCkgeyByZXR1cm4gY1BlcnNwZWN0aXZlc0Fzc2lnbm1lbnRfM18yOyB9CisKKwkJLy9QZXJzcGVjdGl2ZQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0UGVyc3BlY3RpdmVzUGVyc3BlY3RpdmVQYXJzZXJSdWxlQ2FsbF8zXzJfMCgpIHsgcmV0dXJuIGNQZXJzcGVjdGl2ZXNQZXJzcGVjdGl2ZVBhcnNlclJ1bGVDYWxsXzNfMl8wOyB9CisKKwkJLy8ifSIKKwkJcHVibGljIEtleXdvcmQgZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzNfMygpIHsgcmV0dXJuIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfM18zOyB9CisJfQorCisJcHVibGljIGNsYXNzIFBlcnNwZWN0aXZlSW1wb3J0RWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlBlcnNwZWN0aXZlSW1wb3J0Iik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0ltcG9ydEtleXdvcmRfMCA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjSW1wb3J0ZWROYW1lc3BhY2VBc3NpZ25tZW50XzEgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNJbXBvcnRlZE5hbWVzcGFjZVBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZFBhcnNlclJ1bGVDYWxsXzFfMCA9IChSdWxlQ2FsbCljSW1wb3J0ZWROYW1lc3BhY2VBc3NpZ25tZW50XzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQkKKwkJLy9QZXJzcGVjdGl2ZUltcG9ydCByZXR1cm5zIHR5cGVzOjpMSW1wb3J0OgorCQkvLwkiaW1wb3J0IiBpbXBvcnRlZE5hbWVzcGFjZT1QZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQ7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy8iaW1wb3J0IiBpbXBvcnRlZE5hbWVzcGFjZT1QZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQKKwkJcHVibGljIEdyb3VwIGdldEdyb3VwKCkgeyByZXR1cm4gY0dyb3VwOyB9CisKKwkJLy8iaW1wb3J0IgorCQlwdWJsaWMgS2V5d29yZCBnZXRJbXBvcnRLZXl3b3JkXzAoKSB7IHJldHVybiBjSW1wb3J0S2V5d29yZF8wOyB9CisKKwkJLy9pbXBvcnRlZE5hbWVzcGFjZT1QZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0SW1wb3J0ZWROYW1lc3BhY2VBc3NpZ25tZW50XzEoKSB7IHJldHVybiBjSW1wb3J0ZWROYW1lc3BhY2VBc3NpZ25tZW50XzE7IH0KKworCQkvL1BlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0SW1wb3J0ZWROYW1lc3BhY2VQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRQYXJzZXJSdWxlQ2FsbF8xXzAoKSB7IHJldHVybiBjSW1wb3J0ZWROYW1lc3BhY2VQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRQYXJzZXJSdWxlQ2FsbF8xXzA7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgUGVyc3BlY3RpdmVFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiUGVyc3BlY3RpdmUiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQWN0aW9uIGNQZXJzcGVjdGl2ZUFjdGlvbl8wID0gKEFjdGlvbiljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1BlcnNwZWN0aXZlS2V5d29yZF8xID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNOYW1lQXNzaWdubWVudF8yID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjTmFtZVRSQU5TTEFUQUJMRUlEUGFyc2VyUnVsZUNhbGxfMl8wID0gKFJ1bGVDYWxsKWNOYW1lQXNzaWdubWVudF8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfMyA9IChHcm91cCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0Rlc2NyaXB0aW9uQXNzaWdubWVudF8zXzAgPSAoQXNzaWdubWVudCljR3JvdXBfMy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjRGVzY3JpcHRpb25EZXNjcmliZWRCeUtleXdvcmRfM18wXzAgPSAoS2V5d29yZCljRGVzY3JpcHRpb25Bc3NpZ25tZW50XzNfMC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjRGVzY3JpcHRpb25WYWx1ZUFzc2lnbm1lbnRfM18xID0gKEFzc2lnbm1lbnQpY0dyb3VwXzMuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNEZXNjcmlwdGlvblZhbHVlVFJBTlNMQVRBQkxFU1RSSU5HUGFyc2VyUnVsZUNhbGxfM18xXzAgPSAoUnVsZUNhbGwpY0Rlc2NyaXB0aW9uVmFsdWVBc3NpZ25tZW50XzNfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzQgPSAoR3JvdXApY0dyb3VwLmVDb250ZW50cygpLmdldCg0KTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNQcm9jZXNzS2V5d29yZF80XzAgPSAoS2V5d29yZCljR3JvdXBfNC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjUHJvY2Vzc0Fzc2lnbm1lbnRfNF8xID0gKEFzc2lnbm1lbnQpY0dyb3VwXzQuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIENyb3NzUmVmZXJlbmNlIGNQcm9jZXNzQmxpcENyb3NzUmVmZXJlbmNlXzRfMV8wID0gKENyb3NzUmVmZXJlbmNlKWNQcm9jZXNzQXNzaWdubWVudF80XzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNQcm9jZXNzQmxpcElEVGVybWluYWxSdWxlQ2FsbF80XzFfMF8xID0gKFJ1bGVDYWxsKWNQcm9jZXNzQmxpcENyb3NzUmVmZXJlbmNlXzRfMV8wLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNVc2VydGFza0tleXdvcmRfNF8yID0gKEtleXdvcmQpY0dyb3VwXzQuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1VzZXJUYXNrQXNzaWdubWVudF80XzMgPSAoQXNzaWdubWVudCljR3JvdXBfNC5lQ29udGVudHMoKS5nZXQoMyk7CisJCXByaXZhdGUgZmluYWwgQ3Jvc3NSZWZlcmVuY2UgY1VzZXJUYXNrQmxpcFVzZXJUYXNrQ3Jvc3NSZWZlcmVuY2VfNF8zXzAgPSAoQ3Jvc3NSZWZlcmVuY2UpY1VzZXJUYXNrQXNzaWdubWVudF80XzMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNVc2VyVGFza0JsaXBVc2VyVGFza0lEVGVybWluYWxSdWxlQ2FsbF80XzNfMF8xID0gKFJ1bGVDYWxsKWNVc2VyVGFza0JsaXBVc2VyVGFza0Nyb3NzUmVmZXJlbmNlXzRfM18wLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBVbm9yZGVyZWRHcm91cCBjVW5vcmRlcmVkR3JvdXBfNSA9IChVbm9yZGVyZWRHcm91cCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDUpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF81XzAgPSAoR3JvdXApY1Vub3JkZXJlZEdyb3VwXzUuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0ljb25VUklLZXl3b3JkXzVfMF8wID0gKEtleXdvcmQpY0dyb3VwXzVfMC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjSWNvblVSSUFzc2lnbm1lbnRfNV8wXzEgPSAoQXNzaWdubWVudCljR3JvdXBfNV8wLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjSWNvblVSSVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfNV8wXzFfMCA9IChSdWxlQ2FsbCljSWNvblVSSUFzc2lnbm1lbnRfNV8wXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF81XzEgPSAoR3JvdXApY1Vub3JkZXJlZEdyb3VwXzUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0FjY2Vzc2liaWxpdHlLZXl3b3JkXzVfMV8wID0gKEtleXdvcmQpY0dyb3VwXzVfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjQWNjZXNzaWJpbGl0eVBocmFzZUFzc2lnbm1lbnRfNV8xXzEgPSAoQXNzaWdubWVudCljR3JvdXBfNV8xLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjQWNjZXNzaWJpbGl0eVBocmFzZVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfNV8xXzFfMCA9IChSdWxlQ2FsbCljQWNjZXNzaWJpbGl0eVBocmFzZUFzc2lnbm1lbnRfNV8xXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF81XzIgPSAoR3JvdXApY1Vub3JkZXJlZEdyb3VwXzUuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1Rvb2xiYXJLZXl3b3JkXzVfMl8wID0gKEtleXdvcmQpY0dyb3VwXzVfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjVG9vbGJhckFzc2lnbm1lbnRfNV8yXzEgPSAoQXNzaWdubWVudCljR3JvdXBfNV8yLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBDcm9zc1JlZmVyZW5jZSBjVG9vbGJhckFjdGlvblRvb2xiYXJDcm9zc1JlZmVyZW5jZV81XzJfMV8wID0gKENyb3NzUmVmZXJlbmNlKWNUb29sYmFyQXNzaWdubWVudF81XzJfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1Rvb2xiYXJBY3Rpb25Ub29sYmFySURUZXJtaW5hbFJ1bGVDYWxsXzVfMl8xXzBfMSA9IChSdWxlQ2FsbCljVG9vbGJhckFjdGlvblRvb2xiYXJDcm9zc1JlZmVyZW5jZV81XzJfMV8wLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF82ID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCg2KTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNFbGVtZW50c0Fzc2lnbm1lbnRfNyA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoNyk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0VsZW1lbnRzUGVyc3BlY3RpdmVFbGVtZW50UGFyc2VyUnVsZUNhbGxfN18wID0gKFJ1bGVDYWxsKWNFbGVtZW50c0Fzc2lnbm1lbnRfNy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzggPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDgpOworCQkKKwkJLy9QZXJzcGVjdGl2ZToKKwkJLy8Je1BlcnNwZWN0aXZlfSAicGVyc3BlY3RpdmUiIG5hbWU9VFJBTlNMQVRBQkxFSUQgKGRlc2NyaXB0aW9uPz0iZGVzY3JpYmVkIGJ5IiBkZXNjcmlwdGlvblZhbHVlPVRSQU5TTEFUQUJMRVNUUklORyk/CisJCS8vCSgicHJvY2VzcyIgcHJvY2Vzcz1bYmxpcDo6QmxpcF0gInVzZXJ0YXNrIiB1c2VyVGFzaz1bYmxpcDo6QmxpcFVzZXJUYXNrXSk/ICgoImljb25VUkkiIGljb25VUkk9U1RSSU5HKT8gJgorCQkvLwkoImFjY2Vzc2liaWxpdHkiIGFjY2Vzc2liaWxpdHlQaHJhc2U9U1RSSU5HKT8gJiAoInRvb2xiYXIiIHRvb2xiYXI9W2FjdGlvbjo6QWN0aW9uVG9vbGJhcl0pPykgInsiCisJCS8vCWVsZW1lbnRzKz1QZXJzcGVjdGl2ZUVsZW1lbnQqICJ9IjsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL3tQZXJzcGVjdGl2ZX0gInBlcnNwZWN0aXZlIiBuYW1lPVRSQU5TTEFUQUJMRUlEIChkZXNjcmlwdGlvbj89ImRlc2NyaWJlZCBieSIgZGVzY3JpcHRpb25WYWx1ZT1UUkFOU0xBVEFCTEVTVFJJTkcpPworCQkvLygicHJvY2VzcyIgcHJvY2Vzcz1bYmxpcDo6QmxpcF0gInVzZXJ0YXNrIiB1c2VyVGFzaz1bYmxpcDo6QmxpcFVzZXJUYXNrXSk/ICgoImljb25VUkkiIGljb25VUkk9U1RSSU5HKT8gJgorCQkvLygiYWNjZXNzaWJpbGl0eSIgYWNjZXNzaWJpbGl0eVBocmFzZT1TVFJJTkcpPyAmICgidG9vbGJhciIgdG9vbGJhcj1bYWN0aW9uOjpBY3Rpb25Ub29sYmFyXSk/KSAieyIKKwkJLy9lbGVtZW50cys9UGVyc3BlY3RpdmVFbGVtZW50KiAifSIKKwkJcHVibGljIEdyb3VwIGdldEdyb3VwKCkgeyByZXR1cm4gY0dyb3VwOyB9CisKKwkJLy97UGVyc3BlY3RpdmV9CisJCXB1YmxpYyBBY3Rpb24gZ2V0UGVyc3BlY3RpdmVBY3Rpb25fMCgpIHsgcmV0dXJuIGNQZXJzcGVjdGl2ZUFjdGlvbl8wOyB9CisKKwkJLy8icGVyc3BlY3RpdmUiCisJCXB1YmxpYyBLZXl3b3JkIGdldFBlcnNwZWN0aXZlS2V5d29yZF8xKCkgeyByZXR1cm4gY1BlcnNwZWN0aXZlS2V5d29yZF8xOyB9CisKKwkJLy9uYW1lPVRSQU5TTEFUQUJMRUlECisJCXB1YmxpYyBBc3NpZ25tZW50IGdldE5hbWVBc3NpZ25tZW50XzIoKSB7IHJldHVybiBjTmFtZUFzc2lnbm1lbnRfMjsgfQorCisJCS8vVFJBTlNMQVRBQkxFSUQKKwkJcHVibGljIFJ1bGVDYWxsIGdldE5hbWVUUkFOU0xBVEFCTEVJRFBhcnNlclJ1bGVDYWxsXzJfMCgpIHsgcmV0dXJuIGNOYW1lVFJBTlNMQVRBQkxFSURQYXJzZXJSdWxlQ2FsbF8yXzA7IH0KKworCQkvLyhkZXNjcmlwdGlvbj89ImRlc2NyaWJlZCBieSIgZGVzY3JpcHRpb25WYWx1ZT1UUkFOU0xBVEFCTEVTVFJJTkcpPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfMygpIHsgcmV0dXJuIGNHcm91cF8zOyB9CisKKwkJLy9kZXNjcmlwdGlvbj89ImRlc2NyaWJlZCBieSIKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0RGVzY3JpcHRpb25Bc3NpZ25tZW50XzNfMCgpIHsgcmV0dXJuIGNEZXNjcmlwdGlvbkFzc2lnbm1lbnRfM18wOyB9CisKKwkJLy8iZGVzY3JpYmVkIGJ5IgorCQlwdWJsaWMgS2V5d29yZCBnZXREZXNjcmlwdGlvbkRlc2NyaWJlZEJ5S2V5d29yZF8zXzBfMCgpIHsgcmV0dXJuIGNEZXNjcmlwdGlvbkRlc2NyaWJlZEJ5S2V5d29yZF8zXzBfMDsgfQorCisJCS8vZGVzY3JpcHRpb25WYWx1ZT1UUkFOU0xBVEFCTEVTVFJJTkcKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0RGVzY3JpcHRpb25WYWx1ZUFzc2lnbm1lbnRfM18xKCkgeyByZXR1cm4gY0Rlc2NyaXB0aW9uVmFsdWVBc3NpZ25tZW50XzNfMTsgfQorCisJCS8vVFJBTlNMQVRBQkxFU1RSSU5HCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXREZXNjcmlwdGlvblZhbHVlVFJBTlNMQVRBQkxFU1RSSU5HUGFyc2VyUnVsZUNhbGxfM18xXzAoKSB7IHJldHVybiBjRGVzY3JpcHRpb25WYWx1ZVRSQU5TTEFUQUJMRVNUUklOR1BhcnNlclJ1bGVDYWxsXzNfMV8wOyB9CisKKwkJLy8oInByb2Nlc3MiIHByb2Nlc3M9W2JsaXA6OkJsaXBdICJ1c2VydGFzayIgdXNlclRhc2s9W2JsaXA6OkJsaXBVc2VyVGFza10pPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfNCgpIHsgcmV0dXJuIGNHcm91cF80OyB9CisKKwkJLy8icHJvY2VzcyIKKwkJcHVibGljIEtleXdvcmQgZ2V0UHJvY2Vzc0tleXdvcmRfNF8wKCkgeyByZXR1cm4gY1Byb2Nlc3NLZXl3b3JkXzRfMDsgfQorCisJCS8vcHJvY2Vzcz1bYmxpcDo6QmxpcF0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0UHJvY2Vzc0Fzc2lnbm1lbnRfNF8xKCkgeyByZXR1cm4gY1Byb2Nlc3NBc3NpZ25tZW50XzRfMTsgfQorCisJCS8vW2JsaXA6OkJsaXBdCisJCXB1YmxpYyBDcm9zc1JlZmVyZW5jZSBnZXRQcm9jZXNzQmxpcENyb3NzUmVmZXJlbmNlXzRfMV8wKCkgeyByZXR1cm4gY1Byb2Nlc3NCbGlwQ3Jvc3NSZWZlcmVuY2VfNF8xXzA7IH0KKworCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRQcm9jZXNzQmxpcElEVGVybWluYWxSdWxlQ2FsbF80XzFfMF8xKCkgeyByZXR1cm4gY1Byb2Nlc3NCbGlwSURUZXJtaW5hbFJ1bGVDYWxsXzRfMV8wXzE7IH0KKworCQkvLyJ1c2VydGFzayIKKwkJcHVibGljIEtleXdvcmQgZ2V0VXNlcnRhc2tLZXl3b3JkXzRfMigpIHsgcmV0dXJuIGNVc2VydGFza0tleXdvcmRfNF8yOyB9CisKKwkJLy91c2VyVGFzaz1bYmxpcDo6QmxpcFVzZXJUYXNrXQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRVc2VyVGFza0Fzc2lnbm1lbnRfNF8zKCkgeyByZXR1cm4gY1VzZXJUYXNrQXNzaWdubWVudF80XzM7IH0KKworCQkvL1tibGlwOjpCbGlwVXNlclRhc2tdCisJCXB1YmxpYyBDcm9zc1JlZmVyZW5jZSBnZXRVc2VyVGFza0JsaXBVc2VyVGFza0Nyb3NzUmVmZXJlbmNlXzRfM18wKCkgeyByZXR1cm4gY1VzZXJUYXNrQmxpcFVzZXJUYXNrQ3Jvc3NSZWZlcmVuY2VfNF8zXzA7IH0KKworCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRVc2VyVGFza0JsaXBVc2VyVGFza0lEVGVybWluYWxSdWxlQ2FsbF80XzNfMF8xKCkgeyByZXR1cm4gY1VzZXJUYXNrQmxpcFVzZXJUYXNrSURUZXJtaW5hbFJ1bGVDYWxsXzRfM18wXzE7IH0KKworCQkvLygiaWNvblVSSSIgaWNvblVSST1TVFJJTkcpPyAmICgiYWNjZXNzaWJpbGl0eSIgYWNjZXNzaWJpbGl0eVBocmFzZT1TVFJJTkcpPyAmICgidG9vbGJhciIKKwkJLy90b29sYmFyPVthY3Rpb246OkFjdGlvblRvb2xiYXJdKT8KKwkJcHVibGljIFVub3JkZXJlZEdyb3VwIGdldFVub3JkZXJlZEdyb3VwXzUoKSB7IHJldHVybiBjVW5vcmRlcmVkR3JvdXBfNTsgfQorCisJCS8vKCJpY29uVVJJIiBpY29uVVJJPVNUUklORyk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF81XzAoKSB7IHJldHVybiBjR3JvdXBfNV8wOyB9CisKKwkJLy8iaWNvblVSSSIKKwkJcHVibGljIEtleXdvcmQgZ2V0SWNvblVSSUtleXdvcmRfNV8wXzAoKSB7IHJldHVybiBjSWNvblVSSUtleXdvcmRfNV8wXzA7IH0KKworCQkvL2ljb25VUkk9U1RSSU5HCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEljb25VUklBc3NpZ25tZW50XzVfMF8xKCkgeyByZXR1cm4gY0ljb25VUklBc3NpZ25tZW50XzVfMF8xOyB9CisKKwkJLy9TVFJJTkcKKwkJcHVibGljIFJ1bGVDYWxsIGdldEljb25VUklTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzVfMF8xXzAoKSB7IHJldHVybiBjSWNvblVSSVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfNV8wXzFfMDsgfQorCisJCS8vKCJhY2Nlc3NpYmlsaXR5IiBhY2Nlc3NpYmlsaXR5UGhyYXNlPVNUUklORyk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF81XzEoKSB7IHJldHVybiBjR3JvdXBfNV8xOyB9CisKKwkJLy8iYWNjZXNzaWJpbGl0eSIKKwkJcHVibGljIEtleXdvcmQgZ2V0QWNjZXNzaWJpbGl0eUtleXdvcmRfNV8xXzAoKSB7IHJldHVybiBjQWNjZXNzaWJpbGl0eUtleXdvcmRfNV8xXzA7IH0KKworCQkvL2FjY2Vzc2liaWxpdHlQaHJhc2U9U1RSSU5HCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEFjY2Vzc2liaWxpdHlQaHJhc2VBc3NpZ25tZW50XzVfMV8xKCkgeyByZXR1cm4gY0FjY2Vzc2liaWxpdHlQaHJhc2VBc3NpZ25tZW50XzVfMV8xOyB9CisKKwkJLy9TVFJJTkcKKwkJcHVibGljIFJ1bGVDYWxsIGdldEFjY2Vzc2liaWxpdHlQaHJhc2VTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzVfMV8xXzAoKSB7IHJldHVybiBjQWNjZXNzaWJpbGl0eVBocmFzZVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfNV8xXzFfMDsgfQorCisJCS8vKCJ0b29sYmFyIiB0b29sYmFyPVthY3Rpb246OkFjdGlvblRvb2xiYXJdKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzVfMigpIHsgcmV0dXJuIGNHcm91cF81XzI7IH0KKworCQkvLyJ0b29sYmFyIgorCQlwdWJsaWMgS2V5d29yZCBnZXRUb29sYmFyS2V5d29yZF81XzJfMCgpIHsgcmV0dXJuIGNUb29sYmFyS2V5d29yZF81XzJfMDsgfQorCisJCS8vdG9vbGJhcj1bYWN0aW9uOjpBY3Rpb25Ub29sYmFyXQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRUb29sYmFyQXNzaWdubWVudF81XzJfMSgpIHsgcmV0dXJuIGNUb29sYmFyQXNzaWdubWVudF81XzJfMTsgfQorCisJCS8vW2FjdGlvbjo6QWN0aW9uVG9vbGJhcl0KKwkJcHVibGljIENyb3NzUmVmZXJlbmNlIGdldFRvb2xiYXJBY3Rpb25Ub29sYmFyQ3Jvc3NSZWZlcmVuY2VfNV8yXzFfMCgpIHsgcmV0dXJuIGNUb29sYmFyQWN0aW9uVG9vbGJhckNyb3NzUmVmZXJlbmNlXzVfMl8xXzA7IH0KKworCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRUb29sYmFyQWN0aW9uVG9vbGJhcklEVGVybWluYWxSdWxlQ2FsbF81XzJfMV8wXzEoKSB7IHJldHVybiBjVG9vbGJhckFjdGlvblRvb2xiYXJJRFRlcm1pbmFsUnVsZUNhbGxfNV8yXzFfMF8xOyB9CisKKwkJLy8ieyIKKwkJcHVibGljIEtleXdvcmQgZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfNigpIHsgcmV0dXJuIGNMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF82OyB9CisKKwkJLy9lbGVtZW50cys9UGVyc3BlY3RpdmVFbGVtZW50KgorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRFbGVtZW50c0Fzc2lnbm1lbnRfNygpIHsgcmV0dXJuIGNFbGVtZW50c0Fzc2lnbm1lbnRfNzsgfQorCisJCS8vUGVyc3BlY3RpdmVFbGVtZW50CisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRFbGVtZW50c1BlcnNwZWN0aXZlRWxlbWVudFBhcnNlclJ1bGVDYWxsXzdfMCgpIHsgcmV0dXJuIGNFbGVtZW50c1BlcnNwZWN0aXZlRWxlbWVudFBhcnNlclJ1bGVDYWxsXzdfMDsgfQorCisJCS8vIn0iCisJCXB1YmxpYyBLZXl3b3JkIGdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF84KCkgeyByZXR1cm4gY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF84OyB9CisJfQorCisJcHVibGljIGNsYXNzIFBlcnNwZWN0aXZlRWxlbWVudEVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJQZXJzcGVjdGl2ZUVsZW1lbnQiKTsKKwkJcHJpdmF0ZSBmaW5hbCBBbHRlcm5hdGl2ZXMgY0FsdGVybmF0aXZlcyA9IChBbHRlcm5hdGl2ZXMpcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lclBhcnNlclJ1bGVDYWxsXzAgPSAoUnVsZUNhbGwpY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1BlcnNwZWN0aXZlUGFydFN0YWNrUGFyc2VyUnVsZUNhbGxfMSA9IChSdWxlQ2FsbCljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUGVyc3BlY3RpdmVQYXJ0UGFyc2VyUnVsZUNhbGxfMiA9IChSdWxlQ2FsbCljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgyKTsKKwkJCisJCS8vUGVyc3BlY3RpdmVFbGVtZW50OgorCQkvLwlQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIgfCBQZXJzcGVjdGl2ZVBhcnRTdGFjayB8IFBlcnNwZWN0aXZlUGFydDsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lciB8IFBlcnNwZWN0aXZlUGFydFN0YWNrIHwgUGVyc3BlY3RpdmVQYXJ0CisJCXB1YmxpYyBBbHRlcm5hdGl2ZXMgZ2V0QWx0ZXJuYXRpdmVzKCkgeyByZXR1cm4gY0FsdGVybmF0aXZlczsgfQorCisJCS8vUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJQYXJzZXJSdWxlQ2FsbF8wKCkgeyByZXR1cm4gY1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lclBhcnNlclJ1bGVDYWxsXzA7IH0KKworCQkvL1BlcnNwZWN0aXZlUGFydFN0YWNrCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRQZXJzcGVjdGl2ZVBhcnRTdGFja1BhcnNlclJ1bGVDYWxsXzEoKSB7IHJldHVybiBjUGVyc3BlY3RpdmVQYXJ0U3RhY2tQYXJzZXJSdWxlQ2FsbF8xOyB9CisKKwkJLy9QZXJzcGVjdGl2ZVBhcnQKKwkJcHVibGljIFJ1bGVDYWxsIGdldFBlcnNwZWN0aXZlUGFydFBhcnNlclJ1bGVDYWxsXzIoKSB7IHJldHVybiBjUGVyc3BlY3RpdmVQYXJ0UGFyc2VyUnVsZUNhbGxfMjsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyIik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFjdGlvbiBjUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyQWN0aW9uXzAgPSAoQWN0aW9uKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjU2FzaENvbnRhaW5lcktleXdvcmRfMSA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjRWxlbWVudElkQXNzaWdubWVudF8yID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjRWxlbWVudElkSURUZXJtaW5hbFJ1bGVDYWxsXzJfMCA9IChSdWxlQ2FsbCljRWxlbWVudElkQXNzaWdubWVudF8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBVbm9yZGVyZWRHcm91cCBjVW5vcmRlcmVkR3JvdXBfMyA9IChVbm9yZGVyZWRHcm91cCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF8zXzAgPSAoR3JvdXApY1Vub3JkZXJlZEdyb3VwXzMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY09yaWVudGF0aW9uS2V5d29yZF8zXzBfMCA9IChLZXl3b3JkKWNHcm91cF8zXzAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY09yaWVudGF0aW9uQXNzaWdubWVudF8zXzBfMSA9IChBc3NpZ25tZW50KWNHcm91cF8zXzAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNPcmllbnRhdGlvblNhc2hPcmllbnRhdGlvbkVudW1SdWxlQ2FsbF8zXzBfMV8wID0gKFJ1bGVDYWxsKWNPcmllbnRhdGlvbkFzc2lnbm1lbnRfM18wXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF8zXzEgPSAoR3JvdXApY1Vub3JkZXJlZEdyb3VwXzMuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1NlbGVjdGVkRWxlbWVudEtleXdvcmRfM18xXzAgPSAoS2V5d29yZCljR3JvdXBfM18xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNTZWxlY3RlZEVsZW1lbnRBc3NpZ25tZW50XzNfMV8xID0gKEFzc2lnbm1lbnQpY0dyb3VwXzNfMS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQ3Jvc3NSZWZlcmVuY2UgY1NlbGVjdGVkRWxlbWVudFBlcnNwZWN0aXZlRWxlbWVudENyb3NzUmVmZXJlbmNlXzNfMV8xXzAgPSAoQ3Jvc3NSZWZlcmVuY2UpY1NlbGVjdGVkRWxlbWVudEFzc2lnbm1lbnRfM18xXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNTZWxlY3RlZEVsZW1lbnRQZXJzcGVjdGl2ZUVsZW1lbnRJRFRlcm1pbmFsUnVsZUNhbGxfM18xXzFfMF8xID0gKFJ1bGVDYWxsKWNTZWxlY3RlZEVsZW1lbnRQZXJzcGVjdGl2ZUVsZW1lbnRDcm9zc1JlZmVyZW5jZV8zXzFfMV8wLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfM18yID0gKEdyb3VwKWNVbm9yZGVyZWRHcm91cF8zLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNTcGFjZVZvbHVtZUtleXdvcmRfM18yXzAgPSAoS2V5d29yZCljR3JvdXBfM18yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNDb250YWluZXJEYXRhQXNzaWdubWVudF8zXzJfMSA9IChBc3NpZ25tZW50KWNHcm91cF8zXzIuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNDb250YWluZXJEYXRhU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8zXzJfMV8wID0gKFJ1bGVDYWxsKWNDb250YWluZXJEYXRhQXNzaWdubWVudF8zXzJfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzNfMyA9IChHcm91cCljVW5vcmRlcmVkR3JvdXBfMy5lQ29udGVudHMoKS5nZXQoMyk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjQWNjZXNzaWJpbGl0eUtleXdvcmRfM18zXzAgPSAoS2V5d29yZCljR3JvdXBfM18zLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNBY2Nlc3NpYmlsaXR5UGhyYXNlQXNzaWdubWVudF8zXzNfMSA9IChBc3NpZ25tZW50KWNHcm91cF8zXzMuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNBY2Nlc3NpYmlsaXR5UGhyYXNlU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8zXzNfMV8wID0gKFJ1bGVDYWxsKWNBY2Nlc3NpYmlsaXR5UGhyYXNlQXNzaWdubWVudF8zXzNfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfNCA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoNCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjRWxlbWVudHNBc3NpZ25tZW50XzUgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDUpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNFbGVtZW50c1BlcnNwZWN0aXZlRWxlbWVudFBhcnNlclJ1bGVDYWxsXzVfMCA9IChSdWxlQ2FsbCljRWxlbWVudHNBc3NpZ25tZW50XzUuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF82ID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCg2KTsKKwkJCisJCS8vUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyOgorCQkvLwl7UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyfSAic2FzaENvbnRhaW5lciIgZWxlbWVudElkPUlEICgoIm9yaWVudGF0aW9uIiBvcmllbnRhdGlvbj1TYXNoT3JpZW50YXRpb24pPyAmCisJCS8vCSgic2VsZWN0ZWRFbGVtZW50IiBzZWxlY3RlZEVsZW1lbnQ9W1BlcnNwZWN0aXZlRWxlbWVudF0pPyAmICgic3BhY2VWb2x1bWUiIGNvbnRhaW5lckRhdGE9U1RSSU5HKT8gJiAoImFjY2Vzc2liaWxpdHkiCisJCS8vCWFjY2Vzc2liaWxpdHlQaHJhc2U9U1RSSU5HKT8pICJ7IiBlbGVtZW50cys9UGVyc3BlY3RpdmVFbGVtZW50KiAifSI7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy97UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyfSAic2FzaENvbnRhaW5lciIgZWxlbWVudElkPUlEICgoIm9yaWVudGF0aW9uIiBvcmllbnRhdGlvbj1TYXNoT3JpZW50YXRpb24pPyAmCisJCS8vKCJzZWxlY3RlZEVsZW1lbnQiIHNlbGVjdGVkRWxlbWVudD1bUGVyc3BlY3RpdmVFbGVtZW50XSk/ICYgKCJzcGFjZVZvbHVtZSIgY29udGFpbmVyRGF0YT1TVFJJTkcpPyAmICgiYWNjZXNzaWJpbGl0eSIKKwkJLy9hY2Nlc3NpYmlsaXR5UGhyYXNlPVNUUklORyk/KSAieyIgZWxlbWVudHMrPVBlcnNwZWN0aXZlRWxlbWVudCogIn0iCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8ve1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lcn0KKwkJcHVibGljIEFjdGlvbiBnZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY3Rpb25fMCgpIHsgcmV0dXJuIGNQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY3Rpb25fMDsgfQorCisJCS8vInNhc2hDb250YWluZXIiCisJCXB1YmxpYyBLZXl3b3JkIGdldFNhc2hDb250YWluZXJLZXl3b3JkXzEoKSB7IHJldHVybiBjU2FzaENvbnRhaW5lcktleXdvcmRfMTsgfQorCisJCS8vZWxlbWVudElkPUlECisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEVsZW1lbnRJZEFzc2lnbm1lbnRfMigpIHsgcmV0dXJuIGNFbGVtZW50SWRBc3NpZ25tZW50XzI7IH0KKworCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRFbGVtZW50SWRJRFRlcm1pbmFsUnVsZUNhbGxfMl8wKCkgeyByZXR1cm4gY0VsZW1lbnRJZElEVGVybWluYWxSdWxlQ2FsbF8yXzA7IH0KKworCQkvLygib3JpZW50YXRpb24iIG9yaWVudGF0aW9uPVNhc2hPcmllbnRhdGlvbik/ICYgKCJzZWxlY3RlZEVsZW1lbnQiIHNlbGVjdGVkRWxlbWVudD1bUGVyc3BlY3RpdmVFbGVtZW50XSk/ICYKKwkJLy8oInNwYWNlVm9sdW1lIiBjb250YWluZXJEYXRhPVNUUklORyk/ICYgKCJhY2Nlc3NpYmlsaXR5IiBhY2Nlc3NpYmlsaXR5UGhyYXNlPVNUUklORyk/CisJCXB1YmxpYyBVbm9yZGVyZWRHcm91cCBnZXRVbm9yZGVyZWRHcm91cF8zKCkgeyByZXR1cm4gY1Vub3JkZXJlZEdyb3VwXzM7IH0KKworCQkvLygib3JpZW50YXRpb24iIG9yaWVudGF0aW9uPVNhc2hPcmllbnRhdGlvbik/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF8zXzAoKSB7IHJldHVybiBjR3JvdXBfM18wOyB9CisKKwkJLy8ib3JpZW50YXRpb24iCisJCXB1YmxpYyBLZXl3b3JkIGdldE9yaWVudGF0aW9uS2V5d29yZF8zXzBfMCgpIHsgcmV0dXJuIGNPcmllbnRhdGlvbktleXdvcmRfM18wXzA7IH0KKworCQkvL29yaWVudGF0aW9uPVNhc2hPcmllbnRhdGlvbgorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRPcmllbnRhdGlvbkFzc2lnbm1lbnRfM18wXzEoKSB7IHJldHVybiBjT3JpZW50YXRpb25Bc3NpZ25tZW50XzNfMF8xOyB9CisKKwkJLy9TYXNoT3JpZW50YXRpb24KKwkJcHVibGljIFJ1bGVDYWxsIGdldE9yaWVudGF0aW9uU2FzaE9yaWVudGF0aW9uRW51bVJ1bGVDYWxsXzNfMF8xXzAoKSB7IHJldHVybiBjT3JpZW50YXRpb25TYXNoT3JpZW50YXRpb25FbnVtUnVsZUNhbGxfM18wXzFfMDsgfQorCisJCS8vKCJzZWxlY3RlZEVsZW1lbnQiIHNlbGVjdGVkRWxlbWVudD1bUGVyc3BlY3RpdmVFbGVtZW50XSk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF8zXzEoKSB7IHJldHVybiBjR3JvdXBfM18xOyB9CisKKwkJLy8ic2VsZWN0ZWRFbGVtZW50IgorCQlwdWJsaWMgS2V5d29yZCBnZXRTZWxlY3RlZEVsZW1lbnRLZXl3b3JkXzNfMV8wKCkgeyByZXR1cm4gY1NlbGVjdGVkRWxlbWVudEtleXdvcmRfM18xXzA7IH0KKworCQkvL3NlbGVjdGVkRWxlbWVudD1bUGVyc3BlY3RpdmVFbGVtZW50XQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRTZWxlY3RlZEVsZW1lbnRBc3NpZ25tZW50XzNfMV8xKCkgeyByZXR1cm4gY1NlbGVjdGVkRWxlbWVudEFzc2lnbm1lbnRfM18xXzE7IH0KKworCQkvL1tQZXJzcGVjdGl2ZUVsZW1lbnRdCisJCXB1YmxpYyBDcm9zc1JlZmVyZW5jZSBnZXRTZWxlY3RlZEVsZW1lbnRQZXJzcGVjdGl2ZUVsZW1lbnRDcm9zc1JlZmVyZW5jZV8zXzFfMV8wKCkgeyByZXR1cm4gY1NlbGVjdGVkRWxlbWVudFBlcnNwZWN0aXZlRWxlbWVudENyb3NzUmVmZXJlbmNlXzNfMV8xXzA7IH0KKworCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRTZWxlY3RlZEVsZW1lbnRQZXJzcGVjdGl2ZUVsZW1lbnRJRFRlcm1pbmFsUnVsZUNhbGxfM18xXzFfMF8xKCkgeyByZXR1cm4gY1NlbGVjdGVkRWxlbWVudFBlcnNwZWN0aXZlRWxlbWVudElEVGVybWluYWxSdWxlQ2FsbF8zXzFfMV8wXzE7IH0KKworCQkvLygic3BhY2VWb2x1bWUiIGNvbnRhaW5lckRhdGE9U1RSSU5HKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzNfMigpIHsgcmV0dXJuIGNHcm91cF8zXzI7IH0KKworCQkvLyJzcGFjZVZvbHVtZSIKKwkJcHVibGljIEtleXdvcmQgZ2V0U3BhY2VWb2x1bWVLZXl3b3JkXzNfMl8wKCkgeyByZXR1cm4gY1NwYWNlVm9sdW1lS2V5d29yZF8zXzJfMDsgfQorCisJCS8vY29udGFpbmVyRGF0YT1TVFJJTkcKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0Q29udGFpbmVyRGF0YUFzc2lnbm1lbnRfM18yXzEoKSB7IHJldHVybiBjQ29udGFpbmVyRGF0YUFzc2lnbm1lbnRfM18yXzE7IH0KKworCQkvL1NUUklORworCQlwdWJsaWMgUnVsZUNhbGwgZ2V0Q29udGFpbmVyRGF0YVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfM18yXzFfMCgpIHsgcmV0dXJuIGNDb250YWluZXJEYXRhU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8zXzJfMV8wOyB9CisKKwkJLy8oImFjY2Vzc2liaWxpdHkiIGFjY2Vzc2liaWxpdHlQaHJhc2U9U1RSSU5HKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzNfMygpIHsgcmV0dXJuIGNHcm91cF8zXzM7IH0KKworCQkvLyJhY2Nlc3NpYmlsaXR5IgorCQlwdWJsaWMgS2V5d29yZCBnZXRBY2Nlc3NpYmlsaXR5S2V5d29yZF8zXzNfMCgpIHsgcmV0dXJuIGNBY2Nlc3NpYmlsaXR5S2V5d29yZF8zXzNfMDsgfQorCisJCS8vYWNjZXNzaWJpbGl0eVBocmFzZT1TVFJJTkcKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0QWNjZXNzaWJpbGl0eVBocmFzZUFzc2lnbm1lbnRfM18zXzEoKSB7IHJldHVybiBjQWNjZXNzaWJpbGl0eVBocmFzZUFzc2lnbm1lbnRfM18zXzE7IH0KKworCQkvL1NUUklORworCQlwdWJsaWMgUnVsZUNhbGwgZ2V0QWNjZXNzaWJpbGl0eVBocmFzZVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfM18zXzFfMCgpIHsgcmV0dXJuIGNBY2Nlc3NpYmlsaXR5UGhyYXNlU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8zXzNfMV8wOyB9CisKKwkJLy8ieyIKKwkJcHVibGljIEtleXdvcmQgZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfNCgpIHsgcmV0dXJuIGNMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF80OyB9CisKKwkJLy9lbGVtZW50cys9UGVyc3BlY3RpdmVFbGVtZW50KgorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRFbGVtZW50c0Fzc2lnbm1lbnRfNSgpIHsgcmV0dXJuIGNFbGVtZW50c0Fzc2lnbm1lbnRfNTsgfQorCisJCS8vUGVyc3BlY3RpdmVFbGVtZW50CisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRFbGVtZW50c1BlcnNwZWN0aXZlRWxlbWVudFBhcnNlclJ1bGVDYWxsXzVfMCgpIHsgcmV0dXJuIGNFbGVtZW50c1BlcnNwZWN0aXZlRWxlbWVudFBhcnNlclJ1bGVDYWxsXzVfMDsgfQorCisJCS8vIn0iCisJCXB1YmxpYyBLZXl3b3JkIGdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF82KCkgeyByZXR1cm4gY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF82OyB9CisJfQorCisJcHVibGljIGNsYXNzIFBlcnNwZWN0aXZlUGFydFN0YWNrRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlBlcnNwZWN0aXZlUGFydFN0YWNrIik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFjdGlvbiBjUGVyc3BlY3RpdmVQYXJ0U3RhY2tBY3Rpb25fMCA9IChBY3Rpb24pY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNQYXJ0U3RhY2tLZXl3b3JkXzEgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0VsZW1lbnRJZEFzc2lnbm1lbnRfMiA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0VsZW1lbnRJZElEVGVybWluYWxSdWxlQ2FsbF8yXzAgPSAoUnVsZUNhbGwpY0VsZW1lbnRJZEFzc2lnbm1lbnRfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgVW5vcmRlcmVkR3JvdXAgY1Vub3JkZXJlZEdyb3VwXzMgPSAoVW5vcmRlcmVkR3JvdXApY0dyb3VwLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfM18wID0gKEdyb3VwKWNVbm9yZGVyZWRHcm91cF8zLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNTZWxlY3RlZEVsZW1lbnRLZXl3b3JkXzNfMF8wID0gKEtleXdvcmQpY0dyb3VwXzNfMC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjU2VsZWN0ZWRFbGVtZW50QXNzaWdubWVudF8zXzBfMSA9IChBc3NpZ25tZW50KWNHcm91cF8zXzAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIENyb3NzUmVmZXJlbmNlIGNTZWxlY3RlZEVsZW1lbnRQZXJzcGVjdGl2ZVBhcnRDcm9zc1JlZmVyZW5jZV8zXzBfMV8wID0gKENyb3NzUmVmZXJlbmNlKWNTZWxlY3RlZEVsZW1lbnRBc3NpZ25tZW50XzNfMF8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjU2VsZWN0ZWRFbGVtZW50UGVyc3BlY3RpdmVQYXJ0SURUZXJtaW5hbFJ1bGVDYWxsXzNfMF8xXzBfMSA9IChSdWxlQ2FsbCljU2VsZWN0ZWRFbGVtZW50UGVyc3BlY3RpdmVQYXJ0Q3Jvc3NSZWZlcmVuY2VfM18wXzFfMC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzNfMSA9IChHcm91cCljVW5vcmRlcmVkR3JvdXBfMy5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjU3BhY2VWb2x1bWVLZXl3b3JkXzNfMV8wID0gKEtleXdvcmQpY0dyb3VwXzNfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjQ29udGFpbmVyRGF0YUFzc2lnbm1lbnRfM18xXzEgPSAoQXNzaWdubWVudCljR3JvdXBfM18xLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjQ29udGFpbmVyRGF0YVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfM18xXzFfMCA9IChSdWxlQ2FsbCljQ29udGFpbmVyRGF0YUFzc2lnbm1lbnRfM18xXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF8zXzIgPSAoR3JvdXApY1Vub3JkZXJlZEdyb3VwXzMuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0FjY2Vzc2liaWxpdHlLZXl3b3JkXzNfMl8wID0gKEtleXdvcmQpY0dyb3VwXzNfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjQWNjZXNzaWJpbGl0eVBocmFzZUFzc2lnbm1lbnRfM18yXzEgPSAoQXNzaWdubWVudCljR3JvdXBfM18yLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjQWNjZXNzaWJpbGl0eVBocmFzZVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfM18yXzFfMCA9IChSdWxlQ2FsbCljQWNjZXNzaWJpbGl0eVBocmFzZUFzc2lnbm1lbnRfM18yXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzQgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDQpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0VsZW1lbnRzQXNzaWdubWVudF81ID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCg1KTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjRWxlbWVudHNQZXJzcGVjdGl2ZUVsZW1lbnRQYXJzZXJSdWxlQ2FsbF81XzAgPSAoUnVsZUNhbGwpY0VsZW1lbnRzQXNzaWdubWVudF81LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNiA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoNik7CisJCQorCQkvL1BlcnNwZWN0aXZlUGFydFN0YWNrOgorCQkvLwl7UGVyc3BlY3RpdmVQYXJ0U3RhY2t9ICJwYXJ0U3RhY2siIGVsZW1lbnRJZD1JRCAoKCJzZWxlY3RlZEVsZW1lbnQiIHNlbGVjdGVkRWxlbWVudD1bUGVyc3BlY3RpdmVQYXJ0XSk/ICYKKwkJLy8JKCJzcGFjZVZvbHVtZSIgY29udGFpbmVyRGF0YT1TVFJJTkcpPyAmICgiYWNjZXNzaWJpbGl0eSIgYWNjZXNzaWJpbGl0eVBocmFzZT1TVFJJTkcpPykgInsiCisJCS8vCWVsZW1lbnRzKz1QZXJzcGVjdGl2ZUVsZW1lbnQqICJ9IjsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL3tQZXJzcGVjdGl2ZVBhcnRTdGFja30gInBhcnRTdGFjayIgZWxlbWVudElkPUlEICgoInNlbGVjdGVkRWxlbWVudCIgc2VsZWN0ZWRFbGVtZW50PVtQZXJzcGVjdGl2ZVBhcnRdKT8gJiAoInNwYWNlVm9sdW1lIgorCQkvL2NvbnRhaW5lckRhdGE9U1RSSU5HKT8gJiAoImFjY2Vzc2liaWxpdHkiIGFjY2Vzc2liaWxpdHlQaHJhc2U9U1RSSU5HKT8pICJ7IiBlbGVtZW50cys9UGVyc3BlY3RpdmVFbGVtZW50KiAifSIKKwkJcHVibGljIEdyb3VwIGdldEdyb3VwKCkgeyByZXR1cm4gY0dyb3VwOyB9CisKKwkJLy97UGVyc3BlY3RpdmVQYXJ0U3RhY2t9CisJCXB1YmxpYyBBY3Rpb24gZ2V0UGVyc3BlY3RpdmVQYXJ0U3RhY2tBY3Rpb25fMCgpIHsgcmV0dXJuIGNQZXJzcGVjdGl2ZVBhcnRTdGFja0FjdGlvbl8wOyB9CisKKwkJLy8icGFydFN0YWNrIgorCQlwdWJsaWMgS2V5d29yZCBnZXRQYXJ0U3RhY2tLZXl3b3JkXzEoKSB7IHJldHVybiBjUGFydFN0YWNrS2V5d29yZF8xOyB9CisKKwkJLy9lbGVtZW50SWQ9SUQKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0RWxlbWVudElkQXNzaWdubWVudF8yKCkgeyByZXR1cm4gY0VsZW1lbnRJZEFzc2lnbm1lbnRfMjsgfQorCisJCS8vSUQKKwkJcHVibGljIFJ1bGVDYWxsIGdldEVsZW1lbnRJZElEVGVybWluYWxSdWxlQ2FsbF8yXzAoKSB7IHJldHVybiBjRWxlbWVudElkSURUZXJtaW5hbFJ1bGVDYWxsXzJfMDsgfQorCisJCS8vKCJzZWxlY3RlZEVsZW1lbnQiIHNlbGVjdGVkRWxlbWVudD1bUGVyc3BlY3RpdmVQYXJ0XSk/ICYgKCJzcGFjZVZvbHVtZSIgY29udGFpbmVyRGF0YT1TVFJJTkcpPyAmICgiYWNjZXNzaWJpbGl0eSIKKwkJLy9hY2Nlc3NpYmlsaXR5UGhyYXNlPVNUUklORyk/CisJCXB1YmxpYyBVbm9yZGVyZWRHcm91cCBnZXRVbm9yZGVyZWRHcm91cF8zKCkgeyByZXR1cm4gY1Vub3JkZXJlZEdyb3VwXzM7IH0KKworCQkvLygic2VsZWN0ZWRFbGVtZW50IiBzZWxlY3RlZEVsZW1lbnQ9W1BlcnNwZWN0aXZlUGFydF0pPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfM18wKCkgeyByZXR1cm4gY0dyb3VwXzNfMDsgfQorCisJCS8vInNlbGVjdGVkRWxlbWVudCIKKwkJcHVibGljIEtleXdvcmQgZ2V0U2VsZWN0ZWRFbGVtZW50S2V5d29yZF8zXzBfMCgpIHsgcmV0dXJuIGNTZWxlY3RlZEVsZW1lbnRLZXl3b3JkXzNfMF8wOyB9CisKKwkJLy9zZWxlY3RlZEVsZW1lbnQ9W1BlcnNwZWN0aXZlUGFydF0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0U2VsZWN0ZWRFbGVtZW50QXNzaWdubWVudF8zXzBfMSgpIHsgcmV0dXJuIGNTZWxlY3RlZEVsZW1lbnRBc3NpZ25tZW50XzNfMF8xOyB9CisKKwkJLy9bUGVyc3BlY3RpdmVQYXJ0XQorCQlwdWJsaWMgQ3Jvc3NSZWZlcmVuY2UgZ2V0U2VsZWN0ZWRFbGVtZW50UGVyc3BlY3RpdmVQYXJ0Q3Jvc3NSZWZlcmVuY2VfM18wXzFfMCgpIHsgcmV0dXJuIGNTZWxlY3RlZEVsZW1lbnRQZXJzcGVjdGl2ZVBhcnRDcm9zc1JlZmVyZW5jZV8zXzBfMV8wOyB9CisKKwkJLy9JRAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0U2VsZWN0ZWRFbGVtZW50UGVyc3BlY3RpdmVQYXJ0SURUZXJtaW5hbFJ1bGVDYWxsXzNfMF8xXzBfMSgpIHsgcmV0dXJuIGNTZWxlY3RlZEVsZW1lbnRQZXJzcGVjdGl2ZVBhcnRJRFRlcm1pbmFsUnVsZUNhbGxfM18wXzFfMF8xOyB9CisKKwkJLy8oInNwYWNlVm9sdW1lIiBjb250YWluZXJEYXRhPVNUUklORyk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF8zXzEoKSB7IHJldHVybiBjR3JvdXBfM18xOyB9CisKKwkJLy8ic3BhY2VWb2x1bWUiCisJCXB1YmxpYyBLZXl3b3JkIGdldFNwYWNlVm9sdW1lS2V5d29yZF8zXzFfMCgpIHsgcmV0dXJuIGNTcGFjZVZvbHVtZUtleXdvcmRfM18xXzA7IH0KKworCQkvL2NvbnRhaW5lckRhdGE9U1RSSU5HCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldENvbnRhaW5lckRhdGFBc3NpZ25tZW50XzNfMV8xKCkgeyByZXR1cm4gY0NvbnRhaW5lckRhdGFBc3NpZ25tZW50XzNfMV8xOyB9CisKKwkJLy9TVFJJTkcKKwkJcHVibGljIFJ1bGVDYWxsIGdldENvbnRhaW5lckRhdGFTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzNfMV8xXzAoKSB7IHJldHVybiBjQ29udGFpbmVyRGF0YVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfM18xXzFfMDsgfQorCisJCS8vKCJhY2Nlc3NpYmlsaXR5IiBhY2Nlc3NpYmlsaXR5UGhyYXNlPVNUUklORyk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF8zXzIoKSB7IHJldHVybiBjR3JvdXBfM18yOyB9CisKKwkJLy8iYWNjZXNzaWJpbGl0eSIKKwkJcHVibGljIEtleXdvcmQgZ2V0QWNjZXNzaWJpbGl0eUtleXdvcmRfM18yXzAoKSB7IHJldHVybiBjQWNjZXNzaWJpbGl0eUtleXdvcmRfM18yXzA7IH0KKworCQkvL2FjY2Vzc2liaWxpdHlQaHJhc2U9U1RSSU5HCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEFjY2Vzc2liaWxpdHlQaHJhc2VBc3NpZ25tZW50XzNfMl8xKCkgeyByZXR1cm4gY0FjY2Vzc2liaWxpdHlQaHJhc2VBc3NpZ25tZW50XzNfMl8xOyB9CisKKwkJLy9TVFJJTkcKKwkJcHVibGljIFJ1bGVDYWxsIGdldEFjY2Vzc2liaWxpdHlQaHJhc2VTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzNfMl8xXzAoKSB7IHJldHVybiBjQWNjZXNzaWJpbGl0eVBocmFzZVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfM18yXzFfMDsgfQorCisJCS8vInsiCisJCXB1YmxpYyBLZXl3b3JkIGdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzQoKSB7IHJldHVybiBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfNDsgfQorCisJCS8vZWxlbWVudHMrPVBlcnNwZWN0aXZlRWxlbWVudCoKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0RWxlbWVudHNBc3NpZ25tZW50XzUoKSB7IHJldHVybiBjRWxlbWVudHNBc3NpZ25tZW50XzU7IH0KKworCQkvL1BlcnNwZWN0aXZlRWxlbWVudAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0RWxlbWVudHNQZXJzcGVjdGl2ZUVsZW1lbnRQYXJzZXJSdWxlQ2FsbF81XzAoKSB7IHJldHVybiBjRWxlbWVudHNQZXJzcGVjdGl2ZUVsZW1lbnRQYXJzZXJSdWxlQ2FsbF81XzA7IH0KKworCQkvLyJ9IgorCQlwdWJsaWMgS2V5d29yZCBnZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNigpIHsgcmV0dXJuIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNjsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBQZXJzcGVjdGl2ZVBhcnRFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiUGVyc3BlY3RpdmVQYXJ0Iik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFjdGlvbiBjUGVyc3BlY3RpdmVQYXJ0QWN0aW9uXzAgPSAoQWN0aW9uKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjUGFydEtleXdvcmRfMSA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjRWxlbWVudElkQXNzaWdubWVudF8yID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjRWxlbWVudElkVFJBTlNMQVRBQkxFSURQYXJzZXJSdWxlQ2FsbF8yXzAgPSAoUnVsZUNhbGwpY0VsZW1lbnRJZEFzc2lnbm1lbnRfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgVW5vcmRlcmVkR3JvdXAgY1Vub3JkZXJlZEdyb3VwXzMgPSAoVW5vcmRlcmVkR3JvdXApY0dyb3VwLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfM18wID0gKEdyb3VwKWNVbm9yZGVyZWRHcm91cF8zLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNEZXNjcmlwdGlvbkFzc2lnbm1lbnRfM18wXzAgPSAoQXNzaWdubWVudCljR3JvdXBfM18wLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNEZXNjcmlwdGlvbkRlc2NyaWJlZEJ5S2V5d29yZF8zXzBfMF8wID0gKEtleXdvcmQpY0Rlc2NyaXB0aW9uQXNzaWdubWVudF8zXzBfMC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjRGVzY3JpcHRpb25WYWx1ZUFzc2lnbm1lbnRfM18wXzEgPSAoQXNzaWdubWVudCljR3JvdXBfM18wLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjRGVzY3JpcHRpb25WYWx1ZVRSQU5TTEFUQUJMRVNUUklOR1BhcnNlclJ1bGVDYWxsXzNfMF8xXzAgPSAoUnVsZUNhbGwpY0Rlc2NyaXB0aW9uVmFsdWVBc3NpZ25tZW50XzNfMF8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfM18xID0gKEdyb3VwKWNVbm9yZGVyZWRHcm91cF8zLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNTcGFjZVZvbHVtZUtleXdvcmRfM18xXzAgPSAoS2V5d29yZCljR3JvdXBfM18xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNDb250YWluZXJEYXRhQXNzaWdubWVudF8zXzFfMSA9IChBc3NpZ25tZW50KWNHcm91cF8zXzEuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNDb250YWluZXJEYXRhU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8zXzFfMV8wID0gKFJ1bGVDYWxsKWNDb250YWluZXJEYXRhQXNzaWdubWVudF8zXzFfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzNfMiA9IChHcm91cCljVW5vcmRlcmVkR3JvdXBfMy5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjQWNjZXNzaWJpbGl0eUtleXdvcmRfM18yXzAgPSAoS2V5d29yZCljR3JvdXBfM18yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNBY2Nlc3NpYmlsaXR5UGhyYXNlQXNzaWdubWVudF8zXzJfMSA9IChBc3NpZ25tZW50KWNHcm91cF8zXzIuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNBY2Nlc3NpYmlsaXR5UGhyYXNlU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8zXzJfMV8wID0gKFJ1bGVDYWxsKWNBY2Nlc3NpYmlsaXR5UGhyYXNlQXNzaWdubWVudF8zXzJfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzNfMyA9IChHcm91cCljVW5vcmRlcmVkR3JvdXBfMy5lQ29udGVudHMoKS5nZXQoMyk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjSWNvblVSSUtleXdvcmRfM18zXzAgPSAoS2V5d29yZCljR3JvdXBfM18zLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNJY29uVVJJQXNzaWdubWVudF8zXzNfMSA9IChBc3NpZ25tZW50KWNHcm91cF8zXzMuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNJY29uVVJJU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8zXzNfMV8wID0gKFJ1bGVDYWxsKWNJY29uVVJJQXNzaWdubWVudF8zXzNfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzNfNCA9IChHcm91cCljVW5vcmRlcmVkR3JvdXBfMy5lQ29udGVudHMoKS5nZXQoNCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjVmlld0tleXdvcmRfM180XzAgPSAoS2V5d29yZCljR3JvdXBfM180LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNWaWV3QXNzaWdubWVudF8zXzRfMSA9IChBc3NpZ25tZW50KWNHcm91cF8zXzQuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNWaWV3UGVyc3BlY3RpdmVWaWV3UGFyc2VyUnVsZUNhbGxfM180XzFfMCA9IChSdWxlQ2FsbCljVmlld0Fzc2lnbm1lbnRfM180XzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0lzQ2xvc2FibGVBc3NpZ25tZW50XzNfNSA9IChBc3NpZ25tZW50KWNVbm9yZGVyZWRHcm91cF8zLmVDb250ZW50cygpLmdldCg1KTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNJc0Nsb3NhYmxlSXNDbG9zYWJsZUtleXdvcmRfM181XzAgPSAoS2V5d29yZCljSXNDbG9zYWJsZUFzc2lnbm1lbnRfM181LmVDb250ZW50cygpLmdldCgwKTsKKwkJCisJCS8vUGVyc3BlY3RpdmVQYXJ0OgorCQkvLwl7UGVyc3BlY3RpdmVQYXJ0fSAicGFydCIgZWxlbWVudElkPVRSQU5TTEFUQUJMRUlEICgoZGVzY3JpcHRpb24/PSJkZXNjcmliZWQgYnkiIGRlc2NyaXB0aW9uVmFsdWU9VFJBTlNMQVRBQkxFU1RSSU5HKT8KKwkJLy8JJiAoInNwYWNlVm9sdW1lIiBjb250YWluZXJEYXRhPVNUUklORyk/ICYgKCJhY2Nlc3NpYmlsaXR5IiBhY2Nlc3NpYmlsaXR5UGhyYXNlPVNUUklORyk/ICYgKCJpY29uVVJJIiBpY29uVVJJPVNUUklORyk/CisJCS8vCSYgKCJ2aWV3IiB2aWV3PVBlcnNwZWN0aXZlVmlldyk/ICYgaXNDbG9zYWJsZT89ImlzQ2xvc2FibGUiPyk7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy97UGVyc3BlY3RpdmVQYXJ0fSAicGFydCIgZWxlbWVudElkPVRSQU5TTEFUQUJMRUlEICgoZGVzY3JpcHRpb24/PSJkZXNjcmliZWQgYnkiIGRlc2NyaXB0aW9uVmFsdWU9VFJBTlNMQVRBQkxFU1RSSU5HKT8gJgorCQkvLygic3BhY2VWb2x1bWUiIGNvbnRhaW5lckRhdGE9U1RSSU5HKT8gJiAoImFjY2Vzc2liaWxpdHkiIGFjY2Vzc2liaWxpdHlQaHJhc2U9U1RSSU5HKT8gJiAoImljb25VUkkiIGljb25VUkk9U1RSSU5HKT8gJgorCQkvLygidmlldyIgdmlldz1QZXJzcGVjdGl2ZVZpZXcpPyAmIGlzQ2xvc2FibGU/PSJpc0Nsb3NhYmxlIj8pCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8ve1BlcnNwZWN0aXZlUGFydH0KKwkJcHVibGljIEFjdGlvbiBnZXRQZXJzcGVjdGl2ZVBhcnRBY3Rpb25fMCgpIHsgcmV0dXJuIGNQZXJzcGVjdGl2ZVBhcnRBY3Rpb25fMDsgfQorCisJCS8vInBhcnQiCisJCXB1YmxpYyBLZXl3b3JkIGdldFBhcnRLZXl3b3JkXzEoKSB7IHJldHVybiBjUGFydEtleXdvcmRfMTsgfQorCisJCS8vZWxlbWVudElkPVRSQU5TTEFUQUJMRUlECisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEVsZW1lbnRJZEFzc2lnbm1lbnRfMigpIHsgcmV0dXJuIGNFbGVtZW50SWRBc3NpZ25tZW50XzI7IH0KKworCQkvL1RSQU5TTEFUQUJMRUlECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRFbGVtZW50SWRUUkFOU0xBVEFCTEVJRFBhcnNlclJ1bGVDYWxsXzJfMCgpIHsgcmV0dXJuIGNFbGVtZW50SWRUUkFOU0xBVEFCTEVJRFBhcnNlclJ1bGVDYWxsXzJfMDsgfQorCisJCS8vKGRlc2NyaXB0aW9uPz0iZGVzY3JpYmVkIGJ5IiBkZXNjcmlwdGlvblZhbHVlPVRSQU5TTEFUQUJMRVNUUklORyk/ICYgKCJzcGFjZVZvbHVtZSIgY29udGFpbmVyRGF0YT1TVFJJTkcpPyAmCisJCS8vKCJhY2Nlc3NpYmlsaXR5IiBhY2Nlc3NpYmlsaXR5UGhyYXNlPVNUUklORyk/ICYgKCJpY29uVVJJIiBpY29uVVJJPVNUUklORyk/ICYgKCJ2aWV3IiB2aWV3PVBlcnNwZWN0aXZlVmlldyk/ICYKKwkJLy9pc0Nsb3NhYmxlPz0iaXNDbG9zYWJsZSI/CisJCXB1YmxpYyBVbm9yZGVyZWRHcm91cCBnZXRVbm9yZGVyZWRHcm91cF8zKCkgeyByZXR1cm4gY1Vub3JkZXJlZEdyb3VwXzM7IH0KKworCQkvLyhkZXNjcmlwdGlvbj89ImRlc2NyaWJlZCBieSIgZGVzY3JpcHRpb25WYWx1ZT1UUkFOU0xBVEFCTEVTVFJJTkcpPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfM18wKCkgeyByZXR1cm4gY0dyb3VwXzNfMDsgfQorCisJCS8vZGVzY3JpcHRpb24/PSJkZXNjcmliZWQgYnkiCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldERlc2NyaXB0aW9uQXNzaWdubWVudF8zXzBfMCgpIHsgcmV0dXJuIGNEZXNjcmlwdGlvbkFzc2lnbm1lbnRfM18wXzA7IH0KKworCQkvLyJkZXNjcmliZWQgYnkiCisJCXB1YmxpYyBLZXl3b3JkIGdldERlc2NyaXB0aW9uRGVzY3JpYmVkQnlLZXl3b3JkXzNfMF8wXzAoKSB7IHJldHVybiBjRGVzY3JpcHRpb25EZXNjcmliZWRCeUtleXdvcmRfM18wXzBfMDsgfQorCisJCS8vZGVzY3JpcHRpb25WYWx1ZT1UUkFOU0xBVEFCTEVTVFJJTkcKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0RGVzY3JpcHRpb25WYWx1ZUFzc2lnbm1lbnRfM18wXzEoKSB7IHJldHVybiBjRGVzY3JpcHRpb25WYWx1ZUFzc2lnbm1lbnRfM18wXzE7IH0KKworCQkvL1RSQU5TTEFUQUJMRVNUUklORworCQlwdWJsaWMgUnVsZUNhbGwgZ2V0RGVzY3JpcHRpb25WYWx1ZVRSQU5TTEFUQUJMRVNUUklOR1BhcnNlclJ1bGVDYWxsXzNfMF8xXzAoKSB7IHJldHVybiBjRGVzY3JpcHRpb25WYWx1ZVRSQU5TTEFUQUJMRVNUUklOR1BhcnNlclJ1bGVDYWxsXzNfMF8xXzA7IH0KKworCQkvLygic3BhY2VWb2x1bWUiIGNvbnRhaW5lckRhdGE9U1RSSU5HKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzNfMSgpIHsgcmV0dXJuIGNHcm91cF8zXzE7IH0KKworCQkvLyJzcGFjZVZvbHVtZSIKKwkJcHVibGljIEtleXdvcmQgZ2V0U3BhY2VWb2x1bWVLZXl3b3JkXzNfMV8wKCkgeyByZXR1cm4gY1NwYWNlVm9sdW1lS2V5d29yZF8zXzFfMDsgfQorCisJCS8vY29udGFpbmVyRGF0YT1TVFJJTkcKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0Q29udGFpbmVyRGF0YUFzc2lnbm1lbnRfM18xXzEoKSB7IHJldHVybiBjQ29udGFpbmVyRGF0YUFzc2lnbm1lbnRfM18xXzE7IH0KKworCQkvL1NUUklORworCQlwdWJsaWMgUnVsZUNhbGwgZ2V0Q29udGFpbmVyRGF0YVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfM18xXzFfMCgpIHsgcmV0dXJuIGNDb250YWluZXJEYXRhU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8zXzFfMV8wOyB9CisKKwkJLy8oImFjY2Vzc2liaWxpdHkiIGFjY2Vzc2liaWxpdHlQaHJhc2U9U1RSSU5HKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzNfMigpIHsgcmV0dXJuIGNHcm91cF8zXzI7IH0KKworCQkvLyJhY2Nlc3NpYmlsaXR5IgorCQlwdWJsaWMgS2V5d29yZCBnZXRBY2Nlc3NpYmlsaXR5S2V5d29yZF8zXzJfMCgpIHsgcmV0dXJuIGNBY2Nlc3NpYmlsaXR5S2V5d29yZF8zXzJfMDsgfQorCisJCS8vYWNjZXNzaWJpbGl0eVBocmFzZT1TVFJJTkcKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0QWNjZXNzaWJpbGl0eVBocmFzZUFzc2lnbm1lbnRfM18yXzEoKSB7IHJldHVybiBjQWNjZXNzaWJpbGl0eVBocmFzZUFzc2lnbm1lbnRfM18yXzE7IH0KKworCQkvL1NUUklORworCQlwdWJsaWMgUnVsZUNhbGwgZ2V0QWNjZXNzaWJpbGl0eVBocmFzZVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfM18yXzFfMCgpIHsgcmV0dXJuIGNBY2Nlc3NpYmlsaXR5UGhyYXNlU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8zXzJfMV8wOyB9CisKKwkJLy8oImljb25VUkkiIGljb25VUkk9U1RSSU5HKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzNfMygpIHsgcmV0dXJuIGNHcm91cF8zXzM7IH0KKworCQkvLyJpY29uVVJJIgorCQlwdWJsaWMgS2V5d29yZCBnZXRJY29uVVJJS2V5d29yZF8zXzNfMCgpIHsgcmV0dXJuIGNJY29uVVJJS2V5d29yZF8zXzNfMDsgfQorCisJCS8vaWNvblVSST1TVFJJTkcKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0SWNvblVSSUFzc2lnbm1lbnRfM18zXzEoKSB7IHJldHVybiBjSWNvblVSSUFzc2lnbm1lbnRfM18zXzE7IH0KKworCQkvL1NUUklORworCQlwdWJsaWMgUnVsZUNhbGwgZ2V0SWNvblVSSVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfM18zXzFfMCgpIHsgcmV0dXJuIGNJY29uVVJJU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8zXzNfMV8wOyB9CisKKwkJLy8oInZpZXciIHZpZXc9UGVyc3BlY3RpdmVWaWV3KT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzNfNCgpIHsgcmV0dXJuIGNHcm91cF8zXzQ7IH0KKworCQkvLyJ2aWV3IgorCQlwdWJsaWMgS2V5d29yZCBnZXRWaWV3S2V5d29yZF8zXzRfMCgpIHsgcmV0dXJuIGNWaWV3S2V5d29yZF8zXzRfMDsgfQorCisJCS8vdmlldz1QZXJzcGVjdGl2ZVZpZXcKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0Vmlld0Fzc2lnbm1lbnRfM180XzEoKSB7IHJldHVybiBjVmlld0Fzc2lnbm1lbnRfM180XzE7IH0KKworCQkvL1BlcnNwZWN0aXZlVmlldworCQlwdWJsaWMgUnVsZUNhbGwgZ2V0Vmlld1BlcnNwZWN0aXZlVmlld1BhcnNlclJ1bGVDYWxsXzNfNF8xXzAoKSB7IHJldHVybiBjVmlld1BlcnNwZWN0aXZlVmlld1BhcnNlclJ1bGVDYWxsXzNfNF8xXzA7IH0KKworCQkvL2lzQ2xvc2FibGU/PSJpc0Nsb3NhYmxlIj8KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0SXNDbG9zYWJsZUFzc2lnbm1lbnRfM181KCkgeyByZXR1cm4gY0lzQ2xvc2FibGVBc3NpZ25tZW50XzNfNTsgfQorCisJCS8vImlzQ2xvc2FibGUiCisJCXB1YmxpYyBLZXl3b3JkIGdldElzQ2xvc2FibGVJc0Nsb3NhYmxlS2V5d29yZF8zXzVfMCgpIHsgcmV0dXJuIGNJc0Nsb3NhYmxlSXNDbG9zYWJsZUtleXdvcmRfM181XzA7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgUGVyc3BlY3RpdmVWaWV3RWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlBlcnNwZWN0aXZlVmlldyIpOworCQlwcml2YXRlIGZpbmFsIEFsdGVybmF0aXZlcyBjQWx0ZXJuYXRpdmVzID0gKEFsdGVybmF0aXZlcylydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUGVyc3BlY3RpdmVTZWxlY3Rpb25QYXJzZXJSdWxlQ2FsbF8wID0gKFJ1bGVDYWxsKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNQZXJzcGVjdGl2ZVRhYmxlUGFyc2VyUnVsZUNhbGxfMSA9IChSdWxlQ2FsbCljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUGVyc3BlY3RpdmVDaGFydFBhcnNlclJ1bGVDYWxsXzIgPSAoUnVsZUNhbGwpY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1BlcnNwZWN0aXZlUmVwb3J0UGFyc2VyUnVsZUNhbGxfMyA9IChSdWxlQ2FsbCljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUGVyc3BlY3RpdmVPcmdhbml6YXRpb25QYXJzZXJSdWxlQ2FsbF80ID0gKFJ1bGVDYWxsKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDQpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNQZXJzcGVjdGl2ZVRvcG9sb2d5UGFyc2VyUnVsZUNhbGxfNSA9IChSdWxlQ2FsbCljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCg1KTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUGVyc3BlY3RpdmVEaWFsb2dQYXJzZXJSdWxlQ2FsbF82ID0gKFJ1bGVDYWxsKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDYpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNQZXJzcGVjdGl2ZUJQTU5QYXJzZXJSdWxlQ2FsbF83ID0gKFJ1bGVDYWxsKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDcpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNQZXJzcGVjdGl2ZUdyaWRQYXJzZXJSdWxlQ2FsbF84ID0gKFJ1bGVDYWxsKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDgpOworCQkKKwkJLy9QZXJzcGVjdGl2ZVZpZXc6CisJCS8vCVBlcnNwZWN0aXZlU2VsZWN0aW9uIHwgUGVyc3BlY3RpdmVUYWJsZSB8IFBlcnNwZWN0aXZlQ2hhcnQgfCBQZXJzcGVjdGl2ZVJlcG9ydCB8IFBlcnNwZWN0aXZlT3JnYW5pemF0aW9uIHwKKwkJLy8JUGVyc3BlY3RpdmVUb3BvbG9neSB8IFBlcnNwZWN0aXZlRGlhbG9nIHwgUGVyc3BlY3RpdmVCUE1OIHwgUGVyc3BlY3RpdmVHcmlkOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8vUGVyc3BlY3RpdmVTZWxlY3Rpb24gfCBQZXJzcGVjdGl2ZVRhYmxlIHwgUGVyc3BlY3RpdmVDaGFydCB8IFBlcnNwZWN0aXZlUmVwb3J0IHwgUGVyc3BlY3RpdmVPcmdhbml6YXRpb24gfAorCQkvL1BlcnNwZWN0aXZlVG9wb2xvZ3kgfCBQZXJzcGVjdGl2ZURpYWxvZyB8IFBlcnNwZWN0aXZlQlBNTiB8IFBlcnNwZWN0aXZlR3JpZAorCQlwdWJsaWMgQWx0ZXJuYXRpdmVzIGdldEFsdGVybmF0aXZlcygpIHsgcmV0dXJuIGNBbHRlcm5hdGl2ZXM7IH0KKworCQkvL1BlcnNwZWN0aXZlU2VsZWN0aW9uCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRQZXJzcGVjdGl2ZVNlbGVjdGlvblBhcnNlclJ1bGVDYWxsXzAoKSB7IHJldHVybiBjUGVyc3BlY3RpdmVTZWxlY3Rpb25QYXJzZXJSdWxlQ2FsbF8wOyB9CisKKwkJLy9QZXJzcGVjdGl2ZVRhYmxlCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRQZXJzcGVjdGl2ZVRhYmxlUGFyc2VyUnVsZUNhbGxfMSgpIHsgcmV0dXJuIGNQZXJzcGVjdGl2ZVRhYmxlUGFyc2VyUnVsZUNhbGxfMTsgfQorCisJCS8vUGVyc3BlY3RpdmVDaGFydAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0UGVyc3BlY3RpdmVDaGFydFBhcnNlclJ1bGVDYWxsXzIoKSB7IHJldHVybiBjUGVyc3BlY3RpdmVDaGFydFBhcnNlclJ1bGVDYWxsXzI7IH0KKworCQkvL1BlcnNwZWN0aXZlUmVwb3J0CisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRQZXJzcGVjdGl2ZVJlcG9ydFBhcnNlclJ1bGVDYWxsXzMoKSB7IHJldHVybiBjUGVyc3BlY3RpdmVSZXBvcnRQYXJzZXJSdWxlQ2FsbF8zOyB9CisKKwkJLy9QZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbgorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0UGVyc3BlY3RpdmVPcmdhbml6YXRpb25QYXJzZXJSdWxlQ2FsbF80KCkgeyByZXR1cm4gY1BlcnNwZWN0aXZlT3JnYW5pemF0aW9uUGFyc2VyUnVsZUNhbGxfNDsgfQorCisJCS8vUGVyc3BlY3RpdmVUb3BvbG9neQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0UGVyc3BlY3RpdmVUb3BvbG9neVBhcnNlclJ1bGVDYWxsXzUoKSB7IHJldHVybiBjUGVyc3BlY3RpdmVUb3BvbG9neVBhcnNlclJ1bGVDYWxsXzU7IH0KKworCQkvL1BlcnNwZWN0aXZlRGlhbG9nCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRQZXJzcGVjdGl2ZURpYWxvZ1BhcnNlclJ1bGVDYWxsXzYoKSB7IHJldHVybiBjUGVyc3BlY3RpdmVEaWFsb2dQYXJzZXJSdWxlQ2FsbF82OyB9CisKKwkJLy9QZXJzcGVjdGl2ZUJQTU4KKwkJcHVibGljIFJ1bGVDYWxsIGdldFBlcnNwZWN0aXZlQlBNTlBhcnNlclJ1bGVDYWxsXzcoKSB7IHJldHVybiBjUGVyc3BlY3RpdmVCUE1OUGFyc2VyUnVsZUNhbGxfNzsgfQorCisJCS8vUGVyc3BlY3RpdmVHcmlkCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRQZXJzcGVjdGl2ZUdyaWRQYXJzZXJSdWxlQ2FsbF84KCkgeyByZXR1cm4gY1BlcnNwZWN0aXZlR3JpZFBhcnNlclJ1bGVDYWxsXzg7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgUGVyc3BlY3RpdmVTZWxlY3Rpb25FbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiUGVyc3BlY3RpdmVTZWxlY3Rpb24iKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQWN0aW9uIGNQZXJzcGVjdGl2ZVNlbGVjdGlvbkFjdGlvbl8wID0gKEFjdGlvbiljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1NlbGVjdEtleXdvcmRfMSA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjUmVmQXNzaWdubWVudF8yID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBDcm9zc1JlZmVyZW5jZSBjUmVmVGFibGVDcm9zc1JlZmVyZW5jZV8yXzAgPSAoQ3Jvc3NSZWZlcmVuY2UpY1JlZkFzc2lnbm1lbnRfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1JlZlRhYmxlSURUZXJtaW5hbFJ1bGVDYWxsXzJfMF8xID0gKFJ1bGVDYWxsKWNSZWZUYWJsZUNyb3NzUmVmZXJlbmNlXzJfMC5lQ29udGVudHMoKS5nZXQoMSk7CisJCQorCQkvL1BlcnNwZWN0aXZlU2VsZWN0aW9uOgorCQkvLwl7UGVyc3BlY3RpdmVTZWxlY3Rpb259ICJzZWxlY3QiIHJlZj1bdGFibGU6OlRhYmxlXTsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL3tQZXJzcGVjdGl2ZVNlbGVjdGlvbn0gInNlbGVjdCIgcmVmPVt0YWJsZTo6VGFibGVdCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8ve1BlcnNwZWN0aXZlU2VsZWN0aW9ufQorCQlwdWJsaWMgQWN0aW9uIGdldFBlcnNwZWN0aXZlU2VsZWN0aW9uQWN0aW9uXzAoKSB7IHJldHVybiBjUGVyc3BlY3RpdmVTZWxlY3Rpb25BY3Rpb25fMDsgfQorCisJCS8vInNlbGVjdCIKKwkJcHVibGljIEtleXdvcmQgZ2V0U2VsZWN0S2V5d29yZF8xKCkgeyByZXR1cm4gY1NlbGVjdEtleXdvcmRfMTsgfQorCisJCS8vcmVmPVt0YWJsZTo6VGFibGVdCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFJlZkFzc2lnbm1lbnRfMigpIHsgcmV0dXJuIGNSZWZBc3NpZ25tZW50XzI7IH0KKworCQkvL1t0YWJsZTo6VGFibGVdCisJCXB1YmxpYyBDcm9zc1JlZmVyZW5jZSBnZXRSZWZUYWJsZUNyb3NzUmVmZXJlbmNlXzJfMCgpIHsgcmV0dXJuIGNSZWZUYWJsZUNyb3NzUmVmZXJlbmNlXzJfMDsgfQorCisJCS8vSUQKKwkJcHVibGljIFJ1bGVDYWxsIGdldFJlZlRhYmxlSURUZXJtaW5hbFJ1bGVDYWxsXzJfMF8xKCkgeyByZXR1cm4gY1JlZlRhYmxlSURUZXJtaW5hbFJ1bGVDYWxsXzJfMF8xOyB9CisJfQorCisJcHVibGljIGNsYXNzIFBlcnNwZWN0aXZlVGFibGVFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiUGVyc3BlY3RpdmVUYWJsZSIpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cCA9IChHcm91cClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBY3Rpb24gY1BlcnNwZWN0aXZlVGFibGVBY3Rpb25fMCA9IChBY3Rpb24pY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNUYWJsZUtleXdvcmRfMSA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjUmVmQXNzaWdubWVudF8yID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBDcm9zc1JlZmVyZW5jZSBjUmVmVGFibGVDcm9zc1JlZmVyZW5jZV8yXzAgPSAoQ3Jvc3NSZWZlcmVuY2UpY1JlZkFzc2lnbm1lbnRfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1JlZlRhYmxlSURUZXJtaW5hbFJ1bGVDYWxsXzJfMF8xID0gKFJ1bGVDYWxsKWNSZWZUYWJsZUNyb3NzUmVmZXJlbmNlXzJfMC5lQ29udGVudHMoKS5nZXQoMSk7CisJCQorCQkvL1BlcnNwZWN0aXZlVGFibGU6CisJCS8vCXtQZXJzcGVjdGl2ZVRhYmxlfSAidGFibGUiIHJlZj1bdGFibGU6OlRhYmxlXTsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL3tQZXJzcGVjdGl2ZVRhYmxlfSAidGFibGUiIHJlZj1bdGFibGU6OlRhYmxlXQorCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKworCQkvL3tQZXJzcGVjdGl2ZVRhYmxlfQorCQlwdWJsaWMgQWN0aW9uIGdldFBlcnNwZWN0aXZlVGFibGVBY3Rpb25fMCgpIHsgcmV0dXJuIGNQZXJzcGVjdGl2ZVRhYmxlQWN0aW9uXzA7IH0KKworCQkvLyJ0YWJsZSIKKwkJcHVibGljIEtleXdvcmQgZ2V0VGFibGVLZXl3b3JkXzEoKSB7IHJldHVybiBjVGFibGVLZXl3b3JkXzE7IH0KKworCQkvL3JlZj1bdGFibGU6OlRhYmxlXQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRSZWZBc3NpZ25tZW50XzIoKSB7IHJldHVybiBjUmVmQXNzaWdubWVudF8yOyB9CisKKwkJLy9bdGFibGU6OlRhYmxlXQorCQlwdWJsaWMgQ3Jvc3NSZWZlcmVuY2UgZ2V0UmVmVGFibGVDcm9zc1JlZmVyZW5jZV8yXzAoKSB7IHJldHVybiBjUmVmVGFibGVDcm9zc1JlZmVyZW5jZV8yXzA7IH0KKworCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRSZWZUYWJsZUlEVGVybWluYWxSdWxlQ2FsbF8yXzBfMSgpIHsgcmV0dXJuIGNSZWZUYWJsZUlEVGVybWluYWxSdWxlQ2FsbF8yXzBfMTsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBQZXJzcGVjdGl2ZUdyaWRFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiUGVyc3BlY3RpdmVHcmlkIik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFjdGlvbiBjUGVyc3BlY3RpdmVHcmlkQWN0aW9uXzAgPSAoQWN0aW9uKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjR3JpZEtleXdvcmRfMSA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjUmVmQXNzaWdubWVudF8yID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBDcm9zc1JlZmVyZW5jZSBjUmVmVGFibGVDcm9zc1JlZmVyZW5jZV8yXzAgPSAoQ3Jvc3NSZWZlcmVuY2UpY1JlZkFzc2lnbm1lbnRfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1JlZlRhYmxlSURUZXJtaW5hbFJ1bGVDYWxsXzJfMF8xID0gKFJ1bGVDYWxsKWNSZWZUYWJsZUNyb3NzUmVmZXJlbmNlXzJfMC5lQ29udGVudHMoKS5nZXQoMSk7CisJCQorCQkvL1BlcnNwZWN0aXZlR3JpZDoKKwkJLy8Je1BlcnNwZWN0aXZlR3JpZH0gImdyaWQiIHJlZj1bdGFibGU6OlRhYmxlXTsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL3tQZXJzcGVjdGl2ZUdyaWR9ICJncmlkIiByZWY9W3RhYmxlOjpUYWJsZV0KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwKCkgeyByZXR1cm4gY0dyb3VwOyB9CisKKwkJLy97UGVyc3BlY3RpdmVHcmlkfQorCQlwdWJsaWMgQWN0aW9uIGdldFBlcnNwZWN0aXZlR3JpZEFjdGlvbl8wKCkgeyByZXR1cm4gY1BlcnNwZWN0aXZlR3JpZEFjdGlvbl8wOyB9CisKKwkJLy8iZ3JpZCIKKwkJcHVibGljIEtleXdvcmQgZ2V0R3JpZEtleXdvcmRfMSgpIHsgcmV0dXJuIGNHcmlkS2V5d29yZF8xOyB9CisKKwkJLy9yZWY9W3RhYmxlOjpUYWJsZV0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0UmVmQXNzaWdubWVudF8yKCkgeyByZXR1cm4gY1JlZkFzc2lnbm1lbnRfMjsgfQorCisJCS8vW3RhYmxlOjpUYWJsZV0KKwkJcHVibGljIENyb3NzUmVmZXJlbmNlIGdldFJlZlRhYmxlQ3Jvc3NSZWZlcmVuY2VfMl8wKCkgeyByZXR1cm4gY1JlZlRhYmxlQ3Jvc3NSZWZlcmVuY2VfMl8wOyB9CisKKwkJLy9JRAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0UmVmVGFibGVJRFRlcm1pbmFsUnVsZUNhbGxfMl8wXzEoKSB7IHJldHVybiBjUmVmVGFibGVJRFRlcm1pbmFsUnVsZUNhbGxfMl8wXzE7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgUGVyc3BlY3RpdmVDaGFydEVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJQZXJzcGVjdGl2ZUNoYXJ0Iik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFjdGlvbiBjUGVyc3BlY3RpdmVDaGFydEFjdGlvbl8wID0gKEFjdGlvbiljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0NoYXJ0S2V5d29yZF8xID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNSZWZBc3NpZ25tZW50XzIgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIENyb3NzUmVmZXJlbmNlIGNSZWZDaGFydENyb3NzUmVmZXJlbmNlXzJfMCA9IChDcm9zc1JlZmVyZW5jZSljUmVmQXNzaWdubWVudF8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUmVmQ2hhcnRJRFRlcm1pbmFsUnVsZUNhbGxfMl8wXzEgPSAoUnVsZUNhbGwpY1JlZkNoYXJ0Q3Jvc3NSZWZlcmVuY2VfMl8wLmVDb250ZW50cygpLmdldCgxKTsKKwkJCisJCS8vUGVyc3BlY3RpdmVDaGFydDoKKwkJLy8Je1BlcnNwZWN0aXZlQ2hhcnR9ICJjaGFydCIgcmVmPVtjaGFydDo6Q2hhcnRdOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8ve1BlcnNwZWN0aXZlQ2hhcnR9ICJjaGFydCIgcmVmPVtjaGFydDo6Q2hhcnRdCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8ve1BlcnNwZWN0aXZlQ2hhcnR9CisJCXB1YmxpYyBBY3Rpb24gZ2V0UGVyc3BlY3RpdmVDaGFydEFjdGlvbl8wKCkgeyByZXR1cm4gY1BlcnNwZWN0aXZlQ2hhcnRBY3Rpb25fMDsgfQorCisJCS8vImNoYXJ0IgorCQlwdWJsaWMgS2V5d29yZCBnZXRDaGFydEtleXdvcmRfMSgpIHsgcmV0dXJuIGNDaGFydEtleXdvcmRfMTsgfQorCisJCS8vcmVmPVtjaGFydDo6Q2hhcnRdCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFJlZkFzc2lnbm1lbnRfMigpIHsgcmV0dXJuIGNSZWZBc3NpZ25tZW50XzI7IH0KKworCQkvL1tjaGFydDo6Q2hhcnRdCisJCXB1YmxpYyBDcm9zc1JlZmVyZW5jZSBnZXRSZWZDaGFydENyb3NzUmVmZXJlbmNlXzJfMCgpIHsgcmV0dXJuIGNSZWZDaGFydENyb3NzUmVmZXJlbmNlXzJfMDsgfQorCisJCS8vSUQKKwkJcHVibGljIFJ1bGVDYWxsIGdldFJlZkNoYXJ0SURUZXJtaW5hbFJ1bGVDYWxsXzJfMF8xKCkgeyByZXR1cm4gY1JlZkNoYXJ0SURUZXJtaW5hbFJ1bGVDYWxsXzJfMF8xOyB9CisJfQorCisJcHVibGljIGNsYXNzIFBlcnNwZWN0aXZlUmVwb3J0RWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlBlcnNwZWN0aXZlUmVwb3J0Iik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFjdGlvbiBjUGVyc3BlY3RpdmVSZXBvcnRBY3Rpb25fMCA9IChBY3Rpb24pY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNSZXBvcnRLZXl3b3JkXzEgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1JlZkFzc2lnbm1lbnRfMiA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgQ3Jvc3NSZWZlcmVuY2UgY1JlZlJlcG9ydENyb3NzUmVmZXJlbmNlXzJfMCA9IChDcm9zc1JlZmVyZW5jZSljUmVmQXNzaWdubWVudF8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUmVmUmVwb3J0SURUZXJtaW5hbFJ1bGVDYWxsXzJfMF8xID0gKFJ1bGVDYWxsKWNSZWZSZXBvcnRDcm9zc1JlZmVyZW5jZV8yXzAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQkKKwkJLy9QZXJzcGVjdGl2ZVJlcG9ydDoKKwkJLy8Je1BlcnNwZWN0aXZlUmVwb3J0fSAicmVwb3J0IiByZWY9W3JlcG9ydDo6UmVwb3J0XTsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL3tQZXJzcGVjdGl2ZVJlcG9ydH0gInJlcG9ydCIgcmVmPVtyZXBvcnQ6OlJlcG9ydF0KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwKCkgeyByZXR1cm4gY0dyb3VwOyB9CisKKwkJLy97UGVyc3BlY3RpdmVSZXBvcnR9CisJCXB1YmxpYyBBY3Rpb24gZ2V0UGVyc3BlY3RpdmVSZXBvcnRBY3Rpb25fMCgpIHsgcmV0dXJuIGNQZXJzcGVjdGl2ZVJlcG9ydEFjdGlvbl8wOyB9CisKKwkJLy8icmVwb3J0IgorCQlwdWJsaWMgS2V5d29yZCBnZXRSZXBvcnRLZXl3b3JkXzEoKSB7IHJldHVybiBjUmVwb3J0S2V5d29yZF8xOyB9CisKKwkJLy9yZWY9W3JlcG9ydDo6UmVwb3J0XQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRSZWZBc3NpZ25tZW50XzIoKSB7IHJldHVybiBjUmVmQXNzaWdubWVudF8yOyB9CisKKwkJLy9bcmVwb3J0OjpSZXBvcnRdCisJCXB1YmxpYyBDcm9zc1JlZmVyZW5jZSBnZXRSZWZSZXBvcnRDcm9zc1JlZmVyZW5jZV8yXzAoKSB7IHJldHVybiBjUmVmUmVwb3J0Q3Jvc3NSZWZlcmVuY2VfMl8wOyB9CisKKwkJLy9JRAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0UmVmUmVwb3J0SURUZXJtaW5hbFJ1bGVDYWxsXzJfMF8xKCkgeyByZXR1cm4gY1JlZlJlcG9ydElEVGVybWluYWxSdWxlQ2FsbF8yXzBfMTsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbkVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbiIpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cCA9IChHcm91cClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBY3Rpb24gY1BlcnNwZWN0aXZlT3JnYW5pemF0aW9uQWN0aW9uXzAgPSAoQWN0aW9uKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjT3JnYW5pZ3JhbUtleXdvcmRfMSA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjUmVmQXNzaWdubWVudF8yID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBDcm9zc1JlZmVyZW5jZSBjUmVmT3JnYW5pemF0aW9uQ3Jvc3NSZWZlcmVuY2VfMl8wID0gKENyb3NzUmVmZXJlbmNlKWNSZWZBc3NpZ25tZW50XzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNSZWZPcmdhbml6YXRpb25JRFRlcm1pbmFsUnVsZUNhbGxfMl8wXzEgPSAoUnVsZUNhbGwpY1JlZk9yZ2FuaXphdGlvbkNyb3NzUmVmZXJlbmNlXzJfMC5lQ29udGVudHMoKS5nZXQoMSk7CisJCQorCQkvL1BlcnNwZWN0aXZlT3JnYW5pemF0aW9uOgorCQkvLwl7UGVyc3BlY3RpdmVPcmdhbml6YXRpb259ICJvcmdhbmlncmFtIiByZWY9W29yZ2FuaXphdGlvbjo6T3JnYW5pemF0aW9uXTsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL3tQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbn0gIm9yZ2FuaWdyYW0iIHJlZj1bb3JnYW5pemF0aW9uOjpPcmdhbml6YXRpb25dCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8ve1BlcnNwZWN0aXZlT3JnYW5pemF0aW9ufQorCQlwdWJsaWMgQWN0aW9uIGdldFBlcnNwZWN0aXZlT3JnYW5pemF0aW9uQWN0aW9uXzAoKSB7IHJldHVybiBjUGVyc3BlY3RpdmVPcmdhbml6YXRpb25BY3Rpb25fMDsgfQorCisJCS8vIm9yZ2FuaWdyYW0iCisJCXB1YmxpYyBLZXl3b3JkIGdldE9yZ2FuaWdyYW1LZXl3b3JkXzEoKSB7IHJldHVybiBjT3JnYW5pZ3JhbUtleXdvcmRfMTsgfQorCisJCS8vcmVmPVtvcmdhbml6YXRpb246Ok9yZ2FuaXphdGlvbl0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0UmVmQXNzaWdubWVudF8yKCkgeyByZXR1cm4gY1JlZkFzc2lnbm1lbnRfMjsgfQorCisJCS8vW29yZ2FuaXphdGlvbjo6T3JnYW5pemF0aW9uXQorCQlwdWJsaWMgQ3Jvc3NSZWZlcmVuY2UgZ2V0UmVmT3JnYW5pemF0aW9uQ3Jvc3NSZWZlcmVuY2VfMl8wKCkgeyByZXR1cm4gY1JlZk9yZ2FuaXphdGlvbkNyb3NzUmVmZXJlbmNlXzJfMDsgfQorCisJCS8vSUQKKwkJcHVibGljIFJ1bGVDYWxsIGdldFJlZk9yZ2FuaXphdGlvbklEVGVybWluYWxSdWxlQ2FsbF8yXzBfMSgpIHsgcmV0dXJuIGNSZWZPcmdhbml6YXRpb25JRFRlcm1pbmFsUnVsZUNhbGxfMl8wXzE7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgUGVyc3BlY3RpdmVUb3BvbG9neUVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJQZXJzcGVjdGl2ZVRvcG9sb2d5Iik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFjdGlvbiBjUGVyc3BlY3RpdmVUb3BvbG9neUFjdGlvbl8wID0gKEFjdGlvbiljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1RvcG9sb2d5S2V5d29yZF8xID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNSZWZBc3NpZ25tZW50XzIgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIENyb3NzUmVmZXJlbmNlIGNSZWZUb3BvbG9neUNyb3NzUmVmZXJlbmNlXzJfMCA9IChDcm9zc1JlZmVyZW5jZSljUmVmQXNzaWdubWVudF8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUmVmVG9wb2xvZ3lJRFRlcm1pbmFsUnVsZUNhbGxfMl8wXzEgPSAoUnVsZUNhbGwpY1JlZlRvcG9sb2d5Q3Jvc3NSZWZlcmVuY2VfMl8wLmVDb250ZW50cygpLmdldCgxKTsKKwkJCisJCS8vUGVyc3BlY3RpdmVUb3BvbG9neToKKwkJLy8Je1BlcnNwZWN0aXZlVG9wb2xvZ3l9ICJ0b3BvbG9neSIgcmVmPVt0b3BvbG9neTo6VG9wb2xvZ3ldOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8ve1BlcnNwZWN0aXZlVG9wb2xvZ3l9ICJ0b3BvbG9neSIgcmVmPVt0b3BvbG9neTo6VG9wb2xvZ3ldCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8ve1BlcnNwZWN0aXZlVG9wb2xvZ3l9CisJCXB1YmxpYyBBY3Rpb24gZ2V0UGVyc3BlY3RpdmVUb3BvbG9neUFjdGlvbl8wKCkgeyByZXR1cm4gY1BlcnNwZWN0aXZlVG9wb2xvZ3lBY3Rpb25fMDsgfQorCisJCS8vInRvcG9sb2d5IgorCQlwdWJsaWMgS2V5d29yZCBnZXRUb3BvbG9neUtleXdvcmRfMSgpIHsgcmV0dXJuIGNUb3BvbG9neUtleXdvcmRfMTsgfQorCisJCS8vcmVmPVt0b3BvbG9neTo6VG9wb2xvZ3ldCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFJlZkFzc2lnbm1lbnRfMigpIHsgcmV0dXJuIGNSZWZBc3NpZ25tZW50XzI7IH0KKworCQkvL1t0b3BvbG9neTo6VG9wb2xvZ3ldCisJCXB1YmxpYyBDcm9zc1JlZmVyZW5jZSBnZXRSZWZUb3BvbG9neUNyb3NzUmVmZXJlbmNlXzJfMCgpIHsgcmV0dXJuIGNSZWZUb3BvbG9neUNyb3NzUmVmZXJlbmNlXzJfMDsgfQorCisJCS8vSUQKKwkJcHVibGljIFJ1bGVDYWxsIGdldFJlZlRvcG9sb2d5SURUZXJtaW5hbFJ1bGVDYWxsXzJfMF8xKCkgeyByZXR1cm4gY1JlZlRvcG9sb2d5SURUZXJtaW5hbFJ1bGVDYWxsXzJfMF8xOyB9CisJfQorCisJcHVibGljIGNsYXNzIFBlcnNwZWN0aXZlRGlhbG9nRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlBlcnNwZWN0aXZlRGlhbG9nIik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFjdGlvbiBjUGVyc3BlY3RpdmVEaWFsb2dBY3Rpb25fMCA9IChBY3Rpb24pY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNEaWFsb2dLZXl3b3JkXzEgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1JlZkFzc2lnbm1lbnRfMiA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgQ3Jvc3NSZWZlcmVuY2UgY1JlZkRpYWxvZ0Nyb3NzUmVmZXJlbmNlXzJfMCA9IChDcm9zc1JlZmVyZW5jZSljUmVmQXNzaWdubWVudF8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUmVmRGlhbG9nSURUZXJtaW5hbFJ1bGVDYWxsXzJfMF8xID0gKFJ1bGVDYWxsKWNSZWZEaWFsb2dDcm9zc1JlZmVyZW5jZV8yXzAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQkKKwkJLy9QZXJzcGVjdGl2ZURpYWxvZzoKKwkJLy8Je1BlcnNwZWN0aXZlRGlhbG9nfSAiZGlhbG9nIiByZWY9W2RpYWxvZzo6RGlhbG9nXTsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL3tQZXJzcGVjdGl2ZURpYWxvZ30gImRpYWxvZyIgcmVmPVtkaWFsb2c6OkRpYWxvZ10KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwKCkgeyByZXR1cm4gY0dyb3VwOyB9CisKKwkJLy97UGVyc3BlY3RpdmVEaWFsb2d9CisJCXB1YmxpYyBBY3Rpb24gZ2V0UGVyc3BlY3RpdmVEaWFsb2dBY3Rpb25fMCgpIHsgcmV0dXJuIGNQZXJzcGVjdGl2ZURpYWxvZ0FjdGlvbl8wOyB9CisKKwkJLy8iZGlhbG9nIgorCQlwdWJsaWMgS2V5d29yZCBnZXREaWFsb2dLZXl3b3JkXzEoKSB7IHJldHVybiBjRGlhbG9nS2V5d29yZF8xOyB9CisKKwkJLy9yZWY9W2RpYWxvZzo6RGlhbG9nXQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRSZWZBc3NpZ25tZW50XzIoKSB7IHJldHVybiBjUmVmQXNzaWdubWVudF8yOyB9CisKKwkJLy9bZGlhbG9nOjpEaWFsb2ddCisJCXB1YmxpYyBDcm9zc1JlZmVyZW5jZSBnZXRSZWZEaWFsb2dDcm9zc1JlZmVyZW5jZV8yXzAoKSB7IHJldHVybiBjUmVmRGlhbG9nQ3Jvc3NSZWZlcmVuY2VfMl8wOyB9CisKKwkJLy9JRAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0UmVmRGlhbG9nSURUZXJtaW5hbFJ1bGVDYWxsXzJfMF8xKCkgeyByZXR1cm4gY1JlZkRpYWxvZ0lEVGVybWluYWxSdWxlQ2FsbF8yXzBfMTsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBQZXJzcGVjdGl2ZUJQTU5FbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiUGVyc3BlY3RpdmVCUE1OIik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFjdGlvbiBjUGVyc3BlY3RpdmVCUE1OQWN0aW9uXzAgPSAoQWN0aW9uKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjQnBtbktleXdvcmRfMSA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCQorCQkvL1BlcnNwZWN0aXZlQlBNTjoKKwkJLy8Je1BlcnNwZWN0aXZlQlBNTn0gImJwbW4iOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8ve1BlcnNwZWN0aXZlQlBNTn0gImJwbW4iCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8ve1BlcnNwZWN0aXZlQlBNTn0KKwkJcHVibGljIEFjdGlvbiBnZXRQZXJzcGVjdGl2ZUJQTU5BY3Rpb25fMCgpIHsgcmV0dXJuIGNQZXJzcGVjdGl2ZUJQTU5BY3Rpb25fMDsgfQorCisJCS8vImJwbW4iCisJCXB1YmxpYyBLZXl3b3JkIGdldEJwbW5LZXl3b3JkXzEoKSB7IHJldHVybiBjQnBtbktleXdvcmRfMTsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiUGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkIik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNRdWFsaWZpZWROYW1lUGFyc2VyUnVsZUNhbGxfMCA9IChSdWxlQ2FsbCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF8xID0gKEdyb3VwKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjRnVsbFN0b3BLZXl3b3JkXzFfMCA9IChLZXl3b3JkKWNHcm91cF8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNBc3Rlcmlza0tleXdvcmRfMV8xID0gKEtleXdvcmQpY0dyb3VwXzEuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQkKKwkJLy9QZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQ6CisJCS8vCVF1YWxpZmllZE5hbWUgKCIuIiAiKiIpPzsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL1F1YWxpZmllZE5hbWUgKCIuIiAiKiIpPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKworCQkvL1F1YWxpZmllZE5hbWUKKwkJcHVibGljIFJ1bGVDYWxsIGdldFF1YWxpZmllZE5hbWVQYXJzZXJSdWxlQ2FsbF8wKCkgeyByZXR1cm4gY1F1YWxpZmllZE5hbWVQYXJzZXJSdWxlQ2FsbF8wOyB9CisKKwkJLy8oIi4iICIqIik/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF8xKCkgeyByZXR1cm4gY0dyb3VwXzE7IH0KKworCQkvLyIuIgorCQlwdWJsaWMgS2V5d29yZCBnZXRGdWxsU3RvcEtleXdvcmRfMV8wKCkgeyByZXR1cm4gY0Z1bGxTdG9wS2V5d29yZF8xXzA7IH0KKworCQkvLyIqIgorCQlwdWJsaWMgS2V5d29yZCBnZXRBc3Rlcmlza0tleXdvcmRfMV8xKCkgeyByZXR1cm4gY0FzdGVyaXNrS2V5d29yZF8xXzE7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgUXVhbGlmaWVkTmFtZUVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJRdWFsaWZpZWROYW1lIik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNWYWxpZElEUGFyc2VyUnVsZUNhbGxfMCA9IChSdWxlQ2FsbCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF8xID0gKEdyb3VwKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjRnVsbFN0b3BLZXl3b3JkXzFfMCA9IChLZXl3b3JkKWNHcm91cF8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjVmFsaWRJRFBhcnNlclJ1bGVDYWxsXzFfMSA9IChSdWxlQ2FsbCljR3JvdXBfMS5lQ29udGVudHMoKS5nZXQoMSk7CisJCQorCQkvL1F1YWxpZmllZE5hbWU6CisJCS8vCVZhbGlkSUQgKCIuIiBWYWxpZElEKSo7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy9WYWxpZElEICgiLiIgVmFsaWRJRCkqCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8vVmFsaWRJRAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0VmFsaWRJRFBhcnNlclJ1bGVDYWxsXzAoKSB7IHJldHVybiBjVmFsaWRJRFBhcnNlclJ1bGVDYWxsXzA7IH0KKworCQkvLyg9PiAiLiIgVmFsaWRJRCkqCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF8xKCkgeyByZXR1cm4gY0dyb3VwXzE7IH0KKworCQkvLz0+ICIuIgorCQlwdWJsaWMgS2V5d29yZCBnZXRGdWxsU3RvcEtleXdvcmRfMV8wKCkgeyByZXR1cm4gY0Z1bGxTdG9wS2V5d29yZF8xXzA7IH0KKworCQkvL1ZhbGlkSUQKKwkJcHVibGljIFJ1bGVDYWxsIGdldFZhbGlkSURQYXJzZXJSdWxlQ2FsbF8xXzEoKSB7IHJldHVybiBjVmFsaWRJRFBhcnNlclJ1bGVDYWxsXzFfMTsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBWYWxpZElERWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlZhbGlkSUQiKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjSURUZXJtaW5hbFJ1bGVDYWxsID0gKFJ1bGVDYWxsKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQkKKwkJLy9WYWxpZElEOgorCQkvLwlJRDsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRJRFRlcm1pbmFsUnVsZUNhbGwoKSB7IHJldHVybiBjSURUZXJtaW5hbFJ1bGVDYWxsOyB9CisJfQorCisJcHVibGljIGNsYXNzIFRSQU5TTEFUQUJMRUlERWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlRSQU5TTEFUQUJMRUlEIik7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0lEVGVybWluYWxSdWxlQ2FsbCA9IChSdWxlQ2FsbClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJCisJCS8vVFJBTlNMQVRBQkxFSUQ6CisJCS8vCUlEOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8vSUQKKwkJcHVibGljIFJ1bGVDYWxsIGdldElEVGVybWluYWxSdWxlQ2FsbCgpIHsgcmV0dXJuIGNJRFRlcm1pbmFsUnVsZUNhbGw7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgVFJBTlNMQVRBQkxFU1RSSU5HRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlRSQU5TTEFUQUJMRVNUUklORyIpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsID0gKFJ1bGVDYWxsKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQkKKwkJLy9UUkFOU0xBVEFCTEVTVFJJTkc6CisJCS8vCVNUUklORzsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL1NUUklORworCQlwdWJsaWMgUnVsZUNhbGwgZ2V0U1RSSU5HVGVybWluYWxSdWxlQ2FsbCgpIHsgcmV0dXJuIGNTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsOyB9CisJfQorCQorCQorCXB1YmxpYyBjbGFzcyBTYXNoT3JpZW50YXRpb25FbGVtZW50cyBleHRlbmRzIEFic3RyYWN0RW51bVJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtUnVsZSBydWxlID0gKEVudW1SdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiU2FzaE9yaWVudGF0aW9uIik7CisJCXByaXZhdGUgZmluYWwgQWx0ZXJuYXRpdmVzIGNBbHRlcm5hdGl2ZXMgPSAoQWx0ZXJuYXRpdmVzKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY0hPUklaT05UQUxFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNIT1JJWk9OVEFMSG9yaXpvbnRhbEtleXdvcmRfMF8wID0gKEtleXdvcmQpY0hPUklaT05UQUxFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY1ZFUlRJQ0FMRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xID0gKEVudW1MaXRlcmFsRGVjbGFyYXRpb24pY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjVkVSVElDQUxWZXJ0aWNhbEtleXdvcmRfMV8wID0gKEtleXdvcmQpY1ZFUlRJQ0FMRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJCisJCS8vZW51bSBTYXNoT3JpZW50YXRpb246CisJCS8vCUhPUklaT05UQUw9Imhvcml6b250YWwiIHwgVkVSVElDQUw9InZlcnRpY2FsIjsKKwkJcHVibGljIEVudW1SdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy9IT1JJWk9OVEFMPSJob3Jpem9udGFsIiB8IFZFUlRJQ0FMPSJ2ZXJ0aWNhbCIKKwkJcHVibGljIEFsdGVybmF0aXZlcyBnZXRBbHRlcm5hdGl2ZXMoKSB7IHJldHVybiBjQWx0ZXJuYXRpdmVzOyB9CisKKwkJLy9IT1JJWk9OVEFMPSJob3Jpem9udGFsIgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRIT1JJWk9OVEFMRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCkgeyByZXR1cm4gY0hPUklaT05UQUxFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzA7IH0KKworCQkvLyJob3Jpem9udGFsIgorCQlwdWJsaWMgS2V5d29yZCBnZXRIT1JJWk9OVEFMSG9yaXpvbnRhbEtleXdvcmRfMF8wKCkgeyByZXR1cm4gY0hPUklaT05UQUxIb3Jpem9udGFsS2V5d29yZF8wXzA7IH0KKworCQkvL1ZFUlRJQ0FMPSJ2ZXJ0aWNhbCIKKwkJcHVibGljIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gZ2V0VkVSVElDQUxFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSB7IHJldHVybiBjVkVSVElDQUxFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzE7IH0KKworCQkvLyJ2ZXJ0aWNhbCIKKwkJcHVibGljIEtleXdvcmQgZ2V0VkVSVElDQUxWZXJ0aWNhbEtleXdvcmRfMV8wKCkgeyByZXR1cm4gY1ZFUlRJQ0FMVmVydGljYWxLZXl3b3JkXzFfMDsgfQorCX0KKwkKKwlwcml2YXRlIGZpbmFsIFBlcnNwZWN0aXZlTW9kZWxFbGVtZW50cyBwUGVyc3BlY3RpdmVNb2RlbDsKKwlwcml2YXRlIGZpbmFsIFBlcnNwZWN0aXZlUGFja2FnZUVsZW1lbnRzIHBQZXJzcGVjdGl2ZVBhY2thZ2U7CisJcHJpdmF0ZSBmaW5hbCBQZXJzcGVjdGl2ZUltcG9ydEVsZW1lbnRzIHBQZXJzcGVjdGl2ZUltcG9ydDsKKwlwcml2YXRlIGZpbmFsIFBlcnNwZWN0aXZlRWxlbWVudHMgcFBlcnNwZWN0aXZlOworCXByaXZhdGUgZmluYWwgUGVyc3BlY3RpdmVFbGVtZW50RWxlbWVudHMgcFBlcnNwZWN0aXZlRWxlbWVudDsKKwlwcml2YXRlIGZpbmFsIFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lckVsZW1lbnRzIHBQZXJzcGVjdGl2ZVNhc2hDb250YWluZXI7CisJcHJpdmF0ZSBmaW5hbCBQZXJzcGVjdGl2ZVBhcnRTdGFja0VsZW1lbnRzIHBQZXJzcGVjdGl2ZVBhcnRTdGFjazsKKwlwcml2YXRlIGZpbmFsIFBlcnNwZWN0aXZlUGFydEVsZW1lbnRzIHBQZXJzcGVjdGl2ZVBhcnQ7CisJcHJpdmF0ZSBmaW5hbCBQZXJzcGVjdGl2ZVZpZXdFbGVtZW50cyBwUGVyc3BlY3RpdmVWaWV3OworCXByaXZhdGUgZmluYWwgUGVyc3BlY3RpdmVTZWxlY3Rpb25FbGVtZW50cyBwUGVyc3BlY3RpdmVTZWxlY3Rpb247CisJcHJpdmF0ZSBmaW5hbCBQZXJzcGVjdGl2ZVRhYmxlRWxlbWVudHMgcFBlcnNwZWN0aXZlVGFibGU7CisJcHJpdmF0ZSBmaW5hbCBQZXJzcGVjdGl2ZUdyaWRFbGVtZW50cyBwUGVyc3BlY3RpdmVHcmlkOworCXByaXZhdGUgZmluYWwgUGVyc3BlY3RpdmVDaGFydEVsZW1lbnRzIHBQZXJzcGVjdGl2ZUNoYXJ0OworCXByaXZhdGUgZmluYWwgUGVyc3BlY3RpdmVSZXBvcnRFbGVtZW50cyBwUGVyc3BlY3RpdmVSZXBvcnQ7CisJcHJpdmF0ZSBmaW5hbCBQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbkVsZW1lbnRzIHBQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbjsKKwlwcml2YXRlIGZpbmFsIFBlcnNwZWN0aXZlVG9wb2xvZ3lFbGVtZW50cyBwUGVyc3BlY3RpdmVUb3BvbG9neTsKKwlwcml2YXRlIGZpbmFsIFBlcnNwZWN0aXZlRGlhbG9nRWxlbWVudHMgcFBlcnNwZWN0aXZlRGlhbG9nOworCXByaXZhdGUgZmluYWwgUGVyc3BlY3RpdmVCUE1ORWxlbWVudHMgcFBlcnNwZWN0aXZlQlBNTjsKKwlwcml2YXRlIGZpbmFsIFBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZEVsZW1lbnRzIHBQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQ7CisJcHJpdmF0ZSBmaW5hbCBRdWFsaWZpZWROYW1lRWxlbWVudHMgcFF1YWxpZmllZE5hbWU7CisJcHJpdmF0ZSBmaW5hbCBWYWxpZElERWxlbWVudHMgcFZhbGlkSUQ7CisJcHJpdmF0ZSBmaW5hbCBUUkFOU0xBVEFCTEVJREVsZW1lbnRzIHBUUkFOU0xBVEFCTEVJRDsKKwlwcml2YXRlIGZpbmFsIFRSQU5TTEFUQUJMRVNUUklOR0VsZW1lbnRzIHBUUkFOU0xBVEFCTEVTVFJJTkc7CisJcHJpdmF0ZSBmaW5hbCBTYXNoT3JpZW50YXRpb25FbGVtZW50cyB1bmtub3duUnVsZVNhc2hPcmllbnRhdGlvbjsKKwkKKwlwcml2YXRlIGZpbmFsIEdyYW1tYXIgZ3JhbW1hcjsKKworCXByaXZhdGUgZmluYWwgWGJhc2VXaXRoQW5ub3RhdGlvbnNHcmFtbWFyQWNjZXNzIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnM7CisKKwlASW5qZWN0CisJcHVibGljIFBlcnNwZWN0aXZlRHNsR3JhbW1hckFjY2VzcyhHcmFtbWFyUHJvdmlkZXIgZ3JhbW1hclByb3ZpZGVyLAorCQlYYmFzZVdpdGhBbm5vdGF0aW9uc0dyYW1tYXJBY2Nlc3MgZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucykgeworCQl0aGlzLmdyYW1tYXIgPSBpbnRlcm5hbEZpbmRHcmFtbWFyKGdyYW1tYXJQcm92aWRlcik7CisJCXRoaXMuZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucyA9IGdhWGJhc2VXaXRoQW5ub3RhdGlvbnM7CisJCXRoaXMucFBlcnNwZWN0aXZlTW9kZWwgPSBuZXcgUGVyc3BlY3RpdmVNb2RlbEVsZW1lbnRzKCk7CisJCXRoaXMucFBlcnNwZWN0aXZlUGFja2FnZSA9IG5ldyBQZXJzcGVjdGl2ZVBhY2thZ2VFbGVtZW50cygpOworCQl0aGlzLnBQZXJzcGVjdGl2ZUltcG9ydCA9IG5ldyBQZXJzcGVjdGl2ZUltcG9ydEVsZW1lbnRzKCk7CisJCXRoaXMucFBlcnNwZWN0aXZlID0gbmV3IFBlcnNwZWN0aXZlRWxlbWVudHMoKTsKKwkJdGhpcy5wUGVyc3BlY3RpdmVFbGVtZW50ID0gbmV3IFBlcnNwZWN0aXZlRWxlbWVudEVsZW1lbnRzKCk7CisJCXRoaXMucFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lciA9IG5ldyBQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJFbGVtZW50cygpOworCQl0aGlzLnBQZXJzcGVjdGl2ZVBhcnRTdGFjayA9IG5ldyBQZXJzcGVjdGl2ZVBhcnRTdGFja0VsZW1lbnRzKCk7CisJCXRoaXMucFBlcnNwZWN0aXZlUGFydCA9IG5ldyBQZXJzcGVjdGl2ZVBhcnRFbGVtZW50cygpOworCQl0aGlzLnBQZXJzcGVjdGl2ZVZpZXcgPSBuZXcgUGVyc3BlY3RpdmVWaWV3RWxlbWVudHMoKTsKKwkJdGhpcy5wUGVyc3BlY3RpdmVTZWxlY3Rpb24gPSBuZXcgUGVyc3BlY3RpdmVTZWxlY3Rpb25FbGVtZW50cygpOworCQl0aGlzLnBQZXJzcGVjdGl2ZVRhYmxlID0gbmV3IFBlcnNwZWN0aXZlVGFibGVFbGVtZW50cygpOworCQl0aGlzLnBQZXJzcGVjdGl2ZUdyaWQgPSBuZXcgUGVyc3BlY3RpdmVHcmlkRWxlbWVudHMoKTsKKwkJdGhpcy5wUGVyc3BlY3RpdmVDaGFydCA9IG5ldyBQZXJzcGVjdGl2ZUNoYXJ0RWxlbWVudHMoKTsKKwkJdGhpcy5wUGVyc3BlY3RpdmVSZXBvcnQgPSBuZXcgUGVyc3BlY3RpdmVSZXBvcnRFbGVtZW50cygpOworCQl0aGlzLnBQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbiA9IG5ldyBQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbkVsZW1lbnRzKCk7CisJCXRoaXMucFBlcnNwZWN0aXZlVG9wb2xvZ3kgPSBuZXcgUGVyc3BlY3RpdmVUb3BvbG9neUVsZW1lbnRzKCk7CisJCXRoaXMucFBlcnNwZWN0aXZlRGlhbG9nID0gbmV3IFBlcnNwZWN0aXZlRGlhbG9nRWxlbWVudHMoKTsKKwkJdGhpcy5wUGVyc3BlY3RpdmVCUE1OID0gbmV3IFBlcnNwZWN0aXZlQlBNTkVsZW1lbnRzKCk7CisJCXRoaXMucFBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCA9IG5ldyBQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRFbGVtZW50cygpOworCQl0aGlzLnBRdWFsaWZpZWROYW1lID0gbmV3IFF1YWxpZmllZE5hbWVFbGVtZW50cygpOworCQl0aGlzLnBWYWxpZElEID0gbmV3IFZhbGlkSURFbGVtZW50cygpOworCQl0aGlzLnBUUkFOU0xBVEFCTEVJRCA9IG5ldyBUUkFOU0xBVEFCTEVJREVsZW1lbnRzKCk7CisJCXRoaXMucFRSQU5TTEFUQUJMRVNUUklORyA9IG5ldyBUUkFOU0xBVEFCTEVTVFJJTkdFbGVtZW50cygpOworCQl0aGlzLnVua25vd25SdWxlU2FzaE9yaWVudGF0aW9uID0gbmV3IFNhc2hPcmllbnRhdGlvbkVsZW1lbnRzKCk7CisJfQorCQorCXByb3RlY3RlZCBHcmFtbWFyIGludGVybmFsRmluZEdyYW1tYXIoR3JhbW1hclByb3ZpZGVyIGdyYW1tYXJQcm92aWRlcikgeworCQlHcmFtbWFyIGdyYW1tYXIgPSBncmFtbWFyUHJvdmlkZXIuZ2V0R3JhbW1hcih0aGlzKTsKKwkJd2hpbGUgKGdyYW1tYXIgIT0gbnVsbCkgeworCQkJaWYgKCJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsIi5lcXVhbHMoZ3JhbW1hci5nZXROYW1lKCkpKSB7CisJCQkJcmV0dXJuIGdyYW1tYXI7CisJCQl9CisJCQlMaXN0PEdyYW1tYXI+IGdyYW1tYXJzID0gZ3JhbW1hci5nZXRVc2VkR3JhbW1hcnMoKTsKKwkJCWlmICghZ3JhbW1hcnMuaXNFbXB0eSgpKSB7CisJCQkJZ3JhbW1hciA9IGdyYW1tYXJzLml0ZXJhdG9yKCkubmV4dCgpOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZ3JhbW1hcjsKKwl9CisJCisJCisJcHVibGljIEdyYW1tYXIgZ2V0R3JhbW1hcigpIHsKKwkJcmV0dXJuIGdyYW1tYXI7CisJfQorCQorCisJcHVibGljIFhiYXNlV2l0aEFubm90YXRpb25zR3JhbW1hckFjY2VzcyBnZXRYYmFzZVdpdGhBbm5vdGF0aW9uc0dyYW1tYXJBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zOworCX0KKworCQorCS8vUGVyc3BlY3RpdmVNb2RlbDoKKwkvLwlwYWNrYWdlcys9UGVyc3BlY3RpdmVQYWNrYWdlKjsKKwlwdWJsaWMgUGVyc3BlY3RpdmVNb2RlbEVsZW1lbnRzIGdldFBlcnNwZWN0aXZlTW9kZWxBY2Nlc3MoKSB7CisJCXJldHVybiBwUGVyc3BlY3RpdmVNb2RlbDsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0UGVyc3BlY3RpdmVNb2RlbFJ1bGUoKSB7CisJCXJldHVybiBnZXRQZXJzcGVjdGl2ZU1vZGVsQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vUGVyc3BlY3RpdmVQYWNrYWdlOgorCS8vCXtQZXJzcGVjdGl2ZVBhY2thZ2V9ICJwYWNrYWdlIiBuYW1lPVF1YWxpZmllZE5hbWUgKCJ7IiBpbXBvcnRzKz1QZXJzcGVjdGl2ZUltcG9ydCogcGVyc3BlY3RpdmVzKz1QZXJzcGVjdGl2ZSogIn0iKT87CisJcHVibGljIFBlcnNwZWN0aXZlUGFja2FnZUVsZW1lbnRzIGdldFBlcnNwZWN0aXZlUGFja2FnZUFjY2VzcygpIHsKKwkJcmV0dXJuIHBQZXJzcGVjdGl2ZVBhY2thZ2U7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFBlcnNwZWN0aXZlUGFja2FnZVJ1bGUoKSB7CisJCXJldHVybiBnZXRQZXJzcGVjdGl2ZVBhY2thZ2VBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9QZXJzcGVjdGl2ZUltcG9ydCByZXR1cm5zIHR5cGVzOjpMSW1wb3J0OgorCS8vCSJpbXBvcnQiIGltcG9ydGVkTmFtZXNwYWNlPVBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZDsKKwlwdWJsaWMgUGVyc3BlY3RpdmVJbXBvcnRFbGVtZW50cyBnZXRQZXJzcGVjdGl2ZUltcG9ydEFjY2VzcygpIHsKKwkJcmV0dXJuIHBQZXJzcGVjdGl2ZUltcG9ydDsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0UGVyc3BlY3RpdmVJbXBvcnRSdWxlKCkgeworCQlyZXR1cm4gZ2V0UGVyc3BlY3RpdmVJbXBvcnRBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9QZXJzcGVjdGl2ZToKKwkvLwl7UGVyc3BlY3RpdmV9ICJwZXJzcGVjdGl2ZSIgbmFtZT1UUkFOU0xBVEFCTEVJRCAoZGVzY3JpcHRpb24/PSJkZXNjcmliZWQgYnkiIGRlc2NyaXB0aW9uVmFsdWU9VFJBTlNMQVRBQkxFU1RSSU5HKT8KKwkvLwkoInByb2Nlc3MiIHByb2Nlc3M9W2JsaXA6OkJsaXBdICJ1c2VydGFzayIgdXNlclRhc2s9W2JsaXA6OkJsaXBVc2VyVGFza10pPyAoKCJpY29uVVJJIiBpY29uVVJJPVNUUklORyk/ICYKKwkvLwkoImFjY2Vzc2liaWxpdHkiIGFjY2Vzc2liaWxpdHlQaHJhc2U9U1RSSU5HKT8gJiAoInRvb2xiYXIiIHRvb2xiYXI9W2FjdGlvbjo6QWN0aW9uVG9vbGJhcl0pPykgInsiCisJLy8JZWxlbWVudHMrPVBlcnNwZWN0aXZlRWxlbWVudCogIn0iOworCXB1YmxpYyBQZXJzcGVjdGl2ZUVsZW1lbnRzIGdldFBlcnNwZWN0aXZlQWNjZXNzKCkgeworCQlyZXR1cm4gcFBlcnNwZWN0aXZlOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRQZXJzcGVjdGl2ZVJ1bGUoKSB7CisJCXJldHVybiBnZXRQZXJzcGVjdGl2ZUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1BlcnNwZWN0aXZlRWxlbWVudDoKKwkvLwlQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIgfCBQZXJzcGVjdGl2ZVBhcnRTdGFjayB8IFBlcnNwZWN0aXZlUGFydDsKKwlwdWJsaWMgUGVyc3BlY3RpdmVFbGVtZW50RWxlbWVudHMgZ2V0UGVyc3BlY3RpdmVFbGVtZW50QWNjZXNzKCkgeworCQlyZXR1cm4gcFBlcnNwZWN0aXZlRWxlbWVudDsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0UGVyc3BlY3RpdmVFbGVtZW50UnVsZSgpIHsKKwkJcmV0dXJuIGdldFBlcnNwZWN0aXZlRWxlbWVudEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lcjoKKwkvLwl7UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyfSAic2FzaENvbnRhaW5lciIgZWxlbWVudElkPUlEICgoIm9yaWVudGF0aW9uIiBvcmllbnRhdGlvbj1TYXNoT3JpZW50YXRpb24pPyAmCisJLy8JKCJzZWxlY3RlZEVsZW1lbnQiIHNlbGVjdGVkRWxlbWVudD1bUGVyc3BlY3RpdmVFbGVtZW50XSk/ICYgKCJzcGFjZVZvbHVtZSIgY29udGFpbmVyRGF0YT1TVFJJTkcpPyAmICgiYWNjZXNzaWJpbGl0eSIKKwkvLwlhY2Nlc3NpYmlsaXR5UGhyYXNlPVNUUklORyk/KSAieyIgZWxlbWVudHMrPVBlcnNwZWN0aXZlRWxlbWVudCogIn0iOworCXB1YmxpYyBQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJFbGVtZW50cyBnZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJBY2Nlc3MoKSB7CisJCXJldHVybiBwUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJSdWxlKCkgeworCQlyZXR1cm4gZ2V0UGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vUGVyc3BlY3RpdmVQYXJ0U3RhY2s6CisJLy8Je1BlcnNwZWN0aXZlUGFydFN0YWNrfSAicGFydFN0YWNrIiBlbGVtZW50SWQ9SUQgKCgic2VsZWN0ZWRFbGVtZW50IiBzZWxlY3RlZEVsZW1lbnQ9W1BlcnNwZWN0aXZlUGFydF0pPyAmCisJLy8JKCJzcGFjZVZvbHVtZSIgY29udGFpbmVyRGF0YT1TVFJJTkcpPyAmICgiYWNjZXNzaWJpbGl0eSIgYWNjZXNzaWJpbGl0eVBocmFzZT1TVFJJTkcpPykgInsiCisJLy8JZWxlbWVudHMrPVBlcnNwZWN0aXZlRWxlbWVudCogIn0iOworCXB1YmxpYyBQZXJzcGVjdGl2ZVBhcnRTdGFja0VsZW1lbnRzIGdldFBlcnNwZWN0aXZlUGFydFN0YWNrQWNjZXNzKCkgeworCQlyZXR1cm4gcFBlcnNwZWN0aXZlUGFydFN0YWNrOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRQZXJzcGVjdGl2ZVBhcnRTdGFja1J1bGUoKSB7CisJCXJldHVybiBnZXRQZXJzcGVjdGl2ZVBhcnRTdGFja0FjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1BlcnNwZWN0aXZlUGFydDoKKwkvLwl7UGVyc3BlY3RpdmVQYXJ0fSAicGFydCIgZWxlbWVudElkPVRSQU5TTEFUQUJMRUlEICgoZGVzY3JpcHRpb24/PSJkZXNjcmliZWQgYnkiIGRlc2NyaXB0aW9uVmFsdWU9VFJBTlNMQVRBQkxFU1RSSU5HKT8KKwkvLwkmICgic3BhY2VWb2x1bWUiIGNvbnRhaW5lckRhdGE9U1RSSU5HKT8gJiAoImFjY2Vzc2liaWxpdHkiIGFjY2Vzc2liaWxpdHlQaHJhc2U9U1RSSU5HKT8gJiAoImljb25VUkkiIGljb25VUkk9U1RSSU5HKT8KKwkvLwkmICgidmlldyIgdmlldz1QZXJzcGVjdGl2ZVZpZXcpPyAmIGlzQ2xvc2FibGU/PSJpc0Nsb3NhYmxlIj8pOworCXB1YmxpYyBQZXJzcGVjdGl2ZVBhcnRFbGVtZW50cyBnZXRQZXJzcGVjdGl2ZVBhcnRBY2Nlc3MoKSB7CisJCXJldHVybiBwUGVyc3BlY3RpdmVQYXJ0OworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRQZXJzcGVjdGl2ZVBhcnRSdWxlKCkgeworCQlyZXR1cm4gZ2V0UGVyc3BlY3RpdmVQYXJ0QWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vUGVyc3BlY3RpdmVWaWV3OgorCS8vCVBlcnNwZWN0aXZlU2VsZWN0aW9uIHwgUGVyc3BlY3RpdmVUYWJsZSB8IFBlcnNwZWN0aXZlQ2hhcnQgfCBQZXJzcGVjdGl2ZVJlcG9ydCB8IFBlcnNwZWN0aXZlT3JnYW5pemF0aW9uIHwKKwkvLwlQZXJzcGVjdGl2ZVRvcG9sb2d5IHwgUGVyc3BlY3RpdmVEaWFsb2cgfCBQZXJzcGVjdGl2ZUJQTU4gfCBQZXJzcGVjdGl2ZUdyaWQ7CisJcHVibGljIFBlcnNwZWN0aXZlVmlld0VsZW1lbnRzIGdldFBlcnNwZWN0aXZlVmlld0FjY2VzcygpIHsKKwkJcmV0dXJuIHBQZXJzcGVjdGl2ZVZpZXc7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFBlcnNwZWN0aXZlVmlld1J1bGUoKSB7CisJCXJldHVybiBnZXRQZXJzcGVjdGl2ZVZpZXdBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9QZXJzcGVjdGl2ZVNlbGVjdGlvbjoKKwkvLwl7UGVyc3BlY3RpdmVTZWxlY3Rpb259ICJzZWxlY3QiIHJlZj1bdGFibGU6OlRhYmxlXTsKKwlwdWJsaWMgUGVyc3BlY3RpdmVTZWxlY3Rpb25FbGVtZW50cyBnZXRQZXJzcGVjdGl2ZVNlbGVjdGlvbkFjY2VzcygpIHsKKwkJcmV0dXJuIHBQZXJzcGVjdGl2ZVNlbGVjdGlvbjsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0UGVyc3BlY3RpdmVTZWxlY3Rpb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0UGVyc3BlY3RpdmVTZWxlY3Rpb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9QZXJzcGVjdGl2ZVRhYmxlOgorCS8vCXtQZXJzcGVjdGl2ZVRhYmxlfSAidGFibGUiIHJlZj1bdGFibGU6OlRhYmxlXTsKKwlwdWJsaWMgUGVyc3BlY3RpdmVUYWJsZUVsZW1lbnRzIGdldFBlcnNwZWN0aXZlVGFibGVBY2Nlc3MoKSB7CisJCXJldHVybiBwUGVyc3BlY3RpdmVUYWJsZTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0UGVyc3BlY3RpdmVUYWJsZVJ1bGUoKSB7CisJCXJldHVybiBnZXRQZXJzcGVjdGl2ZVRhYmxlQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vUGVyc3BlY3RpdmVHcmlkOgorCS8vCXtQZXJzcGVjdGl2ZUdyaWR9ICJncmlkIiByZWY9W3RhYmxlOjpUYWJsZV07CisJcHVibGljIFBlcnNwZWN0aXZlR3JpZEVsZW1lbnRzIGdldFBlcnNwZWN0aXZlR3JpZEFjY2VzcygpIHsKKwkJcmV0dXJuIHBQZXJzcGVjdGl2ZUdyaWQ7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFBlcnNwZWN0aXZlR3JpZFJ1bGUoKSB7CisJCXJldHVybiBnZXRQZXJzcGVjdGl2ZUdyaWRBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9QZXJzcGVjdGl2ZUNoYXJ0OgorCS8vCXtQZXJzcGVjdGl2ZUNoYXJ0fSAiY2hhcnQiIHJlZj1bY2hhcnQ6OkNoYXJ0XTsKKwlwdWJsaWMgUGVyc3BlY3RpdmVDaGFydEVsZW1lbnRzIGdldFBlcnNwZWN0aXZlQ2hhcnRBY2Nlc3MoKSB7CisJCXJldHVybiBwUGVyc3BlY3RpdmVDaGFydDsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0UGVyc3BlY3RpdmVDaGFydFJ1bGUoKSB7CisJCXJldHVybiBnZXRQZXJzcGVjdGl2ZUNoYXJ0QWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vUGVyc3BlY3RpdmVSZXBvcnQ6CisJLy8Je1BlcnNwZWN0aXZlUmVwb3J0fSAicmVwb3J0IiByZWY9W3JlcG9ydDo6UmVwb3J0XTsKKwlwdWJsaWMgUGVyc3BlY3RpdmVSZXBvcnRFbGVtZW50cyBnZXRQZXJzcGVjdGl2ZVJlcG9ydEFjY2VzcygpIHsKKwkJcmV0dXJuIHBQZXJzcGVjdGl2ZVJlcG9ydDsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0UGVyc3BlY3RpdmVSZXBvcnRSdWxlKCkgeworCQlyZXR1cm4gZ2V0UGVyc3BlY3RpdmVSZXBvcnRBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9QZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbjoKKwkvLwl7UGVyc3BlY3RpdmVPcmdhbml6YXRpb259ICJvcmdhbmlncmFtIiByZWY9W29yZ2FuaXphdGlvbjo6T3JnYW5pemF0aW9uXTsKKwlwdWJsaWMgUGVyc3BlY3RpdmVPcmdhbml6YXRpb25FbGVtZW50cyBnZXRQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbkFjY2VzcygpIHsKKwkJcmV0dXJuIHBQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbjsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0UGVyc3BlY3RpdmVPcmdhbml6YXRpb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0UGVyc3BlY3RpdmVPcmdhbml6YXRpb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9QZXJzcGVjdGl2ZVRvcG9sb2d5OgorCS8vCXtQZXJzcGVjdGl2ZVRvcG9sb2d5fSAidG9wb2xvZ3kiIHJlZj1bdG9wb2xvZ3k6OlRvcG9sb2d5XTsKKwlwdWJsaWMgUGVyc3BlY3RpdmVUb3BvbG9neUVsZW1lbnRzIGdldFBlcnNwZWN0aXZlVG9wb2xvZ3lBY2Nlc3MoKSB7CisJCXJldHVybiBwUGVyc3BlY3RpdmVUb3BvbG9neTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0UGVyc3BlY3RpdmVUb3BvbG9neVJ1bGUoKSB7CisJCXJldHVybiBnZXRQZXJzcGVjdGl2ZVRvcG9sb2d5QWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vUGVyc3BlY3RpdmVEaWFsb2c6CisJLy8Je1BlcnNwZWN0aXZlRGlhbG9nfSAiZGlhbG9nIiByZWY9W2RpYWxvZzo6RGlhbG9nXTsKKwlwdWJsaWMgUGVyc3BlY3RpdmVEaWFsb2dFbGVtZW50cyBnZXRQZXJzcGVjdGl2ZURpYWxvZ0FjY2VzcygpIHsKKwkJcmV0dXJuIHBQZXJzcGVjdGl2ZURpYWxvZzsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0UGVyc3BlY3RpdmVEaWFsb2dSdWxlKCkgeworCQlyZXR1cm4gZ2V0UGVyc3BlY3RpdmVEaWFsb2dBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9QZXJzcGVjdGl2ZUJQTU46CisJLy8Je1BlcnNwZWN0aXZlQlBNTn0gImJwbW4iOworCXB1YmxpYyBQZXJzcGVjdGl2ZUJQTU5FbGVtZW50cyBnZXRQZXJzcGVjdGl2ZUJQTU5BY2Nlc3MoKSB7CisJCXJldHVybiBwUGVyc3BlY3RpdmVCUE1OOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRQZXJzcGVjdGl2ZUJQTU5SdWxlKCkgeworCQlyZXR1cm4gZ2V0UGVyc3BlY3RpdmVCUE1OQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vUGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkOgorCS8vCVF1YWxpZmllZE5hbWUgKCIuIiAiKiIpPzsKKwlwdWJsaWMgUGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkRWxlbWVudHMgZ2V0UGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkQWNjZXNzKCkgeworCQlyZXR1cm4gcFBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZDsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0UGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkUnVsZSgpIHsKKwkJcmV0dXJuIGdldFBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1F1YWxpZmllZE5hbWU6CisJLy8JVmFsaWRJRCAoIi4iIFZhbGlkSUQpKjsKKwlwdWJsaWMgUXVhbGlmaWVkTmFtZUVsZW1lbnRzIGdldFF1YWxpZmllZE5hbWVBY2Nlc3MoKSB7CisJCXJldHVybiBwUXVhbGlmaWVkTmFtZTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0UXVhbGlmaWVkTmFtZVJ1bGUoKSB7CisJCXJldHVybiBnZXRRdWFsaWZpZWROYW1lQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vVmFsaWRJRDoKKwkvLwlJRDsKKwlwdWJsaWMgVmFsaWRJREVsZW1lbnRzIGdldFZhbGlkSURBY2Nlc3MoKSB7CisJCXJldHVybiBwVmFsaWRJRDsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0VmFsaWRJRFJ1bGUoKSB7CisJCXJldHVybiBnZXRWYWxpZElEQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vVFJBTlNMQVRBQkxFSUQ6CisJLy8JSUQ7CisJcHVibGljIFRSQU5TTEFUQUJMRUlERWxlbWVudHMgZ2V0VFJBTlNMQVRBQkxFSURBY2Nlc3MoKSB7CisJCXJldHVybiBwVFJBTlNMQVRBQkxFSUQ7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFRSQU5TTEFUQUJMRUlEUnVsZSgpIHsKKwkJcmV0dXJuIGdldFRSQU5TTEFUQUJMRUlEQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vVFJBTlNMQVRBQkxFU1RSSU5HOgorCS8vCVNUUklORzsKKwlwdWJsaWMgVFJBTlNMQVRBQkxFU1RSSU5HRWxlbWVudHMgZ2V0VFJBTlNMQVRBQkxFU1RSSU5HQWNjZXNzKCkgeworCQlyZXR1cm4gcFRSQU5TTEFUQUJMRVNUUklORzsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0VFJBTlNMQVRBQkxFU1RSSU5HUnVsZSgpIHsKKwkJcmV0dXJuIGdldFRSQU5TTEFUQUJMRVNUUklOR0FjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL2VudW0gU2FzaE9yaWVudGF0aW9uOgorCS8vCUhPUklaT05UQUw9Imhvcml6b250YWwiIHwgVkVSVElDQUw9InZlcnRpY2FsIjsKKwlwdWJsaWMgU2FzaE9yaWVudGF0aW9uRWxlbWVudHMgZ2V0U2FzaE9yaWVudGF0aW9uQWNjZXNzKCkgeworCQlyZXR1cm4gdW5rbm93blJ1bGVTYXNoT3JpZW50YXRpb247CisJfQorCQorCXB1YmxpYyBFbnVtUnVsZSBnZXRTYXNoT3JpZW50YXRpb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0U2FzaE9yaWVudGF0aW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWEFubm90YXRpb246CisJLy8Je1hBbm5vdGF0aW9ufSAiQCIgYW5ub3RhdGlvblR5cGU9W3R5cGVzOjpKdm1Bbm5vdGF0aW9uVHlwZXxRdWFsaWZpZWROYW1lXSAoIigiCisJLy8JKGVsZW1lbnRWYWx1ZVBhaXJzKz1YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKCIsIiBlbGVtZW50VmFsdWVQYWlycys9WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyKSogfAorCS8vCXZhbHVlPVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QpPyAiKSIpPzsKKwlwdWJsaWMgWGJhc2VXaXRoQW5ub3RhdGlvbnNHcmFtbWFyQWNjZXNzLlhBbm5vdGF0aW9uRWxlbWVudHMgZ2V0WEFubm90YXRpb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhBbm5vdGF0aW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhBbm5vdGF0aW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyOgorCS8vCT0+IChlbGVtZW50PVt0eXBlczo6SnZtT3BlcmF0aW9ufFZhbGlkSURdICI9IikgdmFsdWU9WEFubm90YXRpb25FbGVtZW50VmFsdWU7CisJcHVibGljIFhiYXNlV2l0aEFubm90YXRpb25zR3JhbW1hckFjY2Vzcy5YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJFbGVtZW50cyBnZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJSdWxlKCkgeworCQlyZXR1cm4gZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCByZXR1cm5zIHhiYXNlOjpYRXhwcmVzc2lvbjoKKwkvLwk9PiAoe3hiYXNlOjpYTGlzdExpdGVyYWx9ICIjIiAiWyIpIChlbGVtZW50cys9WEFubm90YXRpb25PckV4cHJlc3Npb24gKCIsIiBlbGVtZW50cys9WEFubm90YXRpb25PckV4cHJlc3Npb24pKik/ICJdIgorCS8vCXwgWEFubm90YXRpb25PckV4cHJlc3Npb24gKHt4YmFzZTo6WExpc3RMaXRlcmFsLmVsZW1lbnRzKz1jdXJyZW50fSAoIiwiIGVsZW1lbnRzKz1YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbikrKT87CisJcHVibGljIFhiYXNlV2l0aEFubm90YXRpb25zR3JhbW1hckFjY2Vzcy5YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0RWxlbWVudHMgZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHsKKwkJcmV0dXJuIGdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSByZXR1cm5zIHhiYXNlOjpYRXhwcmVzc2lvbjoKKwkvLwk9PiAoe3hiYXNlOjpYTGlzdExpdGVyYWx9ICIjIiAiWyIpIChlbGVtZW50cys9WEFubm90YXRpb25PckV4cHJlc3Npb24gKCIsIiBlbGVtZW50cys9WEFubm90YXRpb25PckV4cHJlc3Npb24pKik/ICJdIgorCS8vCXwgWEFubm90YXRpb25PckV4cHJlc3Npb247CisJcHVibGljIFhiYXNlV2l0aEFubm90YXRpb25zR3JhbW1hckFjY2Vzcy5YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUVsZW1lbnRzIGdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB7CisJCXJldHVybiBnZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uIHJldHVybnMgeGJhc2U6OlhFeHByZXNzaW9uOgorCS8vCVhBbm5vdGF0aW9uIHwgWEV4cHJlc3Npb247CisJcHVibGljIFhiYXNlV2l0aEFubm90YXRpb25zR3JhbW1hckFjY2Vzcy5YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbkVsZW1lbnRzIGdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB7CisJCXJldHVybiBnZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hFeHByZXNzaW9uOgorCS8vCVhBc3NpZ25tZW50OworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWEV4cHJlc3Npb25FbGVtZW50cyBnZXRYRXhwcmVzc2lvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WEV4cHJlc3Npb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WEV4cHJlc3Npb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YQXNzaWdubWVudCByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCXtYQXNzaWdubWVudH0gZmVhdHVyZT1bdHlwZXM6Okp2bUlkZW50aWZpYWJsZUVsZW1lbnR8RmVhdHVyZUNhbGxJRF0gT3BTaW5nbGVBc3NpZ24gdmFsdWU9WEFzc2lnbm1lbnQgfCBYT3JFeHByZXNzaW9uCisJLy8JKD0+ICh7WEJpbmFyeU9wZXJhdGlvbi5sZWZ0T3BlcmFuZD1jdXJyZW50fSBmZWF0dXJlPVt0eXBlczo6SnZtSWRlbnRpZmlhYmxlRWxlbWVudHxPcE11bHRpQXNzaWduXSkKKwkvLwlyaWdodE9wZXJhbmQ9WEFzc2lnbm1lbnQpPzsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhBc3NpZ25tZW50RWxlbWVudHMgZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhBc3NpZ25tZW50QWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhBc3NpZ25tZW50UnVsZSgpIHsKKwkJcmV0dXJuIGdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vT3BTaW5nbGVBc3NpZ246CisJLy8JIj0iOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuT3BTaW5nbGVBc3NpZ25FbGVtZW50cyBnZXRPcFNpbmdsZUFzc2lnbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0T3BTaW5nbGVBc3NpZ25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0T3BTaW5nbGVBc3NpZ25SdWxlKCkgeworCQlyZXR1cm4gZ2V0T3BTaW5nbGVBc3NpZ25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9PcE11bHRpQXNzaWduOgorCS8vCSIrPSIgfCAiLT0iIHwgIio9IiB8ICIvPSIgfCAiJT0iIHwgIjwiICI8IiAiPSIgfCAiPiIgIj4iPyAiPj0iOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuT3BNdWx0aUFzc2lnbkVsZW1lbnRzIGdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0T3BNdWx0aUFzc2lnblJ1bGUoKSB7CisJCXJldHVybiBnZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWE9yRXhwcmVzc2lvbiByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCVhBbmRFeHByZXNzaW9uICg9PiAoe1hCaW5hcnlPcGVyYXRpb24ubGVmdE9wZXJhbmQ9Y3VycmVudH0gZmVhdHVyZT1bdHlwZXM6Okp2bUlkZW50aWZpYWJsZUVsZW1lbnR8T3BPcl0pCisJLy8JcmlnaHRPcGVyYW5kPVhBbmRFeHByZXNzaW9uKSo7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YT3JFeHByZXNzaW9uRWxlbWVudHMgZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYT3JFeHByZXNzaW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9PcE9yOgorCS8vCSJ8fCI7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5PcE9yRWxlbWVudHMgZ2V0T3BPckFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0T3BPckFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRPcE9yUnVsZSgpIHsKKwkJcmV0dXJuIGdldE9wT3JBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YQW5kRXhwcmVzc2lvbiByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCVhFcXVhbGl0eUV4cHJlc3Npb24gKD0+ICh7WEJpbmFyeU9wZXJhdGlvbi5sZWZ0T3BlcmFuZD1jdXJyZW50fSBmZWF0dXJlPVt0eXBlczo6SnZtSWRlbnRpZmlhYmxlRWxlbWVudHxPcEFuZF0pCisJLy8JcmlnaHRPcGVyYW5kPVhFcXVhbGl0eUV4cHJlc3Npb24pKjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhBbmRFeHByZXNzaW9uRWxlbWVudHMgZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vT3BBbmQ6CisJLy8JIiYmIjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLk9wQW5kRWxlbWVudHMgZ2V0T3BBbmRBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldE9wQW5kQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldE9wQW5kUnVsZSgpIHsKKwkJcmV0dXJuIGdldE9wQW5kQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWEVxdWFsaXR5RXhwcmVzc2lvbiByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCVhSZWxhdGlvbmFsRXhwcmVzc2lvbiAoPT4gKHtYQmluYXJ5T3BlcmF0aW9uLmxlZnRPcGVyYW5kPWN1cnJlbnR9IGZlYXR1cmU9W3R5cGVzOjpKdm1JZGVudGlmaWFibGVFbGVtZW50fE9wRXF1YWxpdHldKQorCS8vCXJpZ2h0T3BlcmFuZD1YUmVsYXRpb25hbEV4cHJlc3Npb24pKjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhFcXVhbGl0eUV4cHJlc3Npb25FbGVtZW50cyBnZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL09wRXF1YWxpdHk6CisJLy8JIj09IiB8ICIhPSIgfCAiPT09IiB8ICIhPT0iOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuT3BFcXVhbGl0eUVsZW1lbnRzIGdldE9wRXF1YWxpdHlBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldE9wRXF1YWxpdHlBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0T3BFcXVhbGl0eVJ1bGUoKSB7CisJCXJldHVybiBnZXRPcEVxdWFsaXR5QWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWFJlbGF0aW9uYWxFeHByZXNzaW9uIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8JWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICg9PiAoe1hJbnN0YW5jZU9mRXhwcmVzc2lvbi5leHByZXNzaW9uPWN1cnJlbnR9ICJpbnN0YW5jZW9mIikgdHlwZT1Kdm1UeXBlUmVmZXJlbmNlIHwgPT4KKwkvLwkoe1hCaW5hcnlPcGVyYXRpb24ubGVmdE9wZXJhbmQ9Y3VycmVudH0gZmVhdHVyZT1bdHlwZXM6Okp2bUlkZW50aWZpYWJsZUVsZW1lbnR8T3BDb21wYXJlXSkKKwkvLwlyaWdodE9wZXJhbmQ9WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uKSo7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YUmVsYXRpb25hbEV4cHJlc3Npb25FbGVtZW50cyBnZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vT3BDb21wYXJlOgorCS8vCSI+PSIgfCAiPCIgIj0iIHwgIj4iIHwgIjwiOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuT3BDb21wYXJlRWxlbWVudHMgZ2V0T3BDb21wYXJlQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRPcENvbXBhcmVBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0T3BDb21wYXJlUnVsZSgpIHsKKwkJcmV0dXJuIGdldE9wQ29tcGFyZUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCVhBZGRpdGl2ZUV4cHJlc3Npb24gKD0+ICh7WEJpbmFyeU9wZXJhdGlvbi5sZWZ0T3BlcmFuZD1jdXJyZW50fSBmZWF0dXJlPVt0eXBlczo6SnZtSWRlbnRpZmlhYmxlRWxlbWVudHxPcE90aGVyXSkKKwkvLwlyaWdodE9wZXJhbmQ9WEFkZGl0aXZlRXhwcmVzc2lvbikqOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uRWxlbWVudHMgZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL09wT3RoZXI6CisJLy8JIi0+IiB8ICIuLjwiIHwgIj4iICIuLiIgfCAiLi4iIHwgIj0+IiB8ICI+IiAoPT4gKCI+IiAiPiIpIHwgIj4iKSB8ICI8IiAoPT4gKCI8IiAiPCIpIHwgIjwiIHwgIj0+IikgfCAiPD4iIHwgIj86IjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLk9wT3RoZXJFbGVtZW50cyBnZXRPcE90aGVyQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRPcE90aGVyQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldE9wT3RoZXJSdWxlKCkgeworCQlyZXR1cm4gZ2V0T3BPdGhlckFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hBZGRpdGl2ZUV4cHJlc3Npb24gcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwlYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICg9PiAoe1hCaW5hcnlPcGVyYXRpb24ubGVmdE9wZXJhbmQ9Y3VycmVudH0gZmVhdHVyZT1bdHlwZXM6Okp2bUlkZW50aWZpYWJsZUVsZW1lbnR8T3BBZGRdKQorCS8vCXJpZ2h0T3BlcmFuZD1YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKSo7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YQWRkaXRpdmVFeHByZXNzaW9uRWxlbWVudHMgZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9PcEFkZDoKKwkvLwkiKyIgfCAiLSI7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5PcEFkZEVsZW1lbnRzIGdldE9wQWRkQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRPcEFkZEFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRPcEFkZFJ1bGUoKSB7CisJCXJldHVybiBnZXRPcEFkZEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwlYVW5hcnlPcGVyYXRpb24gKD0+ICh7WEJpbmFyeU9wZXJhdGlvbi5sZWZ0T3BlcmFuZD1jdXJyZW50fSBmZWF0dXJlPVt0eXBlczo6SnZtSWRlbnRpZmlhYmxlRWxlbWVudHxPcE11bHRpXSkKKwkvLwlyaWdodE9wZXJhbmQ9WFVuYXJ5T3BlcmF0aW9uKSo7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uRWxlbWVudHMgZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9PcE11bHRpOgorCS8vCSIqIiB8ICIqKiIgfCAiLyIgfCAiJSI7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5PcE11bHRpRWxlbWVudHMgZ2V0T3BNdWx0aUFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0T3BNdWx0aUFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRPcE11bHRpUnVsZSgpIHsKKwkJcmV0dXJuIGdldE9wTXVsdGlBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YVW5hcnlPcGVyYXRpb24gcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwl7WFVuYXJ5T3BlcmF0aW9ufSBmZWF0dXJlPVt0eXBlczo6SnZtSWRlbnRpZmlhYmxlRWxlbWVudHxPcFVuYXJ5XSBvcGVyYW5kPVhVbmFyeU9wZXJhdGlvbiB8IFhDYXN0ZWRFeHByZXNzaW9uOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWFVuYXJ5T3BlcmF0aW9uRWxlbWVudHMgZ2V0WFVuYXJ5T3BlcmF0aW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYVW5hcnlPcGVyYXRpb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhVbmFyeU9wZXJhdGlvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL09wVW5hcnk6CisJLy8JIiEiIHwgIi0iIHwgIisiOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuT3BVbmFyeUVsZW1lbnRzIGdldE9wVW5hcnlBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldE9wVW5hcnlBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0T3BVbmFyeVJ1bGUoKSB7CisJCXJldHVybiBnZXRPcFVuYXJ5QWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWENhc3RlZEV4cHJlc3Npb24gcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwlYUG9zdGZpeE9wZXJhdGlvbiAoPT4gKHtYQ2FzdGVkRXhwcmVzc2lvbi50YXJnZXQ9Y3VycmVudH0gImFzIikgdHlwZT1Kdm1UeXBlUmVmZXJlbmNlKSo7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YQ2FzdGVkRXhwcmVzc2lvbkVsZW1lbnRzIGdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB7CisJCXJldHVybiBnZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hQb3N0Zml4T3BlcmF0aW9uIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8JWE1lbWJlckZlYXR1cmVDYWxsID0+ICh7WFBvc3RmaXhPcGVyYXRpb24ub3BlcmFuZD1jdXJyZW50fSBmZWF0dXJlPVt0eXBlczo6SnZtSWRlbnRpZmlhYmxlRWxlbWVudHxPcFBvc3RmaXhdKT87CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YUG9zdGZpeE9wZXJhdGlvbkVsZW1lbnRzIGdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB7CisJCXJldHVybiBnZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL09wUG9zdGZpeDoKKwkvLwkiKysiIHwgIi0tIjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLk9wUG9zdGZpeEVsZW1lbnRzIGdldE9wUG9zdGZpeEFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0T3BQb3N0Zml4QWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldE9wUG9zdGZpeFJ1bGUoKSB7CisJCXJldHVybiBnZXRPcFBvc3RmaXhBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YTWVtYmVyRmVhdHVyZUNhbGwgcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwlYUHJpbWFyeUV4cHJlc3Npb24gKD0+ICh7WEFzc2lnbm1lbnQuYXNzaWduYWJsZT1jdXJyZW50fSAoIi4iIHwgZXhwbGljaXRTdGF0aWM/PSI6OiIpCisJLy8JZmVhdHVyZT1bdHlwZXM6Okp2bUlkZW50aWZpYWJsZUVsZW1lbnR8RmVhdHVyZUNhbGxJRF0gT3BTaW5nbGVBc3NpZ24pIHZhbHVlPVhBc3NpZ25tZW50IHwgPT4KKwkvLwkoe1hNZW1iZXJGZWF0dXJlQ2FsbC5tZW1iZXJDYWxsVGFyZ2V0PWN1cnJlbnR9ICgiLiIgfCBudWxsU2FmZT89Ij8uIiB8IGV4cGxpY2l0U3RhdGljPz0iOjoiKSkgKCI8IgorCS8vCXR5cGVBcmd1bWVudHMrPUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSAoIiwiIHR5cGVBcmd1bWVudHMrPUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSkqICI+Iik/CisJLy8JZmVhdHVyZT1bdHlwZXM6Okp2bUlkZW50aWZpYWJsZUVsZW1lbnR8SWRPclN1cGVyXSAoPT4gZXhwbGljaXRPcGVyYXRpb25DYWxsPz0iKCIgKG1lbWJlckNhbGxBcmd1bWVudHMrPVhTaG9ydENsb3N1cmUKKwkvLwl8IG1lbWJlckNhbGxBcmd1bWVudHMrPVhFeHByZXNzaW9uICgiLCIgbWVtYmVyQ2FsbEFyZ3VtZW50cys9WEV4cHJlc3Npb24pKik/ICIpIik/IG1lbWJlckNhbGxBcmd1bWVudHMrPVhDbG9zdXJlPykqOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWE1lbWJlckZlYXR1cmVDYWxsRWxlbWVudHMgZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hQcmltYXJ5RXhwcmVzc2lvbiByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCVhDb25zdHJ1Y3RvckNhbGwgfCBYQmxvY2tFeHByZXNzaW9uIHwgWFN3aXRjaEV4cHJlc3Npb24gfCBYU3luY2hyb25pemVkRXhwcmVzc2lvbiB8IFhGZWF0dXJlQ2FsbCB8IFhMaXRlcmFsIHwKKwkvLwlYSWZFeHByZXNzaW9uIHwgWEZvckxvb3BFeHByZXNzaW9uIHwgWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24gfCBYV2hpbGVFeHByZXNzaW9uIHwgWERvV2hpbGVFeHByZXNzaW9uIHwKKwkvLwlYVGhyb3dFeHByZXNzaW9uIHwgWFJldHVybkV4cHJlc3Npb24gfCBYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbiB8IFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhQcmltYXJ5RXhwcmVzc2lvbkVsZW1lbnRzIGdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB7CisJCXJldHVybiBnZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YTGl0ZXJhbCByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCVhDb2xsZWN0aW9uTGl0ZXJhbCB8IFhDbG9zdXJlIHwgWEJvb2xlYW5MaXRlcmFsIHwgWE51bWJlckxpdGVyYWwgfCBYTnVsbExpdGVyYWwgfCBYU3RyaW5nTGl0ZXJhbCB8IFhUeXBlTGl0ZXJhbDsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhMaXRlcmFsRWxlbWVudHMgZ2V0WExpdGVyYWxBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhMaXRlcmFsQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhMaXRlcmFsUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhMaXRlcmFsQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWENvbGxlY3Rpb25MaXRlcmFsOgorCS8vCVhTZXRMaXRlcmFsIHwgWExpc3RMaXRlcmFsOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWENvbGxlY3Rpb25MaXRlcmFsRWxlbWVudHMgZ2V0WENvbGxlY3Rpb25MaXRlcmFsQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYQ29sbGVjdGlvbkxpdGVyYWxBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WENvbGxlY3Rpb25MaXRlcmFsUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhDb2xsZWN0aW9uTGl0ZXJhbEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hTZXRMaXRlcmFsOgorCS8vCXtYU2V0TGl0ZXJhbH0gIiMiICJ7IiAoZWxlbWVudHMrPVhFeHByZXNzaW9uICgiLCIgZWxlbWVudHMrPVhFeHByZXNzaW9uKSopPyAifSI7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YU2V0TGl0ZXJhbEVsZW1lbnRzIGdldFhTZXRMaXRlcmFsQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYU2V0TGl0ZXJhbEFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYU2V0TGl0ZXJhbFJ1bGUoKSB7CisJCXJldHVybiBnZXRYU2V0TGl0ZXJhbEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hMaXN0TGl0ZXJhbDoKKwkvLwl7WExpc3RMaXRlcmFsfSAiIyIgIlsiIChlbGVtZW50cys9WEV4cHJlc3Npb24gKCIsIiBlbGVtZW50cys9WEV4cHJlc3Npb24pKik/ICJdIjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhMaXN0TGl0ZXJhbEVsZW1lbnRzIGdldFhMaXN0TGl0ZXJhbEFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WExpc3RMaXRlcmFsQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhMaXN0TGl0ZXJhbFJ1bGUoKSB7CisJCXJldHVybiBnZXRYTGlzdExpdGVyYWxBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YQ2xvc3VyZSByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCT0+ICh7WENsb3N1cmV9ICJbIikgPT4gKChkZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnMrPUp2bUZvcm1hbFBhcmFtZXRlciAoIiwiCisJLy8JZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzKz1Kdm1Gb3JtYWxQYXJhbWV0ZXIpKik/IGV4cGxpY2l0U3ludGF4Pz0ifCIpPyBleHByZXNzaW9uPVhFeHByZXNzaW9uSW5DbG9zdXJlICJdIjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhDbG9zdXJlRWxlbWVudHMgZ2V0WENsb3N1cmVBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhDbG9zdXJlQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhDbG9zdXJlUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWEV4cHJlc3Npb25JbkNsb3N1cmUgcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwl7WEJsb2NrRXhwcmVzc2lvbn0gKGV4cHJlc3Npb25zKz1YRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gIjsiPykqOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWEV4cHJlc3Npb25JbkNsb3N1cmVFbGVtZW50cyBnZXRYRXhwcmVzc2lvbkluQ2xvc3VyZUFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WEV4cHJlc3Npb25JbkNsb3N1cmVBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WEV4cHJlc3Npb25JbkNsb3N1cmVSdWxlKCkgeworCQlyZXR1cm4gZ2V0WEV4cHJlc3Npb25JbkNsb3N1cmVBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YU2hvcnRDbG9zdXJlIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8JPT4gKHtYQ2xvc3VyZX0gKGRlY2xhcmVkRm9ybWFsUGFyYW1ldGVycys9SnZtRm9ybWFsUGFyYW1ldGVyICgiLCIgZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzKz1Kdm1Gb3JtYWxQYXJhbWV0ZXIpKik/CisJLy8JZXhwbGljaXRTeW50YXg/PSJ8IikgZXhwcmVzc2lvbj1YRXhwcmVzc2lvbjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhTaG9ydENsb3N1cmVFbGVtZW50cyBnZXRYU2hvcnRDbG9zdXJlQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYU2hvcnRDbG9zdXJlQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhTaG9ydENsb3N1cmVSdWxlKCkgeworCQlyZXR1cm4gZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCSIoIiBYRXhwcmVzc2lvbiAiKSI7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YUGFyZW50aGVzaXplZEV4cHJlc3Npb25FbGVtZW50cyBnZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWElmRXhwcmVzc2lvbiByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCXtYSWZFeHByZXNzaW9ufSAiaWYiICIoIiBpZj1YRXhwcmVzc2lvbiAiKSIgdGhlbj1YRXhwcmVzc2lvbiAoImVsc2UiIGVsc2U9WEV4cHJlc3Npb24pPzsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhJZkV4cHJlc3Npb25FbGVtZW50cyBnZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYSWZFeHByZXNzaW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhJZkV4cHJlc3Npb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WElmRXhwcmVzc2lvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hTd2l0Y2hFeHByZXNzaW9uIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8Je1hTd2l0Y2hFeHByZXNzaW9ufSAic3dpdGNoIiAoPT4gKCIoIiBkZWNsYXJlZFBhcmFtPUp2bUZvcm1hbFBhcmFtZXRlciAiOiIpIHN3aXRjaD1YRXhwcmVzc2lvbiAiKSIgfCA9PgorCS8vCShkZWNsYXJlZFBhcmFtPUp2bUZvcm1hbFBhcmFtZXRlciAiOiIpPyBzd2l0Y2g9WEV4cHJlc3Npb24pICJ7IiBjYXNlcys9WENhc2VQYXJ0KiAoImRlZmF1bHQiICI6IgorCS8vCWRlZmF1bHQ9WEV4cHJlc3Npb24pPyAifSI7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YU3dpdGNoRXhwcmVzc2lvbkVsZW1lbnRzIGdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYU3dpdGNoRXhwcmVzc2lvblJ1bGUoKSB7CisJCXJldHVybiBnZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hDYXNlUGFydDoKKwkvLwl7WENhc2VQYXJ0fSB0eXBlR3VhcmQ9SnZtVHlwZVJlZmVyZW5jZT8gKCJjYXNlIiBjYXNlPVhFeHByZXNzaW9uKT8gKCI6IiB0aGVuPVhFeHByZXNzaW9uIHwgZmFsbFRocm91Z2g/PSIsIik7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YQ2FzZVBhcnRFbGVtZW50cyBnZXRYQ2FzZVBhcnRBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhDYXNlUGFydEFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYQ2FzZVBhcnRSdWxlKCkgeworCQlyZXR1cm4gZ2V0WENhc2VQYXJ0QWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWEZvckxvb3BFeHByZXNzaW9uIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8JPT4gKHtYRm9yTG9vcEV4cHJlc3Npb259ICJmb3IiICIoIiBkZWNsYXJlZFBhcmFtPUp2bUZvcm1hbFBhcmFtZXRlciAiOiIpIGZvckV4cHJlc3Npb249WEV4cHJlc3Npb24gIikiCisJLy8JZWFjaEV4cHJlc3Npb249WEV4cHJlc3Npb247CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YRm9yTG9vcEV4cHJlc3Npb25FbGVtZW50cyBnZXRYRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYRm9yTG9vcEV4cHJlc3Npb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24gcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwl7WEJhc2ljRm9yTG9vcEV4cHJlc3Npb259ICJmb3IiICIoIiAoaW5pdEV4cHJlc3Npb25zKz1YRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKCIsIgorCS8vCWluaXRFeHByZXNzaW9ucys9WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uKSopPyAiOyIgZXhwcmVzc2lvbj1YRXhwcmVzc2lvbj8gIjsiICh1cGRhdGVFeHByZXNzaW9ucys9WEV4cHJlc3Npb24gKCIsIgorCS8vCXVwZGF0ZUV4cHJlc3Npb25zKz1YRXhwcmVzc2lvbikqKT8gIikiIGVhY2hFeHByZXNzaW9uPVhFeHByZXNzaW9uOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25FbGVtZW50cyBnZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YV2hpbGVFeHByZXNzaW9uIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8Je1hXaGlsZUV4cHJlc3Npb259ICJ3aGlsZSIgIigiIHByZWRpY2F0ZT1YRXhwcmVzc2lvbiAiKSIgYm9keT1YRXhwcmVzc2lvbjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhXaGlsZUV4cHJlc3Npb25FbGVtZW50cyBnZXRYV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYV2hpbGVFeHByZXNzaW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhXaGlsZUV4cHJlc3Npb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WFdoaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hEb1doaWxlRXhwcmVzc2lvbiByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCXtYRG9XaGlsZUV4cHJlc3Npb259ICJkbyIgYm9keT1YRXhwcmVzc2lvbiAid2hpbGUiICIoIiBwcmVkaWNhdGU9WEV4cHJlc3Npb24gIikiOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWERvV2hpbGVFeHByZXNzaW9uRWxlbWVudHMgZ2V0WERvV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYRG9XaGlsZUV4cHJlc3Npb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WERvV2hpbGVFeHByZXNzaW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhEb1doaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hCbG9ja0V4cHJlc3Npb24gcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwl7WEJsb2NrRXhwcmVzc2lvbn0gInsiIChleHByZXNzaW9ucys9WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICI7Ij8pKiAifSI7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YQmxvY2tFeHByZXNzaW9uRWxlbWVudHMgZ2V0WEJsb2NrRXhwcmVzc2lvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WEJsb2NrRXhwcmVzc2lvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYQmxvY2tFeHByZXNzaW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhCbG9ja0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwlYVmFyaWFibGVEZWNsYXJhdGlvbiB8IFhFeHByZXNzaW9uOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uRWxlbWVudHMgZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hWYXJpYWJsZURlY2xhcmF0aW9uIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8Je1hWYXJpYWJsZURlY2xhcmF0aW9ufSAod3JpdGVhYmxlPz0idmFyIiB8ICJ2YWwiKSAoPT4gKHR5cGU9SnZtVHlwZVJlZmVyZW5jZSBuYW1lPVZhbGlkSUQpIHwgbmFtZT1WYWxpZElEKSAoIj0iCisJLy8JcmlnaHQ9WEV4cHJlc3Npb24pPzsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhWYXJpYWJsZURlY2xhcmF0aW9uRWxlbWVudHMgZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhWYXJpYWJsZURlY2xhcmF0aW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vSnZtRm9ybWFsUGFyYW1ldGVyIHJldHVybnMgdHlwZXM6Okp2bUZvcm1hbFBhcmFtZXRlcjoKKwkvLwlwYXJhbWV0ZXJUeXBlPUp2bVR5cGVSZWZlcmVuY2U/IG5hbWU9VmFsaWRJRDsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLkp2bUZvcm1hbFBhcmFtZXRlckVsZW1lbnRzIGdldEp2bUZvcm1hbFBhcmFtZXRlckFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0SnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldEp2bUZvcm1hbFBhcmFtZXRlclJ1bGUoKSB7CisJCXJldHVybiBnZXRKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9GdWxsSnZtRm9ybWFsUGFyYW1ldGVyIHJldHVybnMgdHlwZXM6Okp2bUZvcm1hbFBhcmFtZXRlcjoKKwkvLwlwYXJhbWV0ZXJUeXBlPUp2bVR5cGVSZWZlcmVuY2UgbmFtZT1WYWxpZElEOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuRnVsbEp2bUZvcm1hbFBhcmFtZXRlckVsZW1lbnRzIGdldEZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldEZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0RnVsbEp2bUZvcm1hbFBhcmFtZXRlclJ1bGUoKSB7CisJCXJldHVybiBnZXRGdWxsSnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWEZlYXR1cmVDYWxsIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8Je1hGZWF0dXJlQ2FsbH0gKCI8IiB0eXBlQXJndW1lbnRzKz1Kdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKCIsIiB0eXBlQXJndW1lbnRzKz1Kdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UpKiAiPiIpPworCS8vCWZlYXR1cmU9W3R5cGVzOjpKdm1JZGVudGlmaWFibGVFbGVtZW50fElkT3JTdXBlcl0gKD0+IGV4cGxpY2l0T3BlcmF0aW9uQ2FsbD89IigiIChmZWF0dXJlQ2FsbEFyZ3VtZW50cys9WFNob3J0Q2xvc3VyZQorCS8vCXwgZmVhdHVyZUNhbGxBcmd1bWVudHMrPVhFeHByZXNzaW9uICgiLCIgZmVhdHVyZUNhbGxBcmd1bWVudHMrPVhFeHByZXNzaW9uKSopPyAiKSIpPyBmZWF0dXJlQ2FsbEFyZ3VtZW50cys9WENsb3N1cmU/OworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWEZlYXR1cmVDYWxsRWxlbWVudHMgZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WEZlYXR1cmVDYWxsUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL0ZlYXR1cmVDYWxsSUQ6CisJLy8JVmFsaWRJRCB8ICJleHRlbmRzIiB8ICJzdGF0aWMiIHwgImltcG9ydCIgfCAiZXh0ZW5zaW9uIjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLkZlYXR1cmVDYWxsSURFbGVtZW50cyBnZXRGZWF0dXJlQ2FsbElEQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRGZWF0dXJlQ2FsbElEQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldEZlYXR1cmVDYWxsSURSdWxlKCkgeworCQlyZXR1cm4gZ2V0RmVhdHVyZUNhbGxJREFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL0lkT3JTdXBlcjoKKwkvLwlGZWF0dXJlQ2FsbElEIHwgInN1cGVyIjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLklkT3JTdXBlckVsZW1lbnRzIGdldElkT3JTdXBlckFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0SWRPclN1cGVyQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldElkT3JTdXBlclJ1bGUoKSB7CisJCXJldHVybiBnZXRJZE9yU3VwZXJBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YQ29uc3RydWN0b3JDYWxsIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8Je1hDb25zdHJ1Y3RvckNhbGx9ICJuZXciIGNvbnN0cnVjdG9yPVt0eXBlczo6SnZtQ29uc3RydWN0b3J8UXVhbGlmaWVkTmFtZV0gKCI8IgorCS8vCXR5cGVBcmd1bWVudHMrPUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSAoIiwiIHR5cGVBcmd1bWVudHMrPUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSkqICI+Iik/ICg9PgorCS8vCWV4cGxpY2l0Q29uc3RydWN0b3JDYWxsPz0iKCIgKGFyZ3VtZW50cys9WFNob3J0Q2xvc3VyZSB8IGFyZ3VtZW50cys9WEV4cHJlc3Npb24gKCIsIiBhcmd1bWVudHMrPVhFeHByZXNzaW9uKSopPyAiKSIpPworCS8vCWFyZ3VtZW50cys9WENsb3N1cmU/OworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWENvbnN0cnVjdG9yQ2FsbEVsZW1lbnRzIGdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WENvbnN0cnVjdG9yQ2FsbFJ1bGUoKSB7CisJCXJldHVybiBnZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWEJvb2xlYW5MaXRlcmFsIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8Je1hCb29sZWFuTGl0ZXJhbH0gKCJmYWxzZSIgfCBpc1RydWU/PSJ0cnVlIik7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YQm9vbGVhbkxpdGVyYWxFbGVtZW50cyBnZXRYQm9vbGVhbkxpdGVyYWxBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhCb29sZWFuTGl0ZXJhbEFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYQm9vbGVhbkxpdGVyYWxSdWxlKCkgeworCQlyZXR1cm4gZ2V0WEJvb2xlYW5MaXRlcmFsQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWE51bGxMaXRlcmFsIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8Je1hOdWxsTGl0ZXJhbH0gIm51bGwiOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWE51bGxMaXRlcmFsRWxlbWVudHMgZ2V0WE51bGxMaXRlcmFsQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYTnVsbExpdGVyYWxBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WE51bGxMaXRlcmFsUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhOdWxsTGl0ZXJhbEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hOdW1iZXJMaXRlcmFsIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8Je1hOdW1iZXJMaXRlcmFsfSB2YWx1ZT1OdW1iZXI7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YTnVtYmVyTGl0ZXJhbEVsZW1lbnRzIGdldFhOdW1iZXJMaXRlcmFsQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYTnVtYmVyTGl0ZXJhbEFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYTnVtYmVyTGl0ZXJhbFJ1bGUoKSB7CisJCXJldHVybiBnZXRYTnVtYmVyTGl0ZXJhbEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hTdHJpbmdMaXRlcmFsIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8Je1hTdHJpbmdMaXRlcmFsfSB2YWx1ZT1TVFJJTkc7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YU3RyaW5nTGl0ZXJhbEVsZW1lbnRzIGdldFhTdHJpbmdMaXRlcmFsQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYU3RyaW5nTGl0ZXJhbEFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYU3RyaW5nTGl0ZXJhbFJ1bGUoKSB7CisJCXJldHVybiBnZXRYU3RyaW5nTGl0ZXJhbEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hUeXBlTGl0ZXJhbCByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCXtYVHlwZUxpdGVyYWx9ICJ0eXBlb2YiICIoIiB0eXBlPVt0eXBlczo6SnZtVHlwZXxRdWFsaWZpZWROYW1lXSBhcnJheURpbWVuc2lvbnMrPUFycmF5QnJhY2tldHMqICIpIjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhUeXBlTGl0ZXJhbEVsZW1lbnRzIGdldFhUeXBlTGl0ZXJhbEFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WFR5cGVMaXRlcmFsQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhUeXBlTGl0ZXJhbFJ1bGUoKSB7CisJCXJldHVybiBnZXRYVHlwZUxpdGVyYWxBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YVGhyb3dFeHByZXNzaW9uIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8Je1hUaHJvd0V4cHJlc3Npb259ICJ0aHJvdyIgZXhwcmVzc2lvbj1YRXhwcmVzc2lvbjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhUaHJvd0V4cHJlc3Npb25FbGVtZW50cyBnZXRYVGhyb3dFeHByZXNzaW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYVGhyb3dFeHByZXNzaW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhUaHJvd0V4cHJlc3Npb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WFRocm93RXhwcmVzc2lvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hSZXR1cm5FeHByZXNzaW9uIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8Je1hSZXR1cm5FeHByZXNzaW9ufSAicmV0dXJuIiAtPiBleHByZXNzaW9uPVhFeHByZXNzaW9uPzsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhSZXR1cm5FeHByZXNzaW9uRWxlbWVudHMgZ2V0WFJldHVybkV4cHJlc3Npb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhSZXR1cm5FeHByZXNzaW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhSZXR1cm5FeHByZXNzaW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhSZXR1cm5FeHByZXNzaW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24gcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwl7WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb259ICJ0cnkiIGV4cHJlc3Npb249WEV4cHJlc3Npb24gKGNhdGNoQ2xhdXNlcys9WENhdGNoQ2xhdXNlKyAoImZpbmFsbHkiCisJLy8JZmluYWxseUV4cHJlc3Npb249WEV4cHJlc3Npb24pPyB8ICJmaW5hbGx5IiBmaW5hbGx5RXhwcmVzc2lvbj1YRXhwcmVzc2lvbik7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkVsZW1lbnRzIGdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvblJ1bGUoKSB7CisJCXJldHVybiBnZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8JPT4gKHtYU3luY2hyb25pemVkRXhwcmVzc2lvbn0gInN5bmNocm9uaXplZCIgIigiKSBwYXJhbT1YRXhwcmVzc2lvbiAiKSIgZXhwcmVzc2lvbj1YRXhwcmVzc2lvbjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhTeW5jaHJvbml6ZWRFeHByZXNzaW9uRWxlbWVudHMgZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWENhdGNoQ2xhdXNlOgorCS8vCSJjYXRjaCIgIigiIGRlY2xhcmVkUGFyYW09RnVsbEp2bUZvcm1hbFBhcmFtZXRlciAiKSIgZXhwcmVzc2lvbj1YRXhwcmVzc2lvbjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhDYXRjaENsYXVzZUVsZW1lbnRzIGdldFhDYXRjaENsYXVzZUFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WENhdGNoQ2xhdXNlQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhDYXRjaENsYXVzZVJ1bGUoKSB7CisJCXJldHVybiBnZXRYQ2F0Y2hDbGF1c2VBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9OdW1iZXIgaGlkZGVuKCk6CisJLy8JSEVYIHwgKElOVCB8IERFQ0lNQUwpICgiLiIgKElOVCB8IERFQ0lNQUwpKT87CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5OdW1iZXJFbGVtZW50cyBnZXROdW1iZXJBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldE51bWJlckFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXROdW1iZXJSdWxlKCkgeworCQlyZXR1cm4gZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vLyAqKgorCS8vICogRHVtbXkgcnVsZSwgZm9yICJiZXR0ZXIiIGRvd253YXJkcyBjb21wYXRpYmlsaXR5LCBzaW5jZSBHcmFtbWFyQWNjZXNzIGdlbmVyYXRlcyBub24tc3RhdGljIGlubmVyIGNsYXNzZXMsIAorCS8vICogd2hpY2ggbWFrZXMgZG93bnN0cmVhbSBncmFtbWFycyBicmVhayBvbiBjbGFzc2xvYWRpbmcsIHdoZW4gYSBydWxlIGlzIHJlbW92ZWQuCisJLy8gKiAvCisJLy9TdGF0aWNRdWFsaWZpZXI6CisJLy8JKFZhbGlkSUQgIjo6IikrOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuU3RhdGljUXVhbGlmaWVyRWxlbWVudHMgZ2V0U3RhdGljUXVhbGlmaWVyQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRTdGF0aWNRdWFsaWZpZXJBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0U3RhdGljUXVhbGlmaWVyUnVsZSgpIHsKKwkJcmV0dXJuIGdldFN0YXRpY1F1YWxpZmllckFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL3Rlcm1pbmFsIEhFWDoKKwkvLwkoIjB4IiB8ICIwWCIpICgiMCIuLiI5IiB8ICJhIi4uImYiIHwgIkEiLi4iRiIgfCAiXyIpKyAoIiMiICgoImIiIHwgIkIiKSAoImkiIHwgIkkiKSB8ICgibCIgfCAiTCIpKSk/OworCXB1YmxpYyBUZXJtaW5hbFJ1bGUgZ2V0SEVYUnVsZSgpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0SEVYUnVsZSgpOworCX0gCisKKwkvL3Rlcm1pbmFsIElOVCByZXR1cm5zIGVjb3JlOjpFSW50OgorCS8vCSIwIi4uIjkiICgiMCIuLiI5IiB8ICJfIikqOworCXB1YmxpYyBUZXJtaW5hbFJ1bGUgZ2V0SU5UUnVsZSgpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0SU5UUnVsZSgpOworCX0gCisKKwkvL3Rlcm1pbmFsIERFQ0lNQUw6CisJLy8JSU5UICgoImUiIHwgIkUiKSAoIisiIHwgIi0iKT8gSU5UKT8gKCgiYiIgfCAiQiIpICgiaSIgfCAiSSIgfCAiZCIgfCAiRCIpIHwgKCJsIiB8ICJMIiB8ICJkIiB8ICJEIiB8ICJmIiB8ICJGIikpPzsKKwlwdWJsaWMgVGVybWluYWxSdWxlIGdldERFQ0lNQUxSdWxlKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRERUNJTUFMUnVsZSgpOworCX0gCisKKwkvL0p2bVR5cGVSZWZlcmVuY2U6CisJLy8JSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UgPT4gKHtKdm1HZW5lcmljQXJyYXlUeXBlUmVmZXJlbmNlLmNvbXBvbmVudFR5cGU9Y3VycmVudH0gQXJyYXlCcmFja2V0cykqIHwKKwkvLwlYRnVuY3Rpb25UeXBlUmVmOworCXB1YmxpYyBYdHlwZUdyYW1tYXJBY2Nlc3MuSnZtVHlwZVJlZmVyZW5jZUVsZW1lbnRzIGdldEp2bVR5cGVSZWZlcmVuY2VBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldEp2bVR5cGVSZWZlcmVuY2VBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0SnZtVHlwZVJlZmVyZW5jZVJ1bGUoKSB7CisJCXJldHVybiBnZXRKdm1UeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vQXJyYXlCcmFja2V0czoKKwkvLwkiWyIgIl0iOworCXB1YmxpYyBYdHlwZUdyYW1tYXJBY2Nlc3MuQXJyYXlCcmFja2V0c0VsZW1lbnRzIGdldEFycmF5QnJhY2tldHNBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldEFycmF5QnJhY2tldHNBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0QXJyYXlCcmFja2V0c1J1bGUoKSB7CisJCXJldHVybiBnZXRBcnJheUJyYWNrZXRzQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWEZ1bmN0aW9uVHlwZVJlZjoKKwkvLwkoIigiIChwYXJhbVR5cGVzKz1Kdm1UeXBlUmVmZXJlbmNlICgiLCIgcGFyYW1UeXBlcys9SnZtVHlwZVJlZmVyZW5jZSkqKT8gIikiKT8gIj0+IiByZXR1cm5UeXBlPUp2bVR5cGVSZWZlcmVuY2U7CisJcHVibGljIFh0eXBlR3JhbW1hckFjY2Vzcy5YRnVuY3Rpb25UeXBlUmVmRWxlbWVudHMgZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYRnVuY3Rpb25UeXBlUmVmUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhGdW5jdGlvblR5cGVSZWZBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZToKKwkvLwl0eXBlPVtKdm1UeXBlfFF1YWxpZmllZE5hbWVdICgiPCIgYXJndW1lbnRzKz1Kdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKCIsIiBhcmd1bWVudHMrPUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSkqICI+IgorCS8vCSg9PiAoe0p2bUlubmVyVHlwZVJlZmVyZW5jZS5vdXRlcj1jdXJyZW50fSAiLiIpIHR5cGU9W0p2bVR5cGV8VmFsaWRJRF0gKCI8IiBhcmd1bWVudHMrPUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSAoIiwiCisJLy8JYXJndW1lbnRzKz1Kdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UpKiAiPiIpPykqKT87CisJcHVibGljIFh0eXBlR3JhbW1hckFjY2Vzcy5Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUVsZW1lbnRzIGdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZVJ1bGUoKSB7CisJCXJldHVybiBnZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSByZXR1cm5zIEp2bVR5cGVSZWZlcmVuY2U6CisJLy8JSnZtVHlwZVJlZmVyZW5jZSB8IEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZTsKKwlwdWJsaWMgWHR5cGVHcmFtbWFyQWNjZXNzLkp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZUVsZW1lbnRzIGdldEp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZUFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldEp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVJ1bGUoKSB7CisJCXJldHVybiBnZXRKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2U6CisJLy8Je0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZX0gIj8iIChjb25zdHJhaW50cys9SnZtVXBwZXJCb3VuZCBjb25zdHJhaW50cys9SnZtVXBwZXJCb3VuZEFuZGVkKiB8CisJLy8JY29uc3RyYWludHMrPUp2bUxvd2VyQm91bmQgY29uc3RyYWludHMrPUp2bUxvd2VyQm91bmRBbmRlZCopPzsKKwlwdWJsaWMgWHR5cGVHcmFtbWFyQWNjZXNzLkp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUVsZW1lbnRzIGdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZVJ1bGUoKSB7CisJCXJldHVybiBnZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9Kdm1VcHBlckJvdW5kOgorCS8vCSJleHRlbmRzIiB0eXBlUmVmZXJlbmNlPUp2bVR5cGVSZWZlcmVuY2U7CisJcHVibGljIFh0eXBlR3JhbW1hckFjY2Vzcy5Kdm1VcHBlckJvdW5kRWxlbWVudHMgZ2V0SnZtVXBwZXJCb3VuZEFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0SnZtVXBwZXJCb3VuZEFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRKdm1VcHBlckJvdW5kUnVsZSgpIHsKKwkJcmV0dXJuIGdldEp2bVVwcGVyQm91bmRBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9Kdm1VcHBlckJvdW5kQW5kZWQgcmV0dXJucyBKdm1VcHBlckJvdW5kOgorCS8vCSImIiB0eXBlUmVmZXJlbmNlPUp2bVR5cGVSZWZlcmVuY2U7CisJcHVibGljIFh0eXBlR3JhbW1hckFjY2Vzcy5Kdm1VcHBlckJvdW5kQW5kZWRFbGVtZW50cyBnZXRKdm1VcHBlckJvdW5kQW5kZWRBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldEp2bVVwcGVyQm91bmRBbmRlZEFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRKdm1VcHBlckJvdW5kQW5kZWRSdWxlKCkgeworCQlyZXR1cm4gZ2V0SnZtVXBwZXJCb3VuZEFuZGVkQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vSnZtTG93ZXJCb3VuZDoKKwkvLwkic3VwZXIiIHR5cGVSZWZlcmVuY2U9SnZtVHlwZVJlZmVyZW5jZTsKKwlwdWJsaWMgWHR5cGVHcmFtbWFyQWNjZXNzLkp2bUxvd2VyQm91bmRFbGVtZW50cyBnZXRKdm1Mb3dlckJvdW5kQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRKdm1Mb3dlckJvdW5kQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldEp2bUxvd2VyQm91bmRSdWxlKCkgeworCQlyZXR1cm4gZ2V0SnZtTG93ZXJCb3VuZEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL0p2bUxvd2VyQm91bmRBbmRlZCByZXR1cm5zIEp2bUxvd2VyQm91bmQ6CisJLy8JIiYiIHR5cGVSZWZlcmVuY2U9SnZtVHlwZVJlZmVyZW5jZTsKKwlwdWJsaWMgWHR5cGVHcmFtbWFyQWNjZXNzLkp2bUxvd2VyQm91bmRBbmRlZEVsZW1lbnRzIGdldEp2bUxvd2VyQm91bmRBbmRlZEFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0SnZtTG93ZXJCb3VuZEFuZGVkQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldEp2bUxvd2VyQm91bmRBbmRlZFJ1bGUoKSB7CisJCXJldHVybiBnZXRKdm1Mb3dlckJvdW5kQW5kZWRBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9Kdm1UeXBlUGFyYW1ldGVyOgorCS8vCW5hbWU9VmFsaWRJRCAoY29uc3RyYWludHMrPUp2bVVwcGVyQm91bmQgY29uc3RyYWludHMrPUp2bVVwcGVyQm91bmRBbmRlZCopPzsKKwlwdWJsaWMgWHR5cGVHcmFtbWFyQWNjZXNzLkp2bVR5cGVQYXJhbWV0ZXJFbGVtZW50cyBnZXRKdm1UeXBlUGFyYW1ldGVyQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRKdm1UeXBlUGFyYW1ldGVyQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldEp2bVR5cGVQYXJhbWV0ZXJSdWxlKCkgeworCQlyZXR1cm4gZ2V0SnZtVHlwZVBhcmFtZXRlckFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQ6CisJLy8JUXVhbGlmaWVkTmFtZSAiLiIgIioiOworCXB1YmxpYyBYdHlwZUdyYW1tYXJBY2Nlc3MuUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZEVsZW1lbnRzIGdldFF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0UXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZFJ1bGUoKSB7CisJCXJldHVybiBnZXRRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWEltcG9ydFNlY3Rpb246CisJLy8JaW1wb3J0RGVjbGFyYXRpb25zKz1YSW1wb3J0RGVjbGFyYXRpb24rOworCXB1YmxpYyBYdHlwZUdyYW1tYXJBY2Nlc3MuWEltcG9ydFNlY3Rpb25FbGVtZW50cyBnZXRYSW1wb3J0U2VjdGlvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WEltcG9ydFNlY3Rpb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WEltcG9ydFNlY3Rpb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WEltcG9ydFNlY3Rpb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YSW1wb3J0RGVjbGFyYXRpb246CisJLy8JImltcG9ydCIgKHN0YXRpYz89InN0YXRpYyIgZXh0ZW5zaW9uPz0iZXh0ZW5zaW9uIj8gaW1wb3J0ZWRUeXBlPVtKdm1EZWNsYXJlZFR5cGV8UXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0XQorCS8vCSh3aWxkY2FyZD89IioiIHwgbWVtYmVyTmFtZT1WYWxpZElEKSB8IGltcG9ydGVkVHlwZT1bSnZtRGVjbGFyZWRUeXBlfFF1YWxpZmllZE5hbWVdIHwKKwkvLwlpbXBvcnRlZE5hbWVzcGFjZT1RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkKSAiOyI/OworCXB1YmxpYyBYdHlwZUdyYW1tYXJBY2Nlc3MuWEltcG9ydERlY2xhcmF0aW9uRWxlbWVudHMgZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WEltcG9ydERlY2xhcmF0aW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydDoKKwkvLwkoVmFsaWRJRCAiLiIpKzsKKwlwdWJsaWMgWHR5cGVHcmFtbWFyQWNjZXNzLlF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydEVsZW1lbnRzIGdldFF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydEFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0UXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0QWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydFJ1bGUoKSB7CisJCXJldHVybiBnZXRRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy90ZXJtaW5hbCBJRDoKKwkvLwkiXiI/ICgiYSIuLiJ6IiB8ICJBIi4uIloiIHwgIiQiIHwgIl8iKSAoImEiLi4ieiIgfCAiQSIuLiJaIiB8ICIkIiB8ICJfIiB8ICIwIi4uIjkiKSo7CisJcHVibGljIFRlcm1pbmFsUnVsZSBnZXRJRFJ1bGUoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldElEUnVsZSgpOworCX0gCisKKwkvL3Rlcm1pbmFsIFNUUklORzoKKwkvLwkiXCIiICgiXFwiIC4gLyAqICgnYid8J3QnfCduJ3wnZid8J3InfCd1J3wnIid8IicifCdcXCcpICogLyB8ICEoIlxcIiB8ICJcIiIpKSogIlwiIj8gfCAiXCciICgiXFwiIC4KKwkvLwkvICogKCdiJ3wndCd8J24nfCdmJ3wncid8J3UnfCciJ3wiJyJ8J1xcJykgKiAvIHwgISgiXFwiIHwgIlwnIikpKiAiXCciPzsKKwlwdWJsaWMgVGVybWluYWxSdWxlIGdldFNUUklOR1J1bGUoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFNUUklOR1J1bGUoKTsKKwl9IAorCisJLy90ZXJtaW5hbCBNTF9DT01NRU5UOgorCS8vCSIvICoiLT4iKiAvIjsKKwlwdWJsaWMgVGVybWluYWxSdWxlIGdldE1MX0NPTU1FTlRSdWxlKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRNTF9DT01NRU5UUnVsZSgpOworCX0gCisKKwkvL3Rlcm1pbmFsIFNMX0NPTU1FTlQ6CisJLy8JIi8vIiAhKCJcbiIgfCAiXHIiKSogKCJcciI/ICJcbiIpPzsKKwlwdWJsaWMgVGVybWluYWxSdWxlIGdldFNMX0NPTU1FTlRSdWxlKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRTTF9DT01NRU5UUnVsZSgpOworCX0gCisKKwkvL3Rlcm1pbmFsIFdTOgorCS8vCSgiICIgfCAiXHQiIHwgIlxyIiB8ICJcbiIpKzsKKwlwdWJsaWMgVGVybWluYWxSdWxlIGdldFdTUnVsZSgpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0V1NSdWxlKCk7CisJfSAKKworCS8vdGVybWluYWwgQU5ZX09USEVSOgorCS8vCS47CisJcHVibGljIFRlcm1pbmFsUnVsZSBnZXRBTllfT1RIRVJSdWxlKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRBTllfT1RIRVJSdWxlKCk7CisJfSAKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3ZhbGlkYXRpb24vQWJzdHJhY3RQZXJzcGVjdGl2ZURzbFZhbGlkYXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdmFsaWRhdGlvbi9BYnN0cmFjdFBlcnNwZWN0aXZlRHNsVmFsaWRhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkzYmI4YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3ZhbGlkYXRpb24vQWJzdHJhY3RQZXJzcGVjdGl2ZURzbFZhbGlkYXRvci5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS52YWxpZGF0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CisKK3B1YmxpYyBjbGFzcyBBYnN0cmFjdFBlcnNwZWN0aXZlRHNsVmFsaWRhdG9yIGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5YYmFzZVdpdGhBbm5vdGF0aW9uc1ZhbGlkYXRvciB7CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgTGlzdDxFUGFja2FnZT4gZ2V0RVBhY2thZ2VzKCkgeworCSAgICBMaXN0PEVQYWNrYWdlPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PEVQYWNrYWdlPihzdXBlci5nZXRFUGFja2FnZXMoKSk7CisJICAgIHJlc3VsdC5hZGQoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoImh0dHA6Ly9vc2JwLmVjbGlwc2Uub3JnL3h0ZXh0L3BlcnNwZWN0aXZlL1BlcnNwZWN0aXZlRHNsIikpOworCSAgICByZXN1bHQuYWRkKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKCJodHRwOi8vb3NicC5lY2xpcHNlLm9yZy9kc2wvY29tbW9uL3R5cGVzL3YxIikpOworCSAgICByZXN1bHQuYWRkKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKCJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL1h0ZXh0L1hiYXNlL1hBbm5vdGF0aW9ucyIpKTsKKwkgICAgcmVzdWx0LmFkZChFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZSgiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy94dGV4dC94YmFzZS9YYmFzZSIpKTsKKwkgICAgcmVzdWx0LmFkZChFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZSgiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy94dGV4dC9jb21tb24vSmF2YVZNVHlwZXMiKSk7CisJICAgIHJlc3VsdC5hZGQoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcveHRleHQveGJhc2UvWHR5cGUiKSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9BY3RpdmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvQWN0aXZhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcxOTdhZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvQWN0aXZhdG9yLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLworIHBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZ2l0aW5mby5Mb2dpbmZvOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3I7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7CisKK3B1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgeworCisJcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29udGV4dCBjb250ZXh0OworCisJcHVibGljIHN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7CisJCXJldHVybiBjb250ZXh0OworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGJ1bmRsZUNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlBY3RpdmF0b3IuY29udGV4dCA9IGJ1bmRsZUNvbnRleHQ7CisJCUxvZ2luZm8gbGkgPSBuZXcgTG9naW5mbygpOworCQlsaS5wcmludCggQWN0aXZhdG9yLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgQWN0aXZhdG9yLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQorCSAqLworCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBidW5kbGVDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQWN0aXZhdG9yLmNvbnRleHQgPSBudWxsOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9HZW5lcmF0ZVBlcnNwZWN0aXZlRHNsLm13ZTIgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL0dlbmVyYXRlUGVyc3BlY3RpdmVEc2wubXdlMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWMzM2FhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9HZW5lcmF0ZVBlcnNwZWN0aXZlRHNsLm13ZTIKQEAgLTAsMCArMSwxODkgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KK21vZHVsZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLkdlbmVyYXRlUGVyc3BlY3RpdmVEc2wKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5td2UudXRpbHMuKgoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci4qCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudWkuZ2VuZXJhdG9yLioKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5td2UuKgorCit2YXIgcHJvamVjdE5hbWUgPSAib3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZSIKK3ZhciBncmFtbWFyVVJJID0gInBsYXRmb3JtOi9yZXNvdXJjZS8ke3Byb2plY3ROYW1lfS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9QZXJzcGVjdGl2ZURzbC54dGV4dCIKK3ZhciBmaWxlRXh0ZW5zaW9ucyA9ICJwZXJzcGVjdGl2ZSIKK3ZhciBydW50aW1lUHJvamVjdCA9ICIuLi8ke3Byb2plY3ROYW1lfSIKK3ZhciBnZW5lcmF0ZVh0ZW5kU3R1YiA9IHRydWUKK3ZhciBlbmNvZGluZyA9ICJVVEYtOCIKKworV29ya2Zsb3cgeworCWJlYW4gPSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueGNvcmUuWGNvcmVTdGFuZGFsb25lU2V0dXAgOiB4Y29yZSB7fQorCWJlYW4gPSBvcmcuZWNsaXBzZS54dGV4dC5td2UuUmVhZGVyIHsKKwkJcmVnaXN0ZXIgPSB4Y29yZQorCX0KKyAgICBiZWFuID0gTWF2ZW5TdGFuZGFsb25lU2V0dXAgeworICAgIAlzY2FuQ2xhc3NQYXRoID0gdHJ1ZQorICAgIAlwbGF0Zm9ybVVyaSA9ICIke3J1bnRpbWVQcm9qZWN0fS8uLiIKKwkJcmVnaXN0ZXJHZW5Nb2RlbEZpbGUgPSAicGxhdGZvcm06L3Jlc291cmNlL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvbW9kZWwvUGVyc3BlY3RpdmVEc2wueGNvcmUiCisvLwkJcmVnaXN0ZXJFY29yZUZpbGUgPSAicGxhdGZvcm06L3Jlc291cmNlL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvbW9kZWwvUGVyc3BlY3RpdmVEc2wueGNvcmUiCisJCXJlZ2lzdGVyR2VuZXJhdGVkRVBhY2thZ2U9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2xQYWNrYWdlIgorCisJCXJlZ2lzdGVyR2VuTW9kZWxGaWxlID0gInBsYXRmb3JtOi9yZXNvdXJjZS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnRhYmxlL21vZGVsL1RhYmxlRFNMLnhjb3JlIgorLy8JCXJlZ2lzdGVyRWNvcmVGaWxlID0gInBsYXRmb3JtOi9yZXNvdXJjZS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnRhYmxlL21vZGVsL1RhYmxlRFNMLnhjb3JlIgorCQlyZWdpc3RlckdlbmVyYXRlZEVQYWNrYWdlID0gIm9yZy5lY2xpcHNlLm9zYnAueHRleHQudGFibGUuVGFibGVEU0xQYWNrYWdlIgorCQkKKwkJcmVnaXN0ZXJHZW5Nb2RlbEZpbGUgPSAicGxhdGZvcm06L3Jlc291cmNlL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvbW9kZWwvQ2hhcnREU0wueGNvcmUiCisvLwkJcmVnaXN0ZXJFY29yZUZpbGUgPSAicGxhdGZvcm06L3Jlc291cmNlL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvbW9kZWwvQ2hhcnREU0wueGNvcmUiCisJCXJlZ2lzdGVyR2VuZXJhdGVkRVBhY2thZ2UgPSAib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTFBhY2thZ2UiCisJCQorCQlyZWdpc3Rlckdlbk1vZGVsRmlsZSA9ICJwbGF0Zm9ybTovcmVzb3VyY2Uvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kaWFsb2dkc2wvbW9kZWwvRGlhbG9nRFNMLnhjb3JlIgorLy8JCXJlZ2lzdGVyRWNvcmVGaWxlID0gInBsYXRmb3JtOi9yZXNvdXJjZS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRpYWxvZ2RzbC9tb2RlbC9EaWFsb2dEU0wueGNvcmUiCisJCXJlZ2lzdGVyR2VuZXJhdGVkRVBhY2thZ2UgPSAib3JnLmVjbGlwc2Uub3NicC54dGV4dC5kaWFsb2dkc2wuRGlhbG9nRFNMUGFja2FnZSIKKwkJCisJCXJlZ2lzdGVyR2VuTW9kZWxGaWxlID0gInBsYXRmb3JtOi9yZXNvdXJjZS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0Lm9yZ2FuaXphdGlvbmRzbC9tb2RlbC9Pcmdhbml6YXRpb25EU0wueGNvcmUiCisvLwkJcmVnaXN0ZXJFY29yZUZpbGUgPSAicGxhdGZvcm06L3Jlc291cmNlL29yZy5lY2xpcHNlLm9zYnAueHRleHQub3JnYW5pemF0aW9uZHNsL21vZGVsL09yZ2FuaXphdGlvbkRTTC54Y29yZSIKKwkJcmVnaXN0ZXJHZW5lcmF0ZWRFUGFja2FnZSA9ICJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0Lm9yZ2FuaXphdGlvbmRzbC5Pcmdhbml6YXRpb25EU0xQYWNrYWdlIgorCQkKKwkJcmVnaXN0ZXJHZW5Nb2RlbEZpbGUgPSAicGxhdGZvcm06L3Jlc291cmNlL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL21vZGVsL1JlcG9ydERTTC54Y29yZSIKKy8vCQlyZWdpc3RlckVjb3JlRmlsZSA9ICJwbGF0Zm9ybTovcmVzb3VyY2Uvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvbW9kZWwvUmVwb3J0RFNMLnhjb3JlIgorCQlyZWdpc3RlckdlbmVyYXRlZEVQYWNrYWdlID0gIm9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UiCisJCQorCQlyZWdpc3Rlckdlbk1vZGVsRmlsZSA9ICJwbGF0Zm9ybTovcmVzb3VyY2Uvb3JnLmVjbGlwc2Uub3NicC54dGV4dC50b3BvbG9neWRzbC9tb2RlbC9Ub3BvbG9neURTTC54Y29yZSIKKy8vCQlyZWdpc3RlckVjb3JlRmlsZSA9ICJwbGF0Zm9ybTovcmVzb3VyY2Uvb3JnLmVjbGlwc2Uub3NicC54dGV4dC50b3BvbG9neWRzbC9tb2RlbC9Ub3BvbG9neURTTC54Y29yZSIKKwkJcmVnaXN0ZXJHZW5lcmF0ZWRFUGFja2FnZSA9ICJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnRvcG9sb2d5ZHNsLlRvcG9sb2d5RFNMUGFja2FnZSIKKworCQlyZWdpc3Rlckdlbk1vZGVsRmlsZSA9ICJwbGF0Zm9ybTovcmVzb3VyY2Uvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hY3Rpb24vbW9kZWwvQWN0aW9uRFNMLnhjb3JlIgorCQlyZWdpc3RlckdlbmVyYXRlZEVQYWNrYWdlID0gIm9yZy5lY2xpcHNlLm9zYnAueHRleHQuYWN0aW9uLkFjdGlvbkRTTFBhY2thZ2UiCisKKwkJcmVnaXN0ZXJHZW5Nb2RlbEZpbGUgPSAicGxhdGZvcm06L3Jlc291cmNlL29yZy5lY2xpcHNlLm9zYnAuZHNsLmNvbW1vbi54dGV4dC9tb2RlbC90eXBlcy54Y29yZSIKKwkJcmVnaXN0ZXJFY29yZUZpbGUgPSAicGxhdGZvcm06L3Jlc291cmNlL29yZy5lY2xpcHNlLm9zYnAuZHNsLmNvbW1vbi54dGV4dC9tb2RlbC90eXBlcy54Y29yZSIKKwkJcmVnaXN0ZXJHZW5Nb2RlbEZpbGUgPSAicGxhdGZvcm06L3Jlc291cmNlL29yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy9tb2RlbC9KYXZhVk1UeXBlcy5nZW5tb2RlbCIKKwkJcmVnaXN0ZXJFY29yZUZpbGUgPSAicGxhdGZvcm06L3Jlc291cmNlL29yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy9tb2RlbC9KYXZhVk1UeXBlcy5lY29yZSIKKwkJcmVnaXN0ZXJHZW5Nb2RlbEZpbGUgPSAicGxhdGZvcm06L3Jlc291cmNlL29yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlL21vZGVsL1hiYXNlLmdlbm1vZGVsIgorCQlyZWdpc3RlckVjb3JlRmlsZSA9ICJwbGF0Zm9ybTovcmVzb3VyY2Uvb3JnLmVjbGlwc2UueHRleHQueGJhc2UvbW9kZWwvWHR5cGUuZWNvcmUiCisJCXJlZ2lzdGVyRWNvcmVGaWxlID0gInBsYXRmb3JtOi9yZXNvdXJjZS9vcmcuZWNsaXBzZS54dGV4dC54YmFzZS9tb2RlbC9YYmFzZS5lY29yZSIKKwkJcmVnaXN0ZXJFY29yZUZpbGUgPSAicGxhdGZvcm06L3Jlc291cmNlL29yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlL21vZGVsL1hBbm5vdGF0aW9ucy5lY29yZSIKKyAgICB9CisgICAgCisgICAgY29tcG9uZW50ID0gRGlyZWN0b3J5Q2xlYW5lciB7CisgICAgCWRpcmVjdG9yeSA9ICIke3J1bnRpbWVQcm9qZWN0fS9zcmMtZ2VuIgorICAgIH0KKyAgICAKKyAgICBjb21wb25lbnQgPSBEaXJlY3RvcnlDbGVhbmVyIHsKKyAgICAJZGlyZWN0b3J5ID0gIiR7cnVudGltZVByb2plY3R9LnVpL3NyYy1nZW4iCisgICAgfQorICAgIAorICAgIGNvbXBvbmVudCA9IERpcmVjdG9yeUNsZWFuZXIgeworICAgIAlkaXJlY3RvcnkgPSAiJHtydW50aW1lUHJvamVjdH0udGVzdHMvc3JjLWdlbiIKKyAgICB9CisgICAgCisgICAgY29tcG9uZW50ID0gR2VuZXJhdG9yIHsKKyAgICAJcGF0aFJ0UHJvamVjdCA9IHJ1bnRpbWVQcm9qZWN0CisgICAgCXBhdGhVaVByb2plY3QgPSAiJHtydW50aW1lUHJvamVjdH0udWkiCisgICAgCXBhdGhUZXN0UHJvamVjdCA9ICIke3J1bnRpbWVQcm9qZWN0fS50ZXN0cyIKKyAgICAJcHJvamVjdE5hbWVSdCA9IHByb2plY3ROYW1lCisgICAgCXByb2plY3ROYW1lVWkgPSAiJHtwcm9qZWN0TmFtZX0udWkiCisgICAgCWVuY29kaW5nID0gZW5jb2RpbmcKKyAgICAJbGFuZ3VhZ2UgPSBhdXRvLWluamVjdCB7CisgICAgCQl1cmkgPSBncmFtbWFyVVJJCisgICAgCisgICAgCQkvLyBKYXZhIEFQSSB0byBhY2Nlc3MgZ3JhbW1hciBlbGVtZW50cyAocmVxdWlyZWQgYnkgc2V2ZXJhbCBvdGhlciBmcmFnbWVudHMpCisgICAgCQlmcmFnbWVudCA9IGdyYW1tYXJBY2Nlc3MuR3JhbW1hckFjY2Vzc0ZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisgICAgCisgICAgCQkvLyBnZW5lcmF0ZXMgSmF2YSBBUEkgZm9yIHRoZSBnZW5lcmF0ZWQgRVBhY2thZ2VzCisgICAgCQlmcmFnbWVudCA9IGVjb3JlLkVNRkdlbmVyYXRvckZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisgICAgCisgICAgCQkvLyB0aGUgb2xkIHNlcmlhbGl6YXRpb24gY29tcG9uZW50CisgICAgCQkvLyBmcmFnbWVudCA9IHBhcnNlVHJlZUNvbnN0cnVjdG9yLlBhcnNlVHJlZUNvbnN0cnVjdG9yRnJhZ21lbnQgYXV0by1pbmplY3Qge30gICAgCisgICAgCisgICAgCQkvLyBzZXJpYWxpemVyIDIuMAorICAgIAkJZnJhZ21lbnQgPSBzZXJpYWxpemVyLlNlcmlhbGl6ZXJGcmFnbWVudCBhdXRvLWluamVjdCB7CisgICAgCQkJZ2VuZXJhdGVTdHViID0gZmFsc2UKKyAgICAJCX0KKyAgICAKKyAgICAJCS8vIGEgY3VzdG9tIFJlc291cmNlRmFjdG9yeSBmb3IgdXNlIHdpdGggRU1GCisgICAgCQlmcmFnbWVudCA9IHJlc291cmNlRmFjdG9yeS5SZXNvdXJjZUZhY3RvcnlGcmFnbWVudCBhdXRvLWluamVjdCB7fQorICAgIAorICAgIAkJLy8gVGhlIGFudGxyIHBhcnNlciBnZW5lcmF0b3IgZnJhZ21lbnQuCisgICAgCQlmcmFnbWVudCA9IHBhcnNlci5hbnRsci5YdGV4dEFudGxyR2VuZXJhdG9yRnJhZ21lbnQgYXV0by1pbmplY3QgeworICAgIAkJLy8gIG9wdGlvbnMgPSB7CisgICAgCQkvLyAgICAgIGJhY2t0cmFjayA9IHRydWUKKyAgICAJCS8vICB9CisgICAgCQl9CisgICAgCisgICAgCQkvLyBYdGVuZC1iYXNlZCBBUEkgZm9yIHZhbGlkYXRpb24KKyAgICAJCWZyYWdtZW50ID0gdmFsaWRhdGlvbi5WYWxpZGF0b3JGcmFnbWVudCBhdXRvLWluamVjdCB7CisgICAgCQkvLyAgICBjb21wb3NlZENoZWNrID0gIm9yZy5lY2xpcHNlLnh0ZXh0LnZhbGlkYXRpb24uSW1wb3J0VXJpVmFsaWRhdG9yIgorICAgIAkJLy8gICAgY29tcG9zZWRDaGVjayA9ICJvcmcuZWNsaXBzZS54dGV4dC52YWxpZGF0aW9uLk5hbWVzQXJlVW5pcXVlVmFsaWRhdG9yIgorICAgIAkJfQorICAgIAorICAgIAkJLy8gb2xkIHNjb3BpbmcgYW5kIGV4cG9ydGluZyBBUEkKKyAgICAJCS8vIGZyYWdtZW50ID0gc2NvcGluZy5JbXBvcnRVUklTY29waW5nRnJhZ21lbnQgYXV0by1pbmplY3Qge30KKyAgICAJCS8vIGZyYWdtZW50ID0gZXhwb3J0aW5nLlNpbXBsZU5hbWVzRnJhZ21lbnQgYXV0by1pbmplY3Qge30KKyAgICAKKyAgICAJCS8vIHNjb3BpbmcgYW5kIGV4cG9ydGluZyBBUEkKKyAgICAJCWZyYWdtZW50ID0gc2NvcGluZy5JbXBvcnROYW1lc3BhY2VzU2NvcGluZ0ZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisgICAgCQlmcmFnbWVudCA9IGV4cG9ydGluZy5RdWFsaWZpZWROYW1lc0ZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisgICAgCQlmcmFnbWVudCA9IGJ1aWxkZXIuQnVpbGRlckludGVncmF0aW9uRnJhZ21lbnQgYXV0by1pbmplY3Qge30KKyAgICAKKyAgICAJCS8vIGdlbmVyYXRvciBBUEkKKyAgICAJCWZyYWdtZW50ID0gZ2VuZXJhdG9yLkdlbmVyYXRvckZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisgICAgCisgICAgCQkvLyBmb3JtYXR0ZXIgQVBJCisgICAgCQlmcmFnbWVudCA9IGZvcm1hdHRpbmcuRm9ybWF0dGVyRnJhZ21lbnQgYXV0by1pbmplY3Qge30KKyAgICAKKyAgICAJCS8vIGxhYmVsaW5nIEFQSQorICAgIAkJZnJhZ21lbnQgPSBsYWJlbGluZy5MYWJlbFByb3ZpZGVyRnJhZ21lbnQgYXV0by1pbmplY3QgeworICAgIAkJCWdlbmVyYXRlWHRlbmRTdHViPXRydWUKKyAgICAJCQlnZW5lcmF0ZVN0dWI9ZmFsc2UKKyAgICAJCX0KKyAgICAKKyAgICAJCS8vIG91dGxpbmUgQVBJCisgICAgCQlmcmFnbWVudCA9IG91dGxpbmUuT3V0bGluZVRyZWVQcm92aWRlckZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisgICAgCQlmcmFnbWVudCA9IG91dGxpbmUuUXVpY2tPdXRsaW5lRnJhZ21lbnQgYXV0by1pbmplY3Qge30KKyAgICAKKyAgICAJCS8vIHF1aWNrZml4IEFQSQorICAgIAkJZnJhZ21lbnQgPSBxdWlja2ZpeC5RdWlja2ZpeFByb3ZpZGVyRnJhZ21lbnQgYXV0by1pbmplY3Qge30KKyAgICAKKyAgICAJCS8vIGNvbnRlbnQgYXNzaXN0IEFQSQorICAgIAkJZnJhZ21lbnQgPSBjb250ZW50QXNzaXN0LkNvbnRlbnRBc3Npc3RGcmFnbWVudCBhdXRvLWluamVjdCB7fQorICAgIAorICAgIAkJLy8gZ2VuZXJhdGVzIGEgbW9yZSBsaWdodHdlaWdodCBBbnRsciBwYXJzZXIgYW5kIGxleGVyIHRhaWxvcmVkIGZvciBjb250ZW50IGFzc2lzdAorICAgIAkJZnJhZ21lbnQgPSBwYXJzZXIuYW50bHIuWHRleHRBbnRsclVpR2VuZXJhdG9yRnJhZ21lbnQgYXV0by1pbmplY3Qge30KKyAgICAKKyAgICAJCS8vIGdlbmVyYXRlcyBqdW5pdCB0ZXN0IHN1cHBvcnQgY2xhc3NlcyBpbnRvIEdlbmVyYXRvciNwYXRoVGVzdFByb2plY3QKKyAgICAJCWZyYWdtZW50ID0ganVuaXQuSnVuaXQ0RnJhZ21lbnQgYXV0by1pbmplY3Qge30KKyAgICAKKyAgICAJCS8vIHJlbmFtZSByZWZhY3RvcmluZworICAgIAkJZnJhZ21lbnQgPSByZWZhY3RvcmluZy5SZWZhY3RvckVsZW1lbnROYW1lRnJhZ21lbnQgYXV0by1pbmplY3Qge30KKyAgICAKKyAgICAJCS8vIHByb3ZpZGVzIHRoZSBuZWNlc3NhcnkgYmluZGluZ3MgZm9yIGphdmEgdHlwZXMgaW50ZWdyYXRpb24KKyAgICAJCWZyYWdtZW50ID0gdHlwZXMuVHlwZXNHZW5lcmF0b3JGcmFnbWVudCBhdXRvLWluamVjdCB7fQorICAgIAorICAgIAkJLy8gZ2VuZXJhdGVzIHRoZSByZXF1aXJlZCBiaW5kaW5ncyBvbmx5IGlmIHRoZSBncmFtbWFyIGluaGVyaXRzIGZyb20gWGJhc2UKKyAgICAJCWZyYWdtZW50ID0geGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudCBhdXRvLWluamVjdCB7fQorICAgIAkJCisgICAgCQkvLyBnZW5lcmF0ZXMgdGhlIHJlcXVpcmVkIGJpbmRpbmdzIG9ubHkgaWYgdGhlIGdyYW1tYXIgaW5oZXJpdHMgZnJvbSBYdHlwZQorICAgIAkJZnJhZ21lbnQgPSB4YmFzZS5YdHlwZUdlbmVyYXRvckZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisgICAgCisgICAgCQkvLyBwcm92aWRlcyBhIHByZWZlcmVuY2UgcGFnZSBmb3IgdGVtcGxhdGUgcHJvcG9zYWxzCisgICAgCQlmcmFnbWVudCA9IHRlbXBsYXRlcy5Db2RldGVtcGxhdGVzR2VuZXJhdG9yRnJhZ21lbnQgYXV0by1pbmplY3Qge30KKyAgICAKKyAgICAJCS8vIHByb3ZpZGVzIGEgY29tcGFyZSB2aWV3CisgICAgCQlmcmFnbWVudCA9IGNvbXBhcmUuQ29tcGFyZUZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisKKyAgICAgICAgICAgIC8vIHBhcnNlIGdyYW1tYXIgYW5kIGdlbmVyYXRlIGkxOG4gZ3JhbW1hcgorICAgICAgICAgICAgZnJhZ21lbnQgPSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJhc2ljLmdlbmVyYXRvci5CYXNpY0RzbEdyYW1tYXJJMThuR2VuZXJhdG9yIGF1dG8taW5qZWN0IHt9CisgICAgCX0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvUGVyc3BlY3RpdmVEU0xCdW5kbGVTcGFjZVJ1bnRpbWVNb2R1bGUuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvUGVyc3BlY3RpdmVEU0xCdW5kbGVTcGFjZVJ1bnRpbWVNb2R1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDZiZTU2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9QZXJzcGVjdGl2ZURTTEJ1bmRsZVNwYWNlUnVudGltZU1vZHVsZS5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KKyBwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC54dGV4dC50eXBlcy5idW5kbGVzLkJ1bmRsZVNwYWNlVHlwZVByb3ZpZGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC54dGV4dC50eXBlcy5idW5kbGVzLkJ1bmRsZVNwYWNlVHlwZVNjb3BlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5idWlsZGVyLnR5cGVzLmxvYWRlci5hcGkuSVR5cGVMb2FkZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYnVpbGRlci50eXBlcy5sb2FkZXIuYXBpLklUeXBlTG9hZGVyUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5idWlsZGVyLnR5cGVzLmxvYWRlci5ydW50aW1lLlR5cGVMb2FkZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYnVpbGRlci50eXBlcy5sb2FkZXIucnVudGltZS5UeXBlTG9hZGVyUHJvdmlkZXI7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCitwdWJsaWMgY2xhc3MgUGVyc3BlY3RpdmVEU0xCdW5kbGVTcGFjZVJ1bnRpbWVNb2R1bGUgZXh0ZW5kcworCQlQZXJzcGVjdGl2ZURzbFJ1bnRpbWVNb2R1bGUgeworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci50eXBlcy5UeXBlc0dlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuYWNjZXNzLklKdm1UeXBlUHJvdmlkZXIuRmFjdG9yeT4gYmluZElKdm1UeXBlUHJvdmlkZXIkRmFjdG9yeSgpIHsKKwkJcmV0dXJuIEJ1bmRsZVNwYWNlVHlwZVByb3ZpZGVyRmFjdG9yeS5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IudHlwZXMuVHlwZXNHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLnh0ZXh0LkFic3RyYWN0VHlwZVNjb3BlUHJvdmlkZXI+IGJpbmRBYnN0cmFjdFR5cGVTY29wZVByb3ZpZGVyKCkgeworCQlyZXR1cm4gQnVuZGxlU3BhY2VUeXBlU2NvcGVQcm92aWRlci5jbGFzczsKKwl9CisKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIElUeXBlTG9hZGVyRmFjdG9yeT4gYmluZElUeXBlTG9hZGVyRmFjdG9yeSgpIHsKKwkJcmV0dXJuIFR5cGVMb2FkZXJGYWN0b3J5LmNsYXNzOworCX0KKworCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgSVR5cGVMb2FkZXJQcm92aWRlcj4gSVR5cGVMb2FkZXJQcm92aWRlcigpIHsKKwkJcmV0dXJuIFR5cGVMb2FkZXJQcm92aWRlci5jbGFzczsKKwl9CisJCisJCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL1BlcnNwZWN0aXZlRFNMQnVuZGxlU3BhY2VTdGFuZGFsb25lU2V0dXAuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvUGVyc3BlY3RpdmVEU0xCdW5kbGVTcGFjZVN0YW5kYWxvbmVTZXR1cC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0Mjg5ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL1BlcnNwZWN0aXZlRFNMQnVuZGxlU3BhY2VTdGFuZGFsb25lU2V0dXAuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCisgcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5icG1uMi5lY29yZS5CUE1uU3VwcG9ydFN0YW5kYWxvbmVTZXR1cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJ1aWxkZXIueGJhc2Uuc2V0dXBzLlhiYXNlQnVuZGxlU3BhY2VTdGFuZGFsb25lU2V0dXA7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5HdWljZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3RvcjsKKworQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKK3B1YmxpYyBjbGFzcyBQZXJzcGVjdGl2ZURTTEJ1bmRsZVNwYWNlU3RhbmRhbG9uZVNldHVwIGV4dGVuZHMKKwkJUGVyc3BlY3RpdmVEc2xTdGFuZGFsb25lU2V0dXAgeworCisJcHVibGljIHN0YXRpYyB2b2lkIGRvU2V0dXAoKSB7CisJCW5ldyBQZXJzcGVjdGl2ZURTTEJ1bmRsZVNwYWNlU3RhbmRhbG9uZVNldHVwKCkuY3JlYXRlSW5qZWN0b3JBbmREb0VNRlJlZ2lzdHJhdGlvbigpOworCQlCUE1uU3VwcG9ydFN0YW5kYWxvbmVTZXR1cC5zZXR1cCgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSW5qZWN0b3IgY3JlYXRlSW5qZWN0b3JBbmREb0VNRlJlZ2lzdHJhdGlvbigpIHsKKwkJWGJhc2VCdW5kbGVTcGFjZVN0YW5kYWxvbmVTZXR1cC5kb1NldHVwKCk7CisKKwkJSW5qZWN0b3IgaW5qZWN0b3IgPSBjcmVhdGVJbmplY3RvcigpOworCQlyZWdpc3RlcihpbmplY3Rvcik7CisJCXJldHVybiBpbmplY3RvcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSW5qZWN0b3IgY3JlYXRlSW5qZWN0b3IoKSB7CisJCXJldHVybiBHdWljZS5jcmVhdGVJbmplY3RvcihuZXcgUGVyc3BlY3RpdmVEU0xCdW5kbGVTcGFjZVJ1bnRpbWVNb2R1bGUoKSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL1BlcnNwZWN0aXZlRHNsLnh0ZXh0IGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9QZXJzcGVjdGl2ZURzbC54dGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjhjZGE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9QZXJzcGVjdGl2ZURzbC54dGV4dApAQCAtMCwwICsxLDEyMiBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLworZ3JhbW1hciBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsIHdpdGggb3JnLmVjbGlwc2UueHRleHQueGJhc2UuYW5ub3RhdGlvbnMuWGJhc2VXaXRoQW5ub3RhdGlvbnMKKworaW1wb3J0ICJodHRwOi8vb3NicC5lY2xpcHNlLm9yZy94dGV4dC9wZXJzcGVjdGl2ZS9QZXJzcGVjdGl2ZURzbCIKK2ltcG9ydCAiaHR0cDovL29zYnAuZWNsaXBzZS5vcmcveHRleHQvdGFibGUvVGFibGVEU0wiIGFzIHRhYmxlCitpbXBvcnQgImh0dHA6Ly9vc2JwLmVjbGlwc2Uub3JnL3h0ZXh0L2NoYXJ0L0NoYXJ0RFNMIiBhcyBjaGFydAoraW1wb3J0ICJodHRwOi8vb3NicC5lY2xpcHNlLm9yZy94dGV4dC9kaWFsb2dkc2wvRGlhbG9nRFNMIiBhcyBkaWFsb2cKK2ltcG9ydCAiaHR0cDovL29zYnAuZWNsaXBzZS5vcmcveHRleHQvcmVwb3J0ZHNsL1JlcG9ydERTTCIgYXMgcmVwb3J0CitpbXBvcnQgImh0dHA6Ly9vc2JwLmVjbGlwc2Uub3JnL3h0ZXh0L29yZ2FuaXphdGlvbmRzbC9Pcmdhbml6YXRpb25Ec2wiIGFzIG9yZ2FuaXphdGlvbgoraW1wb3J0ICJodHRwOi8vb3NicC5lY2xpcHNlLm9yZy94dGV4dC90b3BvbG9neWRzbC9Ub3BvbG9neURTTCIgYXMgdG9wb2xvZ3kKK2ltcG9ydCAiaHR0cDovL29zYnAuZWNsaXBzZS5vcmcveHRleHQvYWN0aW9uL0FjdGlvbkRTTCIgYXMgYWN0aW9uCitpbXBvcnQgImh0dHA6Ly9vc2JwLmVjbGlwc2Uub3JnL3h0ZXh0L2JsaXAvQmxpcERTTCIgYXMgYmxpcAoraW1wb3J0ICJodHRwOi8vb3NicC5lY2xpcHNlLm9yZy9kc2wvY29tbW9uL3R5cGVzL3YxIiBhcyB0eXBlcworaW1wb3J0ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBhcyBlY29yZQorCitQZXJzcGVjdGl2ZU1vZGVsOgorCXBhY2thZ2VzKz1QZXJzcGVjdGl2ZVBhY2thZ2UqOworCitQZXJzcGVjdGl2ZVBhY2thZ2U6CisJe1BlcnNwZWN0aXZlUGFja2FnZX0gJ3BhY2thZ2UnIG5hbWU9UXVhbGlmaWVkTmFtZQorCSgneycgKGltcG9ydHMrPVBlcnNwZWN0aXZlSW1wb3J0KSogKHBlcnNwZWN0aXZlcys9UGVyc3BlY3RpdmUpKiAnfScpPzsKKworUGVyc3BlY3RpdmVJbXBvcnQgcmV0dXJucyB0eXBlczo6TEltcG9ydDoKKwknaW1wb3J0JyBpbXBvcnRlZE5hbWVzcGFjZT1QZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQ7CisKK1BlcnNwZWN0aXZlOgorCXtQZXJzcGVjdGl2ZX0gJ3BlcnNwZWN0aXZlJyBuYW1lPVRSQU5TTEFUQUJMRUlECisJKGRlc2NyaXB0aW9uPz0nZGVzY3JpYmVkIGJ5JyBkZXNjcmlwdGlvblZhbHVlPVRSQU5TTEFUQUJMRVNUUklORyk/CisJKCdwcm9jZXNzJyBwcm9jZXNzPVtibGlwOjpCbGlwXSAndXNlcnRhc2snIHVzZXJUYXNrPVtibGlwOjpCbGlwVXNlclRhc2tdKT8KKwkoKCdpY29uVVJJJyBpY29uVVJJPVNUUklORyk/ICYKKwkoJ2FjY2Vzc2liaWxpdHknIGFjY2Vzc2liaWxpdHlQaHJhc2U9U1RSSU5HKT8gJgorCSgndG9vbGJhcicgdG9vbGJhcj1bYWN0aW9uOjpBY3Rpb25Ub29sYmFyXSk/KQorCSd7JyAoZWxlbWVudHMrPVBlcnNwZWN0aXZlRWxlbWVudCkqICd9JzsKKworUGVyc3BlY3RpdmVFbGVtZW50OgorCVBlcnNwZWN0aXZlU2FzaENvbnRhaW5lciB8IFBlcnNwZWN0aXZlUGFydFN0YWNrIHwgUGVyc3BlY3RpdmVQYXJ0OworCitQZXJzcGVjdGl2ZVNhc2hDb250YWluZXI6CisJe1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lcn0gJ3Nhc2hDb250YWluZXInIGVsZW1lbnRJZD1JRAorCSgoJ29yaWVudGF0aW9uJyBvcmllbnRhdGlvbj1TYXNoT3JpZW50YXRpb24pPyAmCisJKCdzZWxlY3RlZEVsZW1lbnQnIHNlbGVjdGVkRWxlbWVudD1bUGVyc3BlY3RpdmVFbGVtZW50XSk/ICYKKwkoJ3NwYWNlVm9sdW1lJyBjb250YWluZXJEYXRhPVNUUklORyk/ICYKKwkoJ2FjY2Vzc2liaWxpdHknIGFjY2Vzc2liaWxpdHlQaHJhc2U9U1RSSU5HKT8pCisJJ3snIChlbGVtZW50cys9UGVyc3BlY3RpdmVFbGVtZW50KSogJ30nOworCitQZXJzcGVjdGl2ZVBhcnRTdGFjazoKKwl7UGVyc3BlY3RpdmVQYXJ0U3RhY2t9ICdwYXJ0U3RhY2snIGVsZW1lbnRJZD1JRAorCSgoJ3NlbGVjdGVkRWxlbWVudCcgc2VsZWN0ZWRFbGVtZW50PVtQZXJzcGVjdGl2ZVBhcnRdKT8gJgorCSgnc3BhY2VWb2x1bWUnIGNvbnRhaW5lckRhdGE9U1RSSU5HKT8gJgorCSgnYWNjZXNzaWJpbGl0eScgYWNjZXNzaWJpbGl0eVBocmFzZT1TVFJJTkcpPykKKwkneycgKGVsZW1lbnRzKz1QZXJzcGVjdGl2ZUVsZW1lbnQpKiAnfSc7CisKK1BlcnNwZWN0aXZlUGFydDoKKwl7UGVyc3BlY3RpdmVQYXJ0fSAncGFydCcgZWxlbWVudElkPVRSQU5TTEFUQUJMRUlECisJKChkZXNjcmlwdGlvbj89J2Rlc2NyaWJlZCBieScgZGVzY3JpcHRpb25WYWx1ZT1UUkFOU0xBVEFCTEVTVFJJTkcpPyAmCisJKCdzcGFjZVZvbHVtZScgY29udGFpbmVyRGF0YT1TVFJJTkcpPyAmCisJKCdhY2Nlc3NpYmlsaXR5JyBhY2Nlc3NpYmlsaXR5UGhyYXNlPVNUUklORyk/ICYKKwkoJ2ljb25VUkknIGljb25VUkk9U1RSSU5HKT8gJgorCSgndmlldycgdmlldz1QZXJzcGVjdGl2ZVZpZXcpPyAmCisJKGlzQ2xvc2FibGU/PSdpc0Nsb3NhYmxlJyk/KTsKKworUGVyc3BlY3RpdmVWaWV3OgorCVBlcnNwZWN0aXZlU2VsZWN0aW9uIHwgUGVyc3BlY3RpdmVUYWJsZSB8IFBlcnNwZWN0aXZlQ2hhcnQgfCBQZXJzcGVjdGl2ZVJlcG9ydCB8IFBlcnNwZWN0aXZlT3JnYW5pemF0aW9uIHwgUGVyc3BlY3RpdmVUb3BvbG9neSB8CisJUGVyc3BlY3RpdmVEaWFsb2cgfCBQZXJzcGVjdGl2ZUJQTU4gfCBQZXJzcGVjdGl2ZUdyaWQ7CisKK1BlcnNwZWN0aXZlU2VsZWN0aW9uOgorCXtQZXJzcGVjdGl2ZVNlbGVjdGlvbn0gJ3NlbGVjdCcgcmVmPVt0YWJsZTo6VGFibGVdOworCitQZXJzcGVjdGl2ZVRhYmxlOgorCXtQZXJzcGVjdGl2ZVRhYmxlfSAndGFibGUnIHJlZj1bdGFibGU6OlRhYmxlXTsKKworUGVyc3BlY3RpdmVHcmlkOgorCXtQZXJzcGVjdGl2ZUdyaWR9ICdncmlkJyByZWY9W3RhYmxlOjpUYWJsZV07CisKK1BlcnNwZWN0aXZlQ2hhcnQ6CisJe1BlcnNwZWN0aXZlQ2hhcnR9ICdjaGFydCcgcmVmPVtjaGFydDo6Q2hhcnRdOworCitQZXJzcGVjdGl2ZVJlcG9ydDoKKwl7UGVyc3BlY3RpdmVSZXBvcnR9ICdyZXBvcnQnIHJlZj1bcmVwb3J0OjpSZXBvcnRdOworCitQZXJzcGVjdGl2ZU9yZ2FuaXphdGlvbjoKKwl7UGVyc3BlY3RpdmVPcmdhbml6YXRpb259ICdvcmdhbmlncmFtJyByZWY9W29yZ2FuaXphdGlvbjo6T3JnYW5pemF0aW9uXTsKKworUGVyc3BlY3RpdmVUb3BvbG9neToKKwl7UGVyc3BlY3RpdmVUb3BvbG9neX0gJ3RvcG9sb2d5JyByZWY9W3RvcG9sb2d5OjpUb3BvbG9neV07CisKK1BlcnNwZWN0aXZlRGlhbG9nOgorCXtQZXJzcGVjdGl2ZURpYWxvZ30gJ2RpYWxvZycgcmVmPVtkaWFsb2c6OkRpYWxvZ107CisKK1BlcnNwZWN0aXZlQlBNTjoKKwl7UGVyc3BlY3RpdmVCUE1OfSAnYnBtbic7CisKK1BlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZDoKKwlRdWFsaWZpZWROYW1lICgnLicgJyonKT87CisKK1F1YWxpZmllZE5hbWU6CisJVmFsaWRJRCAoPT4gJy4nIFZhbGlkSUQpKjsKKworVmFsaWRJRDoKKwlJRDsKKworVFJBTlNMQVRBQkxFSUQ6CisJSUQ7CisKK1RSQU5TTEFUQUJMRVNUUklORzoKKwlTVFJJTkc7CisKK2VudW0gU2FzaE9yaWVudGF0aW9uOgorCUhPUklaT05UQUw9J2hvcml6b250YWwnIHwgVkVSVElDQUw9J3ZlcnRpY2FsJzsKKwkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL1BlcnNwZWN0aXZlRHNsUnVudGltZU1vZHVsZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9QZXJzcGVjdGl2ZURzbFJ1bnRpbWVNb2R1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODNkMGFjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9QZXJzcGVjdGl2ZURzbFJ1bnRpbWVNb2R1bGUuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLworIHBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC54dGV4dC5sYXp5cmVzb2x2ZXIuTGF6eUp2bVR5cGVMaW5rZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wueHRleHQubGF6eXJlc29sdmVyLkxhenlKdm1UeXBlTGlua2luZ0hlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC54dGV4dC5sYXp5cmVzb2x2ZXIuU2VtYW50aWNMb2FkaW5nUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wueHRleHQubGF6eXJlc29sdmVyLmxpbmtlci5GYXN0TGlua2luZ1NlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wueHRleHQubGF6eXJlc29sdmVyLmxpbmtlci5MYXp5SnZtVHlwZVRyYW5zaWVudFZhbHVlU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmkxOG4uRFNMT3V0cHV0Q29uZmlndXJhdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuanZtbW9kZWwuUGVyc3BlY3RpdmVNb2RlbEdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmxpbmtpbmcuUGVyc3BlY3RpdmVKdm1MaW5raW5nSGVscGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuc2NvcGluZy5QZXJzcGVjdGl2ZVNjb3BlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS52YWx1ZWNvbnZlcnRlci5QZXJzcGVjdGl2ZVZhbHVlQ29udmVydGVyU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb252ZXJzaW9uLklWYWx1ZUNvbnZlcnRlclNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLklHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLklPdXRwdXRDb25maWd1cmF0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQubGlua2luZy5JTGlua2luZ1NlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuc2NvcGluZy5JU2NvcGVQcm92aWRlcjsKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkJpbmRlcjsKKworLyoqCisgKiBVc2UgdGhpcyBjbGFzcyB0byByZWdpc3RlciBjb21wb25lbnRzIHRvIGJlIHVzZWQgYXQgcnVudGltZSAvIHdpdGhvdXQgdGhlCisgKiBFcXVpbm94IGV4dGVuc2lvbiByZWdpc3RyeS4KKyAqLworcHVibGljIGNsYXNzIFBlcnNwZWN0aXZlRHNsUnVudGltZU1vZHVsZSBleHRlbmRzCisJCW9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuQWJzdHJhY3RQZXJzcGVjdGl2ZURzbFJ1bnRpbWVNb2R1bGUgeworCUBPdmVycmlkZQorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgSUdlbmVyYXRvcj4gYmluZElHZW5lcmF0b3IoKSB7CisJCXJldHVybiBQZXJzcGVjdGl2ZU1vZGVsR2VuZXJhdG9yLmNsYXNzOworCX0KKworCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgSVNjb3BlUHJvdmlkZXI+IGJpbmRJU2NvcGVQcm92aWRlcigpIHsKKwkJcmV0dXJuIFBlcnNwZWN0aXZlU2NvcGVQcm92aWRlci5jbGFzczsKKwl9CisKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnNjb3BpbmcuYmF0Y2guWGJhc2VCYXRjaFNjb3BlUHJvdmlkZXI+IGJpbmRYYmFzZUJhdGNoU2NvcGVQcm92aWRlcigpIHsKKwkJcmV0dXJuIFBlcnNwZWN0aXZlU2NvcGVQcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZVNlcmlhbGl6ZXJJU2NvcGVQcm92aWRlcigKKwkJCWNvbS5nb29nbGUuaW5qZWN0LkJpbmRlciBiaW5kZXIpIHsKKwkJYmluZGVyLmJpbmQob3JnLmVjbGlwc2UueHRleHQuc2NvcGluZy5JU2NvcGVQcm92aWRlci5jbGFzcykKKwkJCQkuYW5ub3RhdGVkV2l0aCgKKwkJCQkJCW9yZy5lY2xpcHNlLnh0ZXh0LnNlcmlhbGl6ZXIudG9rZW5zLlNlcmlhbGl6ZXJTY29wZVByb3ZpZGVyQmluZGluZy5jbGFzcykKKwkJCQkudG8oUGVyc3BlY3RpdmVTY29wZVByb3ZpZGVyLmNsYXNzKTsKKwl9CisKKwkvLyAvKioKKwkvLyAqIE9ubHkgcmVxdWlyZWQsIGlmIGZxbiBjYW4gbm90IGJlIGNyZWF0ZWQgYnkgYXBwZW5kaW5nIHRoZSBuYW1lcyBvZiB0aGUKKwkvLyAqIHNlbWFudGljIGVsZW1lbnRzIHVwIHRoZSBoaWVyYXJjaHkuCisJLy8gKi8KKwkvLyBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0Lm5hbWluZy5JUXVhbGlmaWVkTmFtZVByb3ZpZGVyPgorCS8vIGJpbmRJUXVhbGlmaWVkTmFtZVByb3ZpZGVyKCkgeworCS8vIHJldHVybiBQZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVQcm92aWRlci5jbGFzczsKKwkvLyB9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIElWYWx1ZUNvbnZlcnRlclNlcnZpY2U+IGJpbmRJVmFsdWVDb252ZXJ0ZXJTZXJ2aWNlKCkgeworCQlyZXR1cm4gUGVyc3BlY3RpdmVWYWx1ZUNvbnZlcnRlclNlcnZpY2UuY2xhc3M7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY29uZmlndXJlKEJpbmRlciBiaW5kZXIpIHsKKwkJc3VwZXIuY29uZmlndXJlKGJpbmRlcik7CisJCWJpbmRlci5iaW5kKElPdXRwdXRDb25maWd1cmF0aW9uUHJvdmlkZXIuY2xhc3MpCisJCQkJLnRvKERTTE91dHB1dENvbmZpZ3VyYXRpb25Qcm92aWRlci5jbGFzcykuaW4oU2luZ2xldG9uLmNsYXNzKTsKKwl9CisKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIElMaW5raW5nU2VydmljZT4gYmluZElMaW5raW5nU2VydmljZSgpIHsKKwkJcmV0dXJuIEZhc3RMaW5raW5nU2VydmljZS5jbGFzczsKKwl9CisKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLlh0ZXh0UmVzb3VyY2U+IGJpbmRYdGV4dFJlc291cmNlKCkgeworCQlyZXR1cm4gU2VtYW50aWNMb2FkaW5nUmVzb3VyY2UuY2xhc3M7CisJfQorCisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5saW5raW5nLklMaW5rZXI+IGJpbmRJTGlua2VyKCkgeworCQlyZXR1cm4gTGF6eUp2bVR5cGVMaW5rZXIuY2xhc3M7CisJfQorCisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5zZXJpYWxpemVyLnNlcXVlbmNlci5JVHJhbnNpZW50VmFsdWVTZXJ2aWNlPiBiaW5kU2VyaWFsaXplcklUcmFuc2llbnRWYWx1ZVNlcnZpY2UoKSB7CisJCXJldHVybiBMYXp5SnZtVHlwZVRyYW5zaWVudFZhbHVlU2VydmljZS5jbGFzczsKKwl9CisKKwkvLyBAT3ZlcnJpZGUKKwkvLyBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIElEZXJpdmVkU3RhdGVDb21wdXRlcj4gYmluZElEZXJpdmVkU3RhdGVDb21wdXRlcigpCisJLy8geworCS8vIHJldHVybiBQZXJzcGVjdGl2ZU1vZGVsRGVyaXZlZFN0YXRlQ29tcHV0ZXJ4LmNsYXNzOworCS8vIH0KKwkvLworCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgTGF6eUp2bVR5cGVMaW5raW5nSGVscGVyPiBiaW5kSnZtTGlua2luZ0hlbHBlcigpIHsKKwkJcmV0dXJuIFBlcnNwZWN0aXZlSnZtTGlua2luZ0hlbHBlci5jbGFzczsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvUGVyc3BlY3RpdmVEc2xTdGFuZGFsb25lU2V0dXAuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvUGVyc3BlY3RpdmVEc2xTdGFuZGFsb25lU2V0dXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDBjYzYwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9QZXJzcGVjdGl2ZURzbFN0YW5kYWxvbmVTZXR1cC5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KKyBwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmU7CisKKy8qKgorICogSW5pdGlhbGl6YXRpb24gc3VwcG9ydCBmb3IgcnVubmluZyBYdGV4dCBsYW5ndWFnZXMgCisgKiB3aXRob3V0IGVxdWlub3ggZXh0ZW5zaW9uIHJlZ2lzdHJ5CisgKi8KK3B1YmxpYyBjbGFzcyBQZXJzcGVjdGl2ZURzbFN0YW5kYWxvbmVTZXR1cCBleHRlbmRzIFBlcnNwZWN0aXZlRHNsU3RhbmRhbG9uZVNldHVwR2VuZXJhdGVkeworCisJcHVibGljIHN0YXRpYyB2b2lkIGRvU2V0dXAoKSB7CisJCW5ldyBQZXJzcGVjdGl2ZURzbFN0YW5kYWxvbmVTZXR1cCgpLmNyZWF0ZUluamVjdG9yQW5kRG9FTUZSZWdpc3RyYXRpb24oKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvWGNvcmVSZXNvdXJjZUZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvWGNvcmVSZXNvdXJjZUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGI3ZjkxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9YY29yZVJlc291cmNlRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KKyBwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueGNvcmUucmVzb3VyY2UuWGNvcmVSZXNvdXJjZTsKKworcHVibGljIGNsYXNzIFhjb3JlUmVzb3VyY2VGYWN0b3J5IGltcGxlbWVudHMgUmVzb3VyY2UuRmFjdG9yeSB7CisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKKwkJWGNvcmVSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBYY29yZVJlc291cmNlKCk7CisJCXJlc291cmNlLnNldFVSSSh1cmkpOworCQlyZXR1cm4gcmVzb3VyY2U7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2Rlcml2ZWRzdGF0ZS9QZXJzcGVjdGl2ZU1vZGVsRGVyaXZlZFN0YXRlQ29tcHV0ZXJ4Lnh0ZW5kIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9kZXJpdmVkc3RhdGUvUGVyc3BlY3RpdmVNb2RlbERlcml2ZWRTdGF0ZUNvbXB1dGVyeC54dGVuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDYwN2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9kZXJpdmVkc3RhdGUvUGVyc3BlY3RpdmVNb2RlbERlcml2ZWRTdGF0ZUNvbXB1dGVyeC54dGVuZApAQCAtMCwwICsxLDk0IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICogCisgKiAgVGhpcyBjb3B5cmlnaHQgbm90aWNlIHNob3dzIHVwIGluIHRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlCisgKgorICovCisgCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuZGVyaXZlZHN0YXRlCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZU1vZGVsCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVBhY2thZ2UKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUGFydAoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYXJ0U3RhY2sKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlU2FzaENvbnRhaW5lcgoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLkRlcml2ZWRTdGF0ZUF3YXJlUmVzb3VyY2UKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5qdm1tb2RlbC5Kdm1Nb2RlbEFzc29jaWF0b3IKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyCitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3RvcnkKKworQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKK2NsYXNzIFBlcnNwZWN0aXZlTW9kZWxEZXJpdmVkU3RhdGVDb21wdXRlcnggZXh0ZW5kcyBKdm1Nb2RlbEFzc29jaWF0b3IgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcih0eXBlb2YoUGVyc3BlY3RpdmVNb2RlbERlcml2ZWRTdGF0ZUNvbXB1dGVyeCkpCisKKwlEZXJpdmVkU3RhdGVBd2FyZVJlc291cmNlIHJlc291cmNlCisKKwkvLyBub3QgaW4gdXNlIC0ganVzdCBhIHNhbXBsZQorCW92ZXJyaWRlIGluc3RhbGxEZXJpdmVkU3RhdGUoRGVyaXZlZFN0YXRlQXdhcmVSZXNvdXJjZSByZXNvdXJjZSwgYm9vbGVhbiBwcmVMaW5raW5nUGhhc2UpIHsKKwkJbG9nLmRlYnVnKCJQZXJzcGVjdGl2ZU1vZGVsRGVyaXZlZFN0YXRlQ29tcHV0ZXJ4IGNhbGxlZCIpCisJCXN1cGVyLmluc3RhbGxEZXJpdmVkU3RhdGUocmVzb3VyY2UsIHByZUxpbmtpbmdQaGFzZSkKKwkJdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlCisKKwkJaWYgKHJlc291cmNlLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoIXByZUxpbmtpbmdQaGFzZSkgeworCisJCQl2YWwgUGVyc3BlY3RpdmVNb2RlbCBlT2JqZWN0ID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCkgYXMgUGVyc3BlY3RpdmVNb2RlbDsKKworCQkJdHJ5IHsKKwkJCQkvLyBjb21wbGV0ZSBhbGwgZWxlbWVudHMKKwkJCQllT2JqZWN0LmVDb250ZW50cy5mb3JFYWNoIFsKKwkJCQkJaXQubWFwCisJCQkJXQorCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisJCQkJbG9nLmVycm9yKCJ7fSIsIGV4KQorCQkJfQorCisvLwkJCWlmICh2aWV3cy5zaXplID4gMCkgeworLy8JCQkJcmVzb3VyY2UuY29udGVudHMgKz0gdmlld3MuZ2V0KDApCisvLwkJCX0KKworCQl9CisJfQorCQorCWRlZiBkaXNwYXRjaCB2b2lkIG1hcChQZXJzcGVjdGl2ZVBhY2thZ2Ugb2JqZWN0KSB7CisJCWxvZy5kZWJ1ZygiQ0NQZXJzcGVjdGl2ZVBhY2thZ2UiKQorCQlvYmplY3QucGVyc3BlY3RpdmVzLmZvckVhY2hbaXQubWFwXQorCX0KKworCWRlZiBkaXNwYXRjaCB2b2lkIG1hcChQZXJzcGVjdGl2ZSBvYmplY3QpIHsKKwkJbG9nLmRlYnVnKCJDQ1BlcnNwZWN0aXZlIikKKwkJb2JqZWN0LmVsZW1lbnRzLmZvckVhY2hbaXQubWFwXQorCX0KKworCWRlZiBkaXNwYXRjaCB2b2lkIG1hcChQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIgb2JqZWN0KSB7CisJCWxvZy5kZWJ1ZygiQ0NQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIiKQorCQlvYmplY3QuZWxlbWVudHMuZm9yRWFjaFtpdC5tYXBdCisJfQorCisJZGVmIGRpc3BhdGNoIHZvaWQgbWFwKFBlcnNwZWN0aXZlUGFydFN0YWNrIG9iamVjdCkgeworCQlsb2cuZGVidWcoIkNDUGVyc3BlY3RpdmVQYXJ0U3RhY2siKQorCQlvYmplY3QuZWxlbWVudHMuZm9yRWFjaFtpdC5tYXBdCisJfQorCisJZGVmIGRpc3BhdGNoIHZvaWQgbWFwKFBlcnNwZWN0aXZlUGFydCBvYmplY3QpIHsKKwkJbG9nLmRlYnVnKCJDQ1BlcnNwZWN0aXZlUGFydCIpCisJfQorCQorCWRlZiBkaXNwYXRjaCB2b2lkIG1hcChWb2lkIG9iamVjdCkgeworCQlsb2cuZGVidWcoInZvaWQiKQorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvZm9ybWF0dGluZy9QZXJzcGVjdGl2ZURzbEZvcm1hdHRlci54dGVuZCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvZm9ybWF0dGluZy9QZXJzcGVjdGl2ZURzbEZvcm1hdHRlci54dGVuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDViN2NiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9mb3JtYXR0aW5nL1BlcnNwZWN0aXZlRHNsRm9ybWF0dGVyLnh0ZW5kCkBAIC0wLDAgKzEsNDcgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKiAKKyAqICBUaGlzIGNvcHlyaWdodCBub3RpY2Ugc2hvd3MgdXAgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAqCisgKi8KKyAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5mb3JtYXR0aW5nCisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuZm9ybWF0dGluZy5pbXBsLkFic3RyYWN0RGVjbGFyYXRpdmVGb3JtYXR0ZXIKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5mb3JtYXR0aW5nLmltcGwuRm9ybWF0dGluZ0NvbmZpZworLy9pbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5zZXJ2aWNlcy5QZXJzcGVjdGl2ZURzbEdyYW1tYXJBY2Nlc3MKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnV0aWxzLnh0ZXh0LkdlbmVyaWNGb3JtYXR0ZXIKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5zZXJ2aWNlcy5YdHlwZUdyYW1tYXJBY2Nlc3MKKworLyoqCisgKiBUaGlzIGNsYXNzIGNvbnRhaW5zIGN1c3RvbSBmb3JtYXR0aW5nIGRlc2NyaXB0aW9uLgorICogCisgKiBzZWUgOiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL1h0ZXh0L2RvY3VtZW50YXRpb24uaHRtbCNmb3JtYXR0aW5nCisgKiBvbiBob3cgYW5kIHdoZW4gdG8gdXNlIGl0IAorICogCisgKiBBbHNvIHNlZSB7QGxpbmsgb3JnLmVjbGlwc2UueHRleHQueHRleHQuWHRleHRGb3JtYXR0aW5nVG9rZW5TZXJpYWxpemVyfSBhcyBhbiBleGFtcGxlCisgKi8KK2NsYXNzIFBlcnNwZWN0aXZlRHNsRm9ybWF0dGVyIGV4dGVuZHMgQWJzdHJhY3REZWNsYXJhdGl2ZUZvcm1hdHRlciB7CisKKy8vCUBJbmplY3QgZXh0ZW5zaW9uIFBlcnNwZWN0aXZlRHNsR3JhbW1hckFjY2VzcworCUBJbmplY3QgWHR5cGVHcmFtbWFyQWNjZXNzIGdyYW1tYXJBY2Nlc3MKKworCW92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUZvcm1hdHRpbmcoRm9ybWF0dGluZ0NvbmZpZyBjKSB7CisJCXZhbCBnZW5lcmljRm9ybWF0dGVyID0gbmV3IEdlbmVyaWNGb3JtYXR0ZXIoKQorCisJCS8vCWNvbW1vbiBmb3JtYXR0aW5nOgorCQlnZW5lcmljRm9ybWF0dGVyLmZvcm1hdEZpcnN0TGV2ZWxCbG9ja3MoIGMsIGdyYW1tYXIuZ3JhbW1hciwgIlBlcnNwZWN0aXZlIiwgIlBlcnNwZWN0aXZlSW1wb3J0IiApCisJCWdlbmVyaWNGb3JtYXR0ZXIuZ2VuZXJpY0Zvcm1hdHRpbmcoYywgZ3JhbW1hciwgZ3JhbW1hckFjY2VzcykKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2p2bW1vZGVsL1BlcnNwZWN0aXZlRHNsSnZtTW9kZWxJbmZlcnJlci54dGVuZCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvanZtbW9kZWwvUGVyc3BlY3RpdmVEc2xKdm1Nb2RlbEluZmVycmVyLnh0ZW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZjkxOWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2p2bW1vZGVsL1BlcnNwZWN0aXZlRHNsSnZtTW9kZWxJbmZlcnJlci54dGVuZApAQCAtMCwwICsxLDM1IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICogCisgKiAgVGhpcyBjb3B5cmlnaHQgbm90aWNlIHNob3dzIHVwIGluIHRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlCisgKgorICovCisgCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuanZtbW9kZWwKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYWNrYWdlCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuanZtbW9kZWwuQWJzdHJhY3RNb2RlbEluZmVycmVyCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuanZtbW9kZWwuSUp2bURlY2xhcmVkVHlwZUFjY2VwdG9yCisKKy8qKgorICogPHA+SW5mZXJzIGEgSlZNIG1vZGVsIGZyb20gdGhlIHNvdXJjZSBtb2RlbC48L3A+IAorICoKKyAqIDxwPlRoZSBKVk0gbW9kZWwgc2hvdWxkIGNvbnRhaW4gYWxsIGVsZW1lbnRzIHRoYXQgd291bGQgYXBwZWFyIGluIHRoZSBKYXZhIGNvZGUgCisgKiB3aGljaCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgc291cmNlIG1vZGVsLiBPdGhlciBtb2RlbHMgbGluayBhZ2FpbnN0IHRoZSBKVk0gbW9kZWwgcmF0aGVyIHRoYW4gdGhlIHNvdXJjZSBtb2RlbC48L3A+ICAgICAKKyAqLworY2xhc3MgUGVyc3BlY3RpdmVEc2xKdm1Nb2RlbEluZmVycmVyIGV4dGVuZHMgQWJzdHJhY3RNb2RlbEluZmVycmVyIHsKKworICAgCWRlZiBkaXNwYXRjaCB2b2lkIGluZmVyKFBlcnNwZWN0aXZlUGFja2FnZSBwa2csIElKdm1EZWNsYXJlZFR5cGVBY2NlcHRvciBhY2NlcHRvciwgYm9vbGVhbiBpc1ByZUluZGV4aW5nUGhhc2UpIHsKKyAgIAl9Cit9CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvanZtbW9kZWwvUGVyc3BlY3RpdmVNb2RlbEdlbmVyYXRvci54dGVuZCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvanZtbW9kZWwvUGVyc3BlY3RpdmVNb2RlbEdlbmVyYXRvci54dGVuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjhmNWIyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9qdm1tb2RlbC9QZXJzcGVjdGl2ZU1vZGVsR2VuZXJhdG9yLnh0ZW5kCkBAIC0wLDAgKzEsODYgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKiAKKyAqICBUaGlzIGNvcHlyaWdodCBub3RpY2Ugc2hvd3MgdXAgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAqCisgKi8KKyAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5qdm1tb2RlbAorCitpbXBvcnQgY29tLnZhYWRpbi51aS5VSQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZXZlbnRicm9rZXIuRXZlbnRCcm9rZXJNc2cKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJhc2ljLmdlbmVyYXRvci5CYXNpY0RzbEdlbmVyYXRvclV0aWxzCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5pMThuLkkxOE5Nb2RlbEdlbmVyYXRvcgoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3QKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbgoraW1wb3J0IGphdmEudXRpbC5IYXNoTWFwCitpbXBvcnQgamF2YS51dGlsLkxvY2FsZQoraW1wb3J0IGphdmEudXRpbC5NYXAKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5kYXRhYmluZGluZy5EYXRhQmluZGluZ0NvbnRleHQKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmRhdGFiaW5kaW5nLlVwZGF0ZVZhbHVlU3RyYXRlZ3kKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmRhdGFiaW5kaW5nLmJlYW5zLkJlYW5zT2JzZXJ2YWJsZXMKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLmV4dGVuc2lvbnMuRXZlbnRVdGlscworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuc2VydmljZXMuZXZlbnRzLklFdmVudEJyb2tlcgoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLklGaWxlU3lzdGVtQWNjZXNzCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuY29tcGlsZXIuR2VuZXJhdG9yQ29uZmlnCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuY29tcGlsZXIuSW1wb3J0TWFuYWdlcgoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAucnVudGltZS5jb21tb24uaTE4bi5JVHJhbnNsYXRvcgoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAucnVudGltZS53ZWIudmFhZGluLmRhdGFiaW5kaW5nLlZhYWRpbk9ic2VydmFibGVzCitpbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5ldmVudC5FdmVudEhhbmRsZXIKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyCitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3RvcnkKKworY2xhc3MgUGVyc3BlY3RpdmVNb2RlbEdlbmVyYXRvciBleHRlbmRzIEkxOE5Nb2RlbEdlbmVyYXRvciB7CisvLwlASW5qZWN0IGV4dGVuc2lvbiBKdm1UeXBlc0J1aWxkZXIKKy8vCUBJbmplY3QgZXh0ZW5zaW9uIElRdWFsaWZpZWROYW1lUHJvdmlkZXIKKwlASW5qZWN0IGV4dGVuc2lvbiBCYXNpY0RzbEdlbmVyYXRvclV0aWxzCisJCisJb3ZlcnJpZGUgY3JlYXRlQXBwZW5kYWJsZShFT2JqZWN0IGNvbnRleHQsIEltcG9ydE1hbmFnZXIgaW1wb3J0TWFuYWdlciwgR2VuZXJhdG9yQ29uZmlnIGNvbmZpZykgeworCQkvLyByZXF1aXJlZCB0byBpbml0aWFsaXplIHRoZSBuZWVkZWQgYnVpbGRlciB0byBhdm9pZCBkZXByZWNhdGVkIG1ldGhvZHMKKwkJYnVpbGRlciA9IGNvbnRleHQuZVJlc291cmNlCisJCS8vIC0tLS0tLS0tLQorCQlpbXBvcnRNYW5hZ2VyLmFkZEltcG9ydEZvcihfdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihIYXNoTWFwLCBfdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihTdHJpbmcpLCBfdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihTdHJpbmcpKS50eXBlKQorCQlpbXBvcnRNYW5hZ2VyLmFkZEltcG9ydEZvcihfdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihNYXAsIF90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKFN0cmluZyksIF90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKFN0cmluZykpLnR5cGUpCisJCWltcG9ydE1hbmFnZXIuYWRkSW1wb3J0Rm9yKF90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKENvbGxlY3Rpb24sIF90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKFN0cmluZykpLnR5cGUpCisJCWFkZEltcG9ydEZvcihpbXBvcnRNYW5hZ2VyLCBfdHlwZVJlZmVyZW5jZUJ1aWxkZXIKKwkJCSxBcnJheUxpc3QKKwkJCSxJRXZlbnRCcm9rZXIKKwkJCSxFdmVudFV0aWxzCisJCQksRXZlbnRCcm9rZXJNc2cKKwkJCSxFdmVudEhhbmRsZXIKKwkJCSxMb2dnZXIKKwkJCSxMb2dnZXJGYWN0b3J5CisJCQkvLyB0aGlzIHN0dWZmIGZvciB0cmFuc2xhdGlvbnMKKwkJCSxVSQorCQkJLFZhYWRpbk9ic2VydmFibGVzCisJCQksRGF0YUJpbmRpbmdDb250ZXh0CisJCQksQmVhbnNPYnNlcnZhYmxlcworCS8vCQksUHJvcGVydHlDaGFuZ2VTdXBwb3J0CisJCQksUmVzb3VyY2VCdW5kbGUKKwkJCSxMb2NhbGUKKwkJCSxVcGRhdGVWYWx1ZVN0cmF0ZWd5CisJCQksSVRyYW5zbGF0b3IKKwkJKQorCQlzdXBlci5jcmVhdGVBcHBlbmRhYmxlKGNvbnRleHQsIGltcG9ydE1hbmFnZXIsIGNvbmZpZykKKwl9CisKKwlvdmVycmlkZSBkb0dlbmVyYXRlKFJlc291cmNlIHJlc291cmNlLCBJRmlsZVN5c3RlbUFjY2VzcyBmc2EpIHsKKwkJYWRkVHJhbnNsYXRhYmxlcygiUGVyc3BlY3RpdmVOQSIpCisJCXN1cGVyLmRvR2VuZXJhdGUocmVzb3VyY2UsIGZzYSkKKwl9CisJCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2xpbmtpbmcvUGVyc3BlY3RpdmVKdm1MaW5raW5nSGVscGVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2xpbmtpbmcvUGVyc3BlY3RpdmVKdm1MaW5raW5nSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFhNjUyZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvbGlua2luZy9QZXJzcGVjdGl2ZUp2bUxpbmtpbmdIZWxwZXIuamF2YQpAQCAtMCwwICsxLDExMCBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLworIHBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5saW5raW5nOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC54dGV4dC5sYXp5cmVzb2x2ZXIuTGF6eUp2bVR5cGVMaW5raW5nSGVscGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2xQYWNrYWdlOworCitwdWJsaWMgY2xhc3MgUGVyc3BlY3RpdmVKdm1MaW5raW5nSGVscGVyIGV4dGVuZHMgTGF6eUp2bVR5cGVMaW5raW5nSGVscGVyIHsKKworCXB1YmxpYyBQZXJzcGVjdGl2ZUp2bUxpbmtpbmdIZWxwZXIoKSB7CisJCXJlZ2lzdGVyKFBlcnNwZWN0aXZlRHNsUGFja2FnZS5MaXRlcmFscy5QRVJTUEVDVElWRV9TRUxFQ1RJT05fX1JFRiwKKwkJCQlQZXJzcGVjdGl2ZURzbFBhY2thZ2UuTGl0ZXJhbHMuUEVSU1BFQ1RJVkVfU0VMRUNUSU9OX19SRUZfVFlQRV9KVk0sCisJCQkJbmV3IElKdm1MaW5rQ3Jvc3NSZWZTdHJpbmdFbmhhbmNlcigpIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyBTdHJpbmcgZW5oYW5jZShFT2JqZWN0IGNvbnRleHQsCisJCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIFN0cmluZyBjcm9zc1JlZlN0cmluZykgeworCQkJCQkJcmV0dXJuIGNyb3NzUmVmU3RyaW5nICsgIlNlbGVjdCI7CisJCQkJCX0KKwkJCQl9LCBudWxsKTsKKwkJcmVnaXN0ZXIoUGVyc3BlY3RpdmVEc2xQYWNrYWdlLkxpdGVyYWxzLlBFUlNQRUNUSVZFX1RBQkxFX19SRUYsCisJCQkJUGVyc3BlY3RpdmVEc2xQYWNrYWdlLkxpdGVyYWxzLlBFUlNQRUNUSVZFX1RBQkxFX19SRUZfVFlQRV9KVk0sCisJCQkJbmV3IElKdm1MaW5rQ3Jvc3NSZWZTdHJpbmdFbmhhbmNlcigpIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyBTdHJpbmcgZW5oYW5jZShFT2JqZWN0IGNvbnRleHQsCisJCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIFN0cmluZyBjcm9zc1JlZlN0cmluZykgeworCQkJCQkJcmV0dXJuIGNyb3NzUmVmU3RyaW5nICsgIlRhYmxlIjsKKwkJCQkJfQorCQkJCX0sIG51bGwpOworCQlyZWdpc3RlcihQZXJzcGVjdGl2ZURzbFBhY2thZ2UuTGl0ZXJhbHMuUEVSU1BFQ1RJVkVfR1JJRF9fUkVGLAorCQkJCVBlcnNwZWN0aXZlRHNsUGFja2FnZS5MaXRlcmFscy5QRVJTUEVDVElWRV9HUklEX19SRUZfVFlQRV9KVk0sCisJCQkJbmV3IElKdm1MaW5rQ3Jvc3NSZWZTdHJpbmdFbmhhbmNlcigpIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyBTdHJpbmcgZW5oYW5jZShFT2JqZWN0IGNvbnRleHQsCisJCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIFN0cmluZyBjcm9zc1JlZlN0cmluZykgeworCQkJCQkJcmV0dXJuIGNyb3NzUmVmU3RyaW5nICsgIkdyaWQiOworCQkJCQl9CisJCQkJfSwgbnVsbCk7CisJCXJlZ2lzdGVyKFBlcnNwZWN0aXZlRHNsUGFja2FnZS5MaXRlcmFscy5QRVJTUEVDVElWRV9DSEFSVF9fUkVGLAorCQkJCVBlcnNwZWN0aXZlRHNsUGFja2FnZS5MaXRlcmFscy5QRVJTUEVDVElWRV9DSEFSVF9fUkVGX1RZUEVfSlZNLAorCQkJCW5ldyBJSnZtTGlua0Nyb3NzUmVmU3RyaW5nRW5oYW5jZXIoKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgU3RyaW5nIGVuaGFuY2UoRU9iamVjdCBjb250ZXh0LAorCQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBTdHJpbmcgY3Jvc3NSZWZTdHJpbmcpIHsKKwkJCQkJCXJldHVybiBjcm9zc1JlZlN0cmluZyArICJDaGFydCI7CisJCQkJCX0KKwkJCQl9LCBudWxsKTsKKwkJcmVnaXN0ZXIoCisJCQkJUGVyc3BlY3RpdmVEc2xQYWNrYWdlLkxpdGVyYWxzLlBFUlNQRUNUSVZFX1JFUE9SVF9fUkVGLAorCQkJCVBlcnNwZWN0aXZlRHNsUGFja2FnZS5MaXRlcmFscy5QRVJTUEVDVElWRV9SRVBPUlRfX1JFRl9UWVBFX0pWTSwKKwkJCQluZXcgSUp2bUxpbmtDcm9zc1JlZlN0cmluZ0VuaGFuY2VyKCkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIFN0cmluZyBlbmhhbmNlKEVPYmplY3QgY29udGV4dCwKKwkJCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgU3RyaW5nIGNyb3NzUmVmU3RyaW5nKSB7CisJCQkJCQlyZXR1cm4gY3Jvc3NSZWZTdHJpbmcgKyAiUmVwb3J0IjsKKwkJCQkJfQorCQkJCX0sIG51bGwpOworLy8JCXJlZ2lzdGVyKAorLy8JCQkJUGVyc3BlY3RpdmVEc2xQYWNrYWdlLkxpdGVyYWxzLlBFUlNQRUNUSVZFX09SR0FOSVpBVElPTl9fUkVGLAorLy8JCQkJUGVyc3BlY3RpdmVEc2xQYWNrYWdlLkxpdGVyYWxzLlBFUlNQRUNUSVZFX09SR0FOSVpBVElPTl9fUkVGX1RZUEVfSlZNLAorLy8JCQkJbmV3IElKdm1MaW5rQ3Jvc3NSZWZTdHJpbmdFbmhhbmNlcigpIHsKKy8vCQkJCQlAT3ZlcnJpZGUKKy8vCQkJCQlwdWJsaWMgU3RyaW5nIGVuaGFuY2UoRU9iamVjdCBjb250ZXh0LAorLy8JCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIFN0cmluZyBjcm9zc1JlZlN0cmluZykgeworLy8JCQkJCQlyZXR1cm4gY3Jvc3NSZWZTdHJpbmcgKyAiTXhHcmFwaE9yZ2FuaXphdGlvbiI7CisvLwkJCQkJfQorLy8JCQkJfSwgbnVsbCk7CisJCXJlZ2lzdGVyKAorCQkJCVBlcnNwZWN0aXZlRHNsUGFja2FnZS5MaXRlcmFscy5QRVJTUEVDVElWRV9UT1BPTE9HWV9fUkVGLAorCQkJCVBlcnNwZWN0aXZlRHNsUGFja2FnZS5MaXRlcmFscy5QRVJTUEVDVElWRV9UT1BPTE9HWV9fUkVGX1RZUEVfSlZNLAorCQkJCW5ldyBJSnZtTGlua0Nyb3NzUmVmU3RyaW5nRW5oYW5jZXIoKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgU3RyaW5nIGVuaGFuY2UoRU9iamVjdCBjb250ZXh0LAorCQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBTdHJpbmcgY3Jvc3NSZWZTdHJpbmcpIHsKKwkJCQkJCXJldHVybiBjcm9zc1JlZlN0cmluZyArICJUb3BvbG9neSI7CisJCQkJCX0KKwkJCQl9LCBudWxsKTsKKwkJcmVnaXN0ZXIoCisJCQkJUGVyc3BlY3RpdmVEc2xQYWNrYWdlLkxpdGVyYWxzLlBFUlNQRUNUSVZFX0RJQUxPR19fUkVGLAorCQkJCVBlcnNwZWN0aXZlRHNsUGFja2FnZS5MaXRlcmFscy5QRVJTUEVDVElWRV9ESUFMT0dfX1JFRl9UWVBFX0pWTSwKKwkJCQluZXcgSUp2bUxpbmtDcm9zc1JlZlN0cmluZ0VuaGFuY2VyKCkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIFN0cmluZyBlbmhhbmNlKEVPYmplY3QgY29udGV4dCwKKwkJCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgU3RyaW5nIGNyb3NzUmVmU3RyaW5nKSB7CisJCQkJCQlyZXR1cm4gY3Jvc3NSZWZTdHJpbmcgKyAiRGlhbG9nIjsKKwkJCQkJfQorCQkJCX0sIG51bGwpOworCQlyZWdpc3RlcihQZXJzcGVjdGl2ZURzbFBhY2thZ2UuTGl0ZXJhbHMuUEVSU1BFQ1RJVkVfX1RPT0xCQVIsCisJCQkJUGVyc3BlY3RpdmVEc2xQYWNrYWdlLkxpdGVyYWxzLlBFUlNQRUNUSVZFX19UT09MQkFSX1RZUEVfSlZNLAorCQkJCW5ldyBJSnZtTGlua0Nyb3NzUmVmU3RyaW5nRW5oYW5jZXIoKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgU3RyaW5nIGVuaGFuY2UoRU9iamVjdCBjb250ZXh0LAorCQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBTdHJpbmcgY3Jvc3NSZWZTdHJpbmcpIHsKKwkJCQkJCXJldHVybiBjcm9zc1JlZlN0cmluZyArICJBY3Rpb24iOworCQkJCQl9CisJCQkJfSwgbnVsbCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9zY29waW5nL1BlcnNwZWN0aXZlRFNMU2NvcGVQcm92aWRlci54dGVuZCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvc2NvcGluZy9QZXJzcGVjdGl2ZURTTFNjb3BlUHJvdmlkZXIueHRlbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUxNjU0MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvc2NvcGluZy9QZXJzcGVjdGl2ZURTTFNjb3BlUHJvdmlkZXIueHRlbmQKQEAgLTAsMCArMSwyNTUgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKiAKKyAqICBUaGlzIGNvcHlyaWdodCBub3RpY2Ugc2hvd3MgdXAgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAqCisgKi8KKyAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5zY29waW5nCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdAoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wueHRleHQubGF6eXJlc29sdmVyLmFwaS5FY29yZVV0aWwzCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5lY3ZpZXcuc2VtYW50aWMudWltb2RlbC5VaUlERVZpZXcKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJsaXAuQmxpcAoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYmxpcC5CbGlwVXNlclRhc2sKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRpYWxvZ2RzbC5EaWFsb2cKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURpYWxvZworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2xQYWNrYWdlCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZUdyaWQKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUGFydFN0YWNrCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVNhc2hDb250YWluZXIKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlU2VsZWN0aW9uCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVRhYmxlCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC50YWJsZS5UYWJsZQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQudGFibGUuVGFibGVHcmlkCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC50YWJsZS5UYWJsZVNlbGVjdGlvbgoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQudGFibGUuVGFibGVUYWJsZQoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLkVPYmplY3REZXNjcmlwdGlvbgoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLklFT2JqZWN0RGVzY3JpcHRpb24KK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5zY29waW5nLklTY29wZQoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnNjb3BpbmcuaW1wbC5NYXBCYXNlZFNjb3BlCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuYW5ub3RhdGlvbnMudHlwZXN5c3RlbS5YYmFzZVdpdGhBbm5vdGF0aW9uc0JhdGNoU2NvcGVQcm92aWRlcgorCitjbGFzcyBQZXJzcGVjdGl2ZVNjb3BlUHJvdmlkZXIgZXh0ZW5kcyBYYmFzZVdpdGhBbm5vdGF0aW9uc0JhdGNoU2NvcGVQcm92aWRlciB7CisKKwlAT3ZlcnJpZGUKKwlvdmVycmlkZSBJU2NvcGUgZ2V0U2NvcGUoRU9iamVjdCBjb250ZXh0LCBFUmVmZXJlbmNlIHJlZmVyZW5jZSkgeworCQlpZiAocmVmZXJlbmNlID09IFBlcnNwZWN0aXZlRHNsUGFja2FnZS5MaXRlcmFscy5QRVJTUEVDVElWRV9TQVNIX0NPTlRBSU5FUl9fU0VMRUNURURfRUxFTUVOVCkgeworCQkJcmV0dXJuIGdldFNjb3BlX0NDUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX3NlbGVjdGVkX2VsZW1lbnQoY29udGV4dCkKKwkJfSBlbHNlIGlmIChyZWZlcmVuY2UgPT0gUGVyc3BlY3RpdmVEc2xQYWNrYWdlLkxpdGVyYWxzLlBFUlNQRUNUSVZFX1BBUlRfU1RBQ0tfX1NFTEVDVEVEX0VMRU1FTlQpIHsKKwkJCXJldHVybiBnZXRTY29wZV9DQ1BlcnNwZWN0aXZlUGFydFN0YWNrX3NlbGVjdGVkX2VsZW1lbnQoY29udGV4dCkKKwkJfSBlbHNlIGlmIChyZWZlcmVuY2UgPT0gUGVyc3BlY3RpdmVEc2xQYWNrYWdlLkxpdGVyYWxzLlBFUlNQRUNUSVZFX19VU0VSX1RBU0spIHsKKwkJCXJldHVybiBnZXRTY29wZV9DQ1BlcnNwZWN0aXZlUGFydFN0YWNrX1VTRVJfVEFTSyhjb250ZXh0IGFzIFBlcnNwZWN0aXZlKQorCQl9IGVsc2UgaWYgKHJlZmVyZW5jZSA9PSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuTGl0ZXJhbHMuUEVSU1BFQ1RJVkVfRElBTE9HX19SRUYpIHsKKwkJCXJldHVybiBnZXRTY29wZV9DQ1BlcnNwZWN0aXZlUGFydFN0YWNrX1BFUlNQRUNUSVZFX0RJQUxPR19fUkVGKGNvbnRleHQgYXMgUGVyc3BlY3RpdmVEaWFsb2csIHJlZmVyZW5jZSkKKwkJfSBlbHNlIGlmIChyZWZlcmVuY2UgPT0gUGVyc3BlY3RpdmVEc2xQYWNrYWdlLkxpdGVyYWxzLlBFUlNQRUNUSVZFX1NFTEVDVElPTl9fUkVGKSB7CisJCQlyZXR1cm4gZ2V0U2NvcGVfQ0NQZXJzcGVjdGl2ZVBhcnRTdGFja19QRVJTUEVDVElWRV9TRUxFQ1RJT05fX1JFRihjb250ZXh0IGFzIFBlcnNwZWN0aXZlU2VsZWN0aW9uLCByZWZlcmVuY2UpCisJCX0gZWxzZSBpZiAocmVmZXJlbmNlID09IFBlcnNwZWN0aXZlRHNsUGFja2FnZS5MaXRlcmFscy5QRVJTUEVDVElWRV9UQUJMRV9fUkVGKSB7CisJCQlyZXR1cm4gZ2V0U2NvcGVfQ0NQZXJzcGVjdGl2ZVBhcnRTdGFja19QRVJTUEVDVElWRV9UQUJMRV9fUkVGKGNvbnRleHQgYXMgUGVyc3BlY3RpdmVUYWJsZSwgcmVmZXJlbmNlKQorCQl9IGVsc2UgaWYgKHJlZmVyZW5jZSA9PSBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuTGl0ZXJhbHMuUEVSU1BFQ1RJVkVfR1JJRF9fUkVGKSB7CisJCQlyZXR1cm4gZ2V0U2NvcGVfQ0NQZXJzcGVjdGl2ZVBhcnRTdGFja19QRVJTUEVDVElWRV9HUklEX19SRUYoY29udGV4dCBhcyBQZXJzcGVjdGl2ZUdyaWQsIHJlZmVyZW5jZSkKKwkJfQorCQlyZXR1cm4gc3VwZXIuZ2V0U2NvcGUoY29udGV4dCwgcmVmZXJlbmNlKQorCX0KKworCWRlZiBnZXRTY29wZV9DQ1BlcnNwZWN0aXZlUGFydFN0YWNrX1BFUlNQRUNUSVZFX0RJQUxPR19fUkVGKFBlcnNwZWN0aXZlRGlhbG9nIGRpYWxvZ1ZpZXcsIEVSZWZlcmVuY2UgcmVmZXJlbmNlKSB7CisJCXZhbCBzdXBlclNjb3BlID0gc3VwZXIuZ2V0U2NvcGUoZGlhbG9nVmlldywgcmVmZXJlbmNlKQorCQl2YXIgcmVzdWx0ID0gPElFT2JqZWN0RGVzY3JpcHRpb24+bmV3QXJyYXlMaXN0CisJCXZhciBwZXJzcGVjdGl2ZSA9IGRpYWxvZ1ZpZXcuZUNvbnRhaW5lcgorCQl3aGlsZSAoKHBlcnNwZWN0aXZlICE9IG51bGwpICYmICEocGVyc3BlY3RpdmUgaW5zdGFuY2VvZiBQZXJzcGVjdGl2ZSkpIHsKKwkJCXBlcnNwZWN0aXZlID0gcGVyc3BlY3RpdmUuZUNvbnRhaW5lcgorCQl9CisJCWlmICgocGVyc3BlY3RpdmUgYXMgUGVyc3BlY3RpdmUpPy51c2VyVGFzayA9PSBudWxsKSB7CisJCQlyZXR1cm4gc3VwZXJTY29wZQorCQl9IGVsc2UgeworCQkJdmFsIGh1bWFuVGFzayA9IEVjb3JlVXRpbDMucmVzb2x2ZSgocGVyc3BlY3RpdmUgYXMgUGVyc3BlY3RpdmUpPy51c2VyVGFzaywgZGlhbG9nVmlldy5lUmVzb3VyY2UucmVzb3VyY2VTZXQpIGFzIEJsaXBVc2VyVGFzaworCQkJdmFsIG9wZXJhdGl2ZUR0byA9IGh1bWFuVGFzay5vcGVyYXRpdmVMRHRvCisJCQlpZiAob3BlcmF0aXZlRHRvPy5uYW1lID09IG51bGwpIHsKKwkJCQlyZXR1cm4gc3VwZXJTY29wZQorCQkJfSBlbHNlIHsKKwkJCQlmb3IgKGVsZW1lbnQgOiBzdXBlclNjb3BlLmFsbEVsZW1lbnRzKSB7CisJCQkJCWlmIChlbGVtZW50LkVPYmplY3RPclByb3h5IGluc3RhbmNlb2YgRGlhbG9nKSB7CisJCQkJCQl2YXIgZGlhbG9nID0gZWxlbWVudC5FT2JqZWN0T3JQcm94eSBhcyBEaWFsb2cKKwkJCQkJCWRpYWxvZyA9IEVjb3JlVXRpbDMucmVzb2x2ZShkaWFsb2csIGRpYWxvZ1ZpZXcuZVJlc291cmNlLnJlc291cmNlU2V0KSBhcyBEaWFsb2cKKwkJCQkJCWlmKGRpYWxvZy51aVZpZXcgIT0gbnVsbCkgeworCQkJCQkJCXZhbCB1aVZpZXdPYmogPSBFY29yZVV0aWwzLnJlc29sdmUoZGlhbG9nLnVpVmlldyBhcyBFT2JqZWN0LCBkaWFsb2dWaWV3LmVSZXNvdXJjZS5yZXNvdXJjZVNldCkKKwkJCQkJCQlpZiAodWlWaWV3T2JqIGluc3RhbmNlb2YgVWlJREVWaWV3KSB7CisJCQkJCQkJCXZhbCB1aVZpZXcgPSB1aVZpZXdPYmogYXMgVWlJREVWaWV3CisJCQkJCQkJCWZvciAoYmVhblNsb3QgOiB1aVZpZXcuYmVhblNsb3RzKSB7CisJCQkJCQkJCQlpZiAob3BlcmF0aXZlRHRvLm5hbWUuZXF1YWxzKGJlYW5TbG90Py5qdm1UeXBlPy50eXBlPy5zaW1wbGVOYW1lKSkgeworCQkJCQkJCQkJCXJlc3VsdC5hZGQoZWxlbWVudCkKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSBpZihkaWFsb2cuZHRvICE9IG51bGwpIHsKKwkJCQkJCQlpZiAob3BlcmF0aXZlRHRvLm5hbWUuZXF1YWxzKGRpYWxvZy5kdG8ubmFtZSkpIHsKKwkJCQkJCQkJcmVzdWx0LmFkZChlbGVtZW50KQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXJldHVybiBNYXBCYXNlZFNjb3BlLmNyZWF0ZVNjb3BlKElTY29wZS5OVUxMU0NPUEUsIHJlc3VsdCkKKwkJfQorCX0KKworCWRlZiBnZXRTY29wZV9DQ1BlcnNwZWN0aXZlUGFydFN0YWNrX1BFUlNQRUNUSVZFX1RBQkxFX19SRUYoUGVyc3BlY3RpdmVUYWJsZSB0YWJsZVZpZXcsIEVSZWZlcmVuY2UgcmVmZXJlbmNlKSB7CisJCXZhciBzdXBlclNjb3BlID0gc3VwZXIuZ2V0U2NvcGUodGFibGVWaWV3LCByZWZlcmVuY2UpCisJCXZhciByZXN1bHQgPSA8SUVPYmplY3REZXNjcmlwdGlvbj5uZXdBcnJheUxpc3QKKwkJLy8gZXh0cmFjdCBwdXJlIHRhYmxlIHRhYmxlcworCQlmb3IgKGVsZW1lbnQgOiBzdXBlclNjb3BlLmFsbEVsZW1lbnRzKSB7CisJCQlpZiAoZWxlbWVudC5FT2JqZWN0T3JQcm94eSBpbnN0YW5jZW9mIFRhYmxlKSB7CisJCQkJdmFyIHRhYmxlID0gZWxlbWVudC5FT2JqZWN0T3JQcm94eSBhcyBUYWJsZQorCQkJCXRhYmxlID0gRWNvcmVVdGlsMy5yZXNvbHZlKHRhYmxlLCB0YWJsZVZpZXcuZVJlc291cmNlLnJlc291cmNlU2V0KSBhcyBUYWJsZQorCQkJCWlmICh0YWJsZS50YWJsZXR5cGUgaW5zdGFuY2VvZiBUYWJsZVRhYmxlKSB7CisJCQkJCXJlc3VsdC5hZGQoZWxlbWVudCkKKwkJCQl9CisJCQkJZWxzZSBpZiAodGFibGUudGFibGV0eXBlIGluc3RhbmNlb2YgVGFibGVHcmlkKSB7CisJCQkJCXJlc3VsdC5hZGQoZWxlbWVudCkKKwkJCQl9CisJCQl9CisJCX0KKwkJc3VwZXJTY29wZSA9IE1hcEJhc2VkU2NvcGUuY3JlYXRlU2NvcGUoSVNjb3BlLk5VTExTQ09QRSwgcmVzdWx0KQorCQlyZXN1bHQgPSA8SUVPYmplY3REZXNjcmlwdGlvbj5uZXdBcnJheUxpc3QKKwkJLy8gY2hlY2sgZm9yIGJsaXAgcmVxdWlyZW1lbnRzCisJCXZhciBwZXJzcGVjdGl2ZSA9IHRhYmxlVmlldy5lQ29udGFpbmVyCisJCXdoaWxlICgocGVyc3BlY3RpdmUgIT0gbnVsbCkgJiYgIShwZXJzcGVjdGl2ZSBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlKSkgeworCQkJcGVyc3BlY3RpdmUgPSBwZXJzcGVjdGl2ZS5lQ29udGFpbmVyCisJCX0KKwkJaWYgKChwZXJzcGVjdGl2ZSBhcyBQZXJzcGVjdGl2ZSk/LnVzZXJUYXNrID09IG51bGwpIHsKKwkJCXJldHVybiBzdXBlclNjb3BlCisJCX0gZWxzZSB7CisJCQkvLyBFdmVuIG5vdCB1c2luZyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoaXMgbGluZSBpdCBpcyBtYW5kYXRvcnkgdG8gaW5pdGlhbGl6ZSBsYXp5IGxvYWRpbmcgZm9yIGJwbW4KKwkJCUVjb3JlVXRpbDMucmVzb2x2ZSgocGVyc3BlY3RpdmUgYXMgUGVyc3BlY3RpdmUpPy5wcm9jZXNzLCB0YWJsZVZpZXcuZVJlc291cmNlLnJlc291cmNlU2V0KSBhcyBCbGlwCisJCQl2YWwgaHVtYW5UYXNrID0gRWNvcmVVdGlsMy5yZXNvbHZlKChwZXJzcGVjdGl2ZSBhcyBQZXJzcGVjdGl2ZSk/LnVzZXJUYXNrLCB0YWJsZVZpZXcuZVJlc291cmNlLnJlc291cmNlU2V0KSBhcyBCbGlwVXNlclRhc2sKKwkJCXZhbCBvcGVyYXRpdmVEdG8gPSBodW1hblRhc2sub3BlcmF0aXZlTER0bworCQkJaWYgKG9wZXJhdGl2ZUR0bz8ubmFtZSA9PSBudWxsKSB7CisJCQkJcmV0dXJuIHN1cGVyU2NvcGUKKwkJCX0gZWxzZSB7CisJCQkJZm9yIChlbGVtZW50IDogc3VwZXJTY29wZS5hbGxFbGVtZW50cykgeworCQkJCQlpZiAoZWxlbWVudC5FT2JqZWN0T3JQcm94eSBpbnN0YW5jZW9mIFRhYmxlKSB7CisJCQkJCQl2YXIgdGFibGUgPSBlbGVtZW50LkVPYmplY3RPclByb3h5IGFzIFRhYmxlCisJCQkJCQl0YWJsZSA9IEVjb3JlVXRpbDMucmVzb2x2ZSh0YWJsZSwgdGFibGVWaWV3LmVSZXNvdXJjZS5yZXNvdXJjZVNldCkgYXMgVGFibGUKKwkJCQkJCWlmICh0YWJsZS50YWJsZXR5cGUgaW5zdGFuY2VvZiBUYWJsZUdyaWQpIHsKKwkJCQkJCQl2YWwgdGFibGVHcmlkID0gdGFibGUudGFibGV0eXBlIGFzIFRhYmxlR3JpZAorCQkJCQkJCXZhbCB0YWJsZUR0b0RhdGFzb3VyY2UgPSB0YWJsZUdyaWQ/LnNvdXJjZQorCQkJCQkJCXZhbCByb290VHlwZUR0byA9IHRhYmxlRHRvRGF0YXNvdXJjZT8uZHRvU291cmNlCisJCQkJCQkJaWYgKG9wZXJhdGl2ZUR0by5uYW1lLmVxdWFscyhyb290VHlwZUR0by5uYW1lKSkgeworCQkJCQkJCQlyZXN1bHQuYWRkKGVsZW1lbnQpCisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIGlmICh0YWJsZS50YWJsZXR5cGUgaW5zdGFuY2VvZiBUYWJsZVRhYmxlKSB7CisJCQkJCQkJcmVzdWx0LmFkZChlbGVtZW50KQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIE1hcEJhc2VkU2NvcGUuY3JlYXRlU2NvcGUoSVNjb3BlLk5VTExTQ09QRSwgcmVzdWx0KQorCQl9CisJfQorCisJZGVmIGdldFNjb3BlX0NDUGVyc3BlY3RpdmVQYXJ0U3RhY2tfUEVSU1BFQ1RJVkVfU0VMRUNUSU9OX19SRUYoUGVyc3BlY3RpdmVTZWxlY3Rpb24gc2VsZWN0aW9uVmlldywgRVJlZmVyZW5jZSByZWZlcmVuY2UpIHsKKwkJdmFyIHN1cGVyU2NvcGUgPSBzdXBlci5nZXRTY29wZShzZWxlY3Rpb25WaWV3LCByZWZlcmVuY2UpCisJCXZhciByZXN1bHQgPSA8SUVPYmplY3REZXNjcmlwdGlvbj5uZXdBcnJheUxpc3QKKwkJLy8gZXh0cmFjdCBwdXJlIHNlbGVjdCB0YWJsZXMKKwkJZm9yIChlbGVtZW50IDogc3VwZXJTY29wZS5hbGxFbGVtZW50cykgeworCQkJaWYgKGVsZW1lbnQuRU9iamVjdE9yUHJveHkgaW5zdGFuY2VvZiBUYWJsZSkgeworCQkJCXZhciB0YWJsZSA9IGVsZW1lbnQuRU9iamVjdE9yUHJveHkgYXMgVGFibGUKKwkJCQl0YWJsZSA9IEVjb3JlVXRpbDMucmVzb2x2ZSh0YWJsZSwgc2VsZWN0aW9uVmlldy5lUmVzb3VyY2UucmVzb3VyY2VTZXQpIGFzIFRhYmxlCisJCQkJaWYgKHRhYmxlLnRhYmxldHlwZSBpbnN0YW5jZW9mIFRhYmxlU2VsZWN0aW9uKSB7CisJCQkJCXJlc3VsdC5hZGQoZWxlbWVudCkKKwkJCQl9CisJCQl9CisJCX0KKwkJc3VwZXJTY29wZSA9IE1hcEJhc2VkU2NvcGUuY3JlYXRlU2NvcGUoSVNjb3BlLk5VTExTQ09QRSwgcmVzdWx0KQorCQlyZXN1bHQgPSA8SUVPYmplY3REZXNjcmlwdGlvbj5uZXdBcnJheUxpc3QKKwkJLy8gY2hlY2sgZm9yIGJsaXAgcmVxdWlyZW1lbnRzCisJCXZhciBwZXJzcGVjdGl2ZSA9IHNlbGVjdGlvblZpZXcuZUNvbnRhaW5lcgorCQl3aGlsZSAoKHBlcnNwZWN0aXZlICE9IG51bGwpICYmICEocGVyc3BlY3RpdmUgaW5zdGFuY2VvZiBQZXJzcGVjdGl2ZSkpIHsKKwkJCXBlcnNwZWN0aXZlID0gcGVyc3BlY3RpdmUuZUNvbnRhaW5lcgorCQl9CisJCWlmICgocGVyc3BlY3RpdmUgYXMgUGVyc3BlY3RpdmUpPy51c2VyVGFzayA9PSBudWxsKSB7CisJCQlyZXR1cm4gc3VwZXJTY29wZQorCQl9IGVsc2UgeworCQkJLy8gRXZlbiBub3QgdXNpbmcgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIGxpbmUgaXQgaXMgbWFuZGF0b3J5IHRvIGluaXRpYWxpemUgbGF6eSBsb2FkaW5nIGZvciBicG1uCisJCQlFY29yZVV0aWwzLnJlc29sdmUoKHBlcnNwZWN0aXZlIGFzIFBlcnNwZWN0aXZlKT8ucHJvY2Vzcywgc2VsZWN0aW9uVmlldy5lUmVzb3VyY2UucmVzb3VyY2VTZXQpIGFzIEJsaXAKKwkJCXZhbCBodW1hblRhc2sgPSBFY29yZVV0aWwzLnJlc29sdmUoKHBlcnNwZWN0aXZlIGFzIFBlcnNwZWN0aXZlKT8udXNlclRhc2ssIHNlbGVjdGlvblZpZXcuZVJlc291cmNlLnJlc291cmNlU2V0KSBhcyBCbGlwVXNlclRhc2sKKwkJCXZhbCBvcGVyYXRpdmVEdG8gPSBodW1hblRhc2sub3BlcmF0aXZlTER0bworCQkJaWYgKG9wZXJhdGl2ZUR0bz8ubmFtZSA9PSBudWxsKSB7CisJCQkJcmV0dXJuIHN1cGVyU2NvcGUKKwkJCX0gZWxzZSB7CisJCQkJZm9yIChlbGVtZW50IDogc3VwZXJTY29wZS5hbGxFbGVtZW50cykgeworCQkJCQlpZiAoZWxlbWVudC5FT2JqZWN0T3JQcm94eSBpbnN0YW5jZW9mIFRhYmxlKSB7CisJCQkJCQl2YXIgdGFibGUgPSBlbGVtZW50LkVPYmplY3RPclByb3h5IGFzIFRhYmxlCisJCQkJCQl0YWJsZSA9IEVjb3JlVXRpbDMucmVzb2x2ZSh0YWJsZSwgc2VsZWN0aW9uVmlldy5lUmVzb3VyY2UucmVzb3VyY2VTZXQpIGFzIFRhYmxlCisJCQkJCQlpZiAodGFibGUudGFibGV0eXBlIGluc3RhbmNlb2YgVGFibGVTZWxlY3Rpb24pIHsKKwkJCQkJCQlyZXN1bHQuYWRkKGVsZW1lbnQpCisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gTWFwQmFzZWRTY29wZS5jcmVhdGVTY29wZShJU2NvcGUuTlVMTFNDT1BFLCByZXN1bHQpCisJCX0KKwl9CisKKwlkZWYgZ2V0U2NvcGVfQ0NQZXJzcGVjdGl2ZVBhcnRTdGFja19QRVJTUEVDVElWRV9HUklEX19SRUYoUGVyc3BlY3RpdmVHcmlkIGdyaWRWaWV3LCBFUmVmZXJlbmNlIHJlZmVyZW5jZSkgeworCQl2YWwgc3VwZXJTY29wZSA9IHN1cGVyLmdldFNjb3BlKGdyaWRWaWV3LCByZWZlcmVuY2UpCisJCXZhciByZXN1bHQgPSA8SUVPYmplY3REZXNjcmlwdGlvbj5uZXdBcnJheUxpc3QKKwkJZm9yIChlbGVtZW50IDogc3VwZXJTY29wZS5hbGxFbGVtZW50cykgeworCQkJaWYgKGVsZW1lbnQuRU9iamVjdE9yUHJveHkgaW5zdGFuY2VvZiBUYWJsZSkgeworCQkJCXZhciB0YWJsZSA9IGVsZW1lbnQuRU9iamVjdE9yUHJveHkgYXMgVGFibGUKKwkJCQl0YWJsZSA9IEVjb3JlVXRpbDMucmVzb2x2ZSh0YWJsZSwgZ3JpZFZpZXcuZVJlc291cmNlLnJlc291cmNlU2V0KSBhcyBUYWJsZQorCQkJCWlmICh0YWJsZS50YWJsZXR5cGUgaW5zdGFuY2VvZiBUYWJsZUdyaWQpIHsKKwkJCQkJcmVzdWx0LmFkZChlbGVtZW50KQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gTWFwQmFzZWRTY29wZS5jcmVhdGVTY29wZShJU2NvcGUuTlVMTFNDT1BFLCByZXN1bHQpCisJfQorCisJZGVmIGdldFNjb3BlX0NDUGVyc3BlY3RpdmVQYXJ0U3RhY2tfVVNFUl9UQVNLKFBlcnNwZWN0aXZlIHBlcnNwZWN0aXZlKSB7CisJCXZhciByZXN1bHQgPSA8SUVPYmplY3REZXNjcmlwdGlvbj5uZXdBcnJheUxpc3QKKwkJdmFyIGJsaXBQcm9jZXNzID0gcGVyc3BlY3RpdmUucHJvY2VzcworCQlpZiAoYmxpcFByb2Nlc3MgIT0gbnVsbCkgeworCQkJZm9yIChpdGVtIDogYmxpcFByb2Nlc3MuaXRlbXMpIHsKKwkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIEJsaXBVc2VyVGFzaykgeworCQkJCQlyZXN1bHQuYWRkKEVPYmplY3REZXNjcmlwdGlvbi5jcmVhdGUoaXRlbS5uYW1lLCBpdGVtKSkKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIE1hcEJhc2VkU2NvcGUuY3JlYXRlU2NvcGUoSVNjb3BlLk5VTExTQ09QRSwgcmVzdWx0KQorCX0KKworCWRlZiBnZXRTY29wZV9DQ1BlcnNwZWN0aXZlUGFydFN0YWNrX3NlbGVjdGVkX2VsZW1lbnQoRU9iamVjdCBvYmplY3QpIHsKKwkJdmFyIHJlc3VsdCA9IDxJRU9iamVjdERlc2NyaXB0aW9uPm5ld0FycmF5TGlzdAorCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgUGVyc3BlY3RpdmVQYXJ0U3RhY2spIHsKKwkJCXZhciBzdGFjayA9IG9iamVjdCBhcyBQZXJzcGVjdGl2ZVBhcnRTdGFjaworCQkJZm9yIChwYXJ0IDogc3RhY2suZWxlbWVudHMpIHsKKwkJCQlyZXN1bHQuYWRkKEVPYmplY3REZXNjcmlwdGlvbi5jcmVhdGUocGFydC5lbGVtZW50SWQsIHBhcnQpKQorCQkJfQorCQl9CisJCXJldHVybiBNYXBCYXNlZFNjb3BlLmNyZWF0ZVNjb3BlKElTY29wZS5OVUxMU0NPUEUsIHJlc3VsdCkKKwl9CisKKwlkZWYgZ2V0U2NvcGVfQ0NQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfc2VsZWN0ZWRfZWxlbWVudChFT2JqZWN0IG9iamVjdCkgeworCQl2YXIgcmVzdWx0ID0gPElFT2JqZWN0RGVzY3JpcHRpb24+bmV3QXJyYXlMaXN0CisJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIpIHsKKwkJCXZhciBzYXNoID0gb2JqZWN0IGFzIFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lcgorCQkJZm9yIChwYXJ0IDogc2FzaC5lbGVtZW50cykgeworCQkJCXJlc3VsdC5hZGQoRU9iamVjdERlc2NyaXB0aW9uLmNyZWF0ZShwYXJ0LmVsZW1lbnRJZCwgcGFydCkpCisJCQl9CisJCX0KKwkJcmV0dXJuIE1hcEJhc2VkU2NvcGUuY3JlYXRlU2NvcGUoSVNjb3BlLk5VTExTQ09QRSwgcmVzdWx0KQorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdmFsaWRhdGlvbi9QZXJzcGVjdGl2ZURzbFZhbGlkYXRvci54dGVuZCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdmFsaWRhdGlvbi9QZXJzcGVjdGl2ZURzbFZhbGlkYXRvci54dGVuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzBkMDI1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS92YWxpZGF0aW9uL1BlcnNwZWN0aXZlRHNsVmFsaWRhdG9yLnh0ZW5kCkBAIC0wLDAgKzEsNDcgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKiAKKyAqICBUaGlzIGNvcHlyaWdodCBub3RpY2Ugc2hvd3MgdXAgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAqCisgKi8KKyAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS52YWxpZGF0aW9uCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLkFjdGl2YXRvcgoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmUKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRHNsUGFja2FnZQoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnZhbGlkYXRpb24uQ2hlY2sKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlCisKKy8qKgorICogQ3VzdG9tIHZhbGlkYXRpb24gcnVsZXMuIAorICoKKyAqIHNlZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL1h0ZXh0L2RvY3VtZW50YXRpb24uaHRtbCN2YWxpZGF0aW9uCisgKi8KK2NsYXNzIFBlcnNwZWN0aXZlRHNsVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RQZXJzcGVjdGl2ZURzbFZhbGlkYXRvciB7CisKKwlAQ2hlY2sKKwlkZWYgY2hlY2tCUE1saWNlbnNlZChQZXJzcGVjdGl2ZSBwZXJzKSB7CisJCWlmICgocGVycy5wcm9jZXNzICE9IG51bGwpKSB7CisJCQlmb3IgKEJ1bmRsZSBiIDogQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRCdW5kbGVzKCkpIHsKKwkJCQlpZiAoYi5nZXRTeW1ib2xpY05hbWUoKS5lcXVhbHMoIm5ldC5vc2JlZS5icG0iKSkgeworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQkJaW5mbygKKwkJCQknJydCUE0gaXMgbmVlZGVkIGFuZCBub3QgeWV0IGxpY2Vuc2VkLiBMaWNlbnNlIEJQTSBhdCB3d3cub3NiZWUubmV0JycnLAorCQkJCXBlcnMsIAorCQkJCVBlcnNwZWN0aXZlRHNsUGFja2FnZS5MaXRlcmFscy5QRVJTUEVDVElWRV9fUFJPQ0VTUykKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdmFsdWVjb252ZXJ0ZXIvUGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdmFsdWVjb252ZXJ0ZXIvUGVyc3BlY3RpdmVRdWFsaWZpZWROYW1lUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzQ2YWU0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS92YWx1ZWNvbnZlcnRlci9QZXJzcGVjdGl2ZVF1YWxpZmllZE5hbWVQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KKyBwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudmFsdWVjb252ZXJ0ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQubmFtaW5nLklRdWFsaWZpZWROYW1lQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lm5hbWluZy5RdWFsaWZpZWROYW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lm5vZGVtb2RlbC5JTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5ub2RlbW9kZWwudXRpbC5Ob2RlTW9kZWxVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5zY29waW5nLlhiYXNlUXVhbGlmaWVkTmFtZVByb3ZpZGVyOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlUGFydFN0YWNrOworCitAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQorcHVibGljIGNsYXNzIFBlcnNwZWN0aXZlUXVhbGlmaWVkTmFtZVByb3ZpZGVyIGV4dGVuZHMgWGJhc2VRdWFsaWZpZWROYW1lUHJvdmlkZXIgeworCisJQEluamVjdAorCXByaXZhdGUgSVF1YWxpZmllZE5hbWVDb252ZXJ0ZXIgcXVhbGlmaWVkTmFtZUNvbnZlcnRlcjsKKworCUBPdmVycmlkZQorCXB1YmxpYyBRdWFsaWZpZWROYW1lIGdldEZ1bGx5UXVhbGlmaWVkTmFtZShFT2JqZWN0IG9iaikgeworCQlpZiAob2JqID09IG51bGwpIHsKKwkJCXJldHVybiBRdWFsaWZpZWROYW1lLmNyZWF0ZSgiIik7CisJCX0KKwkJaWYgKG9iaiBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlKSB7CisJCQlQZXJzcGVjdGl2ZSBwZXJzcGVjdGl2ZSA9IChQZXJzcGVjdGl2ZSkgb2JqOworICAgICAgICAgICAgaWYgKHBlcnNwZWN0aXZlLmdldE5hbWUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAJcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcXVhbGlmaWVkTmFtZUNvbnZlcnRlci50b1F1YWxpZmllZE5hbWUocGVyc3BlY3RpdmUuZ2V0TmFtZSgpKTsKKwkJfQorCQlpZiAob2JqIGluc3RhbmNlb2YgUGVyc3BlY3RpdmVQYXJ0U3RhY2spIHsKKwkJCVBlcnNwZWN0aXZlUGFydFN0YWNrIHN0YWNrID0gKFBlcnNwZWN0aXZlUGFydFN0YWNrKSBvYmo7CisgICAgICAgICAgICBpZiAoc3RhY2suZ2V0RWxlbWVudElkKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgCXJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHF1YWxpZmllZE5hbWVDb252ZXJ0ZXIudG9RdWFsaWZpZWROYW1lKHN0YWNrLmdldEVsZW1lbnRJZCgpKTsKKwkJfQorCQlpZiAob2JqIGluc3RhbmNlb2YgUGVyc3BlY3RpdmVQYXJ0KSB7CisJCQlQZXJzcGVjdGl2ZVBhcnQgcGFydCA9IChQZXJzcGVjdGl2ZVBhcnQpIG9iajsKKyAgICAgICAgICAgIGlmIChwYXJ0LmdldEVsZW1lbnRJZCgpID09IG51bGwpIHsKKyAgICAgICAgICAgIAlyZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBxdWFsaWZpZWROYW1lQ29udmVydGVyLnRvUXVhbGlmaWVkTmFtZShwYXJ0LmdldEVsZW1lbnRJZCgpKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKG9iaik7CisJfQorCisJLy8gdGhpcyBtZXRob2QgZXZhbHVhdGVzIHRoZSBjcm9zcyByZWZlcmVuY2VkIG5hbWUgb2YgYW4gb2JqZWN0IHdpdGhvdXQgY2F1c2luZyBjeWNsaWMgbGF6eSBsaW5raW5nIGVycm9ycworCXByaXZhdGUgU3RyaW5nIGdldENyb3NzUmVmZXJlbmNlTmFtZShFT2JqZWN0IG9iaiwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKKwkJTGlzdDxJTm9kZT4gbm9kZXMgPSBOb2RlTW9kZWxVdGlscy5maW5kTm9kZXNGb3JGZWF0dXJlKG9iaiwgZmVhdHVyZSk7CisJCWlmIChub2Rlcy5zaXplKCkgPT0gMCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIE5vZGVNb2RlbFV0aWxzLmdldFRva2VuVGV4dChub2Rlcy5nZXQoMCkpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldFBhY2thZ2VOYW1lKEVPYmplY3Qgb2JqKSB7CisJCUVPYmplY3QgbyA9IG9iai5lQ29udGFpbmVyKCk7CisJCXdoaWxlKCEobyBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlUGFja2FnZSkpIHsKKwkJCW8gPSBvLmVDb250YWluZXIoKTsKKwkJfQorCQlyZXR1cm4gKChQZXJzcGVjdGl2ZVBhY2thZ2UpbykuZ2V0TmFtZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdmFsdWVjb252ZXJ0ZXIvUGVyc3BlY3RpdmVWYWx1ZUNvbnZlcnRlclNlcnZpY2UuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvdmFsdWVjb252ZXJ0ZXIvUGVyc3BlY3RpdmVWYWx1ZUNvbnZlcnRlclNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDMwYjQyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS92YWx1ZWNvbnZlcnRlci9QZXJzcGVjdGl2ZVZhbHVlQ29udmVydGVyU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqIAkJQ2hyaXN0b3BoZSBMb2V0eiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqICAgICAgSsO2cmcgUmllZ2VsIC0gZnVuY3Rpb25hbCBlbmhhbmNlbWVudHMKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLnZhbHVlY29udmVydGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5iYXNpYy52YWx1ZWNvbnZlcnRlci5UUkFOU0xBVEFCTEVTVFJJTkdWYWx1ZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb252ZXJzaW9uLklWYWx1ZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb252ZXJzaW9uLlZhbHVlQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmNvbnZlcnNpb24uWGJhc2VWYWx1ZUNvbnZlcnRlclNlcnZpY2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOworCisvKioKKyAqIEFkZHMgYSB2YWx1ZSBjb252ZXJzaW9uIGZvciB0aGUgUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCBydWxlLgorICogCisgKiBAYXV0aG9yIEpvZXJnIFJpZWdlbAorICovCitAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQorQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIFBlcnNwZWN0aXZlVmFsdWVDb252ZXJ0ZXJTZXJ2aWNlIGV4dGVuZHMKKwkJWGJhc2VWYWx1ZUNvbnZlcnRlclNlcnZpY2UgeworCisJQEluamVjdAorCXByaXZhdGUgVFJBTlNMQVRBQkxFU1RSSU5HVmFsdWVDb252ZXJ0ZXIgY29udmVydGVyOworCisJQFZhbHVlQ29udmVydGVyKHJ1bGUgPSAiUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCIpCisJcHVibGljIElWYWx1ZUNvbnZlcnRlcjxTdHJpbmc+IGdldFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQoKSB7CisJCXJldHVybiBnZXRRdWFsaWZpZWROYW1lVmFsdWVDb252ZXJ0ZXIoKTsKKwl9CisKKwlAVmFsdWVDb252ZXJ0ZXIocnVsZSA9ICJUUkFOU0xBVEFCTEVTVFJJTkciKQorCXB1YmxpYyBJVmFsdWVDb252ZXJ0ZXI8U3RyaW5nPiBnZXRUcmFuc2xhdGFibGVTdHJpbmdWYWx1ZUNvbnZlcnRlcigpIHsKKwkJcmV0dXJuIGNvbnZlcnRlcjsKKwl9CisJCisJLy8gdGhpcyBjb2RlIGlzIG9ubHkgYSDCocKhwqHCoURJUlRZIEhBQ0shISEhIHRvIGNyZWF0ZSBhIHF1b3RhdGlvbiBhcm91bmQgdGhlIHByb3Bvc2FsCisJLy8gdGV4dCBhbmQgdG8gYXZvaWQgdGhlIGNyZWF0aW9uIG9mIG11bHRpcGxpY2F0aW9uIG9mIHF1b3RhdGlvbnMKKy8vCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoT2JqZWN0IHZhbHVlLCBTdHJpbmcgbGV4ZXJSdWxlKSB7CisvLwkJSVZhbHVlQ29udmVydGVyPE9iamVjdD4gY29udmVydGVyID0gZ2V0Q29udmVydGVyKGxleGVyUnVsZSk7CisvLwkJU3RyaW5nIGNvbnZlcnRlZFZhbHVlID0gY29udmVydGVyLnRvU3RyaW5nKHZhbHVlKTsKKy8vCQlpZiAoSTE4blV0aWwuVFJBTlNMQVRBQkxFU1RSSU5HLmVxdWFscyhsZXhlclJ1bGUpKSB7CisvLwkJCWlmIChjb252ZXJ0ZWRWYWx1ZS5zdGFydHNXaXRoKCJcIiIpKSB7CisvLwkJCQlyZXR1cm4gY29udmVydGVkVmFsdWU7CisvLwkJCX0gZWxzZSB7CisvLwkJCQlyZXR1cm4gJyInICsgY29udmVydGVkVmFsdWUgKyAnIic7CisvLwkJCX0KKy8vCQl9CisvLwkJcmV0dXJuIGNvbnZlcnRlZFZhbHVlOworLy8JfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2Rlcml2ZWRzdGF0ZS9QZXJzcGVjdGl2ZU1vZGVsRGVyaXZlZFN0YXRlQ29tcHV0ZXJ4LmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2Rlcml2ZWRzdGF0ZS9QZXJzcGVjdGl2ZU1vZGVsRGVyaXZlZFN0YXRlQ29tcHV0ZXJ4LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI2Y2NmMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvZGVyaXZlZHN0YXRlL1BlcnNwZWN0aXZlTW9kZWxEZXJpdmVkU3RhdGVDb21wdXRlcnguamF2YQpAQCAtMCwwICsxLDE0OCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogIENvbnRyaWJ1dG9yczoKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICogCisgKiAgVGhpcyBjb3B5cmlnaHQgbm90aWNlIHNob3dzIHVwIGluIHRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5kZXJpdmVkc3RhdGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVBhcnRTdGFjazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlU2FzaENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5EZXJpdmVkU3RhdGVBd2FyZVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmp2bW1vZGVsLkp2bU1vZGVsQXNzb2NpYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuRXhjZXB0aW9uczsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBQZXJzcGVjdGl2ZU1vZGVsRGVyaXZlZFN0YXRlQ29tcHV0ZXJ4IGV4dGVuZHMgSnZtTW9kZWxBc3NvY2lhdG9yIHsKKyAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFBlcnNwZWN0aXZlTW9kZWxEZXJpdmVkU3RhdGVDb21wdXRlcnguY2xhc3MpOworICAKKyAgcHJpdmF0ZSBEZXJpdmVkU3RhdGVBd2FyZVJlc291cmNlIHJlc291cmNlOworICAKKyAgcHVibGljIHZvaWQgaW5zdGFsbERlcml2ZWRTdGF0ZShmaW5hbCBEZXJpdmVkU3RhdGVBd2FyZVJlc291cmNlIHJlc291cmNlLCBmaW5hbCBib29sZWFuIHByZUxpbmtpbmdQaGFzZSkgeworICAgIFBlcnNwZWN0aXZlTW9kZWxEZXJpdmVkU3RhdGVDb21wdXRlcngubG9nLmRlYnVnKCJQZXJzcGVjdGl2ZU1vZGVsRGVyaXZlZFN0YXRlQ29tcHV0ZXJ4IGNhbGxlZCIpOworICAgIHN1cGVyLmluc3RhbGxEZXJpdmVkU3RhdGUocmVzb3VyY2UsIHByZUxpbmtpbmdQaGFzZSk7CisgICAgdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOworICAgIEVMaXN0PEVPYmplY3Q+IF9jb250ZW50cyA9IHJlc291cmNlLmdldENvbnRlbnRzKCk7CisgICAgYm9vbGVhbiBfaXNFbXB0eSA9IF9jb250ZW50cy5pc0VtcHR5KCk7CisgICAgaWYgKF9pc0VtcHR5KSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICgoIXByZUxpbmtpbmdQaGFzZSkpIHsKKyAgICAgIEVMaXN0PEVPYmplY3Q+IF9jb250ZW50c18xID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKTsKKyAgICAgIEVPYmplY3QgX2dldCA9IF9jb250ZW50c18xLmdldCgwKTsKKyAgICAgIGZpbmFsIFBlcnNwZWN0aXZlTW9kZWwgZU9iamVjdCA9ICgoUGVyc3BlY3RpdmVNb2RlbCkgX2dldCk7CisgICAgICB0cnkgeworICAgICAgICBFTGlzdDxFT2JqZWN0PiBfZUNvbnRlbnRzID0gZU9iamVjdC5lQ29udGVudHMoKTsKKyAgICAgICAgZmluYWwgQ29uc3VtZXI8RU9iamVjdD4gX2Z1bmN0aW9uID0gbmV3IENvbnN1bWVyPEVPYmplY3Q+KCkgeworICAgICAgICAgIHB1YmxpYyB2b2lkIGFjY2VwdChmaW5hbCBFT2JqZWN0IGl0KSB7CisgICAgICAgICAgICBQZXJzcGVjdGl2ZU1vZGVsRGVyaXZlZFN0YXRlQ29tcHV0ZXJ4LnRoaXMubWFwKGl0KTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIF9lQ29udGVudHMuZm9yRWFjaChfZnVuY3Rpb24pOworICAgICAgfSBjYXRjaCAoZmluYWwgVGhyb3dhYmxlIF90KSB7CisgICAgICAgIGlmIChfdCBpbnN0YW5jZW9mIEV4Y2VwdGlvbikgeworICAgICAgICAgIGZpbmFsIEV4Y2VwdGlvbiBleCA9IChFeGNlcHRpb24pX3Q7CisgICAgICAgICAgUGVyc3BlY3RpdmVNb2RlbERlcml2ZWRTdGF0ZUNvbXB1dGVyeC5sb2cuZXJyb3IoInt9IiwgZXgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuc25lYWt5VGhyb3coX3QpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIAorICBwcm90ZWN0ZWQgdm9pZCBfbWFwKGZpbmFsIFBlcnNwZWN0aXZlUGFja2FnZSBvYmplY3QpIHsKKyAgICBQZXJzcGVjdGl2ZU1vZGVsRGVyaXZlZFN0YXRlQ29tcHV0ZXJ4LmxvZy5kZWJ1ZygiQ0NQZXJzcGVjdGl2ZVBhY2thZ2UiKTsKKyAgICBFTGlzdDxQZXJzcGVjdGl2ZT4gX3BlcnNwZWN0aXZlcyA9IG9iamVjdC5nZXRQZXJzcGVjdGl2ZXMoKTsKKyAgICBmaW5hbCBDb25zdW1lcjxQZXJzcGVjdGl2ZT4gX2Z1bmN0aW9uID0gbmV3IENvbnN1bWVyPFBlcnNwZWN0aXZlPigpIHsKKyAgICAgIHB1YmxpYyB2b2lkIGFjY2VwdChmaW5hbCBQZXJzcGVjdGl2ZSBpdCkgeworICAgICAgICBQZXJzcGVjdGl2ZU1vZGVsRGVyaXZlZFN0YXRlQ29tcHV0ZXJ4LnRoaXMubWFwKGl0KTsKKyAgICAgIH0KKyAgICB9OworICAgIF9wZXJzcGVjdGl2ZXMuZm9yRWFjaChfZnVuY3Rpb24pOworICB9CisgIAorICBwcm90ZWN0ZWQgdm9pZCBfbWFwKGZpbmFsIFBlcnNwZWN0aXZlIG9iamVjdCkgeworICAgIFBlcnNwZWN0aXZlTW9kZWxEZXJpdmVkU3RhdGVDb21wdXRlcngubG9nLmRlYnVnKCJDQ1BlcnNwZWN0aXZlIik7CisgICAgRUxpc3Q8UGVyc3BlY3RpdmVFbGVtZW50PiBfZWxlbWVudHMgPSBvYmplY3QuZ2V0RWxlbWVudHMoKTsKKyAgICBmaW5hbCBDb25zdW1lcjxQZXJzcGVjdGl2ZUVsZW1lbnQ+IF9mdW5jdGlvbiA9IG5ldyBDb25zdW1lcjxQZXJzcGVjdGl2ZUVsZW1lbnQ+KCkgeworICAgICAgcHVibGljIHZvaWQgYWNjZXB0KGZpbmFsIFBlcnNwZWN0aXZlRWxlbWVudCBpdCkgeworICAgICAgICBQZXJzcGVjdGl2ZU1vZGVsRGVyaXZlZFN0YXRlQ29tcHV0ZXJ4LnRoaXMubWFwKGl0KTsKKyAgICAgIH0KKyAgICB9OworICAgIF9lbGVtZW50cy5mb3JFYWNoKF9mdW5jdGlvbik7CisgIH0KKyAgCisgIHByb3RlY3RlZCB2b2lkIF9tYXAoZmluYWwgUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyIG9iamVjdCkgeworICAgIFBlcnNwZWN0aXZlTW9kZWxEZXJpdmVkU3RhdGVDb21wdXRlcngubG9nLmRlYnVnKCJDQ1BlcnNwZWN0aXZlU2FzaENvbnRhaW5lciIpOworICAgIEVMaXN0PFBlcnNwZWN0aXZlRWxlbWVudD4gX2VsZW1lbnRzID0gb2JqZWN0LmdldEVsZW1lbnRzKCk7CisgICAgZmluYWwgQ29uc3VtZXI8UGVyc3BlY3RpdmVFbGVtZW50PiBfZnVuY3Rpb24gPSBuZXcgQ29uc3VtZXI8UGVyc3BlY3RpdmVFbGVtZW50PigpIHsKKyAgICAgIHB1YmxpYyB2b2lkIGFjY2VwdChmaW5hbCBQZXJzcGVjdGl2ZUVsZW1lbnQgaXQpIHsKKyAgICAgICAgUGVyc3BlY3RpdmVNb2RlbERlcml2ZWRTdGF0ZUNvbXB1dGVyeC50aGlzLm1hcChpdCk7CisgICAgICB9CisgICAgfTsKKyAgICBfZWxlbWVudHMuZm9yRWFjaChfZnVuY3Rpb24pOworICB9CisgIAorICBwcm90ZWN0ZWQgdm9pZCBfbWFwKGZpbmFsIFBlcnNwZWN0aXZlUGFydFN0YWNrIG9iamVjdCkgeworICAgIFBlcnNwZWN0aXZlTW9kZWxEZXJpdmVkU3RhdGVDb21wdXRlcngubG9nLmRlYnVnKCJDQ1BlcnNwZWN0aXZlUGFydFN0YWNrIik7CisgICAgRUxpc3Q8UGVyc3BlY3RpdmVFbGVtZW50PiBfZWxlbWVudHMgPSBvYmplY3QuZ2V0RWxlbWVudHMoKTsKKyAgICBmaW5hbCBDb25zdW1lcjxQZXJzcGVjdGl2ZUVsZW1lbnQ+IF9mdW5jdGlvbiA9IG5ldyBDb25zdW1lcjxQZXJzcGVjdGl2ZUVsZW1lbnQ+KCkgeworICAgICAgcHVibGljIHZvaWQgYWNjZXB0KGZpbmFsIFBlcnNwZWN0aXZlRWxlbWVudCBpdCkgeworICAgICAgICBQZXJzcGVjdGl2ZU1vZGVsRGVyaXZlZFN0YXRlQ29tcHV0ZXJ4LnRoaXMubWFwKGl0KTsKKyAgICAgIH0KKyAgICB9OworICAgIF9lbGVtZW50cy5mb3JFYWNoKF9mdW5jdGlvbik7CisgIH0KKyAgCisgIHByb3RlY3RlZCB2b2lkIF9tYXAoZmluYWwgUGVyc3BlY3RpdmVQYXJ0IG9iamVjdCkgeworICAgIFBlcnNwZWN0aXZlTW9kZWxEZXJpdmVkU3RhdGVDb21wdXRlcngubG9nLmRlYnVnKCJDQ1BlcnNwZWN0aXZlUGFydCIpOworICB9CisgIAorICBwcm90ZWN0ZWQgdm9pZCBfbWFwKGZpbmFsIFZvaWQgb2JqZWN0KSB7CisgICAgUGVyc3BlY3RpdmVNb2RlbERlcml2ZWRTdGF0ZUNvbXB1dGVyeC5sb2cuZGVidWcoInZvaWQiKTsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgbWFwKGZpbmFsIEVPYmplY3Qgb2JqZWN0KSB7CisgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlKSB7CisgICAgICBfbWFwKChQZXJzcGVjdGl2ZSlvYmplY3QpOworICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgUGVyc3BlY3RpdmVQYWNrYWdlKSB7CisgICAgICBfbWFwKChQZXJzcGVjdGl2ZVBhY2thZ2Upb2JqZWN0KTsKKyAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlUGFydCkgeworICAgICAgX21hcCgoUGVyc3BlY3RpdmVQYXJ0KW9iamVjdCk7CisgICAgICByZXR1cm47CisgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBQZXJzcGVjdGl2ZVBhcnRTdGFjaykgeworICAgICAgX21hcCgoUGVyc3BlY3RpdmVQYXJ0U3RhY2spb2JqZWN0KTsKKyAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlU2FzaENvbnRhaW5lcikgeworICAgICAgX21hcCgoUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyKW9iamVjdCk7CisgICAgICByZXR1cm47CisgICAgfSBlbHNlIGlmIChvYmplY3QgPT0gbnVsbCkgeworICAgICAgX21hcCgoVm9pZCludWxsKTsKKyAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5oYW5kbGVkIHBhcmFtZXRlciB0eXBlczogIiArCisgICAgICAgIEFycmF5cy48T2JqZWN0PmFzTGlzdChvYmplY3QpLnRvU3RyaW5nKCkpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9mb3JtYXR0aW5nL1BlcnNwZWN0aXZlRHNsRm9ybWF0dGVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2Zvcm1hdHRpbmcvUGVyc3BlY3RpdmVEc2xGb3JtYXR0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWZmNjAyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS9mb3JtYXR0aW5nL1BlcnNwZWN0aXZlRHNsRm9ybWF0dGVyLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogIENvbnRyaWJ1dG9yczoKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICogCisgKiAgVGhpcyBjb3B5cmlnaHQgbm90aWNlIHNob3dzIHVwIGluIHRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5mb3JtYXR0aW5nOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAudXRpbHMueHRleHQuR2VuZXJpY0Zvcm1hdHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5HcmFtbWFyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmZvcm1hdHRpbmcuaW1wbC5BYnN0cmFjdERlY2xhcmF0aXZlRm9ybWF0dGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmZvcm1hdHRpbmcuaW1wbC5Gb3JtYXR0aW5nQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnNlcnZpY2VzLlh0eXBlR3JhbW1hckFjY2VzczsKKworLyoqCisgKiBUaGlzIGNsYXNzIGNvbnRhaW5zIGN1c3RvbSBmb3JtYXR0aW5nIGRlc2NyaXB0aW9uLgorICogCisgKiBzZWUgOiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL1h0ZXh0L2RvY3VtZW50YXRpb24uaHRtbCNmb3JtYXR0aW5nCisgKiBvbiBob3cgYW5kIHdoZW4gdG8gdXNlIGl0CisgKiAKKyAqIEFsc28gc2VlIHtAbGluayBvcmcuZWNsaXBzZS54dGV4dC54dGV4dC5YdGV4dEZvcm1hdHRpbmdUb2tlblNlcmlhbGl6ZXJ9IGFzIGFuIGV4YW1wbGUKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgUGVyc3BlY3RpdmVEc2xGb3JtYXR0ZXIgZXh0ZW5kcyBBYnN0cmFjdERlY2xhcmF0aXZlRm9ybWF0dGVyIHsKKyAgQEluamVjdAorICBwcml2YXRlIFh0eXBlR3JhbW1hckFjY2VzcyBncmFtbWFyQWNjZXNzOworICAKKyAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlRm9ybWF0dGluZyhmaW5hbCBGb3JtYXR0aW5nQ29uZmlnIGMpIHsKKyAgICBmaW5hbCBHZW5lcmljRm9ybWF0dGVyIGdlbmVyaWNGb3JtYXR0ZXIgPSBuZXcgR2VuZXJpY0Zvcm1hdHRlcigpOworICAgIEdyYW1tYXIgX2dyYW1tYXIgPSB0aGlzLmdyYW1tYXIuZ2V0R3JhbW1hcigpOworICAgIGdlbmVyaWNGb3JtYXR0ZXIuZm9ybWF0Rmlyc3RMZXZlbEJsb2NrcyhjLCBfZ3JhbW1hciwgIlBlcnNwZWN0aXZlIiwgIlBlcnNwZWN0aXZlSW1wb3J0Iik7CisgICAgZ2VuZXJpY0Zvcm1hdHRlci5nZW5lcmljRm9ybWF0dGluZyhjLCB0aGlzLmdyYW1tYXIsIHRoaXMuZ3JhbW1hckFjY2Vzcyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvanZtbW9kZWwvUGVyc3BlY3RpdmVEc2xKdm1Nb2RlbEluZmVycmVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2p2bW1vZGVsL1BlcnNwZWN0aXZlRHNsSnZtTW9kZWxJbmZlcnJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNjk4ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2p2bW1vZGVsL1BlcnNwZWN0aXZlRHNsSnZtTW9kZWxJbmZlcnJlci5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqICBDb250cmlidXRvcnM6CisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqIAorICogIFRoaXMgY29weXJpZ2h0IG5vdGljZSBzaG93cyB1cCBpbiB0aGUgZ2VuZXJhdGVkIEphdmEgY29kZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuanZtbW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmp2bW1vZGVsLkFic3RyYWN0TW9kZWxJbmZlcnJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5qdm1tb2RlbC5JSnZtRGVjbGFyZWRUeXBlQWNjZXB0b3I7CisKKy8qKgorICogPHA+SW5mZXJzIGEgSlZNIG1vZGVsIGZyb20gdGhlIHNvdXJjZSBtb2RlbC48L3A+CisgKiAKKyAqIDxwPlRoZSBKVk0gbW9kZWwgc2hvdWxkIGNvbnRhaW4gYWxsIGVsZW1lbnRzIHRoYXQgd291bGQgYXBwZWFyIGluIHRoZSBKYXZhIGNvZGUKKyAqIHdoaWNoIGlzIGdlbmVyYXRlZCBmcm9tIHRoZSBzb3VyY2UgbW9kZWwuIE90aGVyIG1vZGVscyBsaW5rIGFnYWluc3QgdGhlIEpWTSBtb2RlbCByYXRoZXIgdGhhbiB0aGUgc291cmNlIG1vZGVsLjwvcD4KKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgUGVyc3BlY3RpdmVEc2xKdm1Nb2RlbEluZmVycmVyIGV4dGVuZHMgQWJzdHJhY3RNb2RlbEluZmVycmVyIHsKKyAgcHJvdGVjdGVkIHZvaWQgX2luZmVyKGZpbmFsIFBlcnNwZWN0aXZlUGFja2FnZSBwa2csIGZpbmFsIElKdm1EZWNsYXJlZFR5cGVBY2NlcHRvciBhY2NlcHRvciwgZmluYWwgYm9vbGVhbiBpc1ByZUluZGV4aW5nUGhhc2UpIHsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgaW5mZXIoZmluYWwgRU9iamVjdCBwa2csIGZpbmFsIElKdm1EZWNsYXJlZFR5cGVBY2NlcHRvciBhY2NlcHRvciwgZmluYWwgYm9vbGVhbiBpc1ByZUluZGV4aW5nUGhhc2UpIHsKKyAgICBpZiAocGtnIGluc3RhbmNlb2YgUGVyc3BlY3RpdmVQYWNrYWdlKSB7CisgICAgICBfaW5mZXIoKFBlcnNwZWN0aXZlUGFja2FnZSlwa2csIGFjY2VwdG9yLCBpc1ByZUluZGV4aW5nUGhhc2UpOworICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAocGtnICE9IG51bGwpIHsKKyAgICAgIF9pbmZlcihwa2csIGFjY2VwdG9yLCBpc1ByZUluZGV4aW5nUGhhc2UpOworICAgICAgcmV0dXJuOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmhhbmRsZWQgcGFyYW1ldGVyIHR5cGVzOiAiICsKKyAgICAgICAgQXJyYXlzLjxPYmplY3Q+YXNMaXN0KHBrZywgYWNjZXB0b3IsIGlzUHJlSW5kZXhpbmdQaGFzZSkudG9TdHJpbmcoKSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2p2bW1vZGVsL1BlcnNwZWN0aXZlTW9kZWxHZW5lcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvanZtbW9kZWwvUGVyc3BlY3RpdmVNb2RlbEdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMDhjYTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL2p2bW1vZGVsL1BlcnNwZWN0aXZlTW9kZWxHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiAgQ29udHJpYnV0b3JzOgorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKiAKKyAqICBUaGlzIGNvcHlyaWdodCBub3RpY2Ugc2hvd3MgdXAgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmp2bW1vZGVsOworCitpbXBvcnQgY29tLnZhYWRpbi51aS5VSTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmRhdGFiaW5kaW5nLkRhdGFCaW5kaW5nQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmRhdGFiaW5kaW5nLlVwZGF0ZVZhbHVlU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5kYXRhYmluZGluZy5iZWFucy5CZWFuc09ic2VydmFibGVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuZXh0ZW5zaW9ucy5FdmVudFV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuc2VydmljZXMuZXZlbnRzLklFdmVudEJyb2tlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5ldmVudGJyb2tlci5FdmVudEJyb2tlck1zZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnJ1bnRpbWUuY29tbW9uLmkxOG4uSVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5ydW50aW1lLndlYi52YWFkaW4uZGF0YWJpbmRpbmcuVmFhZGluT2JzZXJ2YWJsZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5iYXNpYy5nZW5lcmF0b3IuQmFzaWNEc2xHZW5lcmF0b3JVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmkxOG4uSTE4Tk1vZGVsR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy5Kdm1UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy5Kdm1UeXBlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5JRmlsZVN5c3RlbUFjY2VzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5jb21waWxlci5HZW5lcmF0b3JDb25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuY29tcGlsZXIuSW1wb3J0TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5jb21waWxlci5vdXRwdXQuVHJlZUFwcGVuZGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkV4dGVuc2lvbjsKK2ltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmV2ZW50LkV2ZW50SGFuZGxlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBQZXJzcGVjdGl2ZU1vZGVsR2VuZXJhdG9yIGV4dGVuZHMgSTE4Tk1vZGVsR2VuZXJhdG9yIHsKKyAgQEluamVjdAorICBARXh0ZW5zaW9uCisgIHByaXZhdGUgQmFzaWNEc2xHZW5lcmF0b3JVdGlscyBfYmFzaWNEc2xHZW5lcmF0b3JVdGlsczsKKyAgCisgIHB1YmxpYyBUcmVlQXBwZW5kYWJsZSBjcmVhdGVBcHBlbmRhYmxlKGZpbmFsIEVPYmplY3QgY29udGV4dCwgZmluYWwgSW1wb3J0TWFuYWdlciBpbXBvcnRNYW5hZ2VyLCBmaW5hbCBHZW5lcmF0b3JDb25maWcgY29uZmlnKSB7CisgICAgVHJlZUFwcGVuZGFibGUgX3hibG9ja2V4cHJlc3Npb24gPSBudWxsOworICAgIHsKKyAgICAgIFJlc291cmNlIF9lUmVzb3VyY2UgPSBjb250ZXh0LmVSZXNvdXJjZSgpOworICAgICAgdGhpcy5zZXRCdWlsZGVyKF9lUmVzb3VyY2UpOworICAgICAgSnZtVHlwZVJlZmVyZW5jZSBfdHlwZVJlZiA9IHRoaXMuX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoU3RyaW5nLmNsYXNzKTsKKyAgICAgIEp2bVR5cGVSZWZlcmVuY2UgX3R5cGVSZWZfMSA9IHRoaXMuX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoU3RyaW5nLmNsYXNzKTsKKyAgICAgIEp2bVR5cGVSZWZlcmVuY2UgX3R5cGVSZWZfMiA9IHRoaXMuX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoSGFzaE1hcC5jbGFzcywgX3R5cGVSZWYsIF90eXBlUmVmXzEpOworICAgICAgSnZtVHlwZSBfdHlwZSA9IF90eXBlUmVmXzIuZ2V0VHlwZSgpOworICAgICAgaW1wb3J0TWFuYWdlci5hZGRJbXBvcnRGb3IoX3R5cGUpOworICAgICAgSnZtVHlwZVJlZmVyZW5jZSBfdHlwZVJlZl8zID0gdGhpcy5fdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihTdHJpbmcuY2xhc3MpOworICAgICAgSnZtVHlwZVJlZmVyZW5jZSBfdHlwZVJlZl80ID0gdGhpcy5fdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihTdHJpbmcuY2xhc3MpOworICAgICAgSnZtVHlwZVJlZmVyZW5jZSBfdHlwZVJlZl81ID0gdGhpcy5fdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihNYXAuY2xhc3MsIF90eXBlUmVmXzMsIF90eXBlUmVmXzQpOworICAgICAgSnZtVHlwZSBfdHlwZV8xID0gX3R5cGVSZWZfNS5nZXRUeXBlKCk7CisgICAgICBpbXBvcnRNYW5hZ2VyLmFkZEltcG9ydEZvcihfdHlwZV8xKTsKKyAgICAgIEp2bVR5cGVSZWZlcmVuY2UgX3R5cGVSZWZfNiA9IHRoaXMuX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoU3RyaW5nLmNsYXNzKTsKKyAgICAgIEp2bVR5cGVSZWZlcmVuY2UgX3R5cGVSZWZfNyA9IHRoaXMuX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoQ29sbGVjdGlvbi5jbGFzcywgX3R5cGVSZWZfNik7CisgICAgICBKdm1UeXBlIF90eXBlXzIgPSBfdHlwZVJlZl83LmdldFR5cGUoKTsKKyAgICAgIGltcG9ydE1hbmFnZXIuYWRkSW1wb3J0Rm9yKF90eXBlXzIpOworICAgICAgdGhpcy5fYmFzaWNEc2xHZW5lcmF0b3JVdGlscy5hZGRJbXBvcnRGb3IodGhpcywgaW1wb3J0TWFuYWdlciwgdGhpcy5fdHlwZVJlZmVyZW5jZUJ1aWxkZXIsIEFycmF5TGlzdC5jbGFzcywgSUV2ZW50QnJva2VyLmNsYXNzLCBFdmVudFV0aWxzLmNsYXNzLCBFdmVudEJyb2tlck1zZy5jbGFzcywgRXZlbnRIYW5kbGVyLmNsYXNzLCBMb2dnZXIuY2xhc3MsIExvZ2dlckZhY3RvcnkuY2xhc3MsIFVJLmNsYXNzLCBWYWFkaW5PYnNlcnZhYmxlcy5jbGFzcywgRGF0YUJpbmRpbmdDb250ZXh0LmNsYXNzLCBCZWFuc09ic2VydmFibGVzLmNsYXNzLCBSZXNvdXJjZUJ1bmRsZS5jbGFzcywgTG9jYWxlLmNsYXNzLCBVcGRhdGVWYWx1ZVN0cmF0ZWd5LmNsYXNzLCBJVHJhbnNsYXRvci5jbGFzcyk7CisgICAgICBfeGJsb2NrZXhwcmVzc2lvbiA9IHN1cGVyLmNyZWF0ZUFwcGVuZGFibGUoY29udGV4dCwgaW1wb3J0TWFuYWdlciwgY29uZmlnKTsKKyAgICB9CisgICAgcmV0dXJuIF94YmxvY2tleHByZXNzaW9uOworICB9CisgIAorICBwdWJsaWMgdm9pZCBkb0dlbmVyYXRlKGZpbmFsIFJlc291cmNlIHJlc291cmNlLCBmaW5hbCBJRmlsZVN5c3RlbUFjY2VzcyBmc2EpIHsKKyAgICB0aGlzLmFkZFRyYW5zbGF0YWJsZXMoIlBlcnNwZWN0aXZlTkEiKTsKKyAgICBzdXBlci5kb0dlbmVyYXRlKHJlc291cmNlLCBmc2EpOworICB9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3Njb3BpbmcvUGVyc3BlY3RpdmVTY29wZVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3Njb3BpbmcvUGVyc3BlY3RpdmVTY29wZVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc3ZGEwOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcGVyc3BlY3RpdmUvc2NvcGluZy9QZXJzcGVjdGl2ZVNjb3BlUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDQ0NiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogIENvbnRyaWJ1dG9yczoKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICogCisgKiAgVGhpcyBjb3B5cmlnaHQgbm90aWNlIHNob3dzIHVwIGluIHRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5zY29waW5nOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuZHRvLkxEdG87CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wueHRleHQubGF6eXJlc29sdmVyLmFwaS5FY29yZVV0aWwzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZWN2aWV3LnNlbWFudGljLnVpbW9kZWwuVWlCZWFuU2xvdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmVjdmlldy5zZW1hbnRpYy51aW1vZGVsLlVpSURFVmlldzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmVjdmlldy5zZW1hbnRpYy51aW1vZGVsLlVpVmlldzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJsaXAuQmxpcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJsaXAuQmxpcEl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5ibGlwLkJsaXBVc2VyVGFzazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRpYWxvZ2RzbC5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVEc2xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVHcmlkOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmVQYXJ0U3RhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVNhc2hDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC50YWJsZS5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnRhYmxlLlRhYmxlRHRvRGF0YXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnRhYmxlLlRhYmxlR3JpZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnRhYmxlLlRhYmxlT3B0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQudGFibGUuVGFibGVTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC50YWJsZS5UYWJsZVRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy5Kdm1UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy5Kdm1UeXBlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLkVPYmplY3REZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5JRU9iamVjdERlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnNjb3BpbmcuSVNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnNjb3BpbmcuaW1wbC5NYXBCYXNlZFNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmFubm90YXRpb25zLnR5cGVzeXN0ZW0uWGJhc2VXaXRoQW5ub3RhdGlvbnNCYXRjaFNjb3BlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkNvbGxlY3Rpb25MaXRlcmFsczsKKworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgUGVyc3BlY3RpdmVTY29wZVByb3ZpZGVyIGV4dGVuZHMgWGJhc2VXaXRoQW5ub3RhdGlvbnNCYXRjaFNjb3BlUHJvdmlkZXIgeworICBAT3ZlcnJpZGUKKyAgcHVibGljIElTY29wZSBnZXRTY29wZShmaW5hbCBFT2JqZWN0IGNvbnRleHQsIGZpbmFsIEVSZWZlcmVuY2UgcmVmZXJlbmNlKSB7CisgICAgYm9vbGVhbiBfZXF1YWxzID0gT2JqZWN0cy5lcXVhbChyZWZlcmVuY2UsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5MaXRlcmFscy5QRVJTUEVDVElWRV9TQVNIX0NPTlRBSU5FUl9fU0VMRUNURURfRUxFTUVOVCk7CisgICAgaWYgKF9lcXVhbHMpIHsKKyAgICAgIHJldHVybiB0aGlzLmdldFNjb3BlX0NDUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyX3NlbGVjdGVkX2VsZW1lbnQoY29udGV4dCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGJvb2xlYW4gX2VxdWFsc18xID0gT2JqZWN0cy5lcXVhbChyZWZlcmVuY2UsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5MaXRlcmFscy5QRVJTUEVDVElWRV9QQVJUX1NUQUNLX19TRUxFQ1RFRF9FTEVNRU5UKTsKKyAgICAgIGlmIChfZXF1YWxzXzEpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2NvcGVfQ0NQZXJzcGVjdGl2ZVBhcnRTdGFja19zZWxlY3RlZF9lbGVtZW50KGNvbnRleHQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYm9vbGVhbiBfZXF1YWxzXzIgPSBPYmplY3RzLmVxdWFsKHJlZmVyZW5jZSwgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLkxpdGVyYWxzLlBFUlNQRUNUSVZFX19VU0VSX1RBU0spOworICAgICAgICBpZiAoX2VxdWFsc18yKSB7CisgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2NvcGVfQ0NQZXJzcGVjdGl2ZVBhcnRTdGFja19VU0VSX1RBU0soKChQZXJzcGVjdGl2ZSkgY29udGV4dCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJvb2xlYW4gX2VxdWFsc18zID0gT2JqZWN0cy5lcXVhbChyZWZlcmVuY2UsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5MaXRlcmFscy5QRVJTUEVDVElWRV9ESUFMT0dfX1JFRik7CisgICAgICAgICAgaWYgKF9lcXVhbHNfMykgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2NvcGVfQ0NQZXJzcGVjdGl2ZVBhcnRTdGFja19QRVJTUEVDVElWRV9ESUFMT0dfX1JFRigoKFBlcnNwZWN0aXZlRGlhbG9nKSBjb250ZXh0KSwgcmVmZXJlbmNlKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYm9vbGVhbiBfZXF1YWxzXzQgPSBPYmplY3RzLmVxdWFsKHJlZmVyZW5jZSwgUGVyc3BlY3RpdmVEc2xQYWNrYWdlLkxpdGVyYWxzLlBFUlNQRUNUSVZFX1NFTEVDVElPTl9fUkVGKTsKKyAgICAgICAgICAgIGlmIChfZXF1YWxzXzQpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2NvcGVfQ0NQZXJzcGVjdGl2ZVBhcnRTdGFja19QRVJTUEVDVElWRV9TRUxFQ1RJT05fX1JFRigoKFBlcnNwZWN0aXZlU2VsZWN0aW9uKSBjb250ZXh0KSwgcmVmZXJlbmNlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGJvb2xlYW4gX2VxdWFsc181ID0gT2JqZWN0cy5lcXVhbChyZWZlcmVuY2UsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5MaXRlcmFscy5QRVJTUEVDVElWRV9UQUJMRV9fUkVGKTsKKyAgICAgICAgICAgICAgaWYgKF9lcXVhbHNfNSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFNjb3BlX0NDUGVyc3BlY3RpdmVQYXJ0U3RhY2tfUEVSU1BFQ1RJVkVfVEFCTEVfX1JFRigoKFBlcnNwZWN0aXZlVGFibGUpIGNvbnRleHQpLCByZWZlcmVuY2UpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gX2VxdWFsc182ID0gT2JqZWN0cy5lcXVhbChyZWZlcmVuY2UsIFBlcnNwZWN0aXZlRHNsUGFja2FnZS5MaXRlcmFscy5QRVJTUEVDVElWRV9HUklEX19SRUYpOworICAgICAgICAgICAgICAgIGlmIChfZXF1YWxzXzYpIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFNjb3BlX0NDUGVyc3BlY3RpdmVQYXJ0U3RhY2tfUEVSU1BFQ1RJVkVfR1JJRF9fUkVGKCgoUGVyc3BlY3RpdmVHcmlkKSBjb250ZXh0KSwgcmVmZXJlbmNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN1cGVyLmdldFNjb3BlKGNvbnRleHQsIHJlZmVyZW5jZSk7CisgIH0KKyAgCisgIHB1YmxpYyBJU2NvcGUgZ2V0U2NvcGVfQ0NQZXJzcGVjdGl2ZVBhcnRTdGFja19QRVJTUEVDVElWRV9ESUFMT0dfX1JFRihmaW5hbCBQZXJzcGVjdGl2ZURpYWxvZyBkaWFsb2dWaWV3LCBmaW5hbCBFUmVmZXJlbmNlIHJlZmVyZW5jZSkgeworICAgIGZpbmFsIElTY29wZSBzdXBlclNjb3BlID0gc3VwZXIuZ2V0U2NvcGUoZGlhbG9nVmlldywgcmVmZXJlbmNlKTsKKyAgICBBcnJheUxpc3Q8SUVPYmplY3REZXNjcmlwdGlvbj4gcmVzdWx0ID0gQ29sbGVjdGlvbkxpdGVyYWxzLjxJRU9iamVjdERlc2NyaXB0aW9uPm5ld0FycmF5TGlzdCgpOworICAgIEVPYmplY3QgcGVyc3BlY3RpdmUgPSBkaWFsb2dWaWV3LmVDb250YWluZXIoKTsKKyAgICB3aGlsZSAoKCghT2JqZWN0cy5lcXVhbChwZXJzcGVjdGl2ZSwgbnVsbCkpICYmICghKHBlcnNwZWN0aXZlIGluc3RhbmNlb2YgUGVyc3BlY3RpdmUpKSkpIHsKKyAgICAgIEVPYmplY3QgX2VDb250YWluZXIgPSBwZXJzcGVjdGl2ZS5lQ29udGFpbmVyKCk7CisgICAgICBwZXJzcGVjdGl2ZSA9IF9lQ29udGFpbmVyOworICAgIH0KKyAgICBCbGlwVXNlclRhc2sgX3VzZXJUYXNrID0gbnVsbDsKKyAgICBpZiAoKChQZXJzcGVjdGl2ZSkgcGVyc3BlY3RpdmUpIT1udWxsKSB7CisgICAgICBfdXNlclRhc2s9KChQZXJzcGVjdGl2ZSkgcGVyc3BlY3RpdmUpLmdldFVzZXJUYXNrKCk7CisgICAgfQorICAgIGJvb2xlYW4gX2VxdWFscyA9IE9iamVjdHMuZXF1YWwoX3VzZXJUYXNrLCBudWxsKTsKKyAgICBpZiAoX2VxdWFscykgeworICAgICAgcmV0dXJuIHN1cGVyU2NvcGU7CisgICAgfSBlbHNlIHsKKyAgICAgIEJsaXBVc2VyVGFzayBfdXNlclRhc2tfMSA9IG51bGw7CisgICAgICBpZiAoKChQZXJzcGVjdGl2ZSkgcGVyc3BlY3RpdmUpIT1udWxsKSB7CisgICAgICAgIF91c2VyVGFza18xPSgoUGVyc3BlY3RpdmUpIHBlcnNwZWN0aXZlKS5nZXRVc2VyVGFzaygpOworICAgICAgfQorICAgICAgUmVzb3VyY2UgX2VSZXNvdXJjZSA9IGRpYWxvZ1ZpZXcuZVJlc291cmNlKCk7CisgICAgICBSZXNvdXJjZVNldCBfcmVzb3VyY2VTZXQgPSBfZVJlc291cmNlLmdldFJlc291cmNlU2V0KCk7CisgICAgICBFT2JqZWN0IF9yZXNvbHZlID0gRWNvcmVVdGlsMy5yZXNvbHZlKF91c2VyVGFza18xLCBfcmVzb3VyY2VTZXQpOworICAgICAgZmluYWwgQmxpcFVzZXJUYXNrIGh1bWFuVGFzayA9ICgoQmxpcFVzZXJUYXNrKSBfcmVzb2x2ZSk7CisgICAgICBmaW5hbCBMRHRvIG9wZXJhdGl2ZUR0byA9IGh1bWFuVGFzay5nZXRPcGVyYXRpdmVMRHRvKCk7CisgICAgICBTdHJpbmcgX25hbWUgPSBudWxsOworICAgICAgaWYgKG9wZXJhdGl2ZUR0byE9bnVsbCkgeworICAgICAgICBfbmFtZT1vcGVyYXRpdmVEdG8uZ2V0TmFtZSgpOworICAgICAgfQorICAgICAgYm9vbGVhbiBfZXF1YWxzXzEgPSBPYmplY3RzLmVxdWFsKF9uYW1lLCBudWxsKTsKKyAgICAgIGlmIChfZXF1YWxzXzEpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyU2NvcGU7CisgICAgICB9IGVsc2UgeworICAgICAgICBJdGVyYWJsZTxJRU9iamVjdERlc2NyaXB0aW9uPiBfYWxsRWxlbWVudHMgPSBzdXBlclNjb3BlLmdldEFsbEVsZW1lbnRzKCk7CisgICAgICAgIGZvciAoZmluYWwgSUVPYmplY3REZXNjcmlwdGlvbiBlbGVtZW50IDogX2FsbEVsZW1lbnRzKSB7CisgICAgICAgICAgRU9iamVjdCBfZU9iamVjdE9yUHJveHkgPSBlbGVtZW50LmdldEVPYmplY3RPclByb3h5KCk7CisgICAgICAgICAgaWYgKChfZU9iamVjdE9yUHJveHkgaW5zdGFuY2VvZiBEaWFsb2cpKSB7CisgICAgICAgICAgICBFT2JqZWN0IF9lT2JqZWN0T3JQcm94eV8xID0gZWxlbWVudC5nZXRFT2JqZWN0T3JQcm94eSgpOworICAgICAgICAgICAgRGlhbG9nIGRpYWxvZyA9ICgoRGlhbG9nKSBfZU9iamVjdE9yUHJveHlfMSk7CisgICAgICAgICAgICBSZXNvdXJjZSBfZVJlc291cmNlXzEgPSBkaWFsb2dWaWV3LmVSZXNvdXJjZSgpOworICAgICAgICAgICAgUmVzb3VyY2VTZXQgX3Jlc291cmNlU2V0XzEgPSBfZVJlc291cmNlXzEuZ2V0UmVzb3VyY2VTZXQoKTsKKyAgICAgICAgICAgIEVPYmplY3QgX3Jlc29sdmVfMSA9IEVjb3JlVXRpbDMucmVzb2x2ZShkaWFsb2csIF9yZXNvdXJjZVNldF8xKTsKKyAgICAgICAgICAgIGRpYWxvZyA9ICgoRGlhbG9nKSBfcmVzb2x2ZV8xKTsKKyAgICAgICAgICAgIFVpVmlldyBfdWlWaWV3ID0gZGlhbG9nLmdldFVpVmlldygpOworICAgICAgICAgICAgYm9vbGVhbiBfbm90RXF1YWxzID0gKCFPYmplY3RzLmVxdWFsKF91aVZpZXcsIG51bGwpKTsKKyAgICAgICAgICAgIGlmIChfbm90RXF1YWxzKSB7CisgICAgICAgICAgICAgIFVpVmlldyBfdWlWaWV3XzEgPSBkaWFsb2cuZ2V0VWlWaWV3KCk7CisgICAgICAgICAgICAgIFJlc291cmNlIF9lUmVzb3VyY2VfMiA9IGRpYWxvZ1ZpZXcuZVJlc291cmNlKCk7CisgICAgICAgICAgICAgIFJlc291cmNlU2V0IF9yZXNvdXJjZVNldF8yID0gX2VSZXNvdXJjZV8yLmdldFJlc291cmNlU2V0KCk7CisgICAgICAgICAgICAgIGZpbmFsIEVPYmplY3QgdWlWaWV3T2JqID0gRWNvcmVVdGlsMy5yZXNvbHZlKCgoRU9iamVjdCkgX3VpVmlld18xKSwgX3Jlc291cmNlU2V0XzIpOworICAgICAgICAgICAgICBpZiAoKHVpVmlld09iaiBpbnN0YW5jZW9mIFVpSURFVmlldykpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBVaUlERVZpZXcgdWlWaWV3ID0gKChVaUlERVZpZXcpIHVpVmlld09iaik7CisgICAgICAgICAgICAgICAgRUxpc3Q8VWlCZWFuU2xvdD4gX2JlYW5TbG90cyA9IHVpVmlldy5nZXRCZWFuU2xvdHMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFVpQmVhblNsb3QgYmVhblNsb3QgOiBfYmVhblNsb3RzKSB7CisgICAgICAgICAgICAgICAgICBTdHJpbmcgX25hbWVfMSA9IG9wZXJhdGl2ZUR0by5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICBKdm1UeXBlUmVmZXJlbmNlIF9qdm1UeXBlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgIGlmIChiZWFuU2xvdCE9bnVsbCkgeworICAgICAgICAgICAgICAgICAgICBfanZtVHlwZT1iZWFuU2xvdC5nZXRKdm1UeXBlKCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBKdm1UeXBlIF90eXBlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgIGlmIChfanZtVHlwZSE9bnVsbCkgeworICAgICAgICAgICAgICAgICAgICBfdHlwZT1fanZtVHlwZS5nZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBTdHJpbmcgX3NpbXBsZU5hbWUgPSBudWxsOworICAgICAgICAgICAgICAgICAgaWYgKF90eXBlIT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgIF9zaW1wbGVOYW1lPV90eXBlLmdldFNpbXBsZU5hbWUoKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGJvb2xlYW4gX2VxdWFsc18yID0gX25hbWVfMS5lcXVhbHMoX3NpbXBsZU5hbWUpOworICAgICAgICAgICAgICAgICAgaWYgKF9lcXVhbHNfMikgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgTER0byBfZHRvID0gZGlhbG9nLmdldER0bygpOworICAgICAgICAgICAgICBib29sZWFuIF9ub3RFcXVhbHNfMSA9ICghT2JqZWN0cy5lcXVhbChfZHRvLCBudWxsKSk7CisgICAgICAgICAgICAgIGlmIChfbm90RXF1YWxzXzEpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX25hbWVfMiA9IG9wZXJhdGl2ZUR0by5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgTER0byBfZHRvXzEgPSBkaWFsb2cuZ2V0RHRvKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9uYW1lXzMgPSBfZHRvXzEuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gX2VxdWFsc18zID0gX25hbWVfMi5lcXVhbHMoX25hbWVfMyk7CisgICAgICAgICAgICAgICAgaWYgKF9lcXVhbHNfMykgeworICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChlbGVtZW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBNYXBCYXNlZFNjb3BlLmNyZWF0ZVNjb3BlKElTY29wZS5OVUxMU0NPUEUsIHJlc3VsdCk7CisgICAgfQorICB9CisgIAorICBwdWJsaWMgSVNjb3BlIGdldFNjb3BlX0NDUGVyc3BlY3RpdmVQYXJ0U3RhY2tfUEVSU1BFQ1RJVkVfVEFCTEVfX1JFRihmaW5hbCBQZXJzcGVjdGl2ZVRhYmxlIHRhYmxlVmlldywgZmluYWwgRVJlZmVyZW5jZSByZWZlcmVuY2UpIHsKKyAgICBJU2NvcGUgc3VwZXJTY29wZSA9IHN1cGVyLmdldFNjb3BlKHRhYmxlVmlldywgcmVmZXJlbmNlKTsKKyAgICBBcnJheUxpc3Q8SUVPYmplY3REZXNjcmlwdGlvbj4gcmVzdWx0ID0gQ29sbGVjdGlvbkxpdGVyYWxzLjxJRU9iamVjdERlc2NyaXB0aW9uPm5ld0FycmF5TGlzdCgpOworICAgIEl0ZXJhYmxlPElFT2JqZWN0RGVzY3JpcHRpb24+IF9hbGxFbGVtZW50cyA9IHN1cGVyU2NvcGUuZ2V0QWxsRWxlbWVudHMoKTsKKyAgICBmb3IgKGZpbmFsIElFT2JqZWN0RGVzY3JpcHRpb24gZWxlbWVudCA6IF9hbGxFbGVtZW50cykgeworICAgICAgRU9iamVjdCBfZU9iamVjdE9yUHJveHkgPSBlbGVtZW50LmdldEVPYmplY3RPclByb3h5KCk7CisgICAgICBpZiAoKF9lT2JqZWN0T3JQcm94eSBpbnN0YW5jZW9mIFRhYmxlKSkgeworICAgICAgICBFT2JqZWN0IF9lT2JqZWN0T3JQcm94eV8xID0gZWxlbWVudC5nZXRFT2JqZWN0T3JQcm94eSgpOworICAgICAgICBUYWJsZSB0YWJsZSA9ICgoVGFibGUpIF9lT2JqZWN0T3JQcm94eV8xKTsKKyAgICAgICAgUmVzb3VyY2UgX2VSZXNvdXJjZSA9IHRhYmxlVmlldy5lUmVzb3VyY2UoKTsKKyAgICAgICAgUmVzb3VyY2VTZXQgX3Jlc291cmNlU2V0ID0gX2VSZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOworICAgICAgICBFT2JqZWN0IF9yZXNvbHZlID0gRWNvcmVVdGlsMy5yZXNvbHZlKHRhYmxlLCBfcmVzb3VyY2VTZXQpOworICAgICAgICB0YWJsZSA9ICgoVGFibGUpIF9yZXNvbHZlKTsKKyAgICAgICAgVGFibGVPcHRpb24gX3RhYmxldHlwZSA9IHRhYmxlLmdldFRhYmxldHlwZSgpOworICAgICAgICBpZiAoKF90YWJsZXR5cGUgaW5zdGFuY2VvZiBUYWJsZVRhYmxlKSkgeworICAgICAgICAgIHJlc3VsdC5hZGQoZWxlbWVudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgVGFibGVPcHRpb24gX3RhYmxldHlwZV8xID0gdGFibGUuZ2V0VGFibGV0eXBlKCk7CisgICAgICAgICAgaWYgKChfdGFibGV0eXBlXzEgaW5zdGFuY2VvZiBUYWJsZUdyaWQpKSB7CisgICAgICAgICAgICByZXN1bHQuYWRkKGVsZW1lbnQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBJU2NvcGUgX2NyZWF0ZVNjb3BlID0gTWFwQmFzZWRTY29wZS5jcmVhdGVTY29wZShJU2NvcGUuTlVMTFNDT1BFLCByZXN1bHQpOworICAgIHN1cGVyU2NvcGUgPSBfY3JlYXRlU2NvcGU7CisgICAgQXJyYXlMaXN0PElFT2JqZWN0RGVzY3JpcHRpb24+IF9uZXdBcnJheUxpc3QgPSBDb2xsZWN0aW9uTGl0ZXJhbHMuPElFT2JqZWN0RGVzY3JpcHRpb24+bmV3QXJyYXlMaXN0KCk7CisgICAgcmVzdWx0ID0gX25ld0FycmF5TGlzdDsKKyAgICBFT2JqZWN0IHBlcnNwZWN0aXZlID0gdGFibGVWaWV3LmVDb250YWluZXIoKTsKKyAgICB3aGlsZSAoKCghT2JqZWN0cy5lcXVhbChwZXJzcGVjdGl2ZSwgbnVsbCkpICYmICghKHBlcnNwZWN0aXZlIGluc3RhbmNlb2YgUGVyc3BlY3RpdmUpKSkpIHsKKyAgICAgIEVPYmplY3QgX2VDb250YWluZXIgPSBwZXJzcGVjdGl2ZS5lQ29udGFpbmVyKCk7CisgICAgICBwZXJzcGVjdGl2ZSA9IF9lQ29udGFpbmVyOworICAgIH0KKyAgICBCbGlwVXNlclRhc2sgX3VzZXJUYXNrID0gbnVsbDsKKyAgICBpZiAoKChQZXJzcGVjdGl2ZSkgcGVyc3BlY3RpdmUpIT1udWxsKSB7CisgICAgICBfdXNlclRhc2s9KChQZXJzcGVjdGl2ZSkgcGVyc3BlY3RpdmUpLmdldFVzZXJUYXNrKCk7CisgICAgfQorICAgIGJvb2xlYW4gX2VxdWFscyA9IE9iamVjdHMuZXF1YWwoX3VzZXJUYXNrLCBudWxsKTsKKyAgICBpZiAoX2VxdWFscykgeworICAgICAgcmV0dXJuIHN1cGVyU2NvcGU7CisgICAgfSBlbHNlIHsKKyAgICAgIEJsaXAgX3Byb2Nlc3MgPSBudWxsOworICAgICAgaWYgKCgoUGVyc3BlY3RpdmUpIHBlcnNwZWN0aXZlKSE9bnVsbCkgeworICAgICAgICBfcHJvY2Vzcz0oKFBlcnNwZWN0aXZlKSBwZXJzcGVjdGl2ZSkuZ2V0UHJvY2VzcygpOworICAgICAgfQorICAgICAgUmVzb3VyY2UgX2VSZXNvdXJjZV8xID0gdGFibGVWaWV3LmVSZXNvdXJjZSgpOworICAgICAgUmVzb3VyY2VTZXQgX3Jlc291cmNlU2V0XzEgPSBfZVJlc291cmNlXzEuZ2V0UmVzb3VyY2VTZXQoKTsKKyAgICAgIEVjb3JlVXRpbDMucmVzb2x2ZShfcHJvY2VzcywgX3Jlc291cmNlU2V0XzEpOworICAgICAgQmxpcFVzZXJUYXNrIF91c2VyVGFza18xID0gbnVsbDsKKyAgICAgIGlmICgoKFBlcnNwZWN0aXZlKSBwZXJzcGVjdGl2ZSkhPW51bGwpIHsKKyAgICAgICAgX3VzZXJUYXNrXzE9KChQZXJzcGVjdGl2ZSkgcGVyc3BlY3RpdmUpLmdldFVzZXJUYXNrKCk7CisgICAgICB9CisgICAgICBSZXNvdXJjZSBfZVJlc291cmNlXzIgPSB0YWJsZVZpZXcuZVJlc291cmNlKCk7CisgICAgICBSZXNvdXJjZVNldCBfcmVzb3VyY2VTZXRfMiA9IF9lUmVzb3VyY2VfMi5nZXRSZXNvdXJjZVNldCgpOworICAgICAgRU9iamVjdCBfcmVzb2x2ZV8xID0gRWNvcmVVdGlsMy5yZXNvbHZlKF91c2VyVGFza18xLCBfcmVzb3VyY2VTZXRfMik7CisgICAgICBmaW5hbCBCbGlwVXNlclRhc2sgaHVtYW5UYXNrID0gKChCbGlwVXNlclRhc2spIF9yZXNvbHZlXzEpOworICAgICAgZmluYWwgTER0byBvcGVyYXRpdmVEdG8gPSBodW1hblRhc2suZ2V0T3BlcmF0aXZlTER0bygpOworICAgICAgU3RyaW5nIF9uYW1lID0gbnVsbDsKKyAgICAgIGlmIChvcGVyYXRpdmVEdG8hPW51bGwpIHsKKyAgICAgICAgX25hbWU9b3BlcmF0aXZlRHRvLmdldE5hbWUoKTsKKyAgICAgIH0KKyAgICAgIGJvb2xlYW4gX2VxdWFsc18xID0gT2JqZWN0cy5lcXVhbChfbmFtZSwgbnVsbCk7CisgICAgICBpZiAoX2VxdWFsc18xKSB7CisgICAgICAgIHJldHVybiBzdXBlclNjb3BlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgSXRlcmFibGU8SUVPYmplY3REZXNjcmlwdGlvbj4gX2FsbEVsZW1lbnRzXzEgPSBzdXBlclNjb3BlLmdldEFsbEVsZW1lbnRzKCk7CisgICAgICAgIGZvciAoZmluYWwgSUVPYmplY3REZXNjcmlwdGlvbiBlbGVtZW50XzEgOiBfYWxsRWxlbWVudHNfMSkgeworICAgICAgICAgIEVPYmplY3QgX2VPYmplY3RPclByb3h5XzIgPSBlbGVtZW50XzEuZ2V0RU9iamVjdE9yUHJveHkoKTsKKyAgICAgICAgICBpZiAoKF9lT2JqZWN0T3JQcm94eV8yIGluc3RhbmNlb2YgVGFibGUpKSB7CisgICAgICAgICAgICBFT2JqZWN0IF9lT2JqZWN0T3JQcm94eV8zID0gZWxlbWVudF8xLmdldEVPYmplY3RPclByb3h5KCk7CisgICAgICAgICAgICBUYWJsZSB0YWJsZV8xID0gKChUYWJsZSkgX2VPYmplY3RPclByb3h5XzMpOworICAgICAgICAgICAgUmVzb3VyY2UgX2VSZXNvdXJjZV8zID0gdGFibGVWaWV3LmVSZXNvdXJjZSgpOworICAgICAgICAgICAgUmVzb3VyY2VTZXQgX3Jlc291cmNlU2V0XzMgPSBfZVJlc291cmNlXzMuZ2V0UmVzb3VyY2VTZXQoKTsKKyAgICAgICAgICAgIEVPYmplY3QgX3Jlc29sdmVfMiA9IEVjb3JlVXRpbDMucmVzb2x2ZSh0YWJsZV8xLCBfcmVzb3VyY2VTZXRfMyk7CisgICAgICAgICAgICB0YWJsZV8xID0gKChUYWJsZSkgX3Jlc29sdmVfMik7CisgICAgICAgICAgICBUYWJsZU9wdGlvbiBfdGFibGV0eXBlXzIgPSB0YWJsZV8xLmdldFRhYmxldHlwZSgpOworICAgICAgICAgICAgaWYgKChfdGFibGV0eXBlXzIgaW5zdGFuY2VvZiBUYWJsZUdyaWQpKSB7CisgICAgICAgICAgICAgIFRhYmxlT3B0aW9uIF90YWJsZXR5cGVfMyA9IHRhYmxlXzEuZ2V0VGFibGV0eXBlKCk7CisgICAgICAgICAgICAgIGZpbmFsIFRhYmxlR3JpZCB0YWJsZUdyaWQgPSAoKFRhYmxlR3JpZCkgX3RhYmxldHlwZV8zKTsKKyAgICAgICAgICAgICAgVGFibGVEdG9EYXRhc291cmNlIF9zb3VyY2UgPSBudWxsOworICAgICAgICAgICAgICBpZiAodGFibGVHcmlkIT1udWxsKSB7CisgICAgICAgICAgICAgICAgX3NvdXJjZT10YWJsZUdyaWQuZ2V0U291cmNlKCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZmluYWwgVGFibGVEdG9EYXRhc291cmNlIHRhYmxlRHRvRGF0YXNvdXJjZSA9IF9zb3VyY2U7CisgICAgICAgICAgICAgIExEdG8gX2R0b1NvdXJjZSA9IG51bGw7CisgICAgICAgICAgICAgIGlmICh0YWJsZUR0b0RhdGFzb3VyY2UhPW51bGwpIHsKKyAgICAgICAgICAgICAgICBfZHRvU291cmNlPXRhYmxlRHRvRGF0YXNvdXJjZS5nZXREdG9Tb3VyY2UoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBmaW5hbCBMRHRvIHJvb3RUeXBlRHRvID0gX2R0b1NvdXJjZTsKKyAgICAgICAgICAgICAgU3RyaW5nIF9uYW1lXzEgPSBvcGVyYXRpdmVEdG8uZ2V0TmFtZSgpOworICAgICAgICAgICAgICBTdHJpbmcgX25hbWVfMiA9IHJvb3RUeXBlRHRvLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgYm9vbGVhbiBfZXF1YWxzXzIgPSBfbmFtZV8xLmVxdWFscyhfbmFtZV8yKTsKKyAgICAgICAgICAgICAgaWYgKF9lcXVhbHNfMikgeworICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoZWxlbWVudF8xKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgVGFibGVPcHRpb24gX3RhYmxldHlwZV80ID0gdGFibGVfMS5nZXRUYWJsZXR5cGUoKTsKKyAgICAgICAgICAgICAgaWYgKChfdGFibGV0eXBlXzQgaW5zdGFuY2VvZiBUYWJsZVRhYmxlKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoZWxlbWVudF8xKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIE1hcEJhc2VkU2NvcGUuY3JlYXRlU2NvcGUoSVNjb3BlLk5VTExTQ09QRSwgcmVzdWx0KTsKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBJU2NvcGUgZ2V0U2NvcGVfQ0NQZXJzcGVjdGl2ZVBhcnRTdGFja19QRVJTUEVDVElWRV9TRUxFQ1RJT05fX1JFRihmaW5hbCBQZXJzcGVjdGl2ZVNlbGVjdGlvbiBzZWxlY3Rpb25WaWV3LCBmaW5hbCBFUmVmZXJlbmNlIHJlZmVyZW5jZSkgeworICAgIElTY29wZSBzdXBlclNjb3BlID0gc3VwZXIuZ2V0U2NvcGUoc2VsZWN0aW9uVmlldywgcmVmZXJlbmNlKTsKKyAgICBBcnJheUxpc3Q8SUVPYmplY3REZXNjcmlwdGlvbj4gcmVzdWx0ID0gQ29sbGVjdGlvbkxpdGVyYWxzLjxJRU9iamVjdERlc2NyaXB0aW9uPm5ld0FycmF5TGlzdCgpOworICAgIEl0ZXJhYmxlPElFT2JqZWN0RGVzY3JpcHRpb24+IF9hbGxFbGVtZW50cyA9IHN1cGVyU2NvcGUuZ2V0QWxsRWxlbWVudHMoKTsKKyAgICBmb3IgKGZpbmFsIElFT2JqZWN0RGVzY3JpcHRpb24gZWxlbWVudCA6IF9hbGxFbGVtZW50cykgeworICAgICAgRU9iamVjdCBfZU9iamVjdE9yUHJveHkgPSBlbGVtZW50LmdldEVPYmplY3RPclByb3h5KCk7CisgICAgICBpZiAoKF9lT2JqZWN0T3JQcm94eSBpbnN0YW5jZW9mIFRhYmxlKSkgeworICAgICAgICBFT2JqZWN0IF9lT2JqZWN0T3JQcm94eV8xID0gZWxlbWVudC5nZXRFT2JqZWN0T3JQcm94eSgpOworICAgICAgICBUYWJsZSB0YWJsZSA9ICgoVGFibGUpIF9lT2JqZWN0T3JQcm94eV8xKTsKKyAgICAgICAgUmVzb3VyY2UgX2VSZXNvdXJjZSA9IHNlbGVjdGlvblZpZXcuZVJlc291cmNlKCk7CisgICAgICAgIFJlc291cmNlU2V0IF9yZXNvdXJjZVNldCA9IF9lUmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKTsKKyAgICAgICAgRU9iamVjdCBfcmVzb2x2ZSA9IEVjb3JlVXRpbDMucmVzb2x2ZSh0YWJsZSwgX3Jlc291cmNlU2V0KTsKKyAgICAgICAgdGFibGUgPSAoKFRhYmxlKSBfcmVzb2x2ZSk7CisgICAgICAgIFRhYmxlT3B0aW9uIF90YWJsZXR5cGUgPSB0YWJsZS5nZXRUYWJsZXR5cGUoKTsKKyAgICAgICAgaWYgKChfdGFibGV0eXBlIGluc3RhbmNlb2YgVGFibGVTZWxlY3Rpb24pKSB7CisgICAgICAgICAgcmVzdWx0LmFkZChlbGVtZW50KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBJU2NvcGUgX2NyZWF0ZVNjb3BlID0gTWFwQmFzZWRTY29wZS5jcmVhdGVTY29wZShJU2NvcGUuTlVMTFNDT1BFLCByZXN1bHQpOworICAgIHN1cGVyU2NvcGUgPSBfY3JlYXRlU2NvcGU7CisgICAgQXJyYXlMaXN0PElFT2JqZWN0RGVzY3JpcHRpb24+IF9uZXdBcnJheUxpc3QgPSBDb2xsZWN0aW9uTGl0ZXJhbHMuPElFT2JqZWN0RGVzY3JpcHRpb24+bmV3QXJyYXlMaXN0KCk7CisgICAgcmVzdWx0ID0gX25ld0FycmF5TGlzdDsKKyAgICBFT2JqZWN0IHBlcnNwZWN0aXZlID0gc2VsZWN0aW9uVmlldy5lQ29udGFpbmVyKCk7CisgICAgd2hpbGUgKCgoIU9iamVjdHMuZXF1YWwocGVyc3BlY3RpdmUsIG51bGwpKSAmJiAoIShwZXJzcGVjdGl2ZSBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlKSkpKSB7CisgICAgICBFT2JqZWN0IF9lQ29udGFpbmVyID0gcGVyc3BlY3RpdmUuZUNvbnRhaW5lcigpOworICAgICAgcGVyc3BlY3RpdmUgPSBfZUNvbnRhaW5lcjsKKyAgICB9CisgICAgQmxpcFVzZXJUYXNrIF91c2VyVGFzayA9IG51bGw7CisgICAgaWYgKCgoUGVyc3BlY3RpdmUpIHBlcnNwZWN0aXZlKSE9bnVsbCkgeworICAgICAgX3VzZXJUYXNrPSgoUGVyc3BlY3RpdmUpIHBlcnNwZWN0aXZlKS5nZXRVc2VyVGFzaygpOworICAgIH0KKyAgICBib29sZWFuIF9lcXVhbHMgPSBPYmplY3RzLmVxdWFsKF91c2VyVGFzaywgbnVsbCk7CisgICAgaWYgKF9lcXVhbHMpIHsKKyAgICAgIHJldHVybiBzdXBlclNjb3BlOworICAgIH0gZWxzZSB7CisgICAgICBCbGlwIF9wcm9jZXNzID0gbnVsbDsKKyAgICAgIGlmICgoKFBlcnNwZWN0aXZlKSBwZXJzcGVjdGl2ZSkhPW51bGwpIHsKKyAgICAgICAgX3Byb2Nlc3M9KChQZXJzcGVjdGl2ZSkgcGVyc3BlY3RpdmUpLmdldFByb2Nlc3MoKTsKKyAgICAgIH0KKyAgICAgIFJlc291cmNlIF9lUmVzb3VyY2VfMSA9IHNlbGVjdGlvblZpZXcuZVJlc291cmNlKCk7CisgICAgICBSZXNvdXJjZVNldCBfcmVzb3VyY2VTZXRfMSA9IF9lUmVzb3VyY2VfMS5nZXRSZXNvdXJjZVNldCgpOworICAgICAgRWNvcmVVdGlsMy5yZXNvbHZlKF9wcm9jZXNzLCBfcmVzb3VyY2VTZXRfMSk7CisgICAgICBCbGlwVXNlclRhc2sgX3VzZXJUYXNrXzEgPSBudWxsOworICAgICAgaWYgKCgoUGVyc3BlY3RpdmUpIHBlcnNwZWN0aXZlKSE9bnVsbCkgeworICAgICAgICBfdXNlclRhc2tfMT0oKFBlcnNwZWN0aXZlKSBwZXJzcGVjdGl2ZSkuZ2V0VXNlclRhc2soKTsKKyAgICAgIH0KKyAgICAgIFJlc291cmNlIF9lUmVzb3VyY2VfMiA9IHNlbGVjdGlvblZpZXcuZVJlc291cmNlKCk7CisgICAgICBSZXNvdXJjZVNldCBfcmVzb3VyY2VTZXRfMiA9IF9lUmVzb3VyY2VfMi5nZXRSZXNvdXJjZVNldCgpOworICAgICAgRU9iamVjdCBfcmVzb2x2ZV8xID0gRWNvcmVVdGlsMy5yZXNvbHZlKF91c2VyVGFza18xLCBfcmVzb3VyY2VTZXRfMik7CisgICAgICBmaW5hbCBCbGlwVXNlclRhc2sgaHVtYW5UYXNrID0gKChCbGlwVXNlclRhc2spIF9yZXNvbHZlXzEpOworICAgICAgZmluYWwgTER0byBvcGVyYXRpdmVEdG8gPSBodW1hblRhc2suZ2V0T3BlcmF0aXZlTER0bygpOworICAgICAgU3RyaW5nIF9uYW1lID0gbnVsbDsKKyAgICAgIGlmIChvcGVyYXRpdmVEdG8hPW51bGwpIHsKKyAgICAgICAgX25hbWU9b3BlcmF0aXZlRHRvLmdldE5hbWUoKTsKKyAgICAgIH0KKyAgICAgIGJvb2xlYW4gX2VxdWFsc18xID0gT2JqZWN0cy5lcXVhbChfbmFtZSwgbnVsbCk7CisgICAgICBpZiAoX2VxdWFsc18xKSB7CisgICAgICAgIHJldHVybiBzdXBlclNjb3BlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgSXRlcmFibGU8SUVPYmplY3REZXNjcmlwdGlvbj4gX2FsbEVsZW1lbnRzXzEgPSBzdXBlclNjb3BlLmdldEFsbEVsZW1lbnRzKCk7CisgICAgICAgIGZvciAoZmluYWwgSUVPYmplY3REZXNjcmlwdGlvbiBlbGVtZW50XzEgOiBfYWxsRWxlbWVudHNfMSkgeworICAgICAgICAgIEVPYmplY3QgX2VPYmplY3RPclByb3h5XzIgPSBlbGVtZW50XzEuZ2V0RU9iamVjdE9yUHJveHkoKTsKKyAgICAgICAgICBpZiAoKF9lT2JqZWN0T3JQcm94eV8yIGluc3RhbmNlb2YgVGFibGUpKSB7CisgICAgICAgICAgICBFT2JqZWN0IF9lT2JqZWN0T3JQcm94eV8zID0gZWxlbWVudF8xLmdldEVPYmplY3RPclByb3h5KCk7CisgICAgICAgICAgICBUYWJsZSB0YWJsZV8xID0gKChUYWJsZSkgX2VPYmplY3RPclByb3h5XzMpOworICAgICAgICAgICAgUmVzb3VyY2UgX2VSZXNvdXJjZV8zID0gc2VsZWN0aW9uVmlldy5lUmVzb3VyY2UoKTsKKyAgICAgICAgICAgIFJlc291cmNlU2V0IF9yZXNvdXJjZVNldF8zID0gX2VSZXNvdXJjZV8zLmdldFJlc291cmNlU2V0KCk7CisgICAgICAgICAgICBFT2JqZWN0IF9yZXNvbHZlXzIgPSBFY29yZVV0aWwzLnJlc29sdmUodGFibGVfMSwgX3Jlc291cmNlU2V0XzMpOworICAgICAgICAgICAgdGFibGVfMSA9ICgoVGFibGUpIF9yZXNvbHZlXzIpOworICAgICAgICAgICAgVGFibGVPcHRpb24gX3RhYmxldHlwZV8xID0gdGFibGVfMS5nZXRUYWJsZXR5cGUoKTsKKyAgICAgICAgICAgIGlmICgoX3RhYmxldHlwZV8xIGluc3RhbmNlb2YgVGFibGVTZWxlY3Rpb24pKSB7CisgICAgICAgICAgICAgIHJlc3VsdC5hZGQoZWxlbWVudF8xKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBNYXBCYXNlZFNjb3BlLmNyZWF0ZVNjb3BlKElTY29wZS5OVUxMU0NPUEUsIHJlc3VsdCk7CisgICAgfQorICB9CisgIAorICBwdWJsaWMgSVNjb3BlIGdldFNjb3BlX0NDUGVyc3BlY3RpdmVQYXJ0U3RhY2tfUEVSU1BFQ1RJVkVfR1JJRF9fUkVGKGZpbmFsIFBlcnNwZWN0aXZlR3JpZCBncmlkVmlldywgZmluYWwgRVJlZmVyZW5jZSByZWZlcmVuY2UpIHsKKyAgICBmaW5hbCBJU2NvcGUgc3VwZXJTY29wZSA9IHN1cGVyLmdldFNjb3BlKGdyaWRWaWV3LCByZWZlcmVuY2UpOworICAgIEFycmF5TGlzdDxJRU9iamVjdERlc2NyaXB0aW9uPiByZXN1bHQgPSBDb2xsZWN0aW9uTGl0ZXJhbHMuPElFT2JqZWN0RGVzY3JpcHRpb24+bmV3QXJyYXlMaXN0KCk7CisgICAgSXRlcmFibGU8SUVPYmplY3REZXNjcmlwdGlvbj4gX2FsbEVsZW1lbnRzID0gc3VwZXJTY29wZS5nZXRBbGxFbGVtZW50cygpOworICAgIGZvciAoZmluYWwgSUVPYmplY3REZXNjcmlwdGlvbiBlbGVtZW50IDogX2FsbEVsZW1lbnRzKSB7CisgICAgICBFT2JqZWN0IF9lT2JqZWN0T3JQcm94eSA9IGVsZW1lbnQuZ2V0RU9iamVjdE9yUHJveHkoKTsKKyAgICAgIGlmICgoX2VPYmplY3RPclByb3h5IGluc3RhbmNlb2YgVGFibGUpKSB7CisgICAgICAgIEVPYmplY3QgX2VPYmplY3RPclByb3h5XzEgPSBlbGVtZW50LmdldEVPYmplY3RPclByb3h5KCk7CisgICAgICAgIFRhYmxlIHRhYmxlID0gKChUYWJsZSkgX2VPYmplY3RPclByb3h5XzEpOworICAgICAgICBSZXNvdXJjZSBfZVJlc291cmNlID0gZ3JpZFZpZXcuZVJlc291cmNlKCk7CisgICAgICAgIFJlc291cmNlU2V0IF9yZXNvdXJjZVNldCA9IF9lUmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKTsKKyAgICAgICAgRU9iamVjdCBfcmVzb2x2ZSA9IEVjb3JlVXRpbDMucmVzb2x2ZSh0YWJsZSwgX3Jlc291cmNlU2V0KTsKKyAgICAgICAgdGFibGUgPSAoKFRhYmxlKSBfcmVzb2x2ZSk7CisgICAgICAgIFRhYmxlT3B0aW9uIF90YWJsZXR5cGUgPSB0YWJsZS5nZXRUYWJsZXR5cGUoKTsKKyAgICAgICAgaWYgKChfdGFibGV0eXBlIGluc3RhbmNlb2YgVGFibGVHcmlkKSkgeworICAgICAgICAgIHJlc3VsdC5hZGQoZWxlbWVudCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE1hcEJhc2VkU2NvcGUuY3JlYXRlU2NvcGUoSVNjb3BlLk5VTExTQ09QRSwgcmVzdWx0KTsKKyAgfQorICAKKyAgcHVibGljIElTY29wZSBnZXRTY29wZV9DQ1BlcnNwZWN0aXZlUGFydFN0YWNrX1VTRVJfVEFTSyhmaW5hbCBQZXJzcGVjdGl2ZSBwZXJzcGVjdGl2ZSkgeworICAgIEFycmF5TGlzdDxJRU9iamVjdERlc2NyaXB0aW9uPiByZXN1bHQgPSBDb2xsZWN0aW9uTGl0ZXJhbHMuPElFT2JqZWN0RGVzY3JpcHRpb24+bmV3QXJyYXlMaXN0KCk7CisgICAgQmxpcCBibGlwUHJvY2VzcyA9IHBlcnNwZWN0aXZlLmdldFByb2Nlc3MoKTsKKyAgICBib29sZWFuIF9ub3RFcXVhbHMgPSAoIU9iamVjdHMuZXF1YWwoYmxpcFByb2Nlc3MsIG51bGwpKTsKKyAgICBpZiAoX25vdEVxdWFscykgeworICAgICAgRUxpc3Q8QmxpcEl0ZW0+IF9pdGVtcyA9IGJsaXBQcm9jZXNzLmdldEl0ZW1zKCk7CisgICAgICBmb3IgKGZpbmFsIEJsaXBJdGVtIGl0ZW0gOiBfaXRlbXMpIHsKKyAgICAgICAgaWYgKChpdGVtIGluc3RhbmNlb2YgQmxpcFVzZXJUYXNrKSkgeworICAgICAgICAgIFN0cmluZyBfbmFtZSA9ICgoQmxpcFVzZXJUYXNrKWl0ZW0pLmdldE5hbWUoKTsKKyAgICAgICAgICBJRU9iamVjdERlc2NyaXB0aW9uIF9jcmVhdGUgPSBFT2JqZWN0RGVzY3JpcHRpb24uY3JlYXRlKF9uYW1lLCBpdGVtKTsKKyAgICAgICAgICByZXN1bHQuYWRkKF9jcmVhdGUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBNYXBCYXNlZFNjb3BlLmNyZWF0ZVNjb3BlKElTY29wZS5OVUxMU0NPUEUsIHJlc3VsdCk7CisgIH0KKyAgCisgIHB1YmxpYyBJU2NvcGUgZ2V0U2NvcGVfQ0NQZXJzcGVjdGl2ZVBhcnRTdGFja19zZWxlY3RlZF9lbGVtZW50KGZpbmFsIEVPYmplY3Qgb2JqZWN0KSB7CisgICAgQXJyYXlMaXN0PElFT2JqZWN0RGVzY3JpcHRpb24+IHJlc3VsdCA9IENvbGxlY3Rpb25MaXRlcmFscy48SUVPYmplY3REZXNjcmlwdGlvbj5uZXdBcnJheUxpc3QoKTsKKyAgICBpZiAoKG9iamVjdCBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlUGFydFN0YWNrKSkgeworICAgICAgUGVyc3BlY3RpdmVQYXJ0U3RhY2sgc3RhY2sgPSAoKFBlcnNwZWN0aXZlUGFydFN0YWNrKSBvYmplY3QpOworICAgICAgRUxpc3Q8UGVyc3BlY3RpdmVFbGVtZW50PiBfZWxlbWVudHMgPSBzdGFjay5nZXRFbGVtZW50cygpOworICAgICAgZm9yIChmaW5hbCBQZXJzcGVjdGl2ZUVsZW1lbnQgcGFydCA6IF9lbGVtZW50cykgeworICAgICAgICBTdHJpbmcgX2VsZW1lbnRJZCA9IHBhcnQuZ2V0RWxlbWVudElkKCk7CisgICAgICAgIElFT2JqZWN0RGVzY3JpcHRpb24gX2NyZWF0ZSA9IEVPYmplY3REZXNjcmlwdGlvbi5jcmVhdGUoX2VsZW1lbnRJZCwgcGFydCk7CisgICAgICAgIHJlc3VsdC5hZGQoX2NyZWF0ZSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBNYXBCYXNlZFNjb3BlLmNyZWF0ZVNjb3BlKElTY29wZS5OVUxMU0NPUEUsIHJlc3VsdCk7CisgIH0KKyAgCisgIHB1YmxpYyBJU2NvcGUgZ2V0U2NvcGVfQ0NQZXJzcGVjdGl2ZVNhc2hDb250YWluZXJfc2VsZWN0ZWRfZWxlbWVudChmaW5hbCBFT2JqZWN0IG9iamVjdCkgeworICAgIEFycmF5TGlzdDxJRU9iamVjdERlc2NyaXB0aW9uPiByZXN1bHQgPSBDb2xsZWN0aW9uTGl0ZXJhbHMuPElFT2JqZWN0RGVzY3JpcHRpb24+bmV3QXJyYXlMaXN0KCk7CisgICAgaWYgKChvYmplY3QgaW5zdGFuY2VvZiBQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIpKSB7CisgICAgICBQZXJzcGVjdGl2ZVNhc2hDb250YWluZXIgc2FzaCA9ICgoUGVyc3BlY3RpdmVTYXNoQ29udGFpbmVyKSBvYmplY3QpOworICAgICAgRUxpc3Q8UGVyc3BlY3RpdmVFbGVtZW50PiBfZWxlbWVudHMgPSBzYXNoLmdldEVsZW1lbnRzKCk7CisgICAgICBmb3IgKGZpbmFsIFBlcnNwZWN0aXZlRWxlbWVudCBwYXJ0IDogX2VsZW1lbnRzKSB7CisgICAgICAgIFN0cmluZyBfZWxlbWVudElkID0gcGFydC5nZXRFbGVtZW50SWQoKTsKKyAgICAgICAgSUVPYmplY3REZXNjcmlwdGlvbiBfY3JlYXRlID0gRU9iamVjdERlc2NyaXB0aW9uLmNyZWF0ZShfZWxlbWVudElkLCBwYXJ0KTsKKyAgICAgICAgcmVzdWx0LmFkZChfY3JlYXRlKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE1hcEJhc2VkU2NvcGUuY3JlYXRlU2NvcGUoSVNjb3BlLk5VTExTQ09QRSwgcmVzdWx0KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS92YWxpZGF0aW9uL1BlcnNwZWN0aXZlRHNsVmFsaWRhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3BlcnNwZWN0aXZlL3ZhbGlkYXRpb24vUGVyc3BlY3RpdmVEc2xWYWxpZGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmZjYzkyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9wZXJzcGVjdGl2ZS92YWxpZGF0aW9uL1BlcnNwZWN0aXZlRHNsVmFsaWRhdG9yLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogIENvbnRyaWJ1dG9yczoKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICogCisgKiAgVGhpcyBjb3B5cmlnaHQgbm90aWNlIHNob3dzIHVwIGluIHRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS52YWxpZGF0aW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYmxpcC5CbGlwOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuQWN0aXZhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZURzbFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS52YWxpZGF0aW9uLkFic3RyYWN0UGVyc3BlY3RpdmVEc2xWYWxpZGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQyLmxpYi5TdHJpbmdDb25jYXRlbmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnZhbGlkYXRpb24uQ2hlY2s7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKKworLyoqCisgKiBDdXN0b20gdmFsaWRhdGlvbiBydWxlcy4KKyAqIAorICogc2VlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvWHRleHQvZG9jdW1lbnRhdGlvbi5odG1sI3ZhbGlkYXRpb24KKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgUGVyc3BlY3RpdmVEc2xWYWxpZGF0b3IgZXh0ZW5kcyBBYnN0cmFjdFBlcnNwZWN0aXZlRHNsVmFsaWRhdG9yIHsKKyAgQENoZWNrCisgIHB1YmxpYyB2b2lkIGNoZWNrQlBNbGljZW5zZWQoZmluYWwgUGVyc3BlY3RpdmUgcGVycykgeworICAgIEJsaXAgX3Byb2Nlc3MgPSBwZXJzLmdldFByb2Nlc3MoKTsKKyAgICBib29sZWFuIF9ub3RFcXVhbHMgPSAoIU9iamVjdHMuZXF1YWwoX3Byb2Nlc3MsIG51bGwpKTsKKyAgICBpZiAoX25vdEVxdWFscykgeworICAgICAgQnVuZGxlQ29udGV4dCBfY29udGV4dCA9IEFjdGl2YXRvci5nZXRDb250ZXh0KCk7CisgICAgICBCdW5kbGVbXSBfYnVuZGxlcyA9IF9jb250ZXh0LmdldEJ1bmRsZXMoKTsKKyAgICAgIGZvciAoZmluYWwgQnVuZGxlIGIgOiBfYnVuZGxlcykgeworICAgICAgICBTdHJpbmcgX3N5bWJvbGljTmFtZSA9IGIuZ2V0U3ltYm9saWNOYW1lKCk7CisgICAgICAgIGJvb2xlYW4gX2VxdWFscyA9IF9zeW1ib2xpY05hbWUuZXF1YWxzKCJuZXQub3NiZWUuYnBtIik7CisgICAgICAgIGlmIChfZXF1YWxzKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiQlBNIGlzIG5lZWRlZCBhbmQgbm90IHlldCBsaWNlbnNlZC4gTGljZW5zZSBCUE0gYXQgd3d3Lm9zYmVlLm5ldCIpOworICAgICAgdGhpcy5pbmZvKF9idWlsZGVyLnRvU3RyaW5nKCksIHBlcnMsIAorICAgICAgICBQZXJzcGVjdGl2ZURzbFBhY2thZ2UuTGl0ZXJhbHMuUEVSU1BFQ1RJVkVfX1BST0NFU1MpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvcG9tLnhtbCBiL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEyM2YxNgotLS0gL2Rldi9udWxsCisrKyBiL3BvbS54bWwKQEAgLTAsMCArMSw5NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Cis8IS0tIyBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KS4gLS0+Cis8IS0tIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIC0tPgorPCEtLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIC0tPgorPCEtLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgLS0+Cis8IS0tIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAtLT4KKzwhLS0jIC0tPgorPCEtLSMgQ29udHJpYnV0b3JzOiAtLT4KKzwhLS0jIENocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAtLT4KKzwhLS0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKwk8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKwk8cGFyZW50PgorCQk8Z3JvdXBJZD5vcmcuZWNsaXBzZS5vc2JwLnJlbGVuZy5tYXZlbjwvZ3JvdXBJZD4KKwkJPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2Uub3NicC5yZWxlbmcubWF2ZW4ucGFyZW50LnR5Y2hvPC9hcnRpZmFjdElkPgorCQk8dmVyc2lvbj4wLjkuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKwkJPHJlbGF0aXZlUGF0aC8+CisJPC9wYXJlbnQ+CisKKwk8Z3JvdXBJZD5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlPC9ncm91cElkPgorCTxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUuYWdncmVnYXRvcjwvYXJ0aWZhY3RJZD4KKwk8dmVyc2lvbj4wLjkuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKwk8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorCisJPHVybD4ke29zYnAuc2l0ZS5yZXBvc2l0b3J5LnVybH08L3VybD4KKwk8c2NtPgorCQk8dXJsPiR7b3NicC5zY20udXJsfTwvdXJsPgorCQk8Y29ubmVjdGlvbj4ke29zYnAuc2NtLmNvbm5lY3Rpb259PC9jb25uZWN0aW9uPgorCQk8ZGV2ZWxvcGVyQ29ubmVjdGlvbj4ke29zYnAuc2NtLmNvbm5lY3Rpb24uZGV2fTwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KKwkJPHRhZz5IRUFEPC90YWc+CisJPC9zY20+CisJPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+CisJCTxzaXRlPgorCQkJPGlkPmdoLXBhZ2VzPC9pZD4KKwkJCTxuYW1lPk9TQlAgR2l0SHViIFBhZ2VzPC9uYW1lPgorCQkJPHVybD4ke2Rpc3RyaWJ1dGlvbi5zaXRlLnVybH08L3VybD4KKwkJPC9zaXRlPgorCTwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KKworCTxwcm9wZXJ0aWVzPgorCQk8b3NicC5naXRyZXBvLm5hbWU+JHtwcm9qZWN0Lmdyb3VwSWR9PC9vc2JwLmdpdHJlcG8ubmFtZT4KKwk8L3Byb3BlcnRpZXM+CisKKwk8bW9kdWxlcz4KKwkJPG1vZHVsZT5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlPC9tb2R1bGU+CisJCTxtb2R1bGU+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5wZXJzcGVjdGl2ZS51aTwvbW9kdWxlPgorCQk8bW9kdWxlPm9yZy5lY2xpcHNlLm9zYnAueHRleHQucGVyc3BlY3RpdmUudGVzdHM8L21vZHVsZT4KKwkJPG1vZHVsZT5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnBlcnNwZWN0aXZlLmZlYXR1cmU8L21vZHVsZT4KKwk8L21vZHVsZXM+CisKKwk8YnVpbGQ+CisJCTxwbHVnaW5NYW5hZ2VtZW50PgorCQkJPHBsdWdpbnM+CisJCQkJPHBsdWdpbj4KKwkJCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorCQkJCQk8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKwkJCQkJPGNvbmZpZ3VyYXRpb24+CisJCQkJCQk8c2tpcD50cnVlPC9za2lwPgorCQkJCQk8L2NvbmZpZ3VyYXRpb24+CisJCQkJPC9wbHVnaW4+CisJCQkJPHBsdWdpbj4KKwkJCQkJPGdyb3VwSWQ+b3JnLmVjbGlwc2UudHljaG88L2dyb3VwSWQ+CisJCQkJCTxhcnRpZmFjdElkPnRhcmdldC1wbGF0Zm9ybS1jb25maWd1cmF0aW9uPC9hcnRpZmFjdElkPgorCQkJCQk8dmVyc2lvbj4ke3R5Y2hvLXZlcnNpb259PC92ZXJzaW9uPgorCQkJCQk8Y29uZmlndXJhdGlvbj4KKwkJCQkJCTxyZXNvbHZlcj5wMjwvcmVzb2x2ZXI+CisJCQkJCQk8cG9tRGVwZW5kZW5jaWVzPmNvbnNpZGVyPC9wb21EZXBlbmRlbmNpZXM+CisJCQkJCQk8ZW52aXJvbm1lbnRzPgorCQkJCQkJCTxlbnZpcm9ubWVudD4KKwkJCQkJCQkJPG9zPndpbjMyPC9vcz4KKwkJCQkJCQkJPHdzPndpbjMyPC93cz4KKwkJCQkJCQkJPGFyY2g+eDg2XzY0PC9hcmNoPgorCQkJCQkJCTwvZW52aXJvbm1lbnQ+CisJCQkJCQkJPGVudmlyb25tZW50PgorCQkJCQkJCQk8b3M+bGludXg8L29zPgorCQkJCQkJCQk8d3M+Z3RrPC93cz4KKwkJCQkJCQkJPGFyY2g+eDg2PC9hcmNoPgorCQkJCQkJCTwvZW52aXJvbm1lbnQ+CisJCQkJCQkJPGVudmlyb25tZW50PgorCQkJCQkJCQk8b3M+bGludXg8L29zPgorCQkJCQkJCQk8d3M+Z3RrPC93cz4KKwkJCQkJCQkJPGFyY2g+eDg2XzY0PC9hcmNoPgorCQkJCQkJCTwvZW52aXJvbm1lbnQ+CisJCQkJCQkJPGVudmlyb25tZW50PgorCQkJCQkJCQk8b3M+bWFjb3N4PC9vcz4KKwkJCQkJCQkJPHdzPmNvY29hPC93cz4KKwkJCQkJCQkJPGFyY2g+eDg2XzY0PC9hcmNoPgorCQkJCQkJCTwvZW52aXJvbm1lbnQ+CisJCQkJCQk8L2Vudmlyb25tZW50cz4KKwkJCQkJPC9jb25maWd1cmF0aW9uPgorCQkJCTwvcGx1Z2luPgorCQkJPC9wbHVnaW5zPgorCQk8L3BsdWdpbk1hbmFnZW1lbnQ+CisJPC9idWlsZD4KKzwvcHJvamVjdD4K